Skip to content

Commit e6f7db2

Browse files
authored
Use TypedExternalConnector and remove type assertions (#138)
Signed-off-by: Carl Henrik Lunde <chlunde@ifi.uio.no>
1 parent 884a40f commit e6f7db2

2 files changed

Lines changed: 13 additions & 38 deletions

File tree

internal/controller/mytype/mytype.go

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import (
3939
)
4040

4141
const (
42-
errNotMyType = "managed resource is not a MyType custom resource"
4342
errTrackPCUsage = "cannot track ProviderConfig usage"
4443
errGetPC = "cannot get ProviderConfig"
4544
errGetCPC = "cannot get ClusterProviderConfig"
@@ -70,7 +69,7 @@ func Setup(mgr ctrl.Manager, o controller.Options) error {
7069
name := managed.ControllerName(v1alpha1.MyTypeGroupKind)
7170

7271
opts := []managed.ReconcilerOption{
73-
managed.WithExternalConnector(&connector{
72+
managed.WithTypedExternalConnector[*v1alpha1.MyType](&connector{
7473
kube: mgr.GetClient(),
7574
usage: resource.NewProviderConfigUsageTracker(mgr.GetClient(), &apisv1alpha1.ProviderConfigUsage{}),
7675
newServiceFn: newNoOpService}),
@@ -123,26 +122,19 @@ type connector struct {
123122
// 2. Getting the managed resource's ProviderConfig.
124123
// 3. Getting the credentials specified by the ProviderConfig.
125124
// 4. Using the credentials to form a client.
126-
func (c *connector) Connect(ctx context.Context, mg resource.Managed) (managed.ExternalClient, error) {
127-
cr, ok := mg.(*v1alpha1.MyType)
128-
if !ok {
129-
return nil, errors.New(errNotMyType)
130-
}
131-
125+
func (c *connector) Connect(ctx context.Context, cr *v1alpha1.MyType) (managed.TypedExternalClient[*v1alpha1.MyType], error) {
132126
if err := c.usage.Track(ctx, cr); err != nil {
133127
return nil, errors.Wrap(err, errTrackPCUsage)
134128
}
135129

136130
var cd apisv1alpha1.ProviderCredentials
137131

138-
// Switch to ModernManaged resource to get ProviderConfigRef
139-
m := mg.(resource.ModernManaged)
140-
ref := m.GetProviderConfigReference()
132+
ref := cr.GetProviderConfigReference()
141133

142134
switch ref.Kind {
143135
case "ProviderConfig":
144136
pc := &apisv1alpha1.ProviderConfig{}
145-
if err := c.kube.Get(ctx, types.NamespacedName{Name: ref.Name, Namespace: m.GetNamespace()}, pc); err != nil {
137+
if err := c.kube.Get(ctx, types.NamespacedName{Name: ref.Name, Namespace: cr.GetNamespace()}, pc); err != nil {
146138
return nil, errors.Wrap(err, errGetPC)
147139
}
148140
cd = pc.Spec.Credentials
@@ -177,21 +169,16 @@ type external struct {
177169
service interface{}
178170
}
179171

180-
func (c *external) Observe(ctx context.Context, mg resource.Managed) (managed.ExternalObservation, error) {
172+
func (c *external) Observe(ctx context.Context, cr *v1alpha1.MyType) (managed.ExternalObservation, error) {
181173
// If the managed resource is marked for deletion then deleted it.
182174
// Because there is no external resource to observe, we return false for
183175
// ResourceExists.
184-
if meta.WasDeleted(mg) {
176+
if meta.WasDeleted(cr) {
185177
return managed.ExternalObservation{
186178
ResourceExists: false,
187179
}, nil
188180
}
189181

190-
cr, ok := mg.(*v1alpha1.MyType)
191-
if !ok {
192-
return managed.ExternalObservation{}, errors.New(errNotMyType)
193-
}
194-
195182
// These fmt statements should be removed in the real implementation.
196183
fmt.Printf("Observing: %+v", cr)
197184

@@ -230,12 +217,8 @@ func (c *external) Observe(ctx context.Context, mg resource.Managed) (managed.Ex
230217
}, nil
231218
}
232219

233-
func (c *external) Create(ctx context.Context, mg resource.Managed) (managed.ExternalCreation, error) {
234-
cr, ok := mg.(*v1alpha1.MyType)
220+
func (c *external) Create(ctx context.Context, cr *v1alpha1.MyType) (managed.ExternalCreation, error) {
235221
cr.Status.SetConditions(xpv1.Creating())
236-
if !ok {
237-
return managed.ExternalCreation{}, errors.New(errNotMyType)
238-
}
239222

240223
fmt.Printf("Creating: %+v", cr)
241224

@@ -250,12 +233,7 @@ func (c *external) Create(ctx context.Context, mg resource.Managed) (managed.Ext
250233
}, nil
251234
}
252235

253-
func (c *external) Update(ctx context.Context, mg resource.Managed) (managed.ExternalUpdate, error) {
254-
cr, ok := mg.(*v1alpha1.MyType)
255-
if !ok {
256-
return managed.ExternalUpdate{}, errors.New(errNotMyType)
257-
}
258-
236+
func (c *external) Update(ctx context.Context, cr *v1alpha1.MyType) (managed.ExternalUpdate, error) {
259237
fmt.Printf("Updating: %+v", cr)
260238

261239
// Copy ConfigurableField to AtProvider and complete the update.
@@ -268,12 +246,8 @@ func (c *external) Update(ctx context.Context, mg resource.Managed) (managed.Ext
268246
}, nil
269247
}
270248

271-
func (c *external) Delete(ctx context.Context, mg resource.Managed) (managed.ExternalDelete, error) {
272-
cr, ok := mg.(*v1alpha1.MyType)
249+
func (c *external) Delete(ctx context.Context, cr *v1alpha1.MyType) (managed.ExternalDelete, error) {
273250
cr.Status.SetConditions(xpv1.Deleting())
274-
if !ok {
275-
return managed.ExternalDelete{}, errors.New(errNotMyType)
276-
}
277251

278252
fmt.Printf("Deleting: %+v", cr)
279253

internal/controller/mytype/mytype_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ import (
2323
"github.com/google/go-cmp/cmp"
2424

2525
"github.com/crossplane/crossplane-runtime/v2/pkg/reconciler/managed"
26-
"github.com/crossplane/crossplane-runtime/v2/pkg/resource"
2726
"github.com/crossplane/crossplane-runtime/v2/pkg/test"
27+
28+
"github.com/crossplane/provider-template/apis/sample/v1alpha1"
2829
)
2930

3031
// Unlike many Kubernetes projects Crossplane does not use third party testing
@@ -42,7 +43,7 @@ func TestObserve(t *testing.T) {
4243

4344
type args struct {
4445
ctx context.Context
45-
mg resource.Managed
46+
cr *v1alpha1.MyType
4647
}
4748

4849
type want struct {
@@ -62,7 +63,7 @@ func TestObserve(t *testing.T) {
6263
for name, tc := range cases {
6364
t.Run(name, func(t *testing.T) {
6465
e := external{service: tc.fields.service}
65-
got, err := e.Observe(tc.args.ctx, tc.args.mg)
66+
got, err := e.Observe(tc.args.ctx, tc.args.cr)
6667
if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" {
6768
t.Errorf("\n%s\ne.Observe(...): -want error, +got error:\n%s\n", tc.reason, diff)
6869
}

0 commit comments

Comments
 (0)