From 1a4ccca0d9d8bc3163223413a80544c1d155a35e Mon Sep 17 00:00:00 2001 From: cgong Date: Wed, 13 May 2026 19:49:40 +1200 Subject: [PATCH 1/3] chore: update boilerplate --- OWNERS_ALIASES | 1 + boilerplate/_data/last-boilerplate-commit | 2 +- boilerplate/openshift/golang-osd-operator/OWNERS_ALIASES | 1 + build/Dockerfile | 2 +- build/Dockerfile.olm-registry | 2 +- 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES index 2c4fa259..e5b08a0d 100644 --- a/OWNERS_ALIASES +++ b/OWNERS_ALIASES @@ -5,6 +5,7 @@ aliases: srep-functional-team-aurora: - AlexSmithGH + - BATMAN-JD - dakotalongRH - eth1030 - joshbranham diff --git a/boilerplate/_data/last-boilerplate-commit b/boilerplate/_data/last-boilerplate-commit index 3abaa232..35f01903 100644 --- a/boilerplate/_data/last-boilerplate-commit +++ b/boilerplate/_data/last-boilerplate-commit @@ -1 +1 @@ -61dbfdfcfd8ab11f8ccbd58bf1d299c2fa3336dd +c2342f1bcec55d87fd028e5c1d7f105c745eb32e diff --git a/boilerplate/openshift/golang-osd-operator/OWNERS_ALIASES b/boilerplate/openshift/golang-osd-operator/OWNERS_ALIASES index 2c4fa259..e5b08a0d 100644 --- a/boilerplate/openshift/golang-osd-operator/OWNERS_ALIASES +++ b/boilerplate/openshift/golang-osd-operator/OWNERS_ALIASES @@ -5,6 +5,7 @@ aliases: srep-functional-team-aurora: - AlexSmithGH + - BATMAN-JD - dakotalongRH - eth1030 - joshbranham diff --git a/build/Dockerfile b/build/Dockerfile index 4f8fdc46..34025688 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -6,7 +6,7 @@ WORKDIR ${OPERATOR_PATH} # Build RUN make go-build -FROM registry.access.redhat.com/ubi9/ubi-minimal:9.7-1778461551 +FROM registry.access.redhat.com/ubi9/ubi-minimal:9.7-1778562320 ENV OPERATOR_PATH=/gcp-project-operator \ OPERATOR_BIN=gcp-project-operator diff --git a/build/Dockerfile.olm-registry b/build/Dockerfile.olm-registry index 5afa8d83..1d247750 100644 --- a/build/Dockerfile.olm-registry +++ b/build/Dockerfile.olm-registry @@ -4,7 +4,7 @@ COPY ${SAAS_OPERATOR_DIR} manifests RUN initializer --permissive # ubi-micro does not work for clusters with fips enabled unless we make OpenSSL available -FROM registry.access.redhat.com/ubi9/ubi-minimal:9.7-1778461551 +FROM registry.access.redhat.com/ubi9/ubi-minimal:9.7-1778562320 COPY --from=builder /bin/registry-server /bin/registry-server COPY --from=builder /bin/grpc_health_probe /bin/grpc_health_probe From ad9504d219acffa45bb4341a632a87fb19a78aad Mon Sep 17 00:00:00 2001 From: cgong Date: Wed, 13 May 2026 20:52:27 +1200 Subject: [PATCH 2/3] fix: resolve lint errors --- config/config.go | 6 ++-- .../projectclaim/projectclaim_controller.go | 2 +- .../projectreference_adapter.go | 12 ++++--- .../projectreference_adapter_test.go | 4 +-- .../projectreference_controller.go | 6 ++-- pkg/configmap/configmap.go | 2 +- pkg/gcpclient/client.go | 36 ++++++++++--------- pkg/util/util.go | 5 ++- 8 files changed, 41 insertions(+), 32 deletions(-) diff --git a/config/config.go b/config/config.go index d1d3e09f..9122c252 100644 --- a/config/config.go +++ b/config/config.go @@ -15,7 +15,7 @@ package config const ( - OperatorName string = "gcp-project-operator" - OperatorNamespace string = "gcp-project-operator" - EnableOLMSkipRange string = "true" + OperatorName string = "gcp-project-operator" + OperatorNamespace string = "gcp-project-operator" + EnableOLMSkipRange string = "true" ) diff --git a/controllers/projectclaim/projectclaim_controller.go b/controllers/projectclaim/projectclaim_controller.go index c762d232..a22f3e61 100644 --- a/controllers/projectclaim/projectclaim_controller.go +++ b/controllers/projectclaim/projectclaim_controller.go @@ -71,7 +71,7 @@ func (r *ProjectClaimReconciler) Reconcile(ctx context.Context, req ctrl.Request // Fetch the ProjectClaim instance instance := &gcpv1alpha1.ProjectClaim{} - err := r.Get(context.TODO(), req.NamespacedName, instance) + err := r.Get(ctx, req.NamespacedName, instance) if err != nil { if errors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. diff --git a/controllers/projectreference/projectreference_adapter.go b/controllers/projectreference/projectreference_adapter.go index 8b7ec7f0..b52dd61c 100644 --- a/controllers/projectreference/projectreference_adapter.go +++ b/controllers/projectreference/projectreference_adapter.go @@ -1,6 +1,8 @@ package projectreference import ( + "errors" + "context" "crypto/sha256" "encoding/base64" @@ -228,7 +230,7 @@ func EnsureProjectCreated(r *ReferenceAdapter) (util.OperationResult, error) { err := r.createProject(r.OperatorConfig.ParentFolderID) if err != nil { - if err == operrors.ErrInactiveProject { + if errors.Is(err, operrors.ErrInactiveProject) { r.ProjectReference.Status.State = gcpv1alpha1.ProjectReferenceStatusError err := r.kubeClient.Status().Update(context.TODO(), r.ProjectReference) if err != nil { @@ -713,7 +715,7 @@ func (r *ReferenceAdapter) handleAvailabilityZonesError(err error) (util.Operati conditions := &r.ProjectReference.Status.Conditions apiCondition, found := r.conditionManager.FindCondition(conditions, gcpv1alpha1.ConditionComputeApiReady) - tenMinutesAgo := metav1.NewTime(time.Now().Add(time.Duration(-10 * time.Minute))) + tenMinutesAgo := metav1.NewTime(time.Now().Add(-10 * time.Minute)) if found && apiCondition.LastTransitionTime.Before(&tenMinutesAgo) { r.conditionManager.SetCondition(conditions, gcpv1alpha1.ConditionComputeApiReady, corev1.ConditionFalse, "QueryAvailabilityZonesFailed", "ComputeAPI not yet ready, couldn't query availability zones") _ = r.StatusUpdate() @@ -790,7 +792,8 @@ func (r *ReferenceAdapter) SetIAMPolicy(serviceAccountEmail string, policies []s } _, err = r.gcpClient.SetIamPolicy(setIamPolicyRequest) if err != nil { - ae, ok := err.(*googleapi.Error) + var ae *googleapi.Error + ok := errors.As(err, &ae) // retry rules below: if ok && ae.Code == http.StatusConflict && retry < 3 { @@ -827,7 +830,8 @@ func (r *ReferenceAdapter) DeleteIAMPolicy(serviceAccountEmail string, memberTyp } _, err = r.gcpClient.SetIamPolicy(setIamPolicyRequest) if err != nil { - ae, ok := err.(*googleapi.Error) + var ae *googleapi.Error + ok := errors.As(err, &ae) // retry rules below: if ok && ae.Code == http.StatusConflict && retry < 3 { diff --git a/controllers/projectreference/projectreference_adapter_test.go b/controllers/projectreference/projectreference_adapter_test.go index 2eab9d05..9e5cb674 100644 --- a/controllers/projectreference/projectreference_adapter_test.go +++ b/controllers/projectreference/projectreference_adapter_test.go @@ -222,7 +222,7 @@ var _ = Describe("ProjectreferenceAdapter", func() { Type: gcpv1alpha1.ConditionComputeApiReady, Status: corev1.ConditionFalse, LastProbeTime: metav1.NewTime(time.Now()), - LastTransitionTime: metav1.NewTime(time.Now().Add(time.Duration(-9 * time.Minute))), + LastTransitionTime: metav1.NewTime(time.Now().Add(-9 * time.Minute)), Reason: "fake-reason", Message: "fake-message", } @@ -240,7 +240,7 @@ var _ = Describe("ProjectreferenceAdapter", func() { Type: gcpv1alpha1.ConditionComputeApiReady, Status: corev1.ConditionFalse, LastProbeTime: metav1.NewTime(time.Now()), - LastTransitionTime: metav1.NewTime(time.Now().Add(time.Duration(-11 * time.Minute))), + LastTransitionTime: metav1.NewTime(time.Now().Add(-11 * time.Minute)), Reason: "fake-reason", Message: "fake-message", } diff --git a/controllers/projectreference/projectreference_controller.go b/controllers/projectreference/projectreference_controller.go index 8e910e6c..37538328 100644 --- a/controllers/projectreference/projectreference_controller.go +++ b/controllers/projectreference/projectreference_controller.go @@ -67,7 +67,7 @@ func (r *ProjectReferenceReconciler) Reconcile(ctx context.Context, req ctrl.Req reqLogger := log.FromContext(ctx) projectReference := &gcpv1alpha1.ProjectReference{} - err := r.Get(context.TODO(), req.NamespacedName, projectReference) + err := r.Get(ctx, req.NamespacedName, projectReference) if err != nil { if errors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. @@ -78,7 +78,7 @@ func (r *ProjectReferenceReconciler) Reconcile(ctx context.Context, req ctrl.Req return ctrl.Result{}, err } - gcpClient, err := r.getGcpClient(projectReference, reqLogger) + gcpClient, err := r.getGcpClient(projectReference) if err != nil { return ctrl.Result{}, err } @@ -137,7 +137,7 @@ func (r *ProjectReferenceReconciler) ReconcileHandler(adapter *ReferenceAdapter, } // Returns a gcpClient, that uses the access credential Secret in the CCS project namespace or the operator namespace -func (r *ProjectReferenceReconciler) getGcpClient(projectReference *gcpv1alpha1.ProjectReference, logger logr.Logger) (gcpclient.Client, error) { +func (r *ProjectReferenceReconciler) getGcpClient(projectReference *gcpv1alpha1.ProjectReference) (gcpclient.Client, error) { credSecretNamespace := operatorNamespace credSecretName := orgGcpSecretName if projectReference.Spec.CCS { diff --git a/pkg/configmap/configmap.go b/pkg/configmap/configmap.go index c541c86a..b311b251 100644 --- a/pkg/configmap/configmap.go +++ b/pkg/configmap/configmap.go @@ -45,7 +45,7 @@ func GetOperatorConfigMap(kubeClient client.Client) (OperatorConfigMap, error) { var operatorConfigMap OperatorConfigMap configmap := &corev1.ConfigMap{} if err := kubeClient.Get(context.TODO(), kubetypes.NamespacedName{Name: OperatorConfigMapName, Namespace: OperatorConfigMapNamespace}, configmap); err != nil { - return operatorConfigMap, fmt.Errorf("unable to get configmap: %v", err) + return operatorConfigMap, fmt.Errorf("unable to get configmap: %w", err) } if data, ok := configmap.Data[OperatorConfigMapKey]; !ok { diff --git a/pkg/gcpclient/client.go b/pkg/gcpclient/client.go index 823be5b9..5c33a551 100644 --- a/pkg/gcpclient/client.go +++ b/pkg/gcpclient/client.go @@ -74,32 +74,32 @@ func NewClient(projectName string, authJSON []byte) (Client, error) { // since we're using a single creds var, we should specify all the required scopes when initializing creds, err := google.CredentialsFromJSON(ctx, authJSON, "https://www.googleapis.com/auth/cloud-platform") if err != nil { - return nil, fmt.Errorf("gcpclient.NewClient.google.CredentialsFromJSON %v", err) + return nil, fmt.Errorf("gcpclient.NewClient.google.CredentialsFromJSON %w", err) } cloudResourceManagerClient, err := cloudresourcemanager.NewService(ctx, option.WithCredentials(creds)) if err != nil { - return nil, fmt.Errorf("gcpclient.NewClient.cloudresourcemanager.NewService %v", err) + return nil, fmt.Errorf("gcpclient.NewClient.cloudresourcemanager.NewService %w", err) } iamClient, err := iam.NewService(ctx, option.WithCredentials(creds)) if err != nil { - return nil, fmt.Errorf("gcpclient.iam.NewService %v", err) + return nil, fmt.Errorf("gcpclient.iam.NewService %w", err) } serviceUsageClient, err := serviceusage.NewService(ctx, option.WithCredentials(creds)) if err != nil { - return nil, fmt.Errorf("gcpclient.serviceUsageClient.NewService %v", err) + return nil, fmt.Errorf("gcpclient.serviceUsageClient.NewService %w", err) } cloudBillingClient, err := cloudbilling.NewService(ctx, option.WithCredentials(creds)) if err != nil { - return nil, fmt.Errorf("gcpclient.cloudBillingClient.NewService %v", err) + return nil, fmt.Errorf("gcpclient.cloudBillingClient.NewService %w", err) } computeService, err := compute.NewService(ctx, option.WithCredentials(creds)) if err != nil { - return nil, fmt.Errorf("gcpclient.compute.NewService %v", err) + return nil, fmt.Errorf("gcpclient.compute.NewService %w", err) } return &gcpClient{ @@ -161,7 +161,7 @@ func (c *gcpClient) CreateProjectLabels(project *cloudresourcemanager.Project, l _, err := c.cloudResourceManagerClient.Projects.Update(project.ProjectId, project).Do() if err != nil { - return fmt.Errorf("gcpclient.CreateProject.Projects.Update %v", err) + return fmt.Errorf("gcpclient.CreateProject.Projects.Update %w", err) } time.Sleep(3 * time.Second) //Wait 3 seconds to make it more probable the project is updated after returning @@ -186,13 +186,14 @@ func (c *gcpClient) CreateProject(parentFolderID string, claimName string) (*clo } operation, err := c.cloudResourceManagerClient.Projects.Create(&project).Do() if err != nil { - ae, ok := err.(*googleapi.Error) + var ae *googleapi.Error + ok := errors.As(err, &ae) // google uses 409 for "already exists" // we continue as it was created if ok && ae.Code == http.StatusConflict { return &cloudresourcemanager.Operation{}, nil } - return &cloudresourcemanager.Operation{}, fmt.Errorf("gcpclient.CreateProject.Projects.Create %v", err) + return &cloudresourcemanager.Operation{}, fmt.Errorf("gcpclient.CreateProject.Projects.Create %w", err) } time.Sleep(3 * time.Second) //Wait 3 seconds to make it more probable the project is created after returning return operation, nil @@ -202,7 +203,7 @@ func (c *gcpClient) CreateProject(parentFolderID string, claimName string) (*clo func (c *gcpClient) DeleteProject(parentFolder string) (*cloudresourcemanager.Empty, error) { empty, err := c.cloudResourceManagerClient.Projects.Delete(c.projectName).Do() if err != nil { - return &cloudresourcemanager.Empty{}, fmt.Errorf("gcpclient.DeleteProject.Projects.Delete %v", err) + return &cloudresourcemanager.Empty{}, fmt.Errorf("gcpclient.DeleteProject.Projects.Delete %w", err) } return empty, nil } @@ -238,7 +239,7 @@ func (c *gcpClient) CreateServiceAccount(name, displayName string) (*iam.Service func (c *gcpClient) DeleteServiceAccount(accountEmail string) error { _, err := c.iamClient.Projects.ServiceAccounts.Delete(fmt.Sprintf("projects/%s/serviceAccounts/%s", c.projectName, accountEmail)).Do() if err != nil { - return fmt.Errorf("gcpclient.DeleteServiceAccount.Projects.ServiceAccounts.Delete: %v", err) + return fmt.Errorf("gcpclient.DeleteServiceAccount.Projects.ServiceAccounts.Delete: %w", err) } return nil @@ -247,7 +248,7 @@ func (c *gcpClient) DeleteServiceAccount(accountEmail string) error { func (c *gcpClient) CreateServiceAccountKey(serviceAccountEmail string) (*iam.ServiceAccountKey, error) { key, err := c.iamClient.Projects.ServiceAccounts.Keys.Create(fmt.Sprintf("projects/%s/serviceAccounts/%s", c.projectName, serviceAccountEmail), &iam.CreateServiceAccountKeyRequest{}).Do() if err != nil { - return &iam.ServiceAccountKey{}, fmt.Errorf("gcpclient.CreateServiceAccountKey.Projects.ServiceAccounts.Keys.Create: %v", err) + return &iam.ServiceAccountKey{}, fmt.Errorf("gcpclient.CreateServiceAccountKey.Projects.ServiceAccounts.Keys.Create: %w", err) } exp := backoff.NewExponentialBackOff() @@ -268,7 +269,7 @@ func (c *gcpClient) DeleteServiceAccountKeys(serviceAccountEmail string) error { resource := fmt.Sprintf("projects/%s/serviceAccounts/%s", c.projectName, serviceAccountEmail) response, err := c.iamClient.Projects.ServiceAccounts.Keys.List(resource).Do() if err != nil { - return fmt.Errorf("gcpclient.DeleteServiceAccountKeys.Projects.ServiceAccounts.Keys.List: %v", err) + return fmt.Errorf("gcpclient.DeleteServiceAccountKeys.Projects.ServiceAccounts.Keys.List: %w", err) } if len(response.Keys) <= 1 { @@ -282,11 +283,11 @@ func (c *gcpClient) DeleteServiceAccountKeys(serviceAccountEmail string) error { // ensure only one key exits newResponse, err := c.iamClient.Projects.ServiceAccounts.Keys.List(resource).Do() if err != nil { - return fmt.Errorf("gcpclient.DeleteServiceAccountKeys.Projects.ServiceAccounts.Keys.List: %v", err) + return fmt.Errorf("gcpclient.DeleteServiceAccountKeys.Projects.ServiceAccounts.Keys.List: %w", err) } if len(newResponse.Keys) > 1 { - return fmt.Errorf("gcpclient.DeleteServiceAccountKeys.Projects.ServiceAccounts.Keys.Delete: %v", errors.New("could not delete all keys")) + return fmt.Errorf("gcpclient.DeleteServiceAccountKeys.Projects.ServiceAccounts.Keys.Delete: %w", errors.New("could not delete all keys")) } return nil @@ -295,7 +296,7 @@ func (c *gcpClient) DeleteServiceAccountKeys(serviceAccountEmail string) error { func (c *gcpClient) GetIamPolicy(projectName string) (*cloudresourcemanager.Policy, error) { policy, err := c.cloudResourceManagerClient.Projects.GetIamPolicy(projectName, &cloudresourcemanager.GetIamPolicyRequest{}).Do() if err != nil { - return nil, fmt.Errorf("gcpclient.GetIamPolicy.Projects.ServiceAccounts.GetIamPolicy %v", err) + return nil, fmt.Errorf("gcpclient.GetIamPolicy.Projects.ServiceAccounts.GetIamPolicy %w", err) } return policy, nil @@ -336,7 +337,8 @@ func (c *gcpClient) EnableAPI(projectID, api string) error { _, err := req.Do() if err != nil { - ae, ok := err.(*googleapi.Error) + var ae *googleapi.Error + ok := errors.As(err, &ae) // Retry rules below: // sometimes we get 403 - Permission denied when even project diff --git a/pkg/util/util.go b/pkg/util/util.go index 1bf67893..95adfb37 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -69,7 +69,7 @@ func GetGCPCredentialsFromSecret(kubeClient client.Client, namespace, name strin }, secret) if err != nil { - return []byte{}, fmt.Errorf("GetGCPCredentialsFromSecret.Get %v", err) + return []byte{}, fmt.Errorf("GetGCPCredentialsFromSecret.Get %w", err) } var osServiceAccountJSON []byte var ok bool @@ -170,7 +170,10 @@ func InArray(needle interface{}, haystack interface{}) (exists bool, index int) index = -1 switch reflect.TypeOf(haystack).Kind() { + default: + case reflect.Slice: + s := reflect.ValueOf(haystack) for i := 0; i < s.Len(); i++ { From 6589cf051999b7c12ecf36c6beb628f85abd274d Mon Sep 17 00:00:00 2001 From: cgong Date: Wed, 13 May 2026 20:59:34 +1200 Subject: [PATCH 3/3] fix: exhaustive and contextcheck lint errors --- .../projectclaim/projectclaim_controller.go | 2 +- controllers/projectclaim/projectclaim_fake.go | 2 +- .../projectclaim/projectclaimadapter.go | 28 +++++------ .../projectclaim/projectclaimadapter_test.go | 2 +- .../projectreference_adapter.go | 46 ++++++++++--------- .../projectreference_adapter_test.go | 4 +- .../projectreference_controller.go | 14 +++--- pkg/configmap/configmap.go | 4 +- pkg/configmap/configmap_test.go | 4 +- pkg/util/util.go | 14 +++--- pkg/util/utils_test.go | 10 ++-- 11 files changed, 71 insertions(+), 59 deletions(-) diff --git a/controllers/projectclaim/projectclaim_controller.go b/controllers/projectclaim/projectclaim_controller.go index a22f3e61..a7a3fed7 100644 --- a/controllers/projectclaim/projectclaim_controller.go +++ b/controllers/projectclaim/projectclaim_controller.go @@ -82,7 +82,7 @@ func (r *ProjectClaimReconciler) Reconcile(ctx context.Context, req ctrl.Request } conditionManager := condition.NewConditionManager() - adapter := NewProjectClaimAdapter(instance, reqLogger, r.Client, conditionManager) + adapter := NewProjectClaimAdapter(ctx, instance, reqLogger, r.Client, conditionManager) result, err := r.ReconcileHandler(adapter) reason := "ReconcileError" _, _ = adapter.SetProjectClaimCondition(gcpv1alpha1.ConditionError, reason, err) diff --git a/controllers/projectclaim/projectclaim_fake.go b/controllers/projectclaim/projectclaim_fake.go index ab765517..29817fd3 100644 --- a/controllers/projectclaim/projectclaim_fake.go +++ b/controllers/projectclaim/projectclaim_fake.go @@ -16,7 +16,7 @@ import ( ) func (c *ProjectClaimAdapter) CreateFakeSecret() error { - if !gcputil.SecretExists(c.client, c.projectClaim.Spec.GCPCredentialSecret.Name, c.projectClaim.Spec.GCPCredentialSecret.Namespace) { + if !gcputil.SecretExists(c.ctx, c.client, c.projectClaim.Spec.GCPCredentialSecret.Name, c.projectClaim.Spec.GCPCredentialSecret.Namespace) { privateKeyString, err := base64.StdEncoding.DecodeString("SS1hbS1mYWtlLXBhc3M=") if err != nil { return err diff --git a/controllers/projectclaim/projectclaimadapter.go b/controllers/projectclaim/projectclaimadapter.go index 65fd96fe..0225b032 100644 --- a/controllers/projectclaim/projectclaimadapter.go +++ b/controllers/projectclaim/projectclaimadapter.go @@ -21,7 +21,9 @@ import ( ) type ProjectClaimAdapter struct { - projectClaim *gcpv1alpha1.ProjectClaim + projectClaim *gcpv1alpha1.ProjectClaim + ctx context.Context //nolint:containedctx + logger logr.Logger client client.Client projectReference *gcpv1alpha1.ProjectReference @@ -40,9 +42,9 @@ const CCSSecretFinalizer string = "finalizer.gcp.managed.openshift.io/ccs" //#no const RegionCheckFailed string = "RegionCheckFailed" const FakeProjectClaim string = "managed.openshift.com/fake" -func NewProjectClaimAdapter(projectClaim *gcpv1alpha1.ProjectClaim, logger logr.Logger, client client.Client, manager condition.Conditions) *ProjectClaimAdapter { +func NewProjectClaimAdapter(ctx context.Context, projectClaim *gcpv1alpha1.ProjectClaim, logger logr.Logger, client client.Client, manager condition.Conditions) *ProjectClaimAdapter { projectReference := newMatchingProjectReference(projectClaim) - return &ProjectClaimAdapter{projectClaim, logger, client, projectReference, manager} + return &ProjectClaimAdapter{projectClaim, ctx, logger, client, projectReference, manager} } // newMatchingProjectReference creates a ProjectReference CR from a ProjectClaim @@ -74,7 +76,7 @@ func newMatchingProjectReference(projectClaim *gcpv1alpha1.ProjectClaim) *gcpv1a // ProjectReferenceExists checks whether a matching ProjectReference already exists func (c *ProjectClaimAdapter) ProjectReferenceExists() (bool, error) { found := &gcpv1alpha1.ProjectReference{} - err := c.client.Get(context.TODO(), types.NamespacedName{Name: c.projectReference.Name, Namespace: c.projectReference.Namespace}, found) + err := c.client.Get(c.ctx, types.NamespacedName{Name: c.projectReference.Name, Namespace: c.projectReference.Namespace}, found) if err != nil { if errors.IsNotFound(err) { return false, nil @@ -140,7 +142,7 @@ func (c *ProjectClaimAdapter) deleteFinalizer(object client.Object, finalizer st finalizers := metadata.GetFinalizers() if gcputil.Contains(finalizers, finalizer) { metadata.SetFinalizers(gcputil.Filter(finalizers, finalizer)) - return c.client.Update(context.TODO(), object) + return c.client.Update(c.ctx, object) } return nil } @@ -154,7 +156,7 @@ func (c *ProjectClaimAdapter) FinalizeProjectClaim() (ObjectState, error) { projectReferenceDeletionRequested := c.IsProjectReferenceDeletion() if projectReferenceExists && !projectReferenceDeletionRequested { - err := c.client.Delete(context.TODO(), c.projectReference) + err := c.client.Delete(c.ctx, c.projectReference) if err != nil { return ObjectUnchanged, err } @@ -182,7 +184,7 @@ func (c *ProjectClaimAdapter) EnsureProjectClaimInitialized() (gcputil.Operation if c.projectClaim.Status.Conditions == nil { c.projectClaim.Status.Conditions = []gcpv1alpha1.Condition{} - err := c.client.Status().Update(context.TODO(), c.projectClaim) + err := c.client.Status().Update(c.ctx, c.projectClaim) if err != nil { return gcputil.RequeueWithError(operrors.Wrap(err, "failed to initialize projectclaim")) } @@ -201,7 +203,7 @@ func (c *ProjectClaimAdapter) EnsureProjectReferenceLink() (gcputil.OperationRes return gcputil.ContinueProcessing() } c.projectClaim.Spec.ProjectReferenceCRLink = expectedLink - err := c.client.Update(context.TODO(), c.projectClaim) + err := c.client.Update(c.ctx, c.projectClaim) if err != nil { return gcputil.RequeueWithError(err) } @@ -241,7 +243,7 @@ func (c *ProjectClaimAdapter) addFinalizer(object client.Object, finalizer strin finalizers := metadata.GetFinalizers() if !gcputil.Contains(finalizers, finalizer) { metadata.SetFinalizers(append(finalizers, finalizer)) - return c.client.Update(context.TODO(), object) + return c.client.Update(c.ctx, object) } return nil } @@ -253,7 +255,7 @@ func (c *ProjectClaimAdapter) getCCSSecret() (*corev1.Secret, error) { Namespace: c.projectClaim.Spec.CCSSecretRef.Namespace, Name: c.projectClaim.Spec.CCSSecretRef.Name, } - err := c.client.Get(context.TODO(), secretName, secret) + err := c.client.Get(c.ctx, secretName, secret) if err != nil { return nil, err } @@ -269,7 +271,7 @@ func (c *ProjectClaimAdapter) EnsureProjectReferenceExists() (gcputil.OperationR if !projectReferenceExists { return gcputil.RequeueOnErrorOrContinue( - c.client.Create(context.TODO(), c.projectReference)) + c.client.Create(c.ctx, c.projectReference)) } return gcputil.ContinueProcessing() } @@ -331,7 +333,7 @@ func (c *ProjectClaimAdapter) IsRegionSupported() (bool, error) { return true, nil } - operatorConfigMap, err := configmap.GetOperatorConfigMap(c.client) + operatorConfigMap, err := configmap.GetOperatorConfigMap(c.ctx, c.client) if err != nil { return true, operrors.Wrap(err, "could not find the OperatorConfigMap") } @@ -362,7 +364,7 @@ func (c *ProjectClaimAdapter) EnsureRegionSupported() (gcputil.OperationResult, // StatusUpdate updates the project claim status func (c *ProjectClaimAdapter) StatusUpdate() error { - if err := c.client.Status().Update(context.TODO(), c.projectClaim); err != nil { + if err := c.client.Status().Update(c.ctx, c.projectClaim); err != nil { return operrors.Wrap(err, fmt.Sprintf("failed to update ProjectClaim state for %s", c.projectClaim.Name)) } diff --git a/controllers/projectclaim/projectclaimadapter_test.go b/controllers/projectclaim/projectclaimadapter_test.go index bd05fa78..f94dfe40 100644 --- a/controllers/projectclaim/projectclaimadapter_test.go +++ b/controllers/projectclaim/projectclaimadapter_test.go @@ -57,7 +57,7 @@ var _ = Describe("Customresourceadapter", func() { } }) JustBeforeEach(func() { - adapter = NewProjectClaimAdapter(projectClaim, logf.Log.WithName("Test Logger"), mockClient, mockConditions) + adapter = NewProjectClaimAdapter(context.TODO(), projectClaim, logf.Log.WithName("Test Logger"), mockClient, mockConditions) }) AfterEach(func() { diff --git a/controllers/projectreference/projectreference_adapter.go b/controllers/projectreference/projectreference_adapter.go index b52dd61c..b4f6c774 100644 --- a/controllers/projectreference/projectreference_adapter.go +++ b/controllers/projectreference/projectreference_adapter.go @@ -96,7 +96,9 @@ var OSDSharedVPCRoles = []string{ // ReferenceAdapter is used to do all the processing of the ProjectReference type inside the reconcile loop type ReferenceAdapter struct { - ProjectClaim *gcpv1alpha1.ProjectClaim + ProjectClaim *gcpv1alpha1.ProjectClaim + ctx context.Context //nolint:containedctx + ProjectReference *gcpv1alpha1.ProjectReference logger logr.Logger kubeClient client.Client @@ -107,13 +109,15 @@ type ReferenceAdapter struct { // NewReferenceAdapter creates an adapter to turn what is requested in a ProjectReference into a GCP project and write the output back. func NewReferenceAdapter( + ctx context.Context, + projectReference *gcpv1alpha1.ProjectReference, logger logr.Logger, client client.Client, gcpClient gcpclient.Client, manager condition.Conditions, cm configmap.OperatorConfigMap, ) (*ReferenceAdapter, error) { - projectClaim, err := getMatchingClaimLink(projectReference, client) + projectClaim, err := getMatchingClaimLink(ctx, projectReference, client) if err != nil { return &ReferenceAdapter{}, err } @@ -147,13 +151,13 @@ func EnsureProjectClaimReady(r *ReferenceAdapter) (util.OperationResult, error) idModified := r.ensureClaimProjectIDSet() if idModified { - err := r.kubeClient.Update(context.TODO(), r.ProjectClaim) + err := r.kubeClient.Update(r.ctx, r.ProjectClaim) if err != nil { return util.RequeueWithError(operrors.Wrap(err, "error updating ProjectClaim spec")) } } r.ProjectClaim.Status.State = gcpv1alpha1.ClaimStatusReady - if err := r.kubeClient.Status().Update(context.TODO(), r.ProjectClaim); err != nil { + if err := r.kubeClient.Status().Update(r.ctx, r.ProjectClaim); err != nil { return util.RequeueWithError(operrors.Wrap(err, "error updating ProjectClaim status")) } return util.StopProcessing() @@ -172,7 +176,7 @@ func EnsureProjectReferenceStatusCreating(adapter *ReferenceAdapter) (util.Opera return util.ContinueProcessing() } adapter.ProjectReference.Status.State = gcpv1alpha1.ProjectReferenceStatusCreating - err := adapter.kubeClient.Status().Update(context.TODO(), adapter.ProjectReference) + err := adapter.kubeClient.Status().Update(adapter.ctx, adapter.ProjectReference) if err != nil { err = operrors.Wrap(err, "error updating ProjectReference status") return util.RequeueWithError(err) @@ -232,7 +236,7 @@ func EnsureProjectCreated(r *ReferenceAdapter) (util.OperationResult, error) { if err != nil { if errors.Is(err, operrors.ErrInactiveProject) { r.ProjectReference.Status.State = gcpv1alpha1.ProjectReferenceStatusError - err := r.kubeClient.Status().Update(context.TODO(), r.ProjectReference) + err := r.kubeClient.Status().Update(r.ctx, r.ProjectReference) if err != nil { return util.RequeueWithError(operrors.Wrap(err, "error updating ProjectReference status")) } @@ -305,14 +309,14 @@ func EnsureStateReady(r *ReferenceAdapter) (util.OperationResult, error) { if r.ProjectReference.Status.State != gcpv1alpha1.ProjectReferenceStatusReady { r.logger.V(1).Info("Setting Status on projectReference") r.ProjectReference.Status.State = gcpv1alpha1.ProjectReferenceStatusReady - return util.RequeueOnErrorOrStop(r.kubeClient.Status().Update(context.TODO(), r.ProjectReference)) + return util.RequeueOnErrorOrStop(r.kubeClient.Status().Update(r.ctx, r.ProjectReference)) } return util.ContinueProcessing() } -func getMatchingClaimLink(projectReference *gcpv1alpha1.ProjectReference, client client.Client) (*gcpv1alpha1.ProjectClaim, error) { +func getMatchingClaimLink(ctx context.Context, projectReference *gcpv1alpha1.ProjectReference, client client.Client) (*gcpv1alpha1.ProjectClaim, error) { projectClaim := &gcpv1alpha1.ProjectClaim{} - err := client.Get(context.TODO(), types.NamespacedName{Name: projectReference.Spec.ProjectClaimCRLink.Name, Namespace: projectReference.Spec.ProjectClaimCRLink.Namespace}, projectClaim) + err := client.Get(ctx, types.NamespacedName{Name: projectReference.Spec.ProjectClaimCRLink.Name, Namespace: projectReference.Spec.ProjectClaimCRLink.Namespace}, projectClaim) if err != nil { return &gcpv1alpha1.ProjectClaim{}, err @@ -327,7 +331,7 @@ func (r *ReferenceAdapter) UpdateProjectID() error { return err } r.ProjectReference.Spec.GCPProjectID = projectID - return r.kubeClient.Update(context.TODO(), r.ProjectReference) + return r.kubeClient.Update(r.ctx, r.ProjectReference) } func (r *ReferenceAdapter) UpdateServiceAccountName() error { @@ -336,7 +340,7 @@ func (r *ReferenceAdapter) UpdateServiceAccountName() error { serviceAccountNameSuffix := utilrand.String(serviceAccountNameSuffixLength) r.ProjectReference.Spec.ServiceAccountName = serviceAccountNameTemplate(serviceAccountNameSuffix) - return r.kubeClient.Update(context.TODO(), r.ProjectReference) + return r.kubeClient.Update(r.ctx, r.ProjectReference) } func EnsureDeletionProcessed(adapter *ReferenceAdapter) (util.OperationResult, error) { @@ -361,7 +365,7 @@ func (r *ReferenceAdapter) IsDeletionRequested() bool { func EnsureFinalizerAdded(r *ReferenceAdapter) (util.OperationResult, error) { if !util.Contains(r.ProjectReference.GetFinalizers(), FinalizerName) { r.ProjectReference.SetFinalizers(append(r.ProjectReference.GetFinalizers(), FinalizerName)) - return util.RequeueOnErrorOrStop(r.kubeClient.Update(context.TODO(), r.ProjectReference)) + return util.RequeueOnErrorOrStop(r.kubeClient.Update(r.ctx, r.ProjectReference)) } return util.ContinueProcessing() } @@ -372,7 +376,7 @@ func (r *ReferenceAdapter) EnsureFinalizerDeleted() error { finalizers := r.ProjectReference.GetFinalizers() if util.Contains(finalizers, FinalizerName) { r.ProjectReference.SetFinalizers(util.Filter(finalizers, FinalizerName)) - return r.kubeClient.Update(context.TODO(), r.ProjectReference) + return r.kubeClient.Update(r.ctx, r.ProjectReference) } return nil } @@ -443,7 +447,7 @@ func GenerateProjectID() (string, error) { func (r *ReferenceAdapter) clearProjectID() error { r.ProjectReference.Spec.GCPProjectID = "" - return r.kubeClient.Update(context.TODO(), r.ProjectReference) + return r.kubeClient.Update(r.ctx, r.ProjectReference) } // deleteProject checks the Project's lifecycle state of the projectReference.Spec.GCPProjectID instance in Google GCP @@ -619,7 +623,7 @@ func (r *ReferenceAdapter) configureServiceAccount(policies []string) (util.Oper } func (r *ReferenceAdapter) createCredentials() (util.OperationResult, error) { - if util.SecretExists(r.kubeClient, r.ProjectClaim.Spec.GCPCredentialSecret.Name, r.ProjectClaim.Spec.GCPCredentialSecret.Namespace) { + if util.SecretExists(r.ctx, r.kubeClient, r.ProjectClaim.Spec.GCPCredentialSecret.Name, r.ProjectClaim.Spec.GCPCredentialSecret.Namespace) { return util.ContinueProcessing() } @@ -651,7 +655,7 @@ func (r *ReferenceAdapter) createCredentials() (util.OperationResult, error) { }) r.logger.V(1).Info(fmt.Sprintf("Creating Secret %s in namespace %s", r.ProjectClaim.Spec.GCPCredentialSecret.Name, r.ProjectClaim.Spec.GCPCredentialSecret.Namespace)) - createErr := r.kubeClient.Create(context.TODO(), secret) + createErr := r.kubeClient.Create(r.ctx, secret) if createErr != nil { return util.RequeueWithError(operrors.Wrap(createErr, fmt.Sprintf("could not create service account secret for %s", r.ProjectClaim.Spec.GCPCredentialSecret.Name))) } @@ -667,15 +671,15 @@ func (r *ReferenceAdapter) deleteCredentials() error { r.logger.Info("Deleting Credentials") r.logger.V(2).Info("Check if the Secret exists") - if util.SecretExists(r.kubeClient, secret.Name, secret.Namespace) { + if util.SecretExists(r.ctx, r.kubeClient, secret.Name, secret.Namespace) { r.logger.V(2).Info("Getting Secret") - key, err := util.GetSecret(r.kubeClient, secret.Name, secret.Namespace) + key, err := util.GetSecret(r.ctx, r.kubeClient, secret.Name, secret.Namespace) if err != nil { return operrors.Wrap(err, fmt.Sprintf("could not get the service account secret for %s", secret.Name)) } r.logger.V(2).Info("Deleting secret") - err = r.kubeClient.Delete(context.TODO(), key) + err = r.kubeClient.Delete(r.ctx, key) if err != nil { return operrors.Wrap(err, fmt.Sprintf("could not delete service account secret for %s", secret.Name)) } @@ -700,7 +704,7 @@ func (r *ReferenceAdapter) ensureClaimAvailabilityZonesSet() (util.OperationResu r.conditionManager.SetCondition(conditions, gcpv1alpha1.ConditionComputeApiReady, corev1.ConditionTrue, "QueryAvailabilityZonesSucceeded", "ComputeAPI ready, successfully queried availability zones") r.ProjectClaim.Spec.AvailabilityZones = zones - err = r.kubeClient.Update(context.TODO(), r.ProjectClaim) + err = r.kubeClient.Update(r.ctx, r.ProjectClaim) if err != nil { return util.RequeueWithError(operrors.Wrap(err, "error updating ProjectClaim spec")) } @@ -868,7 +872,7 @@ func (r *ReferenceAdapter) SetProjectReferenceCondition(reason string, err error // StatusUpdate updates the project reference status func (r *ReferenceAdapter) StatusUpdate() error { - err := r.kubeClient.Status().Update(context.TODO(), r.ProjectReference) + err := r.kubeClient.Status().Update(r.ctx, r.ProjectReference) if err != nil { return operrors.Wrap(err, fmt.Sprintf("failed to update ProjectReference status of %s", r.ProjectReference.Name)) } diff --git a/controllers/projectreference/projectreference_adapter_test.go b/controllers/projectreference/projectreference_adapter_test.go index 9e5cb674..6cb269b2 100644 --- a/controllers/projectreference/projectreference_adapter_test.go +++ b/controllers/projectreference/projectreference_adapter_test.go @@ -1,6 +1,8 @@ package projectreference_test import ( + "context" + "errors" "strings" "time" @@ -74,7 +76,7 @@ var _ = Describe("ProjectreferenceAdapter", func() { JustBeforeEach(func() { claimLink := types.NamespacedName{Name: projectReference.Spec.ProjectClaimCRLink.Name, Namespace: projectReference.Spec.ProjectClaimCRLink.Namespace} mockKubeClient.EXPECT().Get(gomock.Any(), claimLink, gomock.Any()).SetArg(2, *projectClaim) - adapter, err = NewReferenceAdapter(projectReference, logf.Log.WithName("Test Logger"), mockKubeClient, mockGCPClient, mockConditions, configMap) + adapter, err = NewReferenceAdapter(context.TODO(), projectReference, logf.Log.WithName("Test Logger"), mockKubeClient, mockGCPClient, mockConditions, configMap) Expect(err).NotTo(HaveOccurred()) }) Context("generated project names", func() { diff --git a/controllers/projectreference/projectreference_controller.go b/controllers/projectreference/projectreference_controller.go index 37538328..3f1441f2 100644 --- a/controllers/projectreference/projectreference_controller.go +++ b/controllers/projectreference/projectreference_controller.go @@ -78,18 +78,18 @@ func (r *ProjectReferenceReconciler) Reconcile(ctx context.Context, req ctrl.Req return ctrl.Result{}, err } - gcpClient, err := r.getGcpClient(projectReference) + gcpClient, err := r.getGcpClient(ctx, projectReference) if err != nil { return ctrl.Result{}, err } - cm, err := r.getConfigMap() + cm, err := r.getConfigMap(ctx) if err != nil { return ctrl.Result{}, err } conditionManager := condition.NewConditionManager() - adapter, err := NewReferenceAdapter(projectReference, reqLogger, r.Client, gcpClient, conditionManager, cm) + adapter, err := NewReferenceAdapter(ctx, projectReference, reqLogger, r.Client, gcpClient, conditionManager, cm) if err != nil { err = operrors.Wrap(err, "could not create ReferenceAdapter") return ctrl.Result{}, err @@ -137,7 +137,7 @@ func (r *ProjectReferenceReconciler) ReconcileHandler(adapter *ReferenceAdapter, } // Returns a gcpClient, that uses the access credential Secret in the CCS project namespace or the operator namespace -func (r *ProjectReferenceReconciler) getGcpClient(projectReference *gcpv1alpha1.ProjectReference) (gcpclient.Client, error) { +func (r *ProjectReferenceReconciler) getGcpClient(ctx context.Context, projectReference *gcpv1alpha1.ProjectReference) (gcpclient.Client, error) { credSecretNamespace := operatorNamespace credSecretName := orgGcpSecretName if projectReference.Spec.CCS { @@ -145,7 +145,7 @@ func (r *ProjectReferenceReconciler) getGcpClient(projectReference *gcpv1alpha1. credSecretName = projectReference.Spec.CCSSecretRef.Name } // Get org creds from secret - creds, err := util.GetGCPCredentialsFromSecret(r.Client, credSecretNamespace, credSecretName) + creds, err := util.GetGCPCredentialsFromSecret(ctx, r.Client, credSecretNamespace, credSecretName) if err != nil { err = operrors.Wrap(err, fmt.Sprintf("could not get Creds from secret: %s, for namespace %s", credSecretName, credSecretNamespace)) return nil, err @@ -160,8 +160,8 @@ func (r *ProjectReferenceReconciler) getGcpClient(projectReference *gcpv1alpha1. return gcpClient, nil } -func (r *ProjectReferenceReconciler) getConfigMap() (configmap.OperatorConfigMap, error) { - operatorConfigMap, err := configmap.GetOperatorConfigMap(r.Client) +func (r *ProjectReferenceReconciler) getConfigMap(ctx context.Context) (configmap.OperatorConfigMap, error) { + operatorConfigMap, err := configmap.GetOperatorConfigMap(ctx, r.Client) if err != nil { return operatorConfigMap, operrors.Wrap(err, "could not find the OperatorConfigMap") } diff --git a/pkg/configmap/configmap.go b/pkg/configmap/configmap.go index b311b251..c9b64e9c 100644 --- a/pkg/configmap/configmap.go +++ b/pkg/configmap/configmap.go @@ -41,10 +41,10 @@ func ValidateOperatorConfigMap(configmap OperatorConfigMap) error { } // GetOperatorConfigMap returns a configmap defined in requested namespace and name -func GetOperatorConfigMap(kubeClient client.Client) (OperatorConfigMap, error) { +func GetOperatorConfigMap(ctx context.Context, kubeClient client.Client) (OperatorConfigMap, error) { var operatorConfigMap OperatorConfigMap configmap := &corev1.ConfigMap{} - if err := kubeClient.Get(context.TODO(), kubetypes.NamespacedName{Name: OperatorConfigMapName, Namespace: OperatorConfigMapNamespace}, configmap); err != nil { + if err := kubeClient.Get(ctx, kubetypes.NamespacedName{Name: OperatorConfigMapName, Namespace: OperatorConfigMapNamespace}, configmap); err != nil { return operatorConfigMap, fmt.Errorf("unable to get configmap: %w", err) } diff --git a/pkg/configmap/configmap_test.go b/pkg/configmap/configmap_test.go index cf41eb25..82f73215 100644 --- a/pkg/configmap/configmap_test.go +++ b/pkg/configmap/configmap_test.go @@ -1,6 +1,8 @@ package configmap import ( + "context" + "errors" "testing" @@ -189,7 +191,7 @@ func TestGetOperatorConfigMap(t *testing.T) { t.Run(test.name, func(t *testing.T) { mocks := builders.SetupDefaultMocks(t, test.localObjects) - operatorConfigMap, err := GetOperatorConfigMap(mocks.FakeKubeClient) + operatorConfigMap, err := GetOperatorConfigMap(context.TODO(), mocks.FakeKubeClient) if test.expectedErr != nil { assert.Error(t, err) diff --git a/pkg/util/util.go b/pkg/util/util.go index 95adfb37..876d0cf5 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -22,18 +22,18 @@ const ( ) // SecretExists returns a boolean to the caller based on the secretName and namespace args. -func SecretExists(kubeClient client.Client, secretName, namespace string) bool { +func SecretExists(ctx context.Context, kubeClient client.Client, secretName, namespace string) bool { s := &corev1.Secret{} - err := kubeClient.Get(context.TODO(), kubetypes.NamespacedName{Name: secretName, Namespace: namespace}, s) + err := kubeClient.Get(ctx, kubetypes.NamespacedName{Name: secretName, Namespace: namespace}, s) return err == nil } // GetSecret returns a secret based on a secretName and namespace. -func GetSecret(kubeClient client.Client, secretName, namespace string) (*corev1.Secret, error) { +func GetSecret(ctx context.Context, kubeClient client.Client, secretName, namespace string) (*corev1.Secret, error) { s := &corev1.Secret{} - err := kubeClient.Get(context.TODO(), kubetypes.NamespacedName{Name: secretName, Namespace: namespace}, s) + err := kubeClient.Get(ctx, kubetypes.NamespacedName{Name: secretName, Namespace: namespace}, s) if err != nil { return &corev1.Secret{}, err @@ -60,9 +60,9 @@ func NewGCPSecretCR(creds string, namespacedNamed kubetypes.NamespacedName) *cor } // GetGCPCredentialsFromSecret extracts the gcp credentials from a secret. return value is a bytearray -func GetGCPCredentialsFromSecret(kubeClient client.Client, namespace, name string) ([]byte, error) { +func GetGCPCredentialsFromSecret(ctx context.Context, kubeClient client.Client, namespace, name string) ([]byte, error) { secret := &corev1.Secret{} - err := kubeClient.Get(context.TODO(), + err := kubeClient.Get(ctx, kubetypes.NamespacedName{ Namespace: namespace, Name: name, @@ -169,7 +169,7 @@ func InArray(needle interface{}, haystack interface{}) (exists bool, index int) exists = false index = -1 - switch reflect.TypeOf(haystack).Kind() { + switch reflect.TypeOf(haystack).Kind() { //nolint:exhaustive default: case reflect.Slice: diff --git a/pkg/util/utils_test.go b/pkg/util/utils_test.go index 7ae67eed..3d8ecec7 100644 --- a/pkg/util/utils_test.go +++ b/pkg/util/utils_test.go @@ -1,6 +1,8 @@ package util import ( + "context" + "fmt" "testing" @@ -46,7 +48,7 @@ func TestSecretExists(t *testing.T) { t.Run(test.name, func(t *testing.T) { mocks := builders.SetupDefaultMocks(t, test.localObjects) - result := SecretExists(mocks.FakeKubeClient, test.secretName, test.secretNamespace) + result := SecretExists(context.TODO(), mocks.FakeKubeClient, test.secretName, test.secretNamespace) assert.Equal(t, test.expectedResult, result) }) } @@ -95,7 +97,7 @@ func TestGetSecret(t *testing.T) { t.Run(test.name, func(t *testing.T) { mocks := builders.SetupDefaultMocks(t, test.localObjects) - result, err := GetSecret(mocks.FakeKubeClient, test.secretName, test.secretNamespace) + result, err := GetSecret(context.TODO(), mocks.FakeKubeClient, test.secretName, test.secretNamespace) if test.expectedErr { assert.Error(t, err) @@ -166,7 +168,7 @@ func TestGetGCPCredentialsFromSecret(t *testing.T) { assert.Equal(t, expected, result) }, validateErr: func(t *testing.T, expected, result error) { - assert.Equal(t, expected, result) + assert.EqualError(t, result, expected.Error()) }, }, } @@ -175,7 +177,7 @@ func TestGetGCPCredentialsFromSecret(t *testing.T) { t.Run(test.name, func(t *testing.T) { mocks := builders.SetupDefaultMocks(t, test.localObjects) - result, err := GetGCPCredentialsFromSecret(mocks.FakeKubeClient, test.secretNamespace, "testCreds") + result, err := GetGCPCredentialsFromSecret(context.TODO(), mocks.FakeKubeClient, test.secretNamespace, "testCreds") if test.expectedErr != nil { assert.Error(t, err)