From 2031bce5030d14725256031fde7e1e0f529be73f Mon Sep 17 00:00:00 2001 From: Zorian Motso Date: Fri, 23 Jan 2026 12:15:50 +0200 Subject: [PATCH] chore: Upgrade golangci-lint from v1.64.7 to v2.8.0 (#257) --- .golangci.yaml | 83 ++++------ Makefile | 10 +- .../chain/process_trigger_template.go | 28 +++- .../cdstagedeploy/chain/resolve_status.go | 5 +- controllers/codebase/codebase_controller.go | 11 +- .../codebase/service/chain/checkout_branch.go | 7 +- controllers/codebase/service/chain/common.go | 15 +- .../codebase/service/chain/common_test.go | 3 + .../codebase/service/chain/delete_webhook.go | 12 +- .../service/chain/delete_webhook_test.go | 83 ++++------ .../chain/put_default_codebasebranch.go | 8 +- .../service/chain/put_deploy_configs.go | 8 +- .../service/chain/put_gitlab_ci_config.go | 8 +- .../chain/put_gitlab_ci_config_test.go | 14 +- .../service/chain/put_gitwebrepourl.go | 18 ++- .../codebase/service/chain/put_project.go | 142 +++++++++++++++--- .../service/chain/put_project_test.go | 103 ++++++++++--- .../codebase/service/chain/put_webhook.go | 13 +- .../service/chain/put_webhook_test.go | 21 ++- .../codebase/service/template/template.go | 6 +- .../codebasebranch/chain/check_reference.go | 5 +- .../chain/check_reference_test.go | 1 + .../chain/process_new_version.go | 6 +- .../chain/process_new_version_test.go | 1 + .../put_branch_in_git/put_branch_in_git.go | 5 +- .../put_codebase_image_stream.go | 25 ++- .../put_codebase_image_stream_test.go | 14 +- .../codebasebranch_controller.go | 7 +- .../codebasebranch_controller_test.go | 7 +- .../chain/put_cd_stage_deploy.go | 34 ++++- .../chain/put_cd_stage_deploy_test.go | 1 + .../codebaseimagestream_controller.go | 17 ++- .../gitserver/create_event_listener.go | 4 +- .../gitserver/create_event_listener_test.go | 1 + controllers/gitserver/gitserver_controller.go | 6 +- .../gitserver/gitserver_controller_test.go | 8 +- .../integrationsecret_controller.go | 18 ++- .../integrationsecret_controller_test.go | 10 +- .../jiraissuemetadata/chain/factory.go | 12 +- .../chain/put_issue_web_link_test.go | 10 +- .../chain/put_tag_value_test.go | 77 ++++++++-- .../jiraissuemetadata_controller.go | 23 ++- .../jiraissuemetadata_controller_test.go | 5 +- pkg/autodeploy/autodeploy.go | 17 ++- pkg/client/jira/jira_adapter.go | 13 +- pkg/client/jira/jira_adapter_test.go | 4 +- pkg/codebasebranch/labels.go | 10 +- pkg/gerrit/gerrit.go | 19 ++- pkg/git/provider.go | 12 +- pkg/git/provider_test.go | 9 +- pkg/gitlab/manager.go | 8 +- pkg/gitlab/manager_test.go | 15 +- pkg/gitprovider/bitbucket.go | 19 ++- pkg/gitprovider/github_test.go | 67 ++++++--- pkg/gitprovider/gitlab.go | 7 +- pkg/gitprovider/gitlab_test.go | 67 ++++++--- pkg/gitprovider/provider.go | 3 +- pkg/tektoncd/trigger_template.go | 44 +++++- pkg/tektoncd/trigger_template_test.go | 2 + pkg/testutils/envtest.go | 2 +- pkg/util/consts.go | 3 +- pkg/util/template.go | 20 ++- pkg/webhook/codebase_webhook.go | 15 +- pkg/webhook/codebase_webhook_test.go | 69 +++------ pkg/webhook/codebasebranch_webhook.go | 15 +- pkg/webhook/protected_label.go | 15 +- pkg/webhook/webhook.go | 5 +- 67 files changed, 977 insertions(+), 378 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 0b005924..898341e6 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,71 +1,52 @@ -version: "1" +version: "2" run: - timeout: 5m allow-parallel-runners: true -issues: - # don't skip warning about doc comments - # don't exclude the default set of lint - exclude-use-default: false - # restore some of the defaults - # (fill in the rest as needed) - exclude-rules: - - path: "api/*" - linters: - - lll - - path: "internal/*" - linters: - - dupl - - lll - - path: ".*_test\\.go$" - linters: - - errcheck linters: - disable-all: true + default: none enable: - copyloopvar + - dupl - errcheck - - gci - ginkgolinter - goconst - gocyclo - - gofmt - - goimports - - gosimple - govet - ineffassign + - lll - misspell - nakedret - prealloc - revive - staticcheck - - typecheck - unconvert - unparam - unused - - wsl - -linters-settings: - revive: + - wsl_v5 + settings: + revive: + rules: + - name: comment-spacings + - name: import-shadowing + exclusions: + generated: lax rules: - - name: comment-spacings - gci: - # Section configuration to compare against. - # Section names are case-insensitive and may contain parameters in (). - # The default order of sections is `standard > default > custom > blank > dot`, - # If `custom-order` is `true`, it follows the order of `sections` option. - # Default: ["standard", "default"] - sections: - - standard # Standard section: captures all standard packages. - - blank # Blank section: contains all blank imports. This section is not present unless explicitly enabled. - - dot # Dot section: contains all dot imports. This section is not present unless explicitly enabled. - - default # Default section: contains all imports that could not be matched to another section type. - - prefix(github.com/epam) # Custom section: groups all imports with the specified Prefix. - - prefix(github.com/epam/edp-codebase-operator) # Custom section: groups all imports with the specified Prefix. - - # Skip generated files. - skip-generated: true - - # Enable custom order of sections. - # If `true`, make the section order the same as the order of `sections`. - # Default: false - custom-order: true + - linters: + - lll + path: api/* + - linters: + - lll + source: "\\+kubebuilder" + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ \ No newline at end of file diff --git a/Makefile b/Makefile index c7157e9e..571ec5cd 100644 --- a/Makefile +++ b/Makefile @@ -99,11 +99,11 @@ vet: ## Run go vet .PHONY: lint lint: golangci-lint ## Run go lint - ${GOLANGCI_LINT} run -v -c .golangci.yaml ./... + ${GOLANGCI_LINT} run -v ./... -.PHONY: lint +.PHONY: lint-fix lint-fix: golangci-lint ## Run go lint fix - ${GOLANGCI_LINT} run -v -c .golangci.yaml ./... --fix + ${GOLANGCI_LINT} run -v ./... --fix .PHONY: build build: ## build operator's binary @@ -133,7 +133,7 @@ helm-docs: helmdocs ## generate helm docs GOLANGCI_LINT = ${CURRENT_DIR}/bin/golangci-lint .PHONY: golangci-lint golangci-lint: ## Download golangci-lint locally if necessary. - $(call go-install-tool,$(GOLANGCI_LINT),github.com/golangci/golangci-lint/cmd/golangci-lint,$(GOLANGCI_LINT_VERSION)) + $(call go-install-tool,$(GOLANGCI_LINT),github.com/golangci/golangci-lint/v2/cmd/golangci-lint,$(GOLANGCI_LINT_VERSION)) .PHONY: install install: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config. @@ -146,7 +146,7 @@ KUSTOMIZE_VERSION ?= v5.6.0 CONTROLLER_TOOLS_VERSION ?= v0.18.0 ENVTEST_VERSION ?= $(shell go list -m -f "{{ .Version }}" sigs.k8s.io/controller-runtime | awk -F'[v.]' '{printf "release-%d.%d", $$2, $$3}') ENVTEST_K8S_VERSION ?= $(shell go list -m -f "{{ .Version }}" k8s.io/api | awk -F'[v.]' '{printf "1.%d", $$3}') -GOLANGCI_LINT_VERSION ?= v1.64.7 +GOLANGCI_LINT_VERSION ?= v2.8.0 MOCKERY_VERSION ?= v3.6.2 HELMDOCS_VERSION ?= v1.14.2 GITCHGLOG_VERSION ?= v0.15.4 diff --git a/controllers/cdstagedeploy/chain/process_trigger_template.go b/controllers/cdstagedeploy/chain/process_trigger_template.go index f5719648..3aac7608 100644 --- a/controllers/cdstagedeploy/chain/process_trigger_template.go +++ b/controllers/cdstagedeploy/chain/process_trigger_template.go @@ -35,7 +35,14 @@ func NewProcessTriggerTemplate( } func (h *ProcessTriggerTemplate) ServeRequest(ctx context.Context, stageDeploy *codebaseApi.CDStageDeploy) error { - log := ctrl.LoggerFrom(ctx).WithValues("stage", stageDeploy.Spec.Stage, "pipeline", stageDeploy.Spec.Pipeline, "status", stageDeploy.Status.Status) + log := ctrl.LoggerFrom(ctx).WithValues( + "stage", + stageDeploy.Spec.Stage, + "pipeline", + stageDeploy.Spec.Pipeline, + "status", + stageDeploy.Status.Status, + ) if skipPipelineRunCreation(stageDeploy) { log.Info("Skip processing TriggerTemplate for auto-deploy.") @@ -45,10 +52,19 @@ func (h *ProcessTriggerTemplate) ServeRequest(ctx context.Context, stageDeploy * log.Info("Start processing TriggerTemplate for auto-deploy.") - pipeline, stage, rawResource, err := getResourcesForPipelineRun(ctx, stageDeploy, h.k8sClient, h.triggerTemplateManager) + pipeline, stage, rawResource, err := getResourcesForPipelineRun( + ctx, + stageDeploy, + h.k8sClient, + h.triggerTemplateManager, + ) if err != nil { if errors.Is(err, tektoncd.ErrEmptyTriggerTemplateResources) { - log.Info("No resource templates found in the trigger template. Skip processing.", "triggertemplate", stage.Spec.TriggerTemplate) + log.Info( + "No resource templates found in the trigger template. Skip processing.", + "triggertemplate", + stage.Spec.TriggerTemplate, + ) stageDeploy.Status.Status = codebaseApi.CDStageDeployStatusCompleted @@ -150,7 +166,11 @@ func getResourcesForPipelineRun( return pipeline, nil, nil, fmt.Errorf("failed to get Stage: %w", err) } - rawResource, err := triggerTemplateManager.GetRawResourceFromTriggerTemplate(ctx, stage.Spec.TriggerTemplate, stageDeploy.Namespace) + rawResource, err := triggerTemplateManager.GetRawResourceFromTriggerTemplate( + ctx, + stage.Spec.TriggerTemplate, + stageDeploy.Namespace, + ) if err != nil { return pipeline, stage, nil, fmt.Errorf("failed to get raw resource from TriggerTemplate: %w", err) } diff --git a/controllers/cdstagedeploy/chain/resolve_status.go b/controllers/cdstagedeploy/chain/resolve_status.go index c6421df3..e3e1842a 100644 --- a/controllers/cdstagedeploy/chain/resolve_status.go +++ b/controllers/cdstagedeploy/chain/resolve_status.go @@ -90,7 +90,10 @@ func (r *ResolveStatus) ServeRequest(ctx context.Context, stageDeploy *codebaseA return nil } -func (r *ResolveStatus) getRunningPipelines(ctx context.Context, stageDeploy *codebaseApi.CDStageDeploy) (*tektonpipelineApi.PipelineRunList, error) { +func (r *ResolveStatus) getRunningPipelines( + ctx context.Context, + stageDeploy *codebaseApi.CDStageDeploy, +) (*tektonpipelineApi.PipelineRunList, error) { log := ctrl.LoggerFrom(ctx) pipelineRun := &tektonpipelineApi.PipelineRunList{} diff --git a/controllers/codebase/codebase_controller.go b/controllers/codebase/codebase_controller.go index 0ee886d8..188c91ea 100644 --- a/controllers/codebase/codebase_controller.go +++ b/controllers/codebase/codebase_controller.go @@ -194,6 +194,7 @@ func (r *ReconcileCodebase) updateFinishStatus(ctx context.Context, c *codebaseA // setFailureCount increments failure count and returns delay for next reconciliation. func (r *ReconcileCodebase) setFailureCount(ctx context.Context, codebase *codebaseApi.Codebase) time.Duration { const defaultTimeout = 10 * time.Second + timeout := util.GetTimeout(codebase.Status.FailureCount, defaultTimeout) codebase.Status.FailureCount++ @@ -205,7 +206,10 @@ func (r *ReconcileCodebase) setFailureCount(ctx context.Context, codebase *codeb return timeout } -func (r *ReconcileCodebase) getChain(ctx context.Context, codebase *codebaseApi.Codebase) (cHand.CodebaseHandler, error) { +func (r *ReconcileCodebase) getChain( + ctx context.Context, + codebase *codebaseApi.Codebase, +) (cHand.CodebaseHandler, error) { if r.chainGetter == nil { r.chainGetter = func(cr *codebaseApi.Codebase) (cHand.CodebaseHandler, error) { return chain.MakeChain(ctx, r.client), nil @@ -215,7 +219,10 @@ func (r *ReconcileCodebase) getChain(ctx context.Context, codebase *codebaseApi. return r.chainGetter(codebase) } -func (r *ReconcileCodebase) tryToDeleteCodebase(ctx context.Context, codebase *codebaseApi.Codebase) (*reconcile.Result, error) { +func (r *ReconcileCodebase) tryToDeleteCodebase( + ctx context.Context, + codebase *codebaseApi.Codebase, +) (*reconcile.Result, error) { log := ctrl.LoggerFrom(ctx) if codebase.GetDeletionTimestamp().IsZero() { diff --git a/controllers/codebase/service/chain/checkout_branch.go b/controllers/codebase/service/chain/checkout_branch.go index fb10219b..e386f345 100644 --- a/controllers/codebase/service/chain/checkout_branch.go +++ b/controllers/codebase/service/chain/checkout_branch.go @@ -21,7 +21,12 @@ func CheckoutBranch( gitProviderFactory func(config gitproviderv2.Config) gitproviderv2.Git, ) error { log := ctrl.LoggerFrom(ctx) - gitProvider := gitProviderFactory(gitproviderv2.NewConfigFromGitServerAndSecret(repoContext.GitServer, repoContext.GitServerSecret)) + gitProvider := gitProviderFactory( + gitproviderv2.NewConfigFromGitServerAndSecret( + repoContext.GitServer, + repoContext.GitServerSecret, + ), + ) currentBranchName, err := gitProvider.GetCurrentBranchName(ctx, repoContext.WorkDir) if err != nil { diff --git a/controllers/codebase/service/chain/common.go b/controllers/codebase/service/chain/common.go index 22d9d0cc..db21d189 100644 --- a/controllers/codebase/service/chain/common.go +++ b/controllers/codebase/service/chain/common.go @@ -28,7 +28,12 @@ type GitRepositoryContext struct { WorkDir string } -func setIntermediateSuccessFields(ctx context.Context, c client.Client, cb *codebaseApi.Codebase, action codebaseApi.ActionType) error { +func setIntermediateSuccessFields( + ctx context.Context, + c client.Client, + cb *codebaseApi.Codebase, + action codebaseApi.ActionType, +) error { // Set WebHookRef from WebHookID for backward compatibility. webHookRef := cb.Status.WebHookRef if webHookRef == "" && cb.Status.WebHookID != 0 { @@ -81,6 +86,7 @@ func updateGitStatusWithPatch( // Apply patch to status subresource if err := c.Status().Patch(ctx, codebase, patch); err != nil { setFailedFields(codebase, action, err.Error()) + return fmt.Errorf("failed to patch git status to %s for codebase %s: %w", gitStatus, codebase.Name, err) } @@ -113,7 +119,12 @@ func PrepareGitRepository( return nil, err } - gitProvider := gitProviderFactory(gitproviderv2.NewConfigFromGitServerAndSecret(gitRepoCtx.GitServer, gitRepoCtx.GitServerSecret)) + gitProvider := gitProviderFactory( + gitproviderv2.NewConfigFromGitServerAndSecret( + gitRepoCtx.GitServer, + gitRepoCtx.GitServerSecret, + ), + ) if !util.DoesDirectoryExist(gitRepoCtx.WorkDir) || util.IsDirectoryEmpty(gitRepoCtx.WorkDir) { log.Info("Start cloning repository", "url", gitRepoCtx.RepoGitUrl) diff --git a/controllers/codebase/service/chain/common_test.go b/controllers/codebase/service/chain/common_test.go index 3585896c..9463ae27 100644 --- a/controllers/codebase/service/chain/common_test.go +++ b/controllers/codebase/service/chain/common_test.go @@ -312,6 +312,7 @@ func TestPrepareGitRepository(t *testing.T) { m := gitMocks.NewMockGit(t) m.On("Clone", testify.Anything, testify.Anything, testify.Anything).Return(nil) m.On("GetCurrentBranchName", testify.Anything, testify.Anything).Return("main", nil) + return m }, wantErr: require.NoError, @@ -388,6 +389,7 @@ func TestPrepareGitRepository(t *testing.T) { m := gitMocks.NewMockGit(t) m.On("Clone", testify.Anything, testify.Anything, testify.Anything). Return(assert.AnError) + return m }, wantErr: func(t require.TestingT, err error, i ...interface{}) { @@ -432,6 +434,7 @@ func TestPrepareGitRepository(t *testing.T) { m.On("Clone", testify.Anything, testify.Anything, testify.Anything).Return(nil) m.On("GetCurrentBranchName", testify.Anything, testify.Anything). Return("", errors.New("failed to get current branch")) + return m }, wantErr: func(t require.TestingT, err error, i ...interface{}) { diff --git a/controllers/codebase/service/chain/delete_webhook.go b/controllers/codebase/service/chain/delete_webhook.go index b191ec28..71980317 100644 --- a/controllers/codebase/service/chain/delete_webhook.go +++ b/controllers/codebase/service/chain/delete_webhook.go @@ -46,7 +46,11 @@ func (s *DeleteWebHook) ServeRequest(ctx context.Context, codebase *codebaseApi. } gitServer := &codebaseApi.GitServer{} - if err := s.client.Get(ctx, client.ObjectKey{Name: codebase.Spec.GitServer, Namespace: codebase.Namespace}, gitServer); err != nil { + if err := s.client.Get( + ctx, + client.ObjectKey{Name: codebase.Spec.GitServer, Namespace: codebase.Namespace}, + gitServer, + ); err != nil { log.Error(err, "Failed to delete webhook: unable to get GitServer", "gitServer", codebase.Spec.GitServer) return nil @@ -59,7 +63,11 @@ func (s *DeleteWebHook) ServeRequest(ctx context.Context, codebase *codebaseApi. return nil } - gitProvider, err := gitprovider.NewProvider(gitServer, s.restyClient, string(secret.Data[util.GitServerSecretTokenField])) + gitProvider, err := gitprovider.NewProvider( + gitServer, + s.restyClient, + string(secret.Data[util.GitServerSecretTokenField]), + ) if err != nil { log.Error(err, "Failed to delete webhook: unable to create git provider") diff --git a/controllers/codebase/service/chain/delete_webhook_test.go b/controllers/codebase/service/chain/delete_webhook_test.go index 93975bab..22602d98 100644 --- a/controllers/codebase/service/chain/delete_webhook_test.go +++ b/controllers/codebase/service/chain/delete_webhook_test.go @@ -39,15 +39,21 @@ func TestDeleteWebHook_ServeRequest(t *testing.T) { gitURL := "test-owner/test-repo" fakeUrlRegexp := regexp.MustCompile(`.*`) - tests := []struct { + makeSuccessTestCase := func(name string, provider string) struct { name string codebase *codebaseApi.Codebase k8sObjects []client.Object responder func(t *testing.T) hasError bool - }{ - { - name: "success gitlab", + } { + return struct { + name string + codebase *codebaseApi.Codebase + k8sObjects []client.Object + responder func(t *testing.T) + hasError bool + }{ + name: name, codebase: &codebaseApi.Codebase{ ObjectMeta: metaV1.ObjectMeta{ Namespace: namespace, @@ -73,7 +79,7 @@ func TestDeleteWebHook_ServeRequest(t *testing.T) { GitUser: "git", HttpsPort: 443, NameSshKeySecret: "test-secret", - GitProvider: codebaseApi.GitProviderGitlab, + GitProvider: provider, }, }, &coreV1.Secret{ @@ -90,52 +96,18 @@ func TestDeleteWebHook_ServeRequest(t *testing.T) { responder := httpmock.NewStringResponder(http.StatusOK, "") httpmock.RegisterRegexpResponder(http.MethodDelete, fakeUrlRegexp, responder) }, - }, - { - name: "success github", - codebase: &codebaseApi.Codebase{ - ObjectMeta: metaV1.ObjectMeta{ - Namespace: namespace, - Name: "test-codebase", - }, - Spec: codebaseApi.CodebaseSpec{ - GitServer: "test-git-server", - GitUrlPath: gitURL, - CiTool: util.CITekton, - }, - Status: codebaseApi.CodebaseStatus{ - WebHookID: 1, - }, - }, - k8sObjects: []client.Object{ - &codebaseApi.GitServer{ - ObjectMeta: metaV1.ObjectMeta{ - Namespace: namespace, - Name: "test-git-server", - }, - Spec: codebaseApi.GitServerSpec{ - GitHost: "fake.gitlab.com", - GitUser: "git", - HttpsPort: 443, - NameSshKeySecret: "test-secret", - GitProvider: codebaseApi.GitProviderGithub, - }, - }, - &coreV1.Secret{ - ObjectMeta: metaV1.ObjectMeta{ - Namespace: namespace, - Name: "test-secret", - }, - Data: map[string][]byte{ - util.GitServerSecretTokenField: []byte("test-token"), - }, - }, - }, - responder: func(t *testing.T) { - responder := httpmock.NewStringResponder(http.StatusOK, "") - httpmock.RegisterRegexpResponder(http.MethodDelete, fakeUrlRegexp, responder) - }, - }, + } + } + + tests := []struct { + name string + codebase *codebaseApi.Codebase + k8sObjects []client.Object + responder func(t *testing.T) + hasError bool + }{ + makeSuccessTestCase("success gitlab", codebaseApi.GitProviderGitlab), + makeSuccessTestCase("success github", codebaseApi.GitProviderGithub), { name: "success with empty webhook id", codebase: &codebaseApi.Codebase{ @@ -412,7 +384,14 @@ func TestDeleteWebHook_ServeRequest(t *testing.T) { s := NewDeleteWebHook(k8sClient, restyClient, logger) assert.NoError(t, s.ServeRequest(ctrl.LoggerInto(context.Background(), logger), tt.codebase)) - assert.Equalf(t, tt.hasError, loggerSink.LastError() != nil, "expected error: %v, got: %v", tt.hasError, loggerSink.LastError()) + assert.Equalf( + t, + tt.hasError, + loggerSink.LastError() != nil, + "expected error: %v, got: %v", + tt.hasError, + loggerSink.LastError(), + ) }) } } diff --git a/controllers/codebase/service/chain/put_default_codebasebranch.go b/controllers/codebase/service/chain/put_default_codebasebranch.go index cb515523..c41ba24f 100644 --- a/controllers/codebase/service/chain/put_default_codebasebranch.go +++ b/controllers/codebase/service/chain/put_default_codebasebranch.go @@ -25,11 +25,16 @@ func NewPutDefaultCodeBaseBranch(c client.Client) *PutDefaultCodeBaseBranch { // ServeRequest gets the default branch from CodeBase CR and creates CodeBaseBranch CR with this branch. func (s *PutDefaultCodeBaseBranch) ServeRequest(ctx context.Context, codebase *codebaseApi.Codebase) error { - codeBaseBranchName := fmt.Sprintf("%s-%s", codebase.Name, processNameToKubernetesConvention(codebase.Spec.DefaultBranch)) + codeBaseBranchName := fmt.Sprintf( + "%s-%s", + codebase.Name, + processNameToKubernetesConvention(codebase.Spec.DefaultBranch), + ) log := ctrl.LoggerFrom(ctx).WithValues("codeBaseBranchName", codeBaseBranchName) branch := &codebaseApi.CodebaseBranch{} + err := s.client.Get( ctx, client.ObjectKey{ @@ -38,7 +43,6 @@ func (s *PutDefaultCodeBaseBranch) ServeRequest(ctx context.Context, codebase *c }, branch, ) - if err == nil { log.Info("Codebase branch already exists") diff --git a/controllers/codebase/service/chain/put_deploy_configs.go b/controllers/codebase/service/chain/put_deploy_configs.go index 0d1a7f9c..8388b3f0 100644 --- a/controllers/codebase/service/chain/put_deploy_configs.go +++ b/controllers/codebase/service/chain/put_deploy_configs.go @@ -109,7 +109,13 @@ func (h *PutDeployConfigs) tryToPushConfigs(ctx context.Context, codebase *codeb log.Info("Changes have been pushed") // Update status - if err = updateGitStatusWithPatch(ctx, h.client, codebase, codebaseApi.SetupDeploymentTemplates, util.ProjectTemplatesPushedStatus); err != nil { + if err = updateGitStatusWithPatch( + ctx, + h.client, + codebase, + codebaseApi.SetupDeploymentTemplates, + util.ProjectTemplatesPushedStatus, + ); err != nil { return err } diff --git a/controllers/codebase/service/chain/put_gitlab_ci_config.go b/controllers/codebase/service/chain/put_gitlab_ci_config.go index d5ce5d0b..ac3d03dc 100644 --- a/controllers/codebase/service/chain/put_gitlab_ci_config.go +++ b/controllers/codebase/service/chain/put_gitlab_ci_config.go @@ -61,7 +61,13 @@ func (h *PutGitLabCIConfig) ServeRequest(ctx context.Context, codebase *codebase log.Info("End pushing GitLab CI config") // Set status to mark this stage complete - if err := updateGitStatusWithPatch(ctx, h.client, codebase, codebaseApi.RepositoryProvisioning, util.ProjectGitLabCIPushedStatus); err != nil { + if err := updateGitStatusWithPatch( + ctx, + h.client, + codebase, + codebaseApi.RepositoryProvisioning, + util.ProjectGitLabCIPushedStatus, + ); err != nil { return err } diff --git a/controllers/codebase/service/chain/put_gitlab_ci_config_test.go b/controllers/codebase/service/chain/put_gitlab_ci_config_test.go index b8d9c52c..8676c72a 100644 --- a/controllers/codebase/service/chain/put_gitlab_ci_config_test.go +++ b/controllers/codebase/service/chain/put_gitlab_ci_config_test.go @@ -138,7 +138,8 @@ func TestPutGitLabCIConfig_ServeRequest(t *testing.T) { Namespace: defaultNs, }, Data: map[string]string{ - ".gitlab-ci.yml": "variables:\n CODEBASE_NAME: \"{{.CodebaseName}}\"\ninclude:\n - component: $CI_SERVER_FQDN/kuberocketci/ci-java17-mvn/build@0.1.1", + ".gitlab-ci.yml": "variables:\n CODEBASE_NAME: \"{{.CodebaseName}}\"\ninclude:\n " + + "- component: $CI_SERVER_FQDN/kuberocketci/ci-java17-mvn/build@0.1.1", }, }, }, @@ -287,6 +288,7 @@ func TestPutGitLabCIConfig_ServeRequest(t *testing.T) { mock := gitmocks.NewMockGit(t) mock.On("Clone", testify.Anything, testify.Anything, testify.Anything). Return(errors.New("failed to clone git repository")) + return mock }, wantErr: func(t require.TestingT, err error, i ...interface{}) { @@ -320,6 +322,7 @@ func TestPutGitLabCIConfig_ServeRequest(t *testing.T) { Return(nil) mock.On("GetCurrentBranchName", testify.Anything, testify.Anything). Return("", errors.New("failed to get current branch")) + return mock }, setup: func(t *testing.T, wd string) { @@ -358,6 +361,7 @@ func TestPutGitLabCIConfig_ServeRequest(t *testing.T) { Return(nil) mock.On("GetCurrentBranchName", testify.Anything, testify.Anything). Return("master", nil) + return mock }, setup: func(t *testing.T, wd string) { @@ -398,7 +402,8 @@ func TestPutGitLabCIConfig_ServeRequest(t *testing.T) { Namespace: defaultNs, }, Data: map[string]string{ - ".gitlab-ci.yml": "variables:\n CODEBASE_NAME: \"{{.CodebaseName}}\"\ninclude:\n - component: $CI_SERVER_FQDN/kuberocketci/ci-java17-mvn/build@0.1.1", + ".gitlab-ci.yml": "variables:\n CODEBASE_NAME: \"{{.CodebaseName}}\"\ninclude:\n " + + "- component: $CI_SERVER_FQDN/kuberocketci/ci-java17-mvn/build@0.1.1", }, }, }, @@ -410,6 +415,7 @@ func TestPutGitLabCIConfig_ServeRequest(t *testing.T) { Return("master", nil) mock.On("Commit", testify.Anything, testify.Anything, "Add GitLab CI configuration"). Return(errors.New("failed to commit changes")) + return mock }, setup: func(t *testing.T, wd string) { @@ -450,7 +456,8 @@ func TestPutGitLabCIConfig_ServeRequest(t *testing.T) { Namespace: defaultNs, }, Data: map[string]string{ - ".gitlab-ci.yml": "variables:\n CODEBASE_NAME: \"{{.CodebaseName}}\"\ninclude:\n - component: $CI_SERVER_FQDN/kuberocketci/ci-java17-mvn/build@0.1.1", + ".gitlab-ci.yml": "variables:\n CODEBASE_NAME: \"{{.CodebaseName}}\"\ninclude:\n " + + "- component: $CI_SERVER_FQDN/kuberocketci/ci-java17-mvn/build@0.1.1", }, }, }, @@ -464,6 +471,7 @@ func TestPutGitLabCIConfig_ServeRequest(t *testing.T) { Return(nil) mock.On("Push", testify.Anything, testify.Anything, gitproviderv2.RefSpecPushAllBranches). Return(errors.New("failed to push changes")) + return mock }, setup: func(t *testing.T, wd string) { diff --git a/controllers/codebase/service/chain/put_gitwebrepourl.go b/controllers/codebase/service/chain/put_gitwebrepourl.go index 7c94bf58..8067a26c 100644 --- a/controllers/codebase/service/chain/put_gitwebrepourl.go +++ b/controllers/codebase/service/chain/put_gitwebrepourl.go @@ -30,7 +30,11 @@ func (s *PutGitWebRepoUrl) ServeRequest(ctx context.Context, codebase *codebaseA log.Info("Start putting urlRepoPath to codebase status") gitServer := &codebaseApi.GitServer{} - if err := s.client.Get(ctx, client.ObjectKey{Name: codebase.Spec.GitServer, Namespace: codebase.Namespace}, gitServer); err != nil { + if err := s.client.Get( + ctx, + client.ObjectKey{Name: codebase.Spec.GitServer, Namespace: codebase.Namespace}, + gitServer, + ); err != nil { return s.processCodebaseError( codebase, fmt.Errorf("failed to get git server %s: %w", codebase.Spec.GitServer, err), @@ -56,7 +60,11 @@ func (s *PutGitWebRepoUrl) ServeRequest(ctx context.Context, codebase *codebaseA // getGitWebURL returns Git Web URL. // For GitHub and GitLab we return link to the repository in format: https://// // For Gerrit we return link to the repository in format: https:///gitweb?p=.git -func (s *PutGitWebRepoUrl) getGitWebURL(ctx context.Context, gitServer *codebaseApi.GitServer, codebase *codebaseApi.Codebase) (string, error) { +func (s *PutGitWebRepoUrl) getGitWebURL( + ctx context.Context, + gitServer *codebaseApi.GitServer, + codebase *codebaseApi.Codebase, +) (string, error) { switch gitServer.Spec.GitProvider { case codebaseApi.GitProviderGitlab, codebaseApi.GitProviderGithub, codebaseApi.GitProviderBitbucket: urlLink := util.GetHostWithProtocol(gitServer.Spec.GitHost) @@ -66,7 +74,11 @@ func (s *PutGitWebRepoUrl) getGitWebURL(ctx context.Context, gitServer *codebase case codebaseApi.GitProviderGerrit: link := &codebaseApi.QuickLink{} - if err := s.client.Get(ctx, client.ObjectKey{Name: gerritQuickLinkName, Namespace: gitServer.Namespace}, link); err != nil { + if err := s.client.Get( + ctx, + client.ObjectKey{Name: gerritQuickLinkName, Namespace: gitServer.Namespace}, + link, + ); err != nil { return "", fmt.Errorf("failed to get QuickLink %s: %w", gerritQuickLinkName, err) } // QuickLink has https:// prefix in the URL. diff --git a/controllers/codebase/service/chain/put_project.go b/controllers/codebase/service/chain/put_project.go index 5e4d6d67..be0edd5f 100644 --- a/controllers/codebase/service/chain/put_project.go +++ b/controllers/codebase/service/chain/put_project.go @@ -30,8 +30,12 @@ type PutProject struct { } var ( - skipPutProjectStatuses = []string{util.ProjectPushedStatus, util.ProjectGitLabCIPushedStatus, util.ProjectTemplatesPushedStatus} - putProjectStrategies = []codebaseApi.Strategy{codebaseApi.Clone, codebaseApi.Create} + skipPutProjectStatuses = []string{ + util.ProjectPushedStatus, + util.ProjectGitLabCIPushedStatus, + util.ProjectTemplatesPushedStatus, + } + putProjectStrategies = []codebaseApi.Strategy{codebaseApi.Clone, codebaseApi.Create} ) func NewPutProject( @@ -72,7 +76,11 @@ func (h *PutProject) ServeRequest(ctx context.Context, codebase *codebaseApi.Cod err = h.initialProjectProvisioning(ctx, codebase, repoContext) if err != nil { - return h.handleError(codebase, err, fmt.Sprintf("failed to perform initial provisioning of codebase %s", codebase.Name)) + return h.handleError( + codebase, + err, + fmt.Sprintf("failed to perform initial provisioning of codebase %s", codebase.Name), + ) } if err = h.checkoutBranch(ctrl.LoggerInto(ctx, log), codebase, repoContext); err != nil { @@ -84,7 +92,13 @@ func (h *PutProject) ServeRequest(ctx context.Context, codebase *codebaseApi.Cod return h.handleError(codebase, err, "failed to create project") } - if err = updateGitStatusWithPatch(ctx, h.k8sClient, codebase, codebaseApi.RepositoryProvisioning, util.ProjectPushedStatus); err != nil { + if err = updateGitStatusWithPatch( + ctx, + h.k8sClient, + codebase, + codebaseApi.RepositoryProvisioning, + util.ProjectPushedStatus, + ); err != nil { return err } @@ -144,7 +158,13 @@ func (h *PutProject) createProject( return nil } -func (h *PutProject) replaceDefaultBranch(ctx context.Context, g gitproviderv2.Git, directory, defaultBranchName, newBranchName string) error { +func (h *PutProject) replaceDefaultBranch( + ctx context.Context, + g gitproviderv2.Git, + directory, + defaultBranchName, + newBranchName string, +) error { log := ctrl.LoggerFrom(ctx). WithValues("defaultBranch", defaultBranchName, "newBranch", newBranchName) @@ -172,7 +192,12 @@ func (h *PutProject) pushProject(ctx context.Context, projectName string, repoCo log.Info("Start pushing project") log.Info("Start adding remote link") - gitProvider := h.gitProviderFactory(gitproviderv2.NewConfigFromGitServerAndSecret(repoContext.GitServer, repoContext.GitServerSecret)) + gitProvider := h.gitProviderFactory( + gitproviderv2.NewConfigFromGitServerAndSecret( + repoContext.GitServer, + repoContext.GitServerSecret, + ), + ) if err := gitProvider.AddRemoteLink( ctx, @@ -184,7 +209,12 @@ func (h *PutProject) pushProject(ctx context.Context, projectName string, repoCo log.Info("Start pushing changes and tags into git") - if err := gitProvider.Push(ctx, repoContext.WorkDir, gitproviderv2.RefSpecPushAllBranches, gitproviderv2.RefSpecPushAllTags); err != nil { + if err := gitProvider.Push( + ctx, + repoContext.WorkDir, + gitproviderv2.RefSpecPushAllBranches, + gitproviderv2.RefSpecPushAllTags, + ); err != nil { return fmt.Errorf("failed to push changes and tags into git: %w", err) } @@ -193,12 +223,24 @@ func (h *PutProject) pushProject(ctx context.Context, projectName string, repoCo return nil } -func (h *PutProject) createGerritProject(ctx context.Context, gitServer *codebaseApi.GitServer, privateSSHKey, projectName string) error { +func (h *PutProject) createGerritProject( + ctx context.Context, + gitServer *codebaseApi.GitServer, + privateSSHKey, + projectName string, +) error { log := ctrl.LoggerFrom(ctx) log.Info("Start creating project in Gerrit") - projectExist, err := h.gerritClient.CheckProjectExist(gitServer.Spec.SshPort, privateSSHKey, gitServer.Spec.GitHost, gitServer.Spec.GitUser, projectName, log) + projectExist, err := h.gerritClient.CheckProjectExist( + gitServer.Spec.SshPort, + privateSSHKey, + gitServer.Spec.GitHost, + gitServer.Spec.GitUser, + projectName, + log, + ) if err != nil { return fmt.Errorf("failed to check if project exist in Gerrit: %w", err) } @@ -208,7 +250,14 @@ func (h *PutProject) createGerritProject(ctx context.Context, gitServer *codebas return nil } - err = h.gerritClient.CreateProject(gitServer.Spec.SshPort, privateSSHKey, gitServer.Spec.GitHost, gitServer.Spec.GitUser, projectName, log) + err = h.gerritClient.CreateProject( + gitServer.Spec.SshPort, + privateSSHKey, + gitServer.Spec.GitHost, + gitServer.Spec.GitUser, + projectName, + log, + ) if err != nil { return fmt.Errorf("failed to create gerrit project: %w", err) } @@ -218,7 +267,11 @@ func (h *PutProject) createGerritProject(ctx context.Context, gitServer *codebas return nil } -func (h *PutProject) checkoutBranch(ctx context.Context, codebase *codebaseApi.Codebase, repoContext *GitRepositoryContext) error { +func (h *PutProject) checkoutBranch( + ctx context.Context, + codebase *codebaseApi.Codebase, + repoContext *GitRepositoryContext, +) error { log := ctrl.LoggerFrom(ctx).WithValues( "defaultBranch", codebase.Spec.DefaultBranch, @@ -226,19 +279,43 @@ func (h *PutProject) checkoutBranch(ctx context.Context, codebase *codebaseApi.C codebase.Spec.BranchToCopyInDefaultBranch, ) - gitprovider := h.gitProviderFactory(gitproviderv2.NewConfigFromGitServerAndSecret(repoContext.GitServer, repoContext.GitServerSecret)) + gitProvider := h.gitProviderFactory( + gitproviderv2.NewConfigFromGitServerAndSecret( + repoContext.GitServer, + repoContext.GitServerSecret, + ), + ) - if codebase.Spec.BranchToCopyInDefaultBranch != "" && codebase.Spec.DefaultBranch != codebase.Spec.BranchToCopyInDefaultBranch { + if codebase.Spec.BranchToCopyInDefaultBranch != "" && + codebase.Spec.DefaultBranch != codebase.Spec.BranchToCopyInDefaultBranch { log.Info("Start checkout branch to copy") - if err := CheckoutBranch(ctx, codebase.Spec.BranchToCopyInDefaultBranch, repoContext, codebase, h.k8sClient, h.gitProviderFactory); err != nil { + if err := CheckoutBranch( + ctx, + codebase.Spec.BranchToCopyInDefaultBranch, + repoContext, + codebase, + h.k8sClient, + h.gitProviderFactory, + ); err != nil { return fmt.Errorf("failed to checkout branch to copy %s: %w", codebase.Spec.BranchToCopyInDefaultBranch, err) } log.Info("Start replace default branch") - if err := h.replaceDefaultBranch(ctx, gitprovider, repoContext.WorkDir, codebase.Spec.DefaultBranch, codebase.Spec.BranchToCopyInDefaultBranch); err != nil { - return fmt.Errorf("failed to replace default branch %s with %s: %w", codebase.Spec.DefaultBranch, codebase.Spec.BranchToCopyInDefaultBranch, err) + if err := h.replaceDefaultBranch( + ctx, + gitProvider, + repoContext.WorkDir, + codebase.Spec.DefaultBranch, + codebase.Spec.BranchToCopyInDefaultBranch, + ); err != nil { + return fmt.Errorf( + "failed to replace default branch %s with %s: %w", + codebase.Spec.DefaultBranch, + codebase.Spec.BranchToCopyInDefaultBranch, + err, + ) } return nil @@ -246,7 +323,14 @@ func (h *PutProject) checkoutBranch(ctx context.Context, codebase *codebaseApi.C log.Info("Start checkout branch") - if err := CheckoutBranch(ctx, codebase.Spec.DefaultBranch, repoContext, codebase, h.k8sClient, h.gitProviderFactory); err != nil { + if err := CheckoutBranch( + ctx, + codebase.Spec.DefaultBranch, + repoContext, + codebase, + h.k8sClient, + h.gitProviderFactory, + ); err != nil { return fmt.Errorf("failed to checkout default branch %s: %w", codebase.Spec.DefaultBranch, err) } @@ -428,7 +512,11 @@ func (h *PutProject) squashCommits(ctx context.Context, workDir string, strategy return nil } -func (h *PutProject) initialProjectProvisioning(ctx context.Context, codebase *codebaseApi.Codebase, repoContext *GitRepositoryContext) error { +func (h *PutProject) initialProjectProvisioning( + ctx context.Context, + codebase *codebaseApi.Codebase, + repoContext *GitRepositoryContext, +) error { if err := util.CreateDirectory(repoContext.WorkDir); err != nil { return h.handleError(codebase, err, fmt.Sprintf("failed to create dir %q", repoContext.WorkDir)) } @@ -440,7 +528,10 @@ func (h *PutProject) initialProjectProvisioning(ctx context.Context, codebase *c return h.notEmptyProjectProvisioning(ctx, codebase, repoContext) } -func (h *PutProject) emptyProjectProvisioning(ctx context.Context, repoContext *GitRepositoryContext) error { +func (h *PutProject) emptyProjectProvisioning( + ctx context.Context, + repoContext *GitRepositoryContext, +) error { log := ctrl.LoggerFrom(ctx) log.Info("Initialing empty git repository") @@ -451,14 +542,23 @@ func (h *PutProject) emptyProjectProvisioning(ctx context.Context, repoContext * log.Info("Making initial commit") - if err := h.gitProviderNoAuth.Commit(ctx, repoContext.WorkDir, "Initial commit", gitproviderv2.CommitAllowEmpty()); err != nil { + if err := h.gitProviderNoAuth.Commit( + ctx, + repoContext.WorkDir, + "Initial commit", + gitproviderv2.CommitAllowEmpty(), + ); err != nil { return fmt.Errorf("failed to create Initial commit: %w", err) } return nil } -func (h *PutProject) notEmptyProjectProvisioning(ctx context.Context, codebase *codebaseApi.Codebase, repoContext *GitRepositoryContext) error { +func (h *PutProject) notEmptyProjectProvisioning( + ctx context.Context, + codebase *codebaseApi.Codebase, + repoContext *GitRepositoryContext, +) error { log := ctrl.LoggerFrom(ctx) log.Info("Start initial provisioning for non-empty project") diff --git a/controllers/codebase/service/chain/put_project_test.go b/controllers/codebase/service/chain/put_project_test.go index 97e956aa..d223ba3e 100644 --- a/controllers/codebase/service/chain/put_project_test.go +++ b/controllers/codebase/service/chain/put_project_test.go @@ -1,3 +1,4 @@ +// nolint:lll,dupl // Long lines and duplicate test setup are acceptable in tests for readability package chain import ( @@ -34,11 +35,13 @@ func TestPutProject_ServeRequest(t *testing.T) { const defaultNs = "default" tests := []struct { - name string - codebase *codebaseApi.Codebase - objects []client.Object - gitProviderFactory func(t *testing.T) gitproviderv2.GitProviderFactory - gitProvider func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) + name string + codebase *codebaseApi.Codebase + objects []client.Object + gitProviderFactory func(t *testing.T) gitproviderv2.GitProviderFactory + gitProvider func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) wantErr require.ErrorAssertionFunc wantStatus func(t *testing.T, status codebaseApi.CodebaseStatus) wantCodebaseErrorStatus func(t *testing.T, codebase *codebaseApi.Codebase) @@ -59,7 +62,9 @@ func TestPutProject_ServeRequest(t *testing.T) { return nil } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return nil }, wantErr: require.NoError, @@ -86,7 +91,9 @@ func TestPutProject_ServeRequest(t *testing.T) { return nil } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return nil }, wantErr: require.NoError, @@ -113,7 +120,9 @@ func TestPutProject_ServeRequest(t *testing.T) { return nil } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return nil }, wantErr: require.NoError, @@ -140,7 +149,9 @@ func TestPutProject_ServeRequest(t *testing.T) { return nil } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return nil }, wantErr: require.NoError, @@ -193,11 +204,14 @@ func TestPutProject_ServeRequest(t *testing.T) { mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything).Return(nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { mock := mocks.NewMockGitProjectProvider(t) mock.EXPECT().ProjectExists(testify.Anything, testify.Anything, testify.Anything, "test-app"). Return(false, nil) @@ -205,6 +219,7 @@ func TestPutProject_ServeRequest(t *testing.T) { Return(nil) mock.EXPECT().SetDefaultBranch(testify.Anything, testify.Anything, testify.Anything, "test-app", "main"). Return(nil) + return func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return mock, nil } @@ -259,16 +274,20 @@ func TestPutProject_ServeRequest(t *testing.T) { mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything).Return(nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { mock := mocks.NewMockGitProjectProvider(t) mock.EXPECT().ProjectExists(testify.Anything, testify.Anything, testify.Anything, "test-app"). Return(true, nil) mock.EXPECT().SetDefaultBranch(testify.Anything, testify.Anything, testify.Anything, "test-app", "main"). Return(nil) + return func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return mock, nil } @@ -327,11 +346,14 @@ func TestPutProject_ServeRequest(t *testing.T) { mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything).Return(nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { mock := mocks.NewMockGitProjectProvider(t) mock.EXPECT().ProjectExists(testify.Anything, testify.Anything, testify.Anything, "test-app"). Return(false, nil) @@ -339,6 +361,7 @@ func TestPutProject_ServeRequest(t *testing.T) { Return(nil) mock.EXPECT().SetDefaultBranch(testify.Anything, testify.Anything, testify.Anything, "test-app", "main"). Return(nil) + return func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return mock, nil } @@ -391,14 +414,18 @@ func TestPutProject_ServeRequest(t *testing.T) { mock.EXPECT().Init(testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Commit(testify.Anything, testify.Anything, "Initial commit", testify.Anything).Return(nil) mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { mock := mocks.NewMockGitProjectProvider(t) mock.EXPECT().ProjectExists(testify.Anything, testify.Anything, testify.Anything, "test-app"). Return(false, errors.New("API connection failed")) + return func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return mock, nil } @@ -452,16 +479,20 @@ func TestPutProject_ServeRequest(t *testing.T) { mock.EXPECT().Init(testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Commit(testify.Anything, testify.Anything, "Initial commit", testify.Anything).Return(nil) mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { mock := mocks.NewMockGitProjectProvider(t) mock.EXPECT().ProjectExists(testify.Anything, testify.Anything, testify.Anything, "test-app"). Return(false, nil) mock.EXPECT().CreateProject(testify.Anything, testify.Anything, testify.Anything, "test-app", testify.Anything). Return(errors.New("permission denied")) + return func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return mock, nil } @@ -518,16 +549,20 @@ func TestPutProject_ServeRequest(t *testing.T) { mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything). Return(errors.New("push rejected")) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { mock := mocks.NewMockGitProjectProvider(t) mock.EXPECT().ProjectExists(testify.Anything, testify.Anything, testify.Anything, "test-app"). Return(false, nil) mock.EXPECT().CreateProject(testify.Anything, testify.Anything, testify.Anything, "test-app", testify.Anything). Return(nil) + return func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return mock, nil } @@ -583,11 +618,14 @@ func TestPutProject_ServeRequest(t *testing.T) { mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything).Return(nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { mock := mocks.NewMockGitProjectProvider(t) mock.EXPECT().ProjectExists(testify.Anything, testify.Anything, testify.Anything, "test-app"). Return(false, nil) @@ -595,6 +633,7 @@ func TestPutProject_ServeRequest(t *testing.T) { Return(nil) mock.EXPECT().SetDefaultBranch(testify.Anything, testify.Anything, testify.Anything, "test-app", "main"). Return(errors.New("branch does not exist")) + return func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return mock, nil } @@ -650,11 +689,14 @@ func TestPutProject_ServeRequest(t *testing.T) { mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything).Return(nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { mock := mocks.NewMockGitProjectProvider(t) mock.EXPECT().ProjectExists(testify.Anything, testify.Anything, testify.Anything, "test-app"). Return(false, nil) @@ -662,6 +704,7 @@ func TestPutProject_ServeRequest(t *testing.T) { Return(nil) mock.EXPECT().SetDefaultBranch(testify.Anything, testify.Anything, testify.Anything, "test-app", "main"). Return(gitprovider.ErrApiNotSupported) + return func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return mock, nil } @@ -716,11 +759,14 @@ func TestPutProject_ServeRequest(t *testing.T) { mock := gitmocks.NewMockGit(t) mock.EXPECT().Clone(testify.Anything, "https://github.com/epmd-edp/go-go-beego.git", testify.Anything). Return(errors.New("repository not found")) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return mocks.NewMockGitProjectProvider(t), nil } @@ -772,11 +818,14 @@ func TestPutProject_ServeRequest(t *testing.T) { gitProviderFactory: func(t *testing.T) gitproviderv2.GitProviderFactory { mock := gitmocks.NewMockGit(t) mock.EXPECT().Init(testify.Anything, testify.Anything).Return(errors.New("failed to initialize git repository")) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } }, - gitProvider: func(t *testing.T) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { + gitProvider: func( + t *testing.T, + ) func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return func(gitServer *codebaseApi.GitServer, token string) (gitprovider.GitProjectProvider, error) { return mocks.NewMockGitProjectProvider(t), nil } @@ -898,6 +947,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } @@ -910,6 +960,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { Return(nil) mock.EXPECT().SetHeadToBranch(int32(29418), "fake-ssh-key", "gerrit.example.com", "ci", "test-app", "main", testify.Anything). Return(nil) + return mock }, wantErr: require.NoError, @@ -940,6 +991,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } @@ -950,6 +1002,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { Return(true, nil) mock.EXPECT().SetHeadToBranch(int32(29418), "fake-ssh-key", "gerrit.example.com", "ci", "test-app", "main", testify.Anything). Return(nil) + return mock }, wantErr: require.NoError, @@ -984,6 +1037,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything).Return(nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } @@ -996,6 +1050,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { Return(nil) mock.EXPECT().SetHeadToBranch(int32(29418), "fake-ssh-key", "gerrit.example.com", "ci", "test-app", "main", testify.Anything). Return(nil) + return mock }, wantErr: require.NoError, @@ -1024,6 +1079,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { mock.EXPECT().Init(testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Commit(testify.Anything, testify.Anything, "Initial commit", testify.Anything).Return(nil) mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } @@ -1032,6 +1088,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { mock := gerritMocks.NewMockClient(t) mock.EXPECT().CheckProjectExist(int32(29418), "fake-ssh-key", "gerrit.example.com", "ci", "test-app", testify.Anything). Return(false, errors.New("SSH connection failed")) + return mock }, wantErr: require.Error, @@ -1061,6 +1118,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { mock.EXPECT().Init(testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Commit(testify.Anything, testify.Anything, "Initial commit", testify.Anything).Return(nil) mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } @@ -1071,6 +1129,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { Return(false, nil) mock.EXPECT().CreateProject(int32(29418), "fake-ssh-key", "gerrit.example.com", "ci", "test-app", testify.Anything). Return(errors.New("permission denied")) + return mock }, wantErr: require.Error, @@ -1103,6 +1162,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything). Return(errors.New("push rejected")) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } @@ -1113,6 +1173,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { Return(false, nil) mock.EXPECT().CreateProject(int32(29418), "fake-ssh-key", "gerrit.example.com", "ci", "test-app", testify.Anything). Return(nil) + return mock }, wantErr: require.Error, @@ -1144,6 +1205,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { mock.EXPECT().GetCurrentBranchName(testify.Anything, testify.Anything).Return("main", nil) mock.EXPECT().AddRemoteLink(testify.Anything, testify.Anything, testify.Anything).Return(nil) mock.EXPECT().Push(testify.Anything, testify.Anything, testify.Anything, testify.Anything).Return(nil) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } @@ -1156,6 +1218,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { Return(nil) mock.EXPECT().SetHeadToBranch(int32(29418), "fake-ssh-key", "gerrit.example.com", "ci", "test-app", "main", testify.Anything). Return(errors.New("branch does not exist")) + return mock }, wantErr: require.Error, @@ -1187,6 +1250,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { mock := gitmocks.NewMockGit(t) mock.EXPECT().Clone(testify.Anything, "https://github.com/epmd-edp/go-go-beego.git", testify.Anything). Return(errors.New("repository not found")) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } @@ -1219,6 +1283,7 @@ func TestPutProject_ServeRequest_Gerrit(t *testing.T) { gitProviderFactory: func(t *testing.T) gitproviderv2.GitProviderFactory { mock := gitmocks.NewMockGit(t) mock.EXPECT().Init(testify.Anything, testify.Anything).Return(errors.New("failed to initialize git repository")) + return func(config gitproviderv2.Config) gitproviderv2.Git { return mock } diff --git a/controllers/codebase/service/chain/put_webhook.go b/controllers/codebase/service/chain/put_webhook.go index 929a3e09..9c8f3443 100644 --- a/controllers/codebase/service/chain/put_webhook.go +++ b/controllers/codebase/service/chain/put_webhook.go @@ -46,7 +46,11 @@ func (s *PutWebHook) ServeRequest(ctx context.Context, codebase *codebaseApi.Cod log.Info("Start putting webhook") gitServer := &codebaseApi.GitServer{} - if err := s.client.Get(ctx, client.ObjectKey{Name: codebase.Spec.GitServer, Namespace: codebase.Namespace}, gitServer); err != nil { + if err := s.client.Get( + ctx, + client.ObjectKey{Name: codebase.Spec.GitServer, Namespace: codebase.Namespace}, + gitServer, + ); err != nil { return s.processCodebaseError( codebase, fmt.Errorf("failed to get git server %s: %w", codebase.Spec.GitServer, err), @@ -65,7 +69,11 @@ func (s *PutWebHook) ServeRequest(ctx context.Context, codebase *codebaseApi.Cod return s.processCodebaseError(codebase, err) } - gitProvider, err := gitprovider.NewProvider(gitServer, s.restyClient, string(secret.Data[util.GitServerSecretTokenField])) + gitProvider, err := gitprovider.NewProvider( + gitServer, + s.restyClient, + string(secret.Data[util.GitServerSecretTokenField]), + ) if err != nil { return s.processCodebaseError(codebase, fmt.Errorf("failed to create git provider: %w", err)) } @@ -81,7 +89,6 @@ func (s *PutWebHook) ServeRequest(ctx context.Context, codebase *codebaseApi.Cod projectID, codebase.Status.GetWebHookRef(), ) - if err == nil { log.Info("Webhook already exists. Skip putting webhook") diff --git a/controllers/codebase/service/chain/put_webhook_test.go b/controllers/codebase/service/chain/put_webhook_test.go index a4e15204..5067452e 100644 --- a/controllers/codebase/service/chain/put_webhook_test.go +++ b/controllers/codebase/service/chain/put_webhook_test.go @@ -1,3 +1,4 @@ +// nolint:dupl // Duplicate test setup is acceptable in tests for readability package chain import ( @@ -356,11 +357,17 @@ func TestPutWebHook_ServeRequest(t *testing.T) { fakeIngress(gitserver.GenerateIngressName("test-git-server"), "fake.gitlab.com"), }, responder: func(t *testing.T) { - getHookResponder, err := httpmock.NewJsonResponder(http.StatusNotFound, map[string]string{"message": "404 Not Found"}) + getHookResponder, err := httpmock.NewJsonResponder( + http.StatusNotFound, + map[string]string{"message": "404 Not Found"}, + ) require.NoError(t, err) httpmock.RegisterRegexpResponder(http.MethodGet, regexp.MustCompile(`.*999$`), getHookResponder) - getHooksResponder, err := httpmock.NewJsonResponder(http.StatusOK, []map[string]interface{}{{"id": 1, "url": "https://fake.gitlab.com"}}) + getHooksResponder, err := httpmock.NewJsonResponder( + http.StatusOK, + []map[string]interface{}{{"id": 1, "url": "https://fake.gitlab.com"}}, + ) require.NoError(t, err) httpmock.RegisterRegexpResponder(http.MethodGet, regexp.MustCompile(`.*hooks$`), getHooksResponder) }, @@ -529,7 +536,10 @@ func TestPutWebHook_ServeRequest(t *testing.T) { fakeIngress(gitserver.GenerateIngressName("test-git-server"), "fake.gitlab.com"), }, responder: func(t *testing.T) { - getHookResponder, err := httpmock.NewJsonResponder(http.StatusNotFound, map[string]string{"message": "404 Not Found"}) + getHookResponder, err := httpmock.NewJsonResponder( + http.StatusNotFound, + map[string]string{"message": "404 Not Found"}, + ) require.NoError(t, err) httpmock.RegisterRegexpResponder(http.MethodGet, regexp.MustCompile(`.*999$`), getHookResponder) @@ -622,7 +632,10 @@ func TestPutWebHook_ServeRequest(t *testing.T) { }, }, responder: func(t *testing.T) { - getResponder, err := httpmock.NewJsonResponder(http.StatusBadRequest, map[string]string{"message": "400 Bad Request"}) + getResponder, err := httpmock.NewJsonResponder( + http.StatusBadRequest, + map[string]string{"message": "400 Bad Request"}, + ) require.NoError(t, err) httpmock.RegisterRegexpResponder(http.MethodGet, fakeUrlRegexp, getResponder) }, diff --git a/controllers/codebase/service/template/template.go b/controllers/codebase/service/template/template.go index 4f411c56..38c1ce57 100644 --- a/controllers/codebase/service/template/template.go +++ b/controllers/codebase/service/template/template.go @@ -50,7 +50,11 @@ func PrepareTemplates(ctx context.Context, c client.Client, cb *codebaseApi.Code return nil } -func buildTemplateConfig(ctx context.Context, c client.Client, cb *codebaseApi.Codebase) (*model.ConfigGoTemplating, error) { +func buildTemplateConfig( + ctx context.Context, + c client.Client, + cb *codebaseApi.Codebase, +) (*model.ConfigGoTemplating, error) { log := ctrl.LoggerFrom(ctx) log.Info("Start creating template config") diff --git a/controllers/codebasebranch/chain/check_reference.go b/controllers/codebasebranch/chain/check_reference.go index f92d6d17..fc8092f9 100644 --- a/controllers/codebasebranch/chain/check_reference.go +++ b/controllers/codebasebranch/chain/check_reference.go @@ -45,7 +45,10 @@ func (c CheckReferenceExists) ServeRequest(ctx context.Context, codebaseBranch * }, codebase, ); err != nil { - return c.processErr(codebaseBranch, fmt.Errorf("failed to get codebase %s: %w", codebaseBranch.Spec.CodebaseName, err)) + return c.processErr( + codebaseBranch, + fmt.Errorf("failed to get codebase %s: %w", codebaseBranch.Spec.CodebaseName, err), + ) } gitServer := &codebaseApi.GitServer{} diff --git a/controllers/codebasebranch/chain/check_reference_test.go b/controllers/codebasebranch/chain/check_reference_test.go index e444de30..11cf757e 100644 --- a/controllers/codebasebranch/chain/check_reference_test.go +++ b/controllers/codebasebranch/chain/check_reference_test.go @@ -1,3 +1,4 @@ +// nolint:dupl // Duplicate test setup is acceptable in tests for readability package chain import ( diff --git a/controllers/codebasebranch/chain/process_new_version.go b/controllers/codebasebranch/chain/process_new_version.go index 0f19391a..fa602efd 100644 --- a/controllers/codebasebranch/chain/process_new_version.go +++ b/controllers/codebasebranch/chain/process_new_version.go @@ -44,7 +44,11 @@ func (h ProcessNewVersion) ServeRequest(ctx context.Context, codebaseBranch *cod return nil } -func (h ProcessNewVersion) processNewVersion(ctx context.Context, codebaseBranch *codebaseApi.CodebaseBranch, codebase *codebaseApi.Codebase) error { +func (h ProcessNewVersion) processNewVersion( + ctx context.Context, + codebaseBranch *codebaseApi.CodebaseBranch, + codebase *codebaseApi.Codebase, +) error { log := ctrl.LoggerFrom(ctx) if !codebase.Spec.IsVersionTypeSemver() { diff --git a/controllers/codebasebranch/chain/process_new_version_test.go b/controllers/codebasebranch/chain/process_new_version_test.go index 80619a2b..1299099d 100644 --- a/controllers/codebasebranch/chain/process_new_version_test.go +++ b/controllers/codebasebranch/chain/process_new_version_test.go @@ -1,3 +1,4 @@ +// nolint:dupl // Duplicate test setup is acceptable in tests for readability package chain import ( diff --git a/controllers/codebasebranch/chain/put_branch_in_git/put_branch_in_git.go b/controllers/codebasebranch/chain/put_branch_in_git/put_branch_in_git.go index c5e5bbe9..75ec691c 100644 --- a/controllers/codebasebranch/chain/put_branch_in_git/put_branch_in_git.go +++ b/controllers/codebasebranch/chain/put_branch_in_git/put_branch_in_git.go @@ -144,7 +144,10 @@ func (h PutBranchInGit) ServeRequest(ctx context.Context, branch *codebaseApi.Co return nil } -func (h PutBranchInGit) setIntermediateSuccessFields(cb *codebaseApi.CodebaseBranch, action codebaseApi.ActionType) error { +func (h PutBranchInGit) setIntermediateSuccessFields( + cb *codebaseApi.CodebaseBranch, + action codebaseApi.ActionType, +) error { ctx := context.Background() cb.Status = codebaseApi.CodebaseBranchStatus{ Status: model.StatusInit, diff --git a/controllers/codebasebranch/chain/put_codebase_image_stream/put_codebase_image_stream.go b/controllers/codebasebranch/chain/put_codebase_image_stream/put_codebase_image_stream.go index ad69936d..d79303bc 100644 --- a/controllers/codebasebranch/chain/put_codebase_image_stream/put_codebase_image_stream.go +++ b/controllers/codebasebranch/chain/put_codebase_image_stream/put_codebase_image_stream.go @@ -77,11 +77,19 @@ func (h PutCodebaseImageStream) getDockerRegistryUrl(ctx context.Context, namesp } if config.KrciConfigContainerRegistryHost == "" { - return "", fmt.Errorf("%s is not set in %s config map", platform.KrciConfigContainerRegistryHost, platform.KrciConfigMap) + return "", fmt.Errorf( + "%s is not set in %s config map", + platform.KrciConfigContainerRegistryHost, + platform.KrciConfigMap, + ) } if config.KrciConfigContainerRegistrySpace == "" { - return "", fmt.Errorf("%s is not set in %s config map", platform.KrciConfigContainerRegistrySpace, platform.KrciConfigMap) + return "", fmt.Errorf( + "%s is not set in %s config map", + platform.KrciConfigContainerRegistrySpace, + platform.KrciConfigMap, + ) } return fmt.Sprintf("%s/%s", config.KrciConfigContainerRegistryHost, config.KrciConfigContainerRegistrySpace), nil @@ -175,11 +183,15 @@ func (h PutCodebaseImageStream) getCodebaseImageStream( // Get CodebaseImageStream by name old version for backward compatibility. // TODO: remove this in the next releases. cis = &codebaseApi.CodebaseImageStream{} + err = h.Client.Get(ctx, types.NamespacedName{ Namespace: codebaseBranch.Namespace, - Name: fmt.Sprintf("%v-%v", codebaseBranch.Spec.CodebaseName, ProcessNameToK8sConvention(codebaseBranch.Spec.BranchName)), + Name: fmt.Sprintf( + "%v-%v", + codebaseBranch.Spec.CodebaseName, + ProcessNameToK8sConvention(codebaseBranch.Spec.BranchName), + ), }, cis) - if err != nil { return nil, fmt.Errorf("failed to get CodebaseImageStream: %w", err) } @@ -202,7 +214,10 @@ func setFailedFields(cb *codebaseApi.CodebaseBranch, a codebaseApi.ActionType, m } } -func (h PutCodebaseImageStream) setIntermediateSuccessFields(cb *codebaseApi.CodebaseBranch, action codebaseApi.ActionType) error { +func (h PutCodebaseImageStream) setIntermediateSuccessFields( + cb *codebaseApi.CodebaseBranch, + action codebaseApi.ActionType, +) error { ctx := context.Background() cb.Status = codebaseApi.CodebaseBranchStatus{ Status: model.StatusInit, diff --git a/controllers/codebasebranch/chain/put_codebase_image_stream/put_codebase_image_stream_test.go b/controllers/codebasebranch/chain/put_codebase_image_stream/put_codebase_image_stream_test.go index 27978456..da517ade 100644 --- a/controllers/codebasebranch/chain/put_codebase_image_stream/put_codebase_image_stream_test.go +++ b/controllers/codebasebranch/chain/put_codebase_image_stream/put_codebase_image_stream_test.go @@ -60,7 +60,12 @@ func TestPutCodebaseImageStream_ServeRequest(t *testing.T) { }, wantErr: require.NoError, want: func(t *testing.T, k8sCl client.Client) { - cis, err := codebaseimagestream.GetCodebaseImageStreamByCodebaseBaseBranchName(context.Background(), k8sCl, "test-branch", "default") + cis, err := codebaseimagestream.GetCodebaseImageStreamByCodebaseBaseBranchName( + context.Background(), + k8sCl, + "test-branch", + "default", + ) require.NoError(t, err) require.NotNil(t, metav1.GetControllerOf(cis)) @@ -148,7 +153,12 @@ func TestPutCodebaseImageStream_ServeRequest(t *testing.T) { }, wantErr: require.NoError, want: func(t *testing.T, k8sCl client.Client) { - cis, err := codebaseimagestream.GetCodebaseImageStreamByCodebaseBaseBranchName(context.Background(), k8sCl, "test-branch", "default") + cis, err := codebaseimagestream.GetCodebaseImageStreamByCodebaseBaseBranchName( + context.Background(), + k8sCl, + "test-branch", + "default", + ) require.NoError(t, err) require.Contains(t, cis.Labels, codebaseApi.CodebaseBranchLabel) diff --git a/controllers/codebasebranch/codebasebranch_controller.go b/controllers/codebasebranch/codebasebranch_controller.go index bbe3aaf5..bc25e434 100644 --- a/controllers/codebasebranch/codebasebranch_controller.go +++ b/controllers/codebasebranch/codebasebranch_controller.go @@ -194,7 +194,11 @@ func (r *ReconcileCodebaseBranch) Reconcile(ctx context.Context, request reconci return reconcile.Result{}, nil } -func (r *ReconcileCodebaseBranch) setSuccessStatus(ctx context.Context, cb *codebaseApi.CodebaseBranch, action codebaseApi.ActionType) error { +func (r *ReconcileCodebaseBranch) setSuccessStatus( + ctx context.Context, + cb *codebaseApi.CodebaseBranch, + action codebaseApi.ActionType, +) error { cb.Status = codebaseApi.CodebaseBranchStatus{ LastTimeUpdated: metaV1.Now(), Username: "system", @@ -298,6 +302,7 @@ func removeDirectoryIfExists(codebaseName, branchName, namespace string) error { // setFailureCount increments failure count and returns delay for next reconciliation. func (r *ReconcileCodebaseBranch) setFailureCount(c *codebaseApi.CodebaseBranch) time.Duration { const defaultDuration = 10 * time.Second + timeout := util.GetTimeout(c.Status.FailureCount, defaultDuration) r.log.V(2).Info("wait for next reconciliation", "next reconciliation in", timeout) diff --git a/controllers/codebasebranch/codebasebranch_controller_test.go b/controllers/codebasebranch/codebasebranch_controller_test.go index e263b680..66cfb73a 100644 --- a/controllers/codebasebranch/codebasebranch_controller_test.go +++ b/controllers/codebasebranch/codebasebranch_controller_test.go @@ -256,7 +256,12 @@ func TestReconcileCodebaseBranch_Reconcile_ShouldPassWithCreatingCIS(t *testing. assert.NoError(t, err) assert.Equal(t, time.Duration(0), res.RequeueAfter) - cisTocehck, err := codebaseimagestream.GetCodebaseImageStreamByCodebaseBaseBranchName(context.Background(), fakeCl, cb.Name, cb.Namespace) + cisTocehck, err := codebaseimagestream.GetCodebaseImageStreamByCodebaseBaseBranchName( + context.Background(), + fakeCl, + cb.Name, + cb.Namespace, + ) require.NoError(t, err) assert.Equal(t, "stub-url/stub-space/NewCodebase", cisTocehck.Spec.ImageName) diff --git a/controllers/codebaseimagestream/chain/put_cd_stage_deploy.go b/controllers/codebaseimagestream/chain/put_cd_stage_deploy.go index ab26e178..fc8cc704 100644 --- a/controllers/codebaseimagestream/chain/put_cd_stage_deploy.go +++ b/controllers/codebaseimagestream/chain/put_cd_stage_deploy.go @@ -46,10 +46,13 @@ func (h PutCDStageDeploy) ServeRequest(ctx context.Context, imageStream *codebas return nil } -func (h PutCDStageDeploy) handleCodebaseImageStreamEnvLabels(ctx context.Context, imageStream *codebaseApi.CodebaseImageStream) error { +func (h PutCDStageDeploy) handleCodebaseImageStreamEnvLabels( + ctx context.Context, + imageStream *codebaseApi.CodebaseImageStream, +) error { l := ctrl.LoggerFrom(ctx) - if len(imageStream.ObjectMeta.Labels) == 0 { + if len(imageStream.Labels) == 0 { l.Info("CodebaseImageStream does not contain env labels. Skip CDStageDeploy creating.") return nil } @@ -60,7 +63,7 @@ func (h PutCDStageDeploy) handleCodebaseImageStreamEnvLabels(ctx context.Context labelValueRegexp := regexp.MustCompile("^[-A-Za-z0-9_.]+/[-A-Za-z0-9_.]+$") - for envLabel, val := range imageStream.ObjectMeta.Labels { + for envLabel, val := range imageStream.Labels { // pipeline lable should be in format cdpipeline/stage-name: "" if labelValueRegexp.MatchString(envLabel) && val == "" { if err := h.putCDStageDeploy(ctx, envLabel, imageStream.Namespace, imageStream.Spec); err != nil { @@ -90,7 +93,12 @@ func validateCbis(imageStream *codebaseApi.CodebaseImageStream) []string { return errs } -func (h PutCDStageDeploy) putCDStageDeploy(ctx context.Context, envLabel, namespace string, spec codebaseApi.CodebaseImageStreamSpec) error { +func (h PutCDStageDeploy) putCDStageDeploy( + ctx context.Context, + envLabel, + namespace string, + spec codebaseApi.CodebaseImageStreamSpec, +) error { l := ctrl.LoggerFrom(ctx) // use name for CDStageDeploy, it is converted from envLabel and cdpipeline/stage now is cdpipeline-stage name := strings.ReplaceAll(envLabel, "/", "-") @@ -122,7 +130,16 @@ func (h PutCDStageDeploy) putCDStageDeploy(ctx context.Context, envLabel, namesp return nil } - cdsd, err := getCreateCommand(ctx, pipeline, stage, name, namespace, spec.Codebase, stageCr.Spec.TriggerType, spec.Tags) + cdsd, err := getCreateCommand( + ctx, + pipeline, + stage, + name, + namespace, + spec.Codebase, + stageCr.Spec.TriggerType, + spec.Tags, + ) if err != nil { return fmt.Errorf("failed to construct command to create %v cd stage deploy: %w", name, err) } @@ -134,7 +151,12 @@ func (h PutCDStageDeploy) putCDStageDeploy(ctx context.Context, envLabel, namesp return nil } -func (h PutCDStageDeploy) skipCDStageDeployCreation(ctx context.Context, pipeline, namespace string, stage *pipelineApi.Stage) (bool, error) { +func (h PutCDStageDeploy) skipCDStageDeployCreation( + ctx context.Context, + pipeline, + namespace string, + stage *pipelineApi.Stage, +) (bool, error) { l := ctrl.LoggerFrom(ctx) if !stage.IsAutoDeployTriggerType() { diff --git a/controllers/codebaseimagestream/chain/put_cd_stage_deploy_test.go b/controllers/codebaseimagestream/chain/put_cd_stage_deploy_test.go index 3c9f1548..dc1539b8 100644 --- a/controllers/codebaseimagestream/chain/put_cd_stage_deploy_test.go +++ b/controllers/codebaseimagestream/chain/put_cd_stage_deploy_test.go @@ -1,3 +1,4 @@ +// nolint:dupl // Duplicate test setup is acceptable in tests for readability package chain import ( diff --git a/controllers/codebaseimagestream/codebaseimagestream_controller.go b/controllers/codebaseimagestream/codebaseimagestream_controller.go index 4cb28933..d5e77f36 100644 --- a/controllers/codebaseimagestream/codebaseimagestream_controller.go +++ b/controllers/codebaseimagestream/codebaseimagestream_controller.go @@ -51,7 +51,7 @@ func (r *ReconcileCodebaseImageStream) SetupWithManager(mgr ctrl.Manager) error return true } - if !reflect.DeepEqual(oo.Spec.Tags, on.Spec.Tags) && on.ObjectMeta.Labels != nil { + if !reflect.DeepEqual(oo.Spec.Tags, on.Spec.Tags) && on.Labels != nil { return true } @@ -76,9 +76,18 @@ func (r *ReconcileCodebaseImageStream) SetupWithManager(mgr ctrl.Manager) error // +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=codebaseimagestreams/finalizers,verbs=update // Reconcile reads that state of the cluster for a CodebaseImageStream object and makes changes based on the state. -func (r *ReconcileCodebaseImageStream) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) { - log := r.log.WithValues("type", "CodebaseImageStream", "Request.Namespace", request.Namespace, - "Request.Name", request.Name) +func (r *ReconcileCodebaseImageStream) Reconcile( + ctx context.Context, + request reconcile.Request, +) (reconcile.Result, error) { + log := r.log.WithValues( + "type", + "CodebaseImageStream", + "Request.Namespace", + request.Namespace, + "Request.Name", + request.Name, + ) log.Info("Reconciling has been started.") i := &codebaseApi.CodebaseImageStream{} diff --git a/controllers/gitserver/create_event_listener.go b/controllers/gitserver/create_event_listener.go index 403a16f3..0ad78830 100644 --- a/controllers/gitserver/create_event_listener.go +++ b/controllers/gitserver/create_event_listener.go @@ -106,11 +106,11 @@ func (h *CreateEventListener) createEventListener(ctx context.Context, gitServer } elCheck := tektoncd.NewEventListenerUnstructured() + err := h.k8sClient.Get(ctx, client.ObjectKey{ Namespace: gitServer.Namespace, Name: elName, }, elCheck) - if err == nil { log.Info("EventListener already exists", "EventListener", el.GetName()) return nil @@ -141,7 +141,6 @@ func (h *CreateEventListener) createIngress(ctx context.Context, gitServer *code Namespace: gitServer.Namespace, Name: name, }, &networkingv1.Ingress{}) - if err == nil { log.Info("Ingress already exists", "Ingress", name) @@ -225,7 +224,6 @@ func (h *CreateEventListener) createRoute(ctx context.Context, gitServer *codeba Namespace: gitServer.Namespace, Name: name, }, &routeApi.Route{}) - if err == nil { log.Info("Route already exists", "Route", name) diff --git a/controllers/gitserver/create_event_listener_test.go b/controllers/gitserver/create_event_listener_test.go index 02b8636a..26e6f749 100644 --- a/controllers/gitserver/create_event_listener_test.go +++ b/controllers/gitserver/create_event_listener_test.go @@ -1,3 +1,4 @@ +// nolint:dupl // Duplicate test setup is acceptable in tests for readability package gitserver import ( diff --git a/controllers/gitserver/gitserver_controller.go b/controllers/gitserver/gitserver_controller.go index 0515084b..51349507 100644 --- a/controllers/gitserver/gitserver_controller.go +++ b/controllers/gitserver/gitserver_controller.go @@ -143,7 +143,11 @@ func (r *ReconcileGitServer) checkConnectionToGitServer(ctx context.Context, git return nil } -func (r *ReconcileGitServer) updateGitServerStatus(ctx context.Context, gitServer *codebaseApi.GitServer, oldStatus codebaseApi.GitServerStatus) error { +func (r *ReconcileGitServer) updateGitServerStatus( + ctx context.Context, + gitServer *codebaseApi.GitServer, + oldStatus codebaseApi.GitServerStatus, +) error { if gitServer.Status == oldStatus { return nil } diff --git a/controllers/gitserver/gitserver_controller_test.go b/controllers/gitserver/gitserver_controller_test.go index adc98f75..fd5bcfee 100644 --- a/controllers/gitserver/gitserver_controller_test.go +++ b/controllers/gitserver/gitserver_controller_test.go @@ -235,9 +235,11 @@ func TestReconcileGitServer_ServerUnavailable(t *testing.T) { err := corev1.AddToScheme(scheme) assert.NoError(t, err) - secret := corev1.Secret{ObjectMeta: metaV1.ObjectMeta{Name: "ssh-secret", Namespace: gs.Namespace}, Data: map[string][]byte{ - util.PrivateSShKeyName: []byte(testKey), - }} + secret := corev1.Secret{ + ObjectMeta: metaV1.ObjectMeta{Name: "ssh-secret", Namespace: gs.Namespace}, + Data: map[string][]byte{ + util.PrivateSShKeyName: []byte(testKey), + }} fakeCl := fake.NewClientBuilder(). WithScheme(scheme). diff --git a/controllers/integrationsecret/integrationsecret_controller.go b/controllers/integrationsecret/integrationsecret_controller.go index 782808fc..9801d58a 100644 --- a/controllers/integrationsecret/integrationsecret_controller.go +++ b/controllers/integrationsecret/integrationsecret_controller.go @@ -70,7 +70,10 @@ func (r *ReconcileIntegrationSecret) SetupWithManager(mgr ctrl.Manager) error { // +kubebuilder:rbac:groups="",namespace=placeholder,resources=secrets,verbs=get;list;watch;update;patch // Reconcile reads secrets with integration-secret label and set connection status to the annotation. -func (r *ReconcileIntegrationSecret) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) { +func (r *ReconcileIntegrationSecret) Reconcile( + ctx context.Context, + request reconcile.Request, +) (reconcile.Result, error) { secret := &corev1.Secret{} if err := r.client.Get(ctx, request.NamespacedName, secret); err != nil { if k8sErrors.IsNotFound(err) { @@ -109,7 +112,12 @@ func (r *ReconcileIntegrationSecret) Reconcile(ctx context.Context, request reco }, nil } -func (r *ReconcileIntegrationSecret) updateConnectionAnnotation(ctx context.Context, secret *corev1.Secret, reachable bool, errMess string) error { +func (r *ReconcileIntegrationSecret) updateConnectionAnnotation( + ctx context.Context, + secret *corev1.Secret, + reachable bool, + errMess string, +) error { log := ctrl.LoggerFrom(ctx) if secret.GetAnnotations()[integrationSecretConnectionAnnotation] != strconv.FormatBool(reachable) || @@ -239,7 +247,8 @@ func checkRegistry(ctx context.Context, secret *corev1.Secret) error { log := ctrl.LoggerFrom(ctx).WithValues(logKeyUrl, url+"/v2/") log.Info("Making request") - // docker registry specification endpoint https://github.com/opencontainers/distribution-spec/blob/v1.0.1/spec.md#endpoints + // docker registry specification endpoint + // https://github.com/opencontainers/distribution-spec/blob/v1.0.1/spec.md#endpoints resp, err := newRequest(ctx, url).SetBasicAuth(auth.Username, auth.Password).Get("/v2/") if err != nil { return fmt.Errorf("%w", err) @@ -266,7 +275,6 @@ func checkDockerHub(ctx context.Context, username, password string) error { "password": password, }). Post("/v2/users/login") - if err != nil { return fmt.Errorf("%w", err) } @@ -286,7 +294,6 @@ func checkGitHubRegistry(ctx context.Context, auth registryAuth, url string) err SetHeader("Content-Type", "application/json"). SetAuthToken(base64.StdEncoding.EncodeToString([]byte(auth.Password))). Get("/v2/_catalog") - if err != nil { return fmt.Errorf("failed to connect to GitHub registry %w", err) } @@ -315,7 +322,6 @@ func checkCodemie(ctx context.Context, secret *corev1.Secret) error { ForceContentType("application/json"). SetResult(&res). Get("/v1/user") - if err != nil { log.Error(err, "Failed to connect to Codemie") diff --git a/controllers/integrationsecret/integrationsecret_controller_test.go b/controllers/integrationsecret/integrationsecret_controller_test.go index be0a9f54..f05c5982 100644 --- a/controllers/integrationsecret/integrationsecret_controller_test.go +++ b/controllers/integrationsecret/integrationsecret_controller_test.go @@ -199,7 +199,8 @@ func TestReconcileIntegrationSecret_Reconcile(t *testing.T) { }, Type: corev1.SecretTypeDockerConfigJson, Data: map[string][]byte{ - ".dockerconfigjson": []byte(`{"auths":{"` + server.URL + `/success":{"username":"user1", "password":"password1"}}}`), + ".dockerconfigjson": []byte(`{"auths":{"` + server.URL + + `/success":{"username":"user1", "password":"password1"}}}`), }, }, ).Build() @@ -225,7 +226,8 @@ func TestReconcileIntegrationSecret_Reconcile(t *testing.T) { }, Type: corev1.SecretTypeDockerConfigJson, Data: map[string][]byte{ - ".dockerconfigjson": []byte(`{"auths":{"` + server.URL + `/fail":{"username":"user1", "password":"password1"}}}`), + ".dockerconfigjson": []byte(`{"auths":{"` + server.URL + + `/fail":{"username":"user1", "password":"password1"}}}`), }, }, ).Build() @@ -277,7 +279,9 @@ func TestReconcileIntegrationSecret_Reconcile(t *testing.T) { }, Type: corev1.SecretTypeDockerConfigJson, Data: map[string][]byte{ - ".dockerconfigjson": []byte(`{"auths":{"https://index.docker.io/v1/":{"username":"user1", "password":"password1"}}}`), + ".dockerconfigjson": []byte( + `{"auths":{"https://index.docker.io/v1/":{"username":"user1", "password":"password1"}}}`, + ), }, }, ).Build() diff --git a/controllers/jiraissuemetadata/chain/factory.go b/controllers/jiraissuemetadata/chain/factory.go index 96af1c2a..091f5fb4 100644 --- a/controllers/jiraissuemetadata/chain/factory.go +++ b/controllers/jiraissuemetadata/chain/factory.go @@ -15,7 +15,11 @@ import ( const issuesLinks = "issuesLinks" -func CreateChain(metadataPayload string, jiraClient jira.Client, c client.Client) (handler.JiraIssueMetadataHandler, error) { +func CreateChain( + metadataPayload string, + jiraClient jira.Client, + c client.Client, +) (handler.JiraIssueMetadataHandler, error) { payload, err := util.GetFieldsMap(metadataPayload, nil) if err != nil { return nil, fmt.Errorf("failed to parse fields map from payload: %w", err) @@ -52,7 +56,11 @@ func createWithoutApplyingTagsChain(jiraClient jira.Client, c client.Client) han } } -func nextServeOrNil(ctx context.Context, next handler.JiraIssueMetadataHandler, metadata *codebaseApi.JiraIssueMetadata) error { +func nextServeOrNil( + ctx context.Context, + next handler.JiraIssueMetadataHandler, + metadata *codebaseApi.JiraIssueMetadata, +) error { log := ctrl.LoggerFrom(ctx) if next == nil { diff --git a/controllers/jiraissuemetadata/chain/put_issue_web_link_test.go b/controllers/jiraissuemetadata/chain/put_issue_web_link_test.go index 8515fe40..d146dccf 100644 --- a/controllers/jiraissuemetadata/chain/put_issue_web_link_test.go +++ b/controllers/jiraissuemetadata/chain/put_issue_web_link_test.go @@ -50,7 +50,15 @@ func TestPutIssueWebLink_ServeRequest_ShouldFail(t *testing.T) { Namespace: "fake-namespace", }, Spec: codebaseApi.JiraIssueMetadataSpec{ - Payload: "{\n \"components\": \"control-plane-gerrit\",\n \"issuesLinks\": [\n {\n \"ticket\": \"DEV-0000\",\n \"title\": \"[DEV-0000] updated components versions [alpha-zeta][build/1.5.0-SNAPSHOT.377]\",\n \"url\": \"https://example.com/job/alpha-zeta/job/MASTER-Build-alpha-zeta/890/console\"\n }\n ],\n \"fixVersions\": \"alpha-zeta-1.5.0\"\n }", + Payload: "{\n \"components\": \"control-plane-gerrit\",\n \"issuesLinks\": [\n" + + " {\n" + + " \"ticket\": \"DEV-0000\",\n" + + " \"title\": \"[DEV-0000] updated components versions [alpha-zeta][build/1.5.0-SNAPSHOT.377]\",\n" + + " \"url\": \"https://example.com/job/alpha-zeta/job/MASTER-Build-alpha-zeta/890/console\"\n" + + " }\n" + + " ],\n" + + " \"fixVersions\": \"alpha-zeta-1.5.0\"\n" + + " }", }, } diff --git a/controllers/jiraissuemetadata/chain/put_tag_value_test.go b/controllers/jiraissuemetadata/chain/put_tag_value_test.go index cb8db8b2..5eef0c39 100644 --- a/controllers/jiraissuemetadata/chain/put_tag_value_test.go +++ b/controllers/jiraissuemetadata/chain/put_tag_value_test.go @@ -31,7 +31,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{"TEST-1"}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":\"0.0.1-snapshot-java11\",\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":\"0.0.1-snapshot-java11\"," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { @@ -78,7 +83,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{"TEST-1"}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":\"0.0.1-snapshot-java11\",\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":\"0.0.1-snapshot-java11\"," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { @@ -121,7 +131,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{"TEST-1"}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":\"0.0.1-snapshot-java11\",\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":\"0.0.1-snapshot-java11\"," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { @@ -160,7 +175,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{"TEST-1"}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":\"0.0.1-snapshot-java11\",\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":\"0.0.1-snapshot-java11\"," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { @@ -210,7 +230,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{"TEST-1"}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":\"0.0.1-snapshot-java11\",\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":\"0.0.1-snapshot-java11\"," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { @@ -256,7 +281,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{"TEST-1"}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":{\"data\":\"0.0.1-snapshot-java11\"},\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":{\"data\":\"0.0.1-snapshot-java11\"}," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { @@ -305,7 +335,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{"TEST-1"}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":\"0.0.1-snapshot-java11\",\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":\"0.0.1-snapshot-java11\"," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { @@ -338,7 +373,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{"TEST-1"}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":\"0.0.1-snapshot-java11\",\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":\"0.0.1-snapshot-java11\"," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { @@ -362,7 +402,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{"TEST-1"}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":\"0.0.1-snapshot-java11\",\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":\"0.0.1-snapshot-java11\"," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { @@ -382,7 +427,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{"TEST-1"}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":\"0.0.1-snapshot-java11\",\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":\"0.0.1-snapshot-java11\"," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { @@ -418,7 +468,12 @@ func TestPutTagValue_ServeRequest(t *testing.T) { metadata: &codebaseApi.JiraIssueMetadata{ Spec: codebaseApi.JiraIssueMetadataSpec{ Tickets: []string{}, - Payload: "{\"components\":\"java11-mvn-create\",\"fixVersions\":\"0.0.1-snapshot-java11\",\"labels\":\"java11\",\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\",\"title\":\"[EPMDEDPSUP-5510]: test\",\"url\": \"https://test.com\"}]}", + Payload: "{\"components\":\"java11-mvn-create\"," + + "\"fixVersions\":\"0.0.1-snapshot-java11\"," + + "\"labels\":\"java11\"," + + "\"issuesLinks\":[{\"ticket\":\"EPMDEDPSUP-5510\"," + + "\"title\":\"[EPMDEDPSUP-5510]: test\"," + + "\"url\": \"https://test.com\"}]}", }, }, client: func(t *testing.T) jira.Client { diff --git a/controllers/jiraissuemetadata/jiraissuemetadata_controller.go b/controllers/jiraissuemetadata/jiraissuemetadata_controller.go index 20340e38..ce2f9378 100644 --- a/controllers/jiraissuemetadata/jiraissuemetadata_controller.go +++ b/controllers/jiraissuemetadata/jiraissuemetadata_controller.go @@ -35,7 +35,11 @@ const ( errorStatus = "error" ) -func NewReconcileJiraIssueMetadata(c client.Client, scheme *runtime.Scheme, log logr.Logger) *ReconcileJiraIssueMetadata { +func NewReconcileJiraIssueMetadata( + c client.Client, + scheme *runtime.Scheme, + log logr.Logger, +) *ReconcileJiraIssueMetadata { return &ReconcileJiraIssueMetadata{ client: c, scheme: scheme, @@ -87,7 +91,10 @@ func (r *ReconcileJiraIssueMetadata) SetupWithManager(mgr ctrl.Manager) error { // +kubebuilder:rbac:groups=v2.edp.epam.com,resources=jiraissuemetadatas/finalizers,verbs=update // Reconcile reads that state of the cluster for a JiraIssueMetadata object and makes changes based on the state. -func (r *ReconcileJiraIssueMetadata) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) { +func (r *ReconcileJiraIssueMetadata) Reconcile( + ctx context.Context, + request reconcile.Request, +) (reconcile.Result, error) { log := ctrl.LoggerFrom(ctx) log.Info("Reconciling JiraIssueMetadata") @@ -97,7 +104,11 @@ func (r *ReconcileJiraIssueMetadata) Reconcile(ctx context.Context, request reco return reconcile.Result{}, nil } - return reconcile.Result{}, fmt.Errorf("failed to fetch JiraIssueMetadata resource %q: %w", request.NamespacedName, err) + return reconcile.Result{}, fmt.Errorf( + "failed to fetch JiraIssueMetadata resource %q: %w", + request.NamespacedName, + err, + ) } defer r.updateStatus(ctx, i) @@ -158,6 +169,7 @@ func lookup() string { // setFailureCount increments failure count and returns delay for next reconciliation. func (r *ReconcileJiraIssueMetadata) setFailureCount(metadata *codebaseApi.JiraIssueMetadata) time.Duration { const timeoutDurationStep = 500 * time.Millisecond + timeout := util.GetTimeout(metadata.Status.FailureCount, timeoutDurationStep) r.log.V(2).Info("wait for next reconciliation", "next reconciliation in", timeout) @@ -216,7 +228,10 @@ func (r *ReconcileJiraIssueMetadata) initJiraClient(js *codebaseApi.JiraServer) return c, nil } -func (r *ReconcileJiraIssueMetadata) getJiraServer(ctx context.Context, metadata *codebaseApi.JiraIssueMetadata) (*codebaseApi.JiraServer, error) { +func (r *ReconcileJiraIssueMetadata) getJiraServer( + ctx context.Context, + metadata *codebaseApi.JiraIssueMetadata, +) (*codebaseApi.JiraServer, error) { ref, err := util.GetOwnerReference(codebaseKind, metadata.GetOwnerReferences()) if err != nil { return nil, fmt.Errorf("failed to fetch OwnerReference: %w", err) diff --git a/controllers/jiraissuemetadata/jiraissuemetadata_controller_test.go b/controllers/jiraissuemetadata/jiraissuemetadata_controller_test.go index ab51ad89..d774710a 100644 --- a/controllers/jiraissuemetadata/jiraissuemetadata_controller_test.go +++ b/controllers/jiraissuemetadata/jiraissuemetadata_controller_test.go @@ -154,7 +154,10 @@ func TestReconcileJiraIssueMetadata_Reconcile_ShouldFailJiraISDisabled(t *testin assert.Error(t, err) - if !strings.Contains(err.Error(), "codebase codebase has disabled jira integration. skip JiraIssueMetadata JIM reconciliation") { + if !strings.Contains( + err.Error(), + "codebase codebase has disabled jira integration. skip JiraIssueMetadata JIM reconciliation", + ) { t.Fatalf("wrong error returned: %s", err.Error()) } diff --git a/pkg/autodeploy/autodeploy.go b/pkg/autodeploy/autodeploy.go index 05748662..cdb9ead0 100644 --- a/pkg/autodeploy/autodeploy.go +++ b/pkg/autodeploy/autodeploy.go @@ -18,7 +18,12 @@ var ErrLasTagNotFound = fmt.Errorf("last tag not found") type Manager interface { GetAppPayloadForAllLatestStrategy(ctx context.Context, pipeline *pipelineAPi.CDPipeline) (json.RawMessage, error) - GetAppPayloadForCurrentWithStableStrategy(ctx context.Context, current codebaseApi.CodebaseTag, pipeline *pipelineAPi.CDPipeline, stage *pipelineAPi.Stage) (json.RawMessage, error) + GetAppPayloadForCurrentWithStableStrategy( + ctx context.Context, + current codebaseApi.CodebaseTag, + pipeline *pipelineAPi.CDPipeline, + stage *pipelineAPi.Stage, + ) (json.RawMessage, error) } var _ Manager = &StrategyManager{} @@ -35,7 +40,10 @@ func NewStrategyManager(k8sClient client.Client) *StrategyManager { return &StrategyManager{k8sClient: k8sClient} } -func (h *StrategyManager) GetAppPayloadForAllLatestStrategy(ctx context.Context, pipeline *pipelineAPi.CDPipeline) (json.RawMessage, error) { +func (h *StrategyManager) GetAppPayloadForAllLatestStrategy( + ctx context.Context, + pipeline *pipelineAPi.CDPipeline, +) (json.RawMessage, error) { appPayload := make(map[string]ApplicationPayload, len(pipeline.Spec.InputDockerStreams)) for _, stream := range pipeline.Spec.InputDockerStreams { @@ -119,7 +127,10 @@ func (h *StrategyManager) GetAppPayloadForCurrentWithStableStrategy( return rawAppPayload, nil } -func (*StrategyManager) getLatestTag(ctx context.Context, imageStream *codebaseApi.CodebaseImageStream) (codebase, tag string, e error) { +func (*StrategyManager) getLatestTag( + ctx context.Context, + imageStream *codebaseApi.CodebaseImageStream, +) (codebase, tag string, e error) { t, err := codebaseimagestream.GetLastTag(imageStream.Spec.Tags, ctrl.LoggerFrom(ctx)) if err != nil { return "", "", ErrLasTagNotFound diff --git a/pkg/client/jira/jira_adapter.go b/pkg/client/jira/jira_adapter.go index 7e8605ab..653bb99a 100644 --- a/pkg/client/jira/jira_adapter.go +++ b/pkg/client/jira/jira_adapter.go @@ -161,7 +161,12 @@ func (a *GoJiraAdapter) CreateIssueLink(issueId, title, link string) error { }, } - req, err := a.client.NewRequestWithContext(ctx, "POST", fmt.Sprintf("rest/api/2/issue/%v/remotelink", issueId), remoteLink) + req, err := a.client.NewRequestWithContext( + ctx, + "POST", + fmt.Sprintf("rest/api/2/issue/%v/remotelink", issueId), + remoteLink, + ) if err != nil { return fmt.Errorf("failed to create HTTP request to jira: %w", err) } @@ -179,7 +184,11 @@ func (a *GoJiraAdapter) CreateIssueLink(issueId, title, link string) error { // GetIssueTypeMeta returns issue type meta for given project and issue type. // Map key is issue type meta fieldId, value is IssueTypeMeta. // API doc: https://docs.atlassian.com/software/jira/docs/api/REST/9.4.5/#api/2/issue-getCreateIssueMetaFields. -func (a *GoJiraAdapter) GetIssueTypeMeta(ctx context.Context, projectID, issueTypeID string) (map[string]IssueTypeMeta, error) { +func (a *GoJiraAdapter) GetIssueTypeMeta( + ctx context.Context, + projectID, + issueTypeID string, +) (map[string]IssueTypeMeta, error) { u := url.URL{ Path: fmt.Sprintf("rest/api/2/issue/createmeta/%s/issuetypes/%s", projectID, issueTypeID), } diff --git a/pkg/client/jira/jira_adapter_test.go b/pkg/client/jira/jira_adapter_test.go index 659e8c97..6486e82d 100644 --- a/pkg/client/jira/jira_adapter_test.go +++ b/pkg/client/jira/jira_adapter_test.go @@ -315,7 +315,7 @@ func TestGoJiraAdapter_GetIssue(t *testing.T) { ID: "123", }) - w.Write(jsonResp) + _, _ = w.Write(jsonResp) }, wantErr: require.NoError, want: &jira.Issue{ @@ -376,7 +376,7 @@ func TestGoJiraAdapter_GetIssueTypeMeta(t *testing.T) { }}, }) - w.Write(jsonResp) + _, _ = w.Write(jsonResp) }, wantErr: require.NoError, want: map[string]IssueTypeMeta{ diff --git a/pkg/codebasebranch/labels.go b/pkg/codebasebranch/labels.go index 4cedcd25..d7801c6a 100644 --- a/pkg/codebasebranch/labels.go +++ b/pkg/codebasebranch/labels.go @@ -15,9 +15,15 @@ const ( LabelCodebaseName = "app.edp.epam.com/codebaseName" ) -func AddCodebaseLabel(ctx context.Context, k8sClient client.Client, codebaseBranch *codebaseApi.CodebaseBranch, codebaseName string) error { +func AddCodebaseLabel( + ctx context.Context, + k8sClient client.Client, + codebaseBranch *codebaseApi.CodebaseBranch, + codebaseName string, +) error { labelsToSet := map[string]string{ - LabelCodebaseName: codebaseName, // Set it for backward compatibility. TODO: remove and use only codebaseApi.CodebaseLabel. + // Set it for backward compatibility. TODO: remove and use only codebaseApi.CodebaseLabel. + LabelCodebaseName: codebaseName, codebaseApi.CodebaseLabel: codebaseName, codebaseApi.BranchHashLabel: MakeGitBranchHash(codebaseBranch.Spec.BranchName), } diff --git a/pkg/gerrit/gerrit.go b/pkg/gerrit/gerrit.go index 5a33c234..0fe14fe0 100644 --- a/pkg/gerrit/gerrit.go +++ b/pkg/gerrit/gerrit.go @@ -104,7 +104,14 @@ func SshInit(port int32, sshPrivateKey, host, user string, logger logr.Logger) ( return &cl, nil } -func (*SSHGerritClient) CheckProjectExist(port int32, sshPrivateKey, host, user, appName string, logger logr.Logger) (bool, error) { +func (*SSHGerritClient) CheckProjectExist( + port int32, + sshPrivateKey, + host, + user, + appName string, + logger logr.Logger, +) (bool, error) { var raw map[string]interface{} command := "gerrit ls-projects --format json" @@ -162,7 +169,15 @@ func (*SSHGerritClient) CreateProject(port int32, sshPrivateKey, host, user, app } // SetHeadToBranch sets remote git HEAD to specific branch using ssh Gerrit command. -func (*SSHGerritClient) SetHeadToBranch(port int32, sshPrivateKey, host, user, appName, branchName string, logger logr.Logger) error { +func (*SSHGerritClient) SetHeadToBranch( + port int32, + sshPrivateKey, + host, + user, + appName, + branchName string, + logger logr.Logger, +) error { command := fmt.Sprintf("gerrit set-head %v --new-head %v", appName, branchName) cmd := &SSHCommand{ Path: command, diff --git a/pkg/git/provider.go b/pkg/git/provider.go index 40f5b7bb..1ce48f20 100644 --- a/pkg/git/provider.go +++ b/pkg/git/provider.go @@ -75,18 +75,18 @@ type GitProvider struct { } // NewGitProvider creates a new GitProvider with the given configuration. -func NewGitProvider(config Config) *GitProvider { +func NewGitProvider(cfg Config) *GitProvider { // Set defaults - if config.SSHUser == "" { - config.SSHUser = defaultSSHUser + if cfg.SSHUser == "" { + cfg.SSHUser = defaultSSHUser } - if config.SSHPort == 0 { - config.SSHPort = defaultSSHPort + if cfg.SSHPort == 0 { + cfg.SSHPort = defaultSSHPort } return &GitProvider{ - config: config, + config: cfg, } } diff --git a/pkg/git/provider_test.go b/pkg/git/provider_test.go index 2d4e36fb..bc9595e2 100644 --- a/pkg/git/provider_test.go +++ b/pkg/git/provider_test.go @@ -1,3 +1,4 @@ +// nolint:dupl // Duplicate test setup is acceptable in tests for readability package v2 import ( @@ -31,7 +32,7 @@ func TestGitProvider_CheckPermissions(t *testing.T) { } gp := NewGitProvider(config) - bts, err := base64.StdEncoding.DecodeString(`MDAxZSMgc2VydmljZT1naXQtdXBsb2FkLXBhY2sKMDAwMDAxNTY2ZWNmMGVmMmMyZGZmYjc5NjAzM2U1YTAyMjE5YWY4NmVjNjU4NGU1IEhFQUQAbXVsdGlfYWNrIHRoaW4tcGFjayBzaWRlLWJhbmQgc2lkZS1iYW5kLTY0ayBvZnMtZGVsdGEgc2hhbGxvdyBkZWVwZW4tc2luY2UgZGVlcGVuLW5vdCBkZWVwZW4tcmVsYXRpdmUgbm8tcHJvZ3Jlc3MgaW5jbHVkZS10YWcgbXVsdGlfYWNrX2RldGFpbGVkIGFsbG93LXRpcC1zaGExLWluLXdhbnQgYWxsb3ctcmVhY2hhYmxlLXNoYTEtaW4td2FudCBuby1kb25lIHN5bXJlZj1IRUFEOnJlZnMvaGVhZHMvbWFzdGVyIGZpbHRlciBvYmplY3QtZm9ybWF0PXNoYTEgYWdlbnQ9Z2l0L2dpdGh1Yi1nNzhiNDUyNDEzZThiCjAwM2ZlOGQzZmZhYjU1Mjg5NWMxOWI5ZmNmN2FhMjY0ZDI3N2NkZTMzODgxIHJlZnMvaGVhZHMvYnJhbmNoCjAwM2Y2ZWNmMGVmMmMyZGZmYjc5NjAzM2U1YTAyMjE5YWY4NmVjNjU4NGU1IHJlZnMvaGVhZHMvbWFzdGVyCjAwM2ViOGU0NzFmNThiY2JjYTYzYjA3YmRhMjBlNDI4MTkwNDA5YzJkYjQ3IHJlZnMvcHVsbC8xL2hlYWQKMDAzZTk2MzJmMDI4MzNiMmY5NjEzYWZiNWU3NTY4MjEzMmIwYjIyZTRhMzEgcmVmcy9wdWxsLzIvaGVhZAowMDNmYzM3ZjU4YTEzMGNhNTU1ZTQyZmY5NmEwNzFjYjljY2IzZjQzNzUwNCByZWZzL3B1bGwvMi9tZXJnZQowMDAw`) + bts, err := base64.StdEncoding.DecodeString(`MDAxZSMgc2VydmljZT1naXQtdXBsb2FkLXBhY2sKMDAwMDAxNTY2ZWNmMGVmMmMyZGZmYjc5NjAzM2U1YTAyMjE5YWY4NmVjNjU4NGU1IEhFQUQAbXVsdGlfYWNrIHRoaW4tcGFjayBzaWRlLWJhbmQgc2lkZS1iYW5kLTY0ayBvZnMtZGVsdGEgc2hhbGxvdyBkZWVwZW4tc2luY2UgZGVlcGVuLW5vdCBkZWVwZW4tcmVsYXRpdmUgbm8tcHJvZ3Jlc3MgaW5jbHVkZS10YWcgbXVsdGlfYWNrX2RldGFpbGVkIGFsbG93LXRpcC1zaGExLWluLXdhbnQgYWxsb3ctcmVhY2hhYmxlLXNoYTEtaW4td2FudCBuby1kb25lIHN5bXJlZj1IRUFEOnJlZnMvaGVhZHMvbWFzdGVyIGZpbHRlciBvYmplY3QtZm9ybWF0PXNoYTEgYWdlbnQ9Z2l0L2dpdGh1Yi1nNzhiNDUyNDEzZThiCjAwM2ZlOGQzZmZhYjU1Mjg5NWMxOWI5ZmNmN2FhMjY0ZDI3N2NkZTMzODgxIHJlZnMvaGVhZHMvYnJhbmNoCjAwM2Y2ZWNmMGVmMmMyZGZmYjc5NjAzM2U1YTAyMjE5YWY4NmVjNjU4NGU1IHJlZnMvaGVhZHMvbWFzdGVyCjAwM2ViOGU0NzFmNThiY2JjYTYzYjA3YmRhMjBlNDI4MTkwNDA5YzJkYjQ3IHJlZnMvcHVsbC8xL2hlYWQKMDAzZTk2MzJmMDI4MzNiMmY5NjEzYWZiNWU3NTY4MjEzMmIwYjIyZTRhMzEgcmVmcy9wdWxsLzIvaGVhZAowMDNmYzM3ZjU4YTEzMGNhNTU1ZTQyZmY5NmEwNzFjYjljY2IzZjQzNzUwNCByZWZzL3B1bGwvMi9tZXJnZQowMDAw`) // nolint:lll require.NoError(t, err) s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -55,7 +56,7 @@ func TestGitProvider_CheckPermissions_NoRefs(t *testing.T) { } gp := NewGitProvider(config) - bts, err := base64.StdEncoding.DecodeString(`MDAxZSMgc2VydmljZT1naXQtdXBsb2FkLXBhY2sKMDAwMDAwZGUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGNhcGFiaWxpdGllc157fQAgaW5jbHVkZS10YWcgbXVsdGlfYWNrX2RldGFpbGVkIG11bHRpX2FjayBvZnMtZGVsdGEgc2lkZS1iYW5kIHNpZGUtYmFuZC02NGsgdGhpbi1wYWNrIG5vLXByb2dyZXNzIHNoYWxsb3cgbm8tZG9uZSBhZ2VudD1KR2l0L3Y1LjkuMC4yMDIwMDkwODA1MDEtci00MS1nNWQ5MjVlY2JiCjAwMDA=`) + bts, err := base64.StdEncoding.DecodeString(`MDAxZSMgc2VydmljZT1naXQtdXBsb2FkLXBhY2sKMDAwMDAwZGUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGNhcGFiaWxpdGllc157fQAgaW5jbHVkZS10YWcgbXVsdGlfYWNrX2RldGFpbGVkIG11bHRpX2FjayBvZnMtZGVsdGEgc2lkZS1iYW5kIHNpZGUtYmFuZC02NGsgdGhpbi1wYWNrIG5vLXByb2dyZXNzIHNoYWxsb3cgbm8tZG9uZSBhZ2VudD1KR2l0L3Y1LjkuMC4yMDIwMDkwODA1MDEtci00MS1nNWQ5MjVlY2JiCjAwMDA=`) // nolint:lll require.NoError(t, err) s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -381,6 +382,7 @@ func TestGitProvider_CheckReference(t *testing.T) { dir := t.TempDir() _, err := gogit.PlainInit(dir, false) require.NoError(t, err) + return dir }, from: "", @@ -470,6 +472,7 @@ func TestGitProvider_CheckReference(t *testing.T) { dir := t.TempDir() _, err := gogit.PlainInit(dir, false) require.NoError(t, err) + return dir }, from: "non-existent", @@ -713,6 +716,7 @@ func TestGitProvider_Init(t *testing.T) { dir := t.TempDir() _, err := gogit.PlainInit(dir, false) require.NoError(t, err) + return dir }, wantErr: true, @@ -1415,6 +1419,7 @@ func TestGitProvider_CreateRemoteTag_Errors(t *testing.T) { dir := t.TempDir() _, err := gogit.PlainInit(dir, false) require.NoError(t, err) + return dir }, tagName: "v1.0.0", diff --git a/pkg/gitlab/manager.go b/pkg/gitlab/manager.go index 06cfc8f3..4b450dd6 100644 --- a/pkg/gitlab/manager.go +++ b/pkg/gitlab/manager.go @@ -30,8 +30,8 @@ type manager struct { } // NewManager creates a new GitLab CI manager. -func NewManager(client client.Client) Manager { - return &manager{client: client} +func NewManager(k8sClient client.Client) Manager { + return &manager{client: k8sClient} } // InjectGitLabCIConfig creates a .gitlab-ci.yml file from ConfigMap template if it doesn't exist. @@ -63,8 +63,8 @@ func (m *manager) getGitLabCITemplate(ctx context.Context, codebase *codebaseApi // Try specific language-buildtool combination first configMapName := fmt.Sprintf("gitlab-ci-%s-%s", lang, buildTool) - template, err := m.getTemplateFromConfigMap(ctx, configMapName, codebase.Namespace) + template, err := m.getTemplateFromConfigMap(ctx, configMapName, codebase.Namespace) if err == nil { return template, nil } @@ -81,11 +81,11 @@ func (m *manager) getGitLabCITemplate(ctx context.Context, codebase *codebaseApi // getTemplateFromConfigMap retrieves template content from a specific ConfigMap. func (m *manager) getTemplateFromConfigMap(ctx context.Context, configMapName, namespace string) (string, error) { configMap := &corev1.ConfigMap{} + err := m.client.Get(ctx, client.ObjectKey{ Name: configMapName, Namespace: namespace, }, configMap) - if err != nil { return "", err } diff --git a/pkg/gitlab/manager_test.go b/pkg/gitlab/manager_test.go index 1915a043..6d99c1b9 100644 --- a/pkg/gitlab/manager_test.go +++ b/pkg/gitlab/manager_test.go @@ -45,7 +45,8 @@ func TestManager_InjectGitLabCIConfig(t *testing.T) { Namespace: "test-namespace", }, Data: map[string]string{ - ".gitlab-ci.yml": "variables:\n CODEBASE_NAME: \"{{.CodebaseName}}\"\ninclude:\n - component: $CI_SERVER_FQDN/kuberocketci/ci-java17-mvn/build@0.1.1", + ".gitlab-ci.yml": "variables:\n CODEBASE_NAME: \"{{.CodebaseName}}\"\ninclude:\n" + + " - component: $CI_SERVER_FQDN/kuberocketci/ci-java17-mvn/build@0.1.1", }, }, }, @@ -70,7 +71,8 @@ func TestManager_InjectGitLabCIConfig(t *testing.T) { Namespace: "test-namespace", }, Data: map[string]string{ - ".gitlab-ci.yml": "variables:\n CODEBASE_NAME: \"{{.CodebaseName}}\"\ninclude:\n - component: $CI_SERVER_FQDN/kuberocketci/ci-golang/build@0.1.1", + ".gitlab-ci.yml": "variables:\n CODEBASE_NAME: \"{{.CodebaseName}}\"\ninclude:\n" + + " - component: $CI_SERVER_FQDN/kuberocketci/ci-golang/build@0.1.1", }, }, }, @@ -85,7 +87,8 @@ func TestManager_InjectGitLabCIConfig(t *testing.T) { // Create temporary directory tmpDir, err := os.MkdirTemp("", "gitlab-ci-test") require.NoError(t, err) - defer os.RemoveAll(tmpDir) + + defer func() { _ = os.RemoveAll(tmpDir) }() // Create fake Kubernetes client with ConfigMaps scheme := runtime.NewScheme() @@ -117,7 +120,8 @@ func TestManager_InjectGitLabCIConfig_SkipsIfExists(t *testing.T) { // Create temporary directory tmpDir, err := os.MkdirTemp("", "gitlab-ci-test") require.NoError(t, err) - defer os.RemoveAll(tmpDir) + + defer func() { _ = os.RemoveAll(tmpDir) }() // Create existing .gitlab-ci.yml gitlabCIPath := filepath.Join(tmpDir, GitLabCIFileName) @@ -189,7 +193,8 @@ func TestManager_ConfigMapFallbackHierarchy(t *testing.T) { // Create temporary directory tmpDir, err := os.MkdirTemp("", "gitlab-ci-fallback-test") require.NoError(t, err) - defer os.RemoveAll(tmpDir) + + defer func() { _ = os.RemoveAll(tmpDir) }() manager := NewManager(fakeClient) ctx := context.Background() diff --git a/pkg/gitprovider/bitbucket.go b/pkg/gitprovider/bitbucket.go index 17dc75c3..8c2d4f9f 100644 --- a/pkg/gitprovider/bitbucket.go +++ b/pkg/gitprovider/bitbucket.go @@ -54,7 +54,11 @@ func NewBitbucketClient(token string, opts ...BitbucketClientOptsSetter) (*Bitbu }, nil } -func (b *BitbucketClient) CreateWebHook(ctx context.Context, _, _, projectID, webHookSecret, webHookURL string, skipTLS bool) (*WebHook, error) { +func (b *BitbucketClient) CreateWebHook( + ctx context.Context, + _, _, projectID, webHookSecret, webHookURL string, + skipTLS bool, +) (*WebHook, error) { owner, repo, err := parseProjectID(projectID) if err != nil { return nil, err @@ -91,7 +95,6 @@ func (b *BitbucketClient) CreateWebHook(ctx context.Context, _, _, projectID, we return nil }, ) - if err != nil { return nil, fmt.Errorf("failed to create Bitbucket web hook: %w", err) } @@ -110,7 +113,11 @@ func (b *BitbucketClient) CreateWebHook(ctx context.Context, _, _, projectID, we }, nil } -func (b *BitbucketClient) CreateWebHookIfNotExists(ctx context.Context, _, _, projectID, webHookSecret, webHookURL string, skipTLS bool) (*WebHook, error) { +func (b *BitbucketClient) CreateWebHookIfNotExists( + ctx context.Context, + _, _, projectID, webHookSecret, webHookURL string, + skipTLS bool, +) (*WebHook, error) { webHooks, err := b.GetWebHooks(ctx, "", "", projectID) if err != nil { return nil, err @@ -207,7 +214,11 @@ func (b *BitbucketClient) DeleteWebHook(ctx context.Context, _, _, projectID, we return nil } -func (b *BitbucketClient) CreateProject(ctx context.Context, _, _, projectID string, settings RepositorySettings) error { +func (b *BitbucketClient) CreateProject( + ctx context.Context, + _, _, projectID string, + settings RepositorySettings, +) error { owner, repo, err := parseProjectID(projectID) if err != nil { return err diff --git a/pkg/gitprovider/github_test.go b/pkg/gitprovider/github_test.go index dc40004c..0a7eb43c 100644 --- a/pkg/gitprovider/github_test.go +++ b/pkg/gitprovider/github_test.go @@ -1,3 +1,4 @@ +// nolint:dupl // Duplicate test setup is acceptable in tests for readability package gitprovider import ( @@ -381,29 +382,55 @@ func TestGitHubClient_CreateWebHookIfNotExists(t *testing.T) { }, } + runCreateWebHookIfNotExistsTest := func( + t *testing.T, + client *GitHubClient, + tt struct { + name string + projectID string + webHookURL string + GETRespStatus int + GETResBody interface{} + POSTRespStatus int + POSTResBody interface{} + want *WebHook + wantErr require.ErrorAssertionFunc + errContains string + }, + ) { + httpmock.Reset() + + GETResponder, err := httpmock.NewJsonResponder(tt.GETRespStatus, tt.GETResBody) + require.NoError(t, err) + httpmock.RegisterRegexpResponder(http.MethodGet, fakeUrlRegexp, GETResponder) + + POSTResponder, err := httpmock.NewJsonResponder(tt.POSTRespStatus, tt.POSTResBody) + require.NoError(t, err) + httpmock.RegisterRegexpResponder(http.MethodPost, fakeUrlRegexp, POSTResponder) + + got, err := client.CreateWebHookIfNotExists( + context.Background(), + "url", + "token", + tt.projectID, + "secret", + tt.webHookURL, + false, + ) + + tt.wantErr(t, err) + + if tt.errContains != "" { + assert.Contains(t, err.Error(), tt.errContains) + } + + assert.Equal(t, tt.want, got) + } + for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - httpmock.Reset() - - GETResponder, err := httpmock.NewJsonResponder(tt.GETRespStatus, tt.GETResBody) - require.NoError(t, err) - httpmock.RegisterRegexpResponder(http.MethodGet, fakeUrlRegexp, GETResponder) - - POSTResponder, err := httpmock.NewJsonResponder(tt.POSTRespStatus, tt.POSTResBody) - require.NoError(t, err) - httpmock.RegisterRegexpResponder(http.MethodPost, fakeUrlRegexp, POSTResponder) - c := NewGitHubClient(restyClient) - - got, err := c.CreateWebHookIfNotExists(context.Background(), "url", "token", tt.projectID, "secret", tt.webHookURL, false) - - tt.wantErr(t, err) - - if tt.errContains != "" { - assert.Contains(t, err.Error(), tt.errContains) - } - - assert.Equal(t, tt.want, got) + runCreateWebHookIfNotExistsTest(t, c, tt) }) } } diff --git a/pkg/gitprovider/gitlab.go b/pkg/gitprovider/gitlab.go index e19eb514..9060511e 100644 --- a/pkg/gitprovider/gitlab.go +++ b/pkg/gitprovider/gitlab.go @@ -232,6 +232,7 @@ func (c *GitLabClient) CreateProject( } c.restyClient.HostURL = gitlabURL + resp, err := c.restyClient. R(). SetContext(ctx). @@ -242,7 +243,6 @@ func (c *GitLabClient) CreateProject( "visibility": settings.Visibility(), }). Post("/api/v4/projects") - if err != nil { return fmt.Errorf("failed to create GitLab project: %w", err) } @@ -262,6 +262,7 @@ func (c *GitLabClient) ProjectExists( projectID string, ) (bool, error) { c.restyClient.HostURL = gitlabURL + resp, err := c.restyClient. R(). SetContext(ctx). @@ -270,7 +271,6 @@ func (c *GitLabClient) ProjectExists( "projectID": projectID, }). Get("/api/v4/projects/{projectID}") - if err != nil { return false, fmt.Errorf("failed to check if GitLab project exists: %w", err) } @@ -294,6 +294,7 @@ func (c *GitLabClient) SetDefaultBranch( branch string, ) error { c.restyClient.HostURL = gitlabURL + resp, err := c.restyClient. R(). SetContext(ctx). @@ -305,7 +306,6 @@ func (c *GitLabClient) SetDefaultBranch( "default_branch": branch, }). Put("/api/v4/projects/{projectID}") - if err != nil { return fmt.Errorf("failed to set GitLab default branch: %w", err) } @@ -335,7 +335,6 @@ func (c *GitLabClient) getNamespace( }). SetResult(ns). Get("/api/v4/namespaces/{gitlabNamespace}") - if err != nil { return nil, fmt.Errorf("failed to get GitLab namespace: %w", err) } diff --git a/pkg/gitprovider/gitlab_test.go b/pkg/gitprovider/gitlab_test.go index a7b3a337..107b89e6 100644 --- a/pkg/gitprovider/gitlab_test.go +++ b/pkg/gitprovider/gitlab_test.go @@ -1,3 +1,4 @@ +// nolint:dupl // Duplicate test setup is acceptable in tests for readability package gitprovider import ( @@ -316,29 +317,55 @@ func TestGitLabClient_CreateWebHookIfNotExists(t *testing.T) { }, } + runCreateWebHookIfNotExistsTest := func( + t *testing.T, + client *GitLabClient, + tt struct { + name string + projectID string + webHookURL string + GETRespStatus int + GETResBody interface{} + POSTRespStatus int + POSTResBody interface{} + want *WebHook + wantErr require.ErrorAssertionFunc + errContains string + }, + ) { + httpmock.Reset() + + GETResponder, err := httpmock.NewJsonResponder(tt.GETRespStatus, tt.GETResBody) + require.NoError(t, err) + httpmock.RegisterRegexpResponder(http.MethodGet, fakeUrlRegexp, GETResponder) + + POSTResponder, err := httpmock.NewJsonResponder(tt.POSTRespStatus, tt.POSTResBody) + require.NoError(t, err) + httpmock.RegisterRegexpResponder(http.MethodPost, fakeUrlRegexp, POSTResponder) + + got, err := client.CreateWebHookIfNotExists( + context.Background(), + "url", + "token", + tt.projectID, + "secret", + tt.webHookURL, + false, + ) + + tt.wantErr(t, err) + + if tt.errContains != "" { + assert.Contains(t, err.Error(), tt.errContains) + } + + assert.Equal(t, tt.want, got) + } + for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - httpmock.Reset() - - GETResponder, err := httpmock.NewJsonResponder(tt.GETRespStatus, tt.GETResBody) - require.NoError(t, err) - httpmock.RegisterRegexpResponder(http.MethodGet, fakeUrlRegexp, GETResponder) - - POSTResponder, err := httpmock.NewJsonResponder(tt.POSTRespStatus, tt.POSTResBody) - require.NoError(t, err) - httpmock.RegisterRegexpResponder(http.MethodPost, fakeUrlRegexp, POSTResponder) - c := NewGitLabClient(restyClient) - - got, err := c.CreateWebHookIfNotExists(context.Background(), "url", "token", tt.projectID, "secret", tt.webHookURL, false) - - tt.wantErr(t, err) - - if tt.errContains != "" { - assert.Contains(t, err.Error(), tt.errContains) - } - - assert.Equal(t, tt.want, got) + runCreateWebHookIfNotExistsTest(t, c, tt) }) } } diff --git a/pkg/gitprovider/provider.go b/pkg/gitprovider/provider.go index 6d673286..4a964199 100644 --- a/pkg/gitprovider/provider.go +++ b/pkg/gitprovider/provider.go @@ -119,7 +119,8 @@ func GetGitProviderAPIURL(gitServer *codebaseApi.GitServer) string { if gitServer.Spec.GitProvider == codebaseApi.GitProviderGithub { // GitHub API url is different for enterprise and other versions - // see: https://docs.github.com/en/get-started/learning-about-github/about-versions-of-github-docs#github-enterprise-server + // see: + // https://docs.github.com/en/get-started/learning-about-github/about-versions-of-github-docs#github-enterprise-server if url == "https://github.com" { return "https://api.github.com" } diff --git a/pkg/tektoncd/trigger_template.go b/pkg/tektoncd/trigger_template.go index 3e9e9cb9..6353b3d3 100644 --- a/pkg/tektoncd/trigger_template.go +++ b/pkg/tektoncd/trigger_template.go @@ -17,9 +17,31 @@ import ( var ErrEmptyTriggerTemplateResources = fmt.Errorf("trigger template resources is empty") type TriggerTemplateManager interface { - GetRawResourceFromTriggerTemplate(ctx context.Context, triggerTemplateName, ns string) ([]byte, error) - CreatePipelineRun(ctx context.Context, ns, cdStageDeployName string, rawPipeRun, appPayload, stage, pipeline, clusterSecret []byte) error - CreatePendingPipelineRun(ctx context.Context, ns, cdStageDeployName string, rawPipeRun, appPayload, stage, pipeline, clusterSecret []byte) error + GetRawResourceFromTriggerTemplate( + ctx context.Context, + triggerTemplateName, + ns string, + ) ([]byte, error) + CreatePipelineRun( + ctx context.Context, + ns, + cdStageDeployName string, + rawPipeRun, + appPayload, + stage, + pipeline, + clusterSecret []byte, + ) error + CreatePendingPipelineRun( + ctx context.Context, + ns, + cdStageDeployName string, + rawPipeRun, + appPayload, + stage, + pipeline, + clusterSecret []byte, + ) error } var _ TriggerTemplateManager = &TektonTriggerTemplateManager{} @@ -32,7 +54,11 @@ func NewTektonTriggerTemplateManager(k8sClient client.Client) *TektonTriggerTemp return &TektonTriggerTemplateManager{k8sClient: k8sClient} } -func (h *TektonTriggerTemplateManager) GetRawResourceFromTriggerTemplate(ctx context.Context, triggerTemplateName, ns string) ([]byte, error) { +func (h *TektonTriggerTemplateManager) GetRawResourceFromTriggerTemplate( + ctx context.Context, + triggerTemplateName, + ns string, +) ([]byte, error) { template := &tektonTriggersApi.TriggerTemplate{} if err := h.k8sClient.Get(ctx, client.ObjectKey{ Namespace: ns, @@ -45,8 +71,8 @@ func (h *TektonTriggerTemplateManager) GetRawResourceFromTriggerTemplate(ctx con return nil, ErrEmptyTriggerTemplateResources } - rawPipeRun := make([]byte, len(template.Spec.ResourceTemplates[0].RawExtension.Raw)) - copy(rawPipeRun, template.Spec.ResourceTemplates[0].RawExtension.Raw) + rawPipeRun := make([]byte, len(template.Spec.ResourceTemplates[0].Raw)) + copy(rawPipeRun, template.Spec.ResourceTemplates[0].Raw) return rawPipeRun, nil } @@ -111,7 +137,11 @@ func makeUnstructuredPipelineRun( pipeline []byte, clusterSecret []byte, ) (*unstructured.Unstructured, error) { - rawPipeRun = bytes.ReplaceAll(rawPipeRun, []byte("$(tt.params.APPLICATIONS_PAYLOAD)"), bytes.ReplaceAll(appPayload, []byte(`"`), []byte(`\"`))) + rawPipeRun = bytes.ReplaceAll( + rawPipeRun, + []byte("$(tt.params.APPLICATIONS_PAYLOAD)"), + bytes.ReplaceAll(appPayload, []byte(`"`), []byte(`\"`)), + ) rawPipeRun = bytes.ReplaceAll(rawPipeRun, []byte("$(tt.params.CDSTAGE)"), stage) rawPipeRun = bytes.ReplaceAll(rawPipeRun, []byte("$(tt.params.CDPIPELINE)"), pipeline) rawPipeRun = bytes.ReplaceAll(rawPipeRun, []byte("$(tt.params.KUBECONFIG_SECRET_NAME)"), clusterSecret) diff --git a/pkg/tektoncd/trigger_template_test.go b/pkg/tektoncd/trigger_template_test.go index 80577e78..26dc3d54 100644 --- a/pkg/tektoncd/trigger_template_test.go +++ b/pkg/tektoncd/trigger_template_test.go @@ -192,6 +192,7 @@ func TestTektonTriggerTemplateManager_CreatePipelineRun(t *testing.T) { run := l.Items[0] require.Len(t, run.Spec.Params, 4) + for _, p := range run.Spec.Params { switch p.Name { case "APPLICATIONS_PAYLOAD": @@ -279,6 +280,7 @@ func TestTektonTriggerTemplateManager_CreatePendingPipelineRun(t *testing.T) { require.Equal(t, tektonpipelineApi.PipelineRunSpecStatusPending, string(run.Spec.Status)) require.Len(t, run.Spec.Params, 4) + for _, p := range run.Spec.Params { switch p.Name { case "APPLICATIONS_PAYLOAD": diff --git a/pkg/testutils/envtest.go b/pkg/testutils/envtest.go index 9806dc14..12a35914 100644 --- a/pkg/testutils/envtest.go +++ b/pkg/testutils/envtest.go @@ -9,8 +9,8 @@ import ( func GetFirstFoundEnvTestBinaryDir() string { basePath := filepath.Join("..", "..", "..", "bin", "k8s") - entries, err := os.ReadDir(basePath) + entries, err := os.ReadDir(basePath) if err != nil { logf.Log.Error(err, "Failed to read directory", "path", basePath) return "" diff --git a/pkg/util/consts.go b/pkg/util/consts.go index 83487bec..a6557544 100644 --- a/pkg/util/consts.go +++ b/pkg/util/consts.go @@ -22,7 +22,8 @@ const ( PrivateSShKeyName = "id_rsa" // GitServerSecretTokenField is a field in secret created for the git server that stores GitLab/GitHub token. GitServerSecretTokenField = "token" - // GitServerSecretWebhookSecretField is a field in secret created for the git server that stores secret token for webhook. + // GitServerSecretWebhookSecretField is a field in secret created for the git server that stores + // secret token for webhook. GitServerSecretWebhookSecretField = "secretString" // GitServerSecretUserNameField is a field in secret created for the git server that stores username. GitServerSecretUserNameField = "username" diff --git a/pkg/util/template.go b/pkg/util/template.go index 7adc382e..011d380f 100644 --- a/pkg/util/template.go +++ b/pkg/util/template.go @@ -162,7 +162,12 @@ func CopyHelmChartTemplates(deploymentScript, templatesDest, assetsDir string, c return nil } -func CopyRpmPackageTemplates(ctx context.Context, templatesDest, assetsDir string, config *model.ConfigGoTemplating) error { +func CopyRpmPackageTemplates( + ctx context.Context, + templatesDest, + assetsDir string, + config *model.ConfigGoTemplating, +) error { l := ctrl.LoggerFrom(ctx) l.Info("Start handling RPM Package templates") @@ -171,7 +176,10 @@ func CopyRpmPackageTemplates(ctx context.Context, templatesDest, assetsDir strin rpmlintTemplatePath := path.Join(assetsDir, "templates/applications/rpm-package/.rpmlintrc.toml") specTemplatePath := path.Join(assetsDir, fmt.Sprintf("templates/applications/rpm-package/%s/spec.tmpl", config.Lang)) - serviceTemplatePath := path.Join(assetsDir, fmt.Sprintf("templates/applications/rpm-package/%s/service.tmpl", config.Lang)) + serviceTemplatePath := path.Join( + assetsDir, + fmt.Sprintf("templates/applications/rpm-package/%s/service.tmpl", config.Lang), + ) if _, err := os.Stat(specTemplatePath); os.IsNotExist(err) { specTemplatePath = path.Join(assetsDir, "templates/applications/rpm-package/default/spec.tmpl") @@ -227,7 +235,13 @@ func createAndRenderTemplate(destPath, templatePath, templateName string, config return renderTemplate(destFile, templatePath, templateName, config) } -func CopyTemplate(ctx context.Context, deploymentScript, workDir, assetsDir string, cf *model.ConfigGoTemplating) error { +func CopyTemplate( + ctx context.Context, + deploymentScript, + workDir, + assetsDir string, + cf *model.ConfigGoTemplating, +) error { switch deploymentScript { case HelmChartDeploymentScriptType: templatesDest := path.Join(workDir, "deploy-templates") diff --git a/pkg/webhook/codebase_webhook.go b/pkg/webhook/codebase_webhook.go index 63119464..2fdeec7a 100644 --- a/pkg/webhook/codebase_webhook.go +++ b/pkg/webhook/codebase_webhook.go @@ -47,7 +47,10 @@ func (r *CodebaseValidationWebhook) SetupWebhookWithManager(mgr ctrl.Manager) er var _ webhook.CustomValidator = &CodebaseValidationWebhook{} // ValidateCreate is a webhook for validating the creation of the Codebase CR. -func (r *CodebaseValidationWebhook) ValidateCreate(ctx context.Context, obj runtime.Object) (warnings admission.Warnings, err error) { +func (r *CodebaseValidationWebhook) ValidateCreate( + ctx context.Context, + obj runtime.Object, +) (warnings admission.Warnings, err error) { req, err := admission.RequestFromContext(ctx) if err != nil { return nil, apierrors.NewBadRequest(fmt.Errorf("expected admission.Request in ctx: %w", err).Error()) @@ -96,7 +99,10 @@ func (r *CodebaseValidationWebhook) ValidateCreate(ctx context.Context, obj runt } // ValidateUpdate is a webhook for validating the updating of the Codebase CR. -func (r *CodebaseValidationWebhook) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (warnings admission.Warnings, err error) { +func (r *CodebaseValidationWebhook) ValidateUpdate( + ctx context.Context, + oldObj, newObj runtime.Object, +) (warnings admission.Warnings, err error) { req, err := admission.RequestFromContext(ctx) if err != nil { return nil, fmt.Errorf("expected admission.Request in ctx: %w", err) @@ -123,7 +129,10 @@ func (r *CodebaseValidationWebhook) ValidateUpdate(ctx context.Context, oldObj, } // ValidateDelete is a webhook for validating the deleting of the Codebase CR. -func (r *CodebaseValidationWebhook) ValidateDelete(ctx context.Context, obj runtime.Object) (warnings admission.Warnings, err error) { +func (r *CodebaseValidationWebhook) ValidateDelete( + ctx context.Context, + obj runtime.Object, +) (warnings admission.Warnings, err error) { req, err := admission.RequestFromContext(ctx) if err != nil { return nil, fmt.Errorf("expected admission.Request in ctx: %w", err) diff --git a/pkg/webhook/codebase_webhook_test.go b/pkg/webhook/codebase_webhook_test.go index 460a645c..7c83b2b2 100644 --- a/pkg/webhook/codebase_webhook_test.go +++ b/pkg/webhook/codebase_webhook_test.go @@ -22,15 +22,21 @@ func TestCodebaseWebhook_ValidateCreate(t *testing.T) { scheme := runtime.NewScheme() require.NoError(t, codebaseApi.AddToScheme(scheme)) - tests := []struct { + makeGitUrlPathExistsTestCase := func(name, gitUrlPath string) struct { name string client client.Client ctx context.Context obj runtime.Object wantErr require.ErrorAssertionFunc - }{ - { - name: "should return error if GitUrlPath already exists", + } { + return struct { + name string + client client.Client + ctx context.Context + obj runtime.Object + wantErr require.ErrorAssertionFunc + }{ + name: name, client: fake.NewClientBuilder().WithScheme(scheme).WithObjects(&codebaseApi.Codebase{ ObjectMeta: metaV1.ObjectMeta{ Name: "codebase2", @@ -54,7 +60,7 @@ func TestCodebaseWebhook_ValidateCreate(t *testing.T) { Namespace: "default", }, Spec: codebaseApi.CodebaseSpec{ - GitUrlPath: "user/repo", + GitUrlPath: gitUrlPath, Strategy: codebaseApi.Import, Lang: "java", Versioning: codebaseApi.Versioning{ @@ -67,46 +73,21 @@ func TestCodebaseWebhook_ValidateCreate(t *testing.T) { require.Contains(t, err.Error(), "codebase codebase2 with GitUrlPath user/repo already exists") }, - }, - { - name: "should return error if GitUrlPath already exists with, check .git suffix", - client: fake.NewClientBuilder().WithScheme(scheme).WithObjects(&codebaseApi.Codebase{ - ObjectMeta: metaV1.ObjectMeta{ - Name: "codebase2", - Namespace: "default", - }, - Spec: codebaseApi.CodebaseSpec{ - GitUrlPath: "user/repo", - Strategy: codebaseApi.Import, - Lang: "java", - }, - }).Build(), - ctx: admission.NewContextWithRequest(context.Background(), admission.Request{ - AdmissionRequest: v1.AdmissionRequest{ - Name: "codebase", - Namespace: "default", - }, - }), - obj: &codebaseApi.Codebase{ - ObjectMeta: metaV1.ObjectMeta{ - Name: "codebase", - Namespace: "default", - }, - Spec: codebaseApi.CodebaseSpec{ - GitUrlPath: "user/repo.git", - Strategy: codebaseApi.Import, - Lang: "java", - Versioning: codebaseApi.Versioning{ - Type: codebaseApi.VersioningTypDefault, - }, - }, - }, - wantErr: func(t require.TestingT, err error, _ ...any) { - require.Error(t, err) + } + } - require.Contains(t, err.Error(), "codebase codebase2 with GitUrlPath user/repo already exists") - }, - }, + tests := []struct { + name string + client client.Client + ctx context.Context + obj runtime.Object + wantErr require.ErrorAssertionFunc + }{ + makeGitUrlPathExistsTestCase("should return error if GitUrlPath already exists", "user/repo"), + makeGitUrlPathExistsTestCase( + "should return error if GitUrlPath already exists with, check .git suffix", + "user/repo.git", + ), { name: "should skip codebase with same GitUrlPath in the another namespace", client: fake.NewClientBuilder().WithScheme(scheme).WithObjects(&codebaseApi.Codebase{ diff --git a/pkg/webhook/codebasebranch_webhook.go b/pkg/webhook/codebasebranch_webhook.go index c65ab792..f0898f05 100644 --- a/pkg/webhook/codebasebranch_webhook.go +++ b/pkg/webhook/codebasebranch_webhook.go @@ -44,7 +44,10 @@ func (r *CodebaseBranchValidationWebhook) SetupWebhookWithManager(mgr ctrl.Manag var _ webhook.CustomValidator = &CodebaseBranchValidationWebhook{} // ValidateCreate is a webhook for validating the creation of the CodebaseBranch CR. -func (r *CodebaseBranchValidationWebhook) ValidateCreate(ctx context.Context, obj runtime.Object) (warnings admission.Warnings, err error) { +func (r *CodebaseBranchValidationWebhook) ValidateCreate( + ctx context.Context, + obj runtime.Object, +) (warnings admission.Warnings, err error) { createdCodebaseBranch, ok := obj.(*v1.CodebaseBranch) if !ok { r.log.Info("The wrong object given, skipping validation") @@ -73,7 +76,10 @@ func (r *CodebaseBranchValidationWebhook) ValidateCreate(ctx context.Context, ob } // ValidateUpdate is a webhook for validating the updating of the CodebaseBranch CR. -func (r *CodebaseBranchValidationWebhook) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (warnings admission.Warnings, err error) { +func (r *CodebaseBranchValidationWebhook) ValidateUpdate( + ctx context.Context, + oldObj, newObj runtime.Object, +) (warnings admission.Warnings, err error) { if err = checkResourceProtectionFromModificationOnUpdate(oldObj, newObj); err != nil { return nil, err } @@ -82,7 +88,10 @@ func (r *CodebaseBranchValidationWebhook) ValidateUpdate(ctx context.Context, ol } // ValidateDelete is a webhook for validating the deleting of the CodebaseBranch CR. -func (r *CodebaseBranchValidationWebhook) ValidateDelete(ctx context.Context, obj runtime.Object) (warnings admission.Warnings, err error) { +func (r *CodebaseBranchValidationWebhook) ValidateDelete( + ctx context.Context, + obj runtime.Object, +) (warnings admission.Warnings, err error) { if err = checkResourceProtectionFromModificationOnDelete(obj); err != nil { return nil, err } diff --git a/pkg/webhook/protected_label.go b/pkg/webhook/protected_label.go index 7e927607..36451223 100644 --- a/pkg/webhook/protected_label.go +++ b/pkg/webhook/protected_label.go @@ -45,12 +45,18 @@ func (r *ProtectedLabelValidationWebhook) SetupWebhookWithManager(mgr ctrl.Manag } // ValidateCreate is a webhook for validating the creation of the ProtectedLabel CR. -func (*ProtectedLabelValidationWebhook) ValidateCreate(_ context.Context, _ runtime.Object) (warnings admission.Warnings, err error) { +func (*ProtectedLabelValidationWebhook) ValidateCreate( + _ context.Context, + _ runtime.Object, +) (warnings admission.Warnings, err error) { return nil, nil } // ValidateUpdate is a webhook for validating the updating of the ProtectedLabel CR. -func (*ProtectedLabelValidationWebhook) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (warnings admission.Warnings, err error) { +func (*ProtectedLabelValidationWebhook) ValidateUpdate( + _ context.Context, + oldObj, newObj runtime.Object, +) (warnings admission.Warnings, err error) { if err = checkResourceProtectionFromModificationOnUpdate(oldObj, newObj); err != nil { return nil, err } @@ -59,7 +65,10 @@ func (*ProtectedLabelValidationWebhook) ValidateUpdate(_ context.Context, oldObj } // ValidateDelete is a webhook for validating the deleting of the ProtectedLabel CR. -func (*ProtectedLabelValidationWebhook) ValidateDelete(_ context.Context, obj runtime.Object) (warnings admission.Warnings, err error) { +func (*ProtectedLabelValidationWebhook) ValidateDelete( + _ context.Context, + obj runtime.Object, +) (warnings admission.Warnings, err error) { if err = checkResourceProtectionFromModificationOnDelete(obj); err != nil { return nil, err } diff --git a/pkg/webhook/webhook.go b/pkg/webhook/webhook.go index 277b757c..9d5e72b0 100644 --- a/pkg/webhook/webhook.go +++ b/pkg/webhook/webhook.go @@ -17,7 +17,10 @@ func RegisterValidationWebHook(ctx context.Context, mgr ctrl.Manager, namespace return fmt.Errorf("failed to populate certificates: %w", err) } - if err := NewCodebaseValidationWebhook(mgr.GetClient(), ctrl.Log.WithName("codebase-webhook")).SetupWebhookWithManager(mgr); err != nil { + if err := NewCodebaseValidationWebhook( + mgr.GetClient(), + ctrl.Log.WithName("codebase-webhook"), + ).SetupWebhookWithManager(mgr); err != nil { return err }