From 290da751836e8ee3969de9734874cbe6a654c688 Mon Sep 17 00:00:00 2001 From: Amund Tenstad Date: Wed, 8 Jan 2025 20:51:46 +0100 Subject: [PATCH] chore: configure cloudian client and fix test --- internal/controller/accesskey/accesskey.go | 37 ++++++++++++------- .../controller/accesskey/accesskey_test.go | 3 +- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/internal/controller/accesskey/accesskey.go b/internal/controller/accesskey/accesskey.go index c07998f1..56c3e451 100644 --- a/internal/controller/accesskey/accesskey.go +++ b/internal/controller/accesskey/accesskey.go @@ -35,10 +35,11 @@ import ( "github.com/statnett/provider-cloudian/apis/user/v1alpha1" apisv1alpha1 "github.com/statnett/provider-cloudian/apis/v1alpha1" "github.com/statnett/provider-cloudian/internal/features" + "github.com/statnett/provider-cloudian/internal/sdk/cloudian" ) const ( - errNotAccessKey = "managed resource is not a AccessKey custom resource" + errNotAccessKey = "managed resource is not a AccessKey custom resource" errTrackPCUsage = "cannot track ProviderConfig usage" errGetPC = "cannot get ProviderConfig" errGetCreds = "cannot get credentials" @@ -46,11 +47,15 @@ const ( errNewClient = "cannot create new Service" ) -// A NoOpService does nothing. -type NoOpService struct{} - var ( - newNoOpService = func(_ []byte) (interface{}, error) { return &NoOpService{}, nil } + newCloudianService = func(providerConfig *apisv1alpha1.ProviderConfig, authHeader string) (*cloudian.Client, error) { + // FIXME: Don't require InsecureSkipVerify + return cloudian.NewClient( + providerConfig.Spec.Endpoint, + authHeader, + cloudian.WithInsecureTLSVerify(true), + ), nil + } ) // Setup adds a controller that reconciles AccessKey managed resources. @@ -67,7 +72,7 @@ func Setup(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{ kube: mgr.GetClient(), usage: resource.NewProviderConfigUsageTracker(mgr.GetClient(), &apisv1alpha1.ProviderConfigUsage{}), - newServiceFn: newNoOpService}), + newServiceFn: newCloudianService}), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithPollInterval(o.PollInterval), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -86,7 +91,7 @@ func Setup(mgr ctrl.Manager, o controller.Options) error { type connector struct { kube client.Client usage resource.Tracker - newServiceFn func(creds []byte) (interface{}, error) + newServiceFn func(providerConfig *apisv1alpha1.ProviderConfig, authHeader string) (*cloudian.Client, error) } // Connect typically produces an ExternalClient by: @@ -109,18 +114,18 @@ func (c *connector) Connect(ctx context.Context, mg resource.Managed) (managed.E return nil, errors.Wrap(err, errGetPC) } - cd := pc.Spec.Credentials - data, err := resource.CommonCredentialExtractor(ctx, cd.Source, c.kube, cd.CommonCredentialSelectors) + cd := pc.Spec.AuthHeader + authHeader, err := resource.CommonCredentialExtractor(ctx, cd.Source, c.kube, cd.CommonCredentialSelectors) if err != nil { return nil, errors.Wrap(err, errGetCreds) } - svc, err := c.newServiceFn(data) + svc, err := c.newServiceFn(pc, string(authHeader)) if err != nil { return nil, errors.Wrap(err, errNewClient) } - return &external{service: svc}, nil + return &external{cloudianService: svc}, nil } // An ExternalClient observes, then either creates, updates, or deletes an @@ -128,7 +133,7 @@ func (c *connector) Connect(ctx context.Context, mg resource.Managed) (managed.E type external struct { // A 'client' used to connect to the external resource API. In practice this // would be something like an AWS SDK client. - service interface{} + cloudianService *cloudian.Client } func (c *external) Observe(ctx context.Context, mg resource.Managed) (managed.ExternalObservation, error) { @@ -187,13 +192,17 @@ func (c *external) Update(ctx context.Context, mg resource.Managed) (managed.Ext }, nil } -func (c *external) Delete(ctx context.Context, mg resource.Managed) error { +func (c *external) Delete(ctx context.Context, mg resource.Managed) (managed.ExternalDelete, error) { cr, ok := mg.(*v1alpha1.AccessKey) if !ok { - return errors.New(errNotAccessKey) + return managed.ExternalDelete{}, errors.New(errNotAccessKey) } fmt.Printf("Deleting: %+v", cr) + return managed.ExternalDelete{}, nil +} + +func (c *external) Disconnect(ctx context.Context) error { return nil } diff --git a/internal/controller/accesskey/accesskey_test.go b/internal/controller/accesskey/accesskey_test.go index b07db5d3..86717e58 100644 --- a/internal/controller/accesskey/accesskey_test.go +++ b/internal/controller/accesskey/accesskey_test.go @@ -37,7 +37,6 @@ import ( func TestObserve(t *testing.T) { type fields struct { - service interface{} } type args struct { @@ -61,7 +60,7 @@ func TestObserve(t *testing.T) { for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := external{service: tc.fields.service} + e := external{} got, err := e.Observe(tc.args.ctx, tc.args.mg) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { t.Errorf("\n%s\ne.Observe(...): -want error, +got error:\n%s\n", tc.reason, diff)