Skip to content

Commit

Permalink
chore: configure cloudian client and fix test
Browse files Browse the repository at this point in the history
  • Loading branch information
tenstad committed Jan 8, 2025
1 parent ebd8c82 commit 290da75
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 16 deletions.
37 changes: 23 additions & 14 deletions internal/controller/accesskey/accesskey.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,22 +35,27 @@ 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"

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.
Expand All @@ -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))),
Expand All @@ -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:
Expand All @@ -109,26 +114,26 @@ 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
// external resource to ensure it reflects the managed resource's desired state.
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) {
Expand Down Expand Up @@ -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
}
3 changes: 1 addition & 2 deletions internal/controller/accesskey/accesskey_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import (

func TestObserve(t *testing.T) {
type fields struct {
service interface{}
}

type args struct {
Expand All @@ -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)
Expand Down

0 comments on commit 290da75

Please sign in to comment.