diff --git a/cmd/manager/main.go b/cmd/manager/main.go index e3be10ab7..d14fe3279 100644 --- a/cmd/manager/main.go +++ b/cmd/manager/main.go @@ -11,6 +11,7 @@ import ( "github.com/openshift/gcp-project-operator/pkg/apis" "github.com/openshift/gcp-project-operator/pkg/controller" + logtypes "github.com/openshift/gcp-project-operator/pkg/util/types" "github.com/operator-framework/operator-sdk/pkg/leader" "github.com/operator-framework/operator-sdk/pkg/log/zap" @@ -32,9 +33,9 @@ var ( var log = logf.Log.WithName("cmd") func printVersion() { - log.Info(fmt.Sprintf("Go Version: %s", runtime.Version())) - log.Info(fmt.Sprintf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH)) - log.Info(fmt.Sprintf("Version of operator-sdk: %v", sdkVersion.Version)) + log.V(logtypes.OperatorSDK).Info(fmt.Sprintf("Go Version: %s", runtime.Version())) + log.V(logtypes.OperatorSDK).Info(fmt.Sprintf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH)) + log.V(logtypes.OperatorSDK).Info(fmt.Sprintf("Version of operator-sdk: %v", sdkVersion.Version)) } func main() { @@ -95,7 +96,7 @@ func run() error { return err } - log.Info("Registering Components.") + log.V(logtypes.OperatorSDK).Info("Registering Components.") // Setup Scheme for all resources if err := apis.AddToScheme(mgr.GetScheme()); err != nil { @@ -112,15 +113,15 @@ func run() error { // Create Service object to expose the metrics port. _, err = metrics.ExposeMetricsPort(ctx, metricsPort) if err != nil { - log.Info(err.Error()) + log.V(logtypes.OperatorSDK).Info(err.Error()) } // start cache and wait for sync - log.Info("init chache") + log.V(logtypes.OperatorSDK).Info("init chache") cache := mgr.GetCache() go cache.Start(stopCh) cache.WaitForCacheSync(stopCh) - log.Info("Starting the Cmd.") + log.V(logtypes.OperatorSDK).Info("Starting the Cmd.") // Start the Cmd return mgr.Start(stopCh) diff --git a/docs/debug.md b/docs/debug.md index 8b17416a3..3e59c4224 100644 --- a/docs/debug.md +++ b/docs/debug.md @@ -2,6 +2,32 @@ Some useful commands: +### Log verbosity + +You can modify the verbosity by adding `args:`to the [operator.yaml](../deploy/operator.yaml) + +If you want to see `info` logs coming from the `ProjectReference` use `--zap-level=X`, where X can be: + +1. ProjectReference logs +2. ProjectClaim logs +3. gcp client logs +4. operator-sdk logs (golang version, etc) + +as described in the type [ComponentLogLevel](../pkg/util/types/comonentloglevel.go) + +e.g. if you are interested only in error messages, you can do it like this: + +```yaml + containers: + - name: gcp-project-operator + image: quay.io/app-sre/gcp-project-operator + command: + - gcp-project-operator + args: + - '--zap-level=error' + imagePullPolicy: Always +``` + ### ProjectClaim The `ProjectClaim` is getting deployed onto a namespace defined at the Resource. diff --git a/docs/development.md b/docs/development.md index 948bcf073..5708c5c5e 100644 --- a/docs/development.md +++ b/docs/development.md @@ -37,7 +37,7 @@ The operator can run either: No matter which option you choose, before running the Operator you have to create the following Custom Resource Definitions on the cluster: -```zsh +```shell kubectl create -f deploy/crds/gcp_v1alpha1_projectclaim_crd.yaml kubectl create -f deploy/crds/gcp_v1alpha1_projectreference_crd.yaml ``` @@ -46,20 +46,33 @@ kubectl create -f deploy/crds/gcp_v1alpha1_projectreference_crd.yaml Make sure you have the [operator-sdk](https://github.com/operator-framework/operator-sdk/releases) binary in your `$PATH` and run it locally: -```zsh +```shell $ operator-sdk run --local --namespace gcp-project-operator ``` You will see some initialization logs. The Operator will remain _idle_ after that, waiting for `ProjectClaim` resources to be present in the cluster. +You can change the verbosity of the logs, by passing the `--zap-level` flag as part of the `--operator-flags`: + +```shell +run --local --namespace gcp-project-operator --operator-flags --zap-level=99 +``` + +* Level 1: ProjectReference +* Level 2: ProjectClaim +* Level 3: gcpclient +* Level 4: operator-sdk framrwork logs (golang version, etc) + +all of the levels are saved in an package called [github.com/openshift/gcp-project-operator/pkg/util/types](../pkg/util/types/comonentlog) + ### Remotely #### Pushing Image a container registry Push the image to your container registry of your choice. For example: -```bash +```shell username="razevedo" podman build . -f build/Dockerfile -t "quay.io/$username/gcp-project-operator" podman push "quay.io/$username/gcp-project-operator" @@ -85,7 +98,7 @@ kubectl scale deployment gcp-project-operator -n gcp-project-operator --replicas Otherwise, you can directly upload the image to your kubernetes cluster by hand -```zsh +```shell # Export the image locally docker save $image-name > image-name.tar diff --git a/pkg/controller/projectclaim/projectclaim_controller.go b/pkg/controller/projectclaim/projectclaim_controller.go index 635ef77ca..09b8a658a 100644 --- a/pkg/controller/projectclaim/projectclaim_controller.go +++ b/pkg/controller/projectclaim/projectclaim_controller.go @@ -79,7 +79,6 @@ func NewReconcileProjectClaim(client client.Client, scheme *runtime.Scheme) *Rec // Reconcile calls ReconcileHandler and updates the CRD if any err occurs func (r *ReconcileProjectClaim) Reconcile(request reconcile.Request) (reconcile.Result, error) { reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) - reqLogger.Info("Reconciling ProjectClaim") // Fetch the ProjectClaim instance instance := &gcpv1alpha1.ProjectClaim{} diff --git a/pkg/controller/projectclaim/projectclaimadapter.go b/pkg/controller/projectclaim/projectclaimadapter.go index ef67e3afd..539236c70 100644 --- a/pkg/controller/projectclaim/projectclaimadapter.go +++ b/pkg/controller/projectclaim/projectclaimadapter.go @@ -6,6 +6,8 @@ import ( "github.com/go-logr/logr" "github.com/openshift/cluster-api/pkg/util" + logtypes "github.com/openshift/gcp-project-operator/pkg/util/types" + gcpv1alpha1 "github.com/openshift/gcp-project-operator/pkg/apis/gcp/v1alpha1" condition "github.com/openshift/gcp-project-operator/pkg/condition" operrors "github.com/openshift/gcp-project-operator/pkg/util/errors" @@ -175,7 +177,7 @@ func (c *ProjectClaimAdapter) EnsureProjectReferenceLink() (ObjectState, error) func (c *ProjectClaimAdapter) EnsureFinalizer() (ObjectState, error) { if !util.Contains(c.projectClaim.GetFinalizers(), ProjectClaimFinalizer) { - c.logger.Info("Adding Finalizer to the ProjectClaim") + c.logger.V(int(logtypes.ProjectClaim)).Info("Adding Finalizer to the ProjectClaim") c.projectClaim.SetFinalizers(append(c.projectClaim.GetFinalizers(), ProjectClaimFinalizer)) err := c.client.Update(context.TODO(), c.projectClaim) diff --git a/pkg/controller/projectreference/projectreference_adapter.go b/pkg/controller/projectreference/projectreference_adapter.go index 79e0f6265..730547fad 100644 --- a/pkg/controller/projectreference/projectreference_adapter.go +++ b/pkg/controller/projectreference/projectreference_adapter.go @@ -17,6 +17,7 @@ import ( "github.com/openshift/gcp-project-operator/pkg/gcpclient" gcputil "github.com/openshift/gcp-project-operator/pkg/util" operrors "github.com/openshift/gcp-project-operator/pkg/util/errors" + logtypes "github.com/openshift/gcp-project-operator/pkg/util/types" "google.golang.org/api/cloudresourcemanager/v1" "google.golang.org/api/googleapi" "google.golang.org/api/iam/v1" @@ -96,7 +97,6 @@ func (r *ReferenceAdapter) EnsureProjectClaimReady() (gcpv1alpha1.ClaimStatus, e } if r.ProjectReference.Status.State == gcpv1alpha1.ProjectReferenceStatusReady && r.ProjectClaim.Status.State == gcpv1alpha1.ClaimStatusReady { - r.logger.Info("ProjectReference and ProjectClaim CR are in READY state nothing to process.") return r.ProjectClaim.Status.State, nil } @@ -148,21 +148,21 @@ func (r *ReferenceAdapter) EnsureProjectConfigured() error { return err } - r.logger.Info("Configuring APIS") + r.logger.V(int(logtypes.ProjectReference)).Info("Configuring APIS") err = r.configureAPIS(configMap) if err != nil { r.logger.Error(err, "Error configuring APIS") return err } - r.logger.Info("Configuring Service Account") + r.logger.V(int(logtypes.ProjectReference)).Info("Configuring Service Account") err = r.configureServiceAccount() if err != nil { r.logger.Error(err, "Error configuring service account") return err } - r.logger.Info("Creating Credentials") + r.logger.V(int(logtypes.ProjectReference)).Info("Creating Credentials") err = r.createCredentials() if err != nil { r.logger.Error(err, "Error creating credentials") @@ -172,7 +172,7 @@ func (r *ReferenceAdapter) EnsureProjectConfigured() error { func (r *ReferenceAdapter) EnsureStateReady() error { if r.ProjectReference.Status.State != gcpv1alpha1.ProjectReferenceStatusReady { - r.logger.Info("Setting Status on projectReference") + r.logger.V(int(logtypes.ProjectReference)).Info("Setting Status on projectReference") r.ProjectReference.Status.State = gcpv1alpha1.ProjectReferenceStatusReady return r.kubeClient.Status().Update(context.TODO(), r.ProjectReference) } @@ -299,7 +299,7 @@ func (r *ReferenceAdapter) createProject(parentFolderID string) error { if projectExists { switch project.LifecycleState { case "ACTIVE": - r.logger.Info("Project lifecycleState == ACTIVE") + r.logger.V(int(logtypes.ProjectReference)).Info("Project lifecycleState == ACTIVE") return nil case "DELETE_REQUESTED": return operrors.ErrInactiveProject @@ -309,12 +309,12 @@ func (r *ReferenceAdapter) createProject(parentFolderID string) error { } } - r.logger.Info("Creating Project") + r.logger.V(int(logtypes.ProjectReference)).Info("Creating Project") // If we cannot create the project clear the projectID from spec so we can try again with another unique key _, err = r.gcpClient.CreateProject(parentFolderID) if err != nil { r.logger.Error(err, "could not create project", "Parent Folder ID", parentFolderID, "Requested Project ID", r.ProjectReference.Spec.GCPProjectID) - r.logger.Info("Clearing gcpProjectID from ProjectReferenceSpec") + r.logger.V(int(logtypes.ProjectReference)).Info("Clearing gcpProjectID from ProjectReferenceSpec") //Todo() We need to requeue here ot it will continue to the next step. err = r.clearProjectID() if err != nil { @@ -340,14 +340,14 @@ func (r *ReferenceAdapter) getProject(projectId string) (*cloudresourcemanager.P } func (r *ReferenceAdapter) configureAPIS(config configmap.OperatorConfigMap) error { - r.logger.Info("Enabling Billing API") + r.logger.V(int(logtypes.ProjectReference)).Info("Enabling Billing API") err := r.gcpClient.EnableAPI(r.ProjectReference.Spec.GCPProjectID, "cloudbilling.googleapis.com") if err != nil { r.logger.Error(err, fmt.Sprintf("Error enabling %s api for project %s", "cloudbilling.googleapis.com", r.ProjectReference.Spec.GCPProjectID)) return err } - r.logger.Info("Linking Cloud Billing Account") + r.logger.V(int(logtypes.ProjectReference)).Info("Linking Cloud Billing Account") err = r.gcpClient.CreateCloudBillingAccount(r.ProjectReference.Spec.GCPProjectID, config.BillingAccount) if err != nil { r.logger.Error(err, "error creating CloudBilling") @@ -385,7 +385,7 @@ func (r *ReferenceAdapter) configureServiceAccount() error { serviceAccount, err := r.gcpClient.GetServiceAccount(osdServiceAccountName) if err != nil { // Create OSDManged Service account - r.logger.Info("Creating Service Account") + r.logger.V(int(logtypes.ProjectReference)).Info("Creating Service Account") account, err := r.gcpClient.CreateServiceAccount(osdServiceAccountName, osdServiceAccountName) if err != nil { r.logger.Error(err, "could not create service account", "Service Account Name", osdServiceAccountName) @@ -394,7 +394,7 @@ func (r *ReferenceAdapter) configureServiceAccount() error { serviceAccount = account } - r.logger.Info("Setting Service Account Policies") + r.logger.V(int(logtypes.ProjectReference)).Info("Setting Service Account Policies") err = r.SetIAMPolicy(serviceAccount.Email) if err != nil { r.logger.Error(err, "could not update policy on project", "Project Name", r.ProjectReference.Spec.GCPProjectID) @@ -411,7 +411,7 @@ func (r *ReferenceAdapter) createCredentials() error { return err } - r.logger.Info("Creating Service AccountKey") + r.logger.V(int(logtypes.ProjectReference)).Info("Creating Service AccountKey") key, err := r.gcpClient.CreateServiceAccountKey(serviceAccount.Email) if err != nil { r.logger.Error(err, "could not create service account key", "Service Account Name", serviceAccount.Email) @@ -430,7 +430,7 @@ func (r *ReferenceAdapter) createCredentials() error { Name: r.ProjectClaim.Spec.GCPCredentialSecret.Name, }) - r.logger.Info(fmt.Sprintf("Creating Secret %s in namespace %s", r.ProjectClaim.Spec.GCPCredentialSecret.Name, r.ProjectClaim.Spec.GCPCredentialSecret.Namespace)) + r.logger.V(int(logtypes.ProjectReference)).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) if createErr != nil { r.logger.Error(createErr, "could not create service account secret ", "Service Account Secret Name", r.ProjectClaim.Spec.GCPCredentialSecret.Name) diff --git a/pkg/controller/projectreference/projectreference_controller.go b/pkg/controller/projectreference/projectreference_controller.go index 4d479c133..7b17b2ba4 100644 --- a/pkg/controller/projectreference/projectreference_controller.go +++ b/pkg/controller/projectreference/projectreference_controller.go @@ -9,6 +9,7 @@ import ( condition "github.com/openshift/gcp-project-operator/pkg/condition" "github.com/openshift/gcp-project-operator/pkg/gcpclient" "github.com/openshift/gcp-project-operator/pkg/util" + logtypes "github.com/openshift/gcp-project-operator/pkg/util/types" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -81,7 +82,6 @@ type ReconcileProjectReference struct { // Reconcile wraps ReconcileHandler() and updates the conditions if any error occurs func (r *ReconcileProjectReference) Reconcile(request reconcile.Request) (reconcile.Result, error) { reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) - reqLogger.Info("Reconciling ProjectReference") projectReference := &gcpv1alpha1.ProjectReference{} err := r.client.Get(context.TODO(), request.NamespacedName, projectReference) @@ -156,7 +156,7 @@ func (r *ReconcileProjectReference) ReconcileHandler(adapter *ReferenceAdapter, } if adapter.ProjectReference.Spec.GCPProjectID == "" { - reqLogger.Info("Creating ProjectID in ProjectReference CR") + reqLogger.V(int(logtypes.ProjectReference)).Info("Creating ProjectID in ProjectReference CR") err := adapter.UpdateProjectID() if err != nil { reqLogger.Error(err, "Could not update ProjectID in Project Reference CR") @@ -165,14 +165,14 @@ func (r *ReconcileProjectReference) ReconcileHandler(adapter *ReferenceAdapter, return r.requeue() } - reqLogger.Info("Adding a Finalizer") + reqLogger.V(int(logtypes.ProjectReference)).Info("Adding a Finalizer") err = adapter.EnsureFinalizerAdded() if err != nil { reqLogger.Error(err, "Error adding the finalizer") return r.requeueOnErr(err) } - reqLogger.Info("Configuring Project") + reqLogger.V(int(logtypes.ProjectReference)).Info("Configuring Project") err = adapter.EnsureProjectConfigured() if err != nil { return r.requeueAfter(5*time.Second, err) diff --git a/pkg/gcpclient/client.go b/pkg/gcpclient/client.go index a86a416df..acb73f83c 100644 --- a/pkg/gcpclient/client.go +++ b/pkg/gcpclient/client.go @@ -12,6 +12,7 @@ import ( "strings" "time" + logtypes "github.com/openshift/gcp-project-operator/pkg/util/types" "golang.org/x/oauth2/google" cloudbilling "google.golang.org/api/cloudbilling/v1" cloudresourcemanager "google.golang.org/api/cloudresourcemanager/v1" @@ -157,7 +158,7 @@ func (c *gcpClient) GetProject(projectID string) (*cloudresourcemanager.Project, // CreateProject creates a project in a given folder. func (c *gcpClient) CreateProject(parentFolderID string) (*cloudresourcemanager.Operation, error) { - log.Info("gcpClient.CreateProject") + log.V(logtypes.GCPClient).Info("gcpClient.CreateProject") project := cloudresourcemanager.Project{ //Labels: nil, Name: c.projectName, @@ -281,7 +282,7 @@ func (c *gcpClient) SetIamPolicy(setIamPolicyRequest *cloudresourcemanager.SetIa } func (c *gcpClient) EnableAPI(projectID, api string) error { - log.Info(fmt.Sprintf("enable %s api", api)) + log.V(logtypes.GCPClient).Info(fmt.Sprintf("enable %s api", api)) enableServicerequest := &serviceManagment.EnableServiceRequest{ ConsumerId: fmt.Sprintf("project:%s", projectID), } @@ -302,7 +303,7 @@ func (c *gcpClient) EnableAPI(projectID, api string) error { // creation is completed and marked as Done. // Something is not propagating in the backend. if ok && ae.Code == http.StatusForbidden && retry <= gcpAPIRetriesCount { - log.Info(fmt.Sprintf("retry %d for enable %s api", retry, api)) + log.V(logtypes.GCPClient).Info(fmt.Sprintf("retry %d for enable %s api", retry, api)) continue } return err diff --git a/pkg/util/mocks/gcpclient/client.go b/pkg/util/mocks/gcpclient/client.go index 0cea8cd95..82f886b58 100644 --- a/pkg/util/mocks/gcpclient/client.go +++ b/pkg/util/mocks/gcpclient/client.go @@ -5,37 +5,36 @@ package gcpclient import ( - reflect "reflect" - gomock "github.com/golang/mock/gomock" cloudresourcemanager "google.golang.org/api/cloudresourcemanager/v1" iam "google.golang.org/api/iam/v1" + reflect "reflect" ) -// MockClient is a mock of Client interface +// MockClient is a mock of Client interface. type MockClient struct { ctrl *gomock.Controller recorder *MockClientMockRecorder } -// MockClientMockRecorder is the mock recorder for MockClient +// MockClientMockRecorder is the mock recorder for MockClient. type MockClientMockRecorder struct { mock *MockClient } -// NewMockClient creates a new mock instance +// NewMockClient creates a new mock instance. func NewMockClient(ctrl *gomock.Controller) *MockClient { mock := &MockClient{ctrl: ctrl} mock.recorder = &MockClientMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockClient) EXPECT() *MockClientMockRecorder { return m.recorder } -// GetServiceAccount mocks base method +// GetServiceAccount mocks base method. func (m *MockClient) GetServiceAccount(accountName string) (*iam.ServiceAccount, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetServiceAccount", accountName) @@ -44,13 +43,13 @@ func (m *MockClient) GetServiceAccount(accountName string) (*iam.ServiceAccount, return ret0, ret1 } -// GetServiceAccount indicates an expected call of GetServiceAccount +// GetServiceAccount indicates an expected call of GetServiceAccount. func (mr *MockClientMockRecorder) GetServiceAccount(accountName interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetServiceAccount", reflect.TypeOf((*MockClient)(nil).GetServiceAccount), accountName) } -// CreateServiceAccount mocks base method +// CreateServiceAccount mocks base method. func (m *MockClient) CreateServiceAccount(name, displayName string) (*iam.ServiceAccount, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateServiceAccount", name, displayName) @@ -59,13 +58,13 @@ func (m *MockClient) CreateServiceAccount(name, displayName string) (*iam.Servic return ret0, ret1 } -// CreateServiceAccount indicates an expected call of CreateServiceAccount +// CreateServiceAccount indicates an expected call of CreateServiceAccount. func (mr *MockClientMockRecorder) CreateServiceAccount(name, displayName interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateServiceAccount", reflect.TypeOf((*MockClient)(nil).CreateServiceAccount), name, displayName) } -// DeleteServiceAccount mocks base method +// DeleteServiceAccount mocks base method. func (m *MockClient) DeleteServiceAccount(accountEmail string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteServiceAccount", accountEmail) @@ -73,13 +72,13 @@ func (m *MockClient) DeleteServiceAccount(accountEmail string) error { return ret0 } -// DeleteServiceAccount indicates an expected call of DeleteServiceAccount +// DeleteServiceAccount indicates an expected call of DeleteServiceAccount. func (mr *MockClientMockRecorder) DeleteServiceAccount(accountEmail interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteServiceAccount", reflect.TypeOf((*MockClient)(nil).DeleteServiceAccount), accountEmail) } -// CreateServiceAccountKey mocks base method +// CreateServiceAccountKey mocks base method. func (m *MockClient) CreateServiceAccountKey(serviceAccountEmail string) (*iam.ServiceAccountKey, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateServiceAccountKey", serviceAccountEmail) @@ -88,13 +87,13 @@ func (m *MockClient) CreateServiceAccountKey(serviceAccountEmail string) (*iam.S return ret0, ret1 } -// CreateServiceAccountKey indicates an expected call of CreateServiceAccountKey +// CreateServiceAccountKey indicates an expected call of CreateServiceAccountKey. func (mr *MockClientMockRecorder) CreateServiceAccountKey(serviceAccountEmail interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateServiceAccountKey", reflect.TypeOf((*MockClient)(nil).CreateServiceAccountKey), serviceAccountEmail) } -// DeleteServiceAccountKeys mocks base method +// DeleteServiceAccountKeys mocks base method. func (m *MockClient) DeleteServiceAccountKeys(serviceAccountEmail string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteServiceAccountKeys", serviceAccountEmail) @@ -102,13 +101,13 @@ func (m *MockClient) DeleteServiceAccountKeys(serviceAccountEmail string) error return ret0 } -// DeleteServiceAccountKeys indicates an expected call of DeleteServiceAccountKeys +// DeleteServiceAccountKeys indicates an expected call of DeleteServiceAccountKeys. func (mr *MockClientMockRecorder) DeleteServiceAccountKeys(serviceAccountEmail interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteServiceAccountKeys", reflect.TypeOf((*MockClient)(nil).DeleteServiceAccountKeys), serviceAccountEmail) } -// GetIamPolicy mocks base method +// GetIamPolicy mocks base method. func (m *MockClient) GetIamPolicy(projectName string) (*cloudresourcemanager.Policy, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetIamPolicy", projectName) @@ -117,13 +116,13 @@ func (m *MockClient) GetIamPolicy(projectName string) (*cloudresourcemanager.Pol return ret0, ret1 } -// GetIamPolicy indicates an expected call of GetIamPolicy +// GetIamPolicy indicates an expected call of GetIamPolicy. func (mr *MockClientMockRecorder) GetIamPolicy(projectName interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetIamPolicy", reflect.TypeOf((*MockClient)(nil).GetIamPolicy), projectName) } -// SetIamPolicy mocks base method +// SetIamPolicy mocks base method. func (m *MockClient) SetIamPolicy(setIamPolicyRequest *cloudresourcemanager.SetIamPolicyRequest) (*cloudresourcemanager.Policy, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SetIamPolicy", setIamPolicyRequest) @@ -132,13 +131,13 @@ func (m *MockClient) SetIamPolicy(setIamPolicyRequest *cloudresourcemanager.SetI return ret0, ret1 } -// SetIamPolicy indicates an expected call of SetIamPolicy +// SetIamPolicy indicates an expected call of SetIamPolicy. func (mr *MockClientMockRecorder) SetIamPolicy(setIamPolicyRequest interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIamPolicy", reflect.TypeOf((*MockClient)(nil).SetIamPolicy), setIamPolicyRequest) } -// ListProjects mocks base method +// ListProjects mocks base method. func (m *MockClient) ListProjects() ([]*cloudresourcemanager.Project, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListProjects") @@ -147,13 +146,13 @@ func (m *MockClient) ListProjects() ([]*cloudresourcemanager.Project, error) { return ret0, ret1 } -// ListProjects indicates an expected call of ListProjects +// ListProjects indicates an expected call of ListProjects. func (mr *MockClientMockRecorder) ListProjects() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListProjects", reflect.TypeOf((*MockClient)(nil).ListProjects)) } -// CreateProject mocks base method +// CreateProject mocks base method. func (m *MockClient) CreateProject(parentFolder string) (*cloudresourcemanager.Operation, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateProject", parentFolder) @@ -162,13 +161,13 @@ func (m *MockClient) CreateProject(parentFolder string) (*cloudresourcemanager.O return ret0, ret1 } -// CreateProject indicates an expected call of CreateProject +// CreateProject indicates an expected call of CreateProject. func (mr *MockClientMockRecorder) CreateProject(parentFolder interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateProject", reflect.TypeOf((*MockClient)(nil).CreateProject), parentFolder) } -// DeleteProject mocks base method +// DeleteProject mocks base method. func (m *MockClient) DeleteProject(parentFolder string) (*cloudresourcemanager.Empty, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteProject", parentFolder) @@ -177,13 +176,13 @@ func (m *MockClient) DeleteProject(parentFolder string) (*cloudresourcemanager.E return ret0, ret1 } -// DeleteProject indicates an expected call of DeleteProject +// DeleteProject indicates an expected call of DeleteProject. func (mr *MockClientMockRecorder) DeleteProject(parentFolder interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteProject", reflect.TypeOf((*MockClient)(nil).DeleteProject), parentFolder) } -// GetProject mocks base method +// GetProject mocks base method. func (m *MockClient) GetProject(projectID string) (*cloudresourcemanager.Project, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetProject", projectID) @@ -192,13 +191,13 @@ func (m *MockClient) GetProject(projectID string) (*cloudresourcemanager.Project return ret0, ret1 } -// GetProject indicates an expected call of GetProject +// GetProject indicates an expected call of GetProject. func (mr *MockClientMockRecorder) GetProject(projectID interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProject", reflect.TypeOf((*MockClient)(nil).GetProject), projectID) } -// EnableAPI mocks base method +// EnableAPI mocks base method. func (m *MockClient) EnableAPI(projectID, api string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "EnableAPI", projectID, api) @@ -206,13 +205,13 @@ func (m *MockClient) EnableAPI(projectID, api string) error { return ret0 } -// EnableAPI indicates an expected call of EnableAPI +// EnableAPI indicates an expected call of EnableAPI. func (mr *MockClientMockRecorder) EnableAPI(projectID, api interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnableAPI", reflect.TypeOf((*MockClient)(nil).EnableAPI), projectID, api) } -// CreateCloudBillingAccount mocks base method +// CreateCloudBillingAccount mocks base method. func (m *MockClient) CreateCloudBillingAccount(projectID, billingAccount string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateCloudBillingAccount", projectID, billingAccount) @@ -220,13 +219,13 @@ func (m *MockClient) CreateCloudBillingAccount(projectID, billingAccount string) return ret0 } -// CreateCloudBillingAccount indicates an expected call of CreateCloudBillingAccount +// CreateCloudBillingAccount indicates an expected call of CreateCloudBillingAccount. func (mr *MockClientMockRecorder) CreateCloudBillingAccount(projectID, billingAccount interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateCloudBillingAccount", reflect.TypeOf((*MockClient)(nil).CreateCloudBillingAccount), projectID, billingAccount) } -// ListAvilibilityZones mocks base method +// ListAvilibilityZones mocks base method. func (m *MockClient) ListAvilibilityZones(projectID, region string) ([]string, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListAvilibilityZones", projectID, region) @@ -235,7 +234,7 @@ func (m *MockClient) ListAvilibilityZones(projectID, region string) ([]string, e return ret0, ret1 } -// ListAvilibilityZones indicates an expected call of ListAvilibilityZones +// ListAvilibilityZones indicates an expected call of ListAvilibilityZones. func (mr *MockClientMockRecorder) ListAvilibilityZones(projectID, region interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAvilibilityZones", reflect.TypeOf((*MockClient)(nil).ListAvilibilityZones), projectID, region) diff --git a/pkg/util/types/comonentloglevel.go b/pkg/util/types/comonentloglevel.go new file mode 100644 index 000000000..5ec99d7cc --- /dev/null +++ b/pkg/util/types/comonentloglevel.go @@ -0,0 +1,15 @@ +package types + +// ComponentLogLevel type is used in the logging function to assert the log level for components +type ComponentLogLevel int + +const ( + // ProjectReference is v1 verbose level + ProjectReference ComponentLogLevel = 1 + // ProjectClaim is v2 verbose level + ProjectClaim = 2 + // GCPClient is v3 verbose level + GCPClient = 3 + //OperatorSDK is v4 verbose level + OperatorSDK = 4 +) diff --git a/pkg/util/util.go b/pkg/util/util.go index 48ed7e3e8..ed33365d5 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -56,6 +56,7 @@ func NewGCPSecretCR(creds string, namespacedNamed kubetypes.NamespacedName) *cor } } +// GetGCPCredentialsFromSecret extracts the gcp credentials from a secret. return value is a bytearray func GetGCPCredentialsFromSecret(kubeClient kubeclientpkg.Client, namespace, name string) ([]byte, error) { secret := &corev1.Secret{} err := kubeClient.Get(context.TODO(), @@ -67,18 +68,18 @@ func GetGCPCredentialsFromSecret(kubeClient kubeclientpkg.Client, namespace, nam if err != nil { return []byte{}, fmt.Errorf("GetGCPCredentialsFromSecret.Get %v", err) } - var osServiceAccountJson []byte + var osServiceAccountJSON []byte var ok bool - osServiceAccountJson, ok = secret.Data["osServiceAccount.json"] + osServiceAccountJSON, ok = secret.Data["osServiceAccount.json"] if !ok { - osServiceAccountJson, ok = secret.Data["key.json"] + osServiceAccountJSON, ok = secret.Data["key.json"] } if !ok { return []byte{}, fmt.Errorf("GCP credentials secret %v did not contain key %v", name, "{osServiceAccount,key}.json") } - return osServiceAccountJson, nil + return osServiceAccountJSON, nil } // AddOrUpdateBinding checks if a binding from a map of bindings whose keys are the binding.Role exists in a list and if so it appends any new members to that binding. @@ -135,6 +136,7 @@ func rolebindingMap(roles []string, member string) map[string]cloudresourcemanag return requiredBindings } +// InArray checks if a needle exists inside of the haystack func InArray(needle interface{}, haystack interface{}) (exists bool, index int) { exists = false index = -1