From 204176a06bd48abd3c8771a521e7bb39706e6703 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Wed, 12 Jun 2024 22:29:03 +0200 Subject: [PATCH 01/74] chore: enable errorlint linter on applicationset folder (#18618) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 2 +- .../controllers/applicationset_controller.go | 12 ++++---- applicationset/generators/git.go | 4 +-- applicationset/generators/list.go | 8 ++--- applicationset/generators/matrix.go | 2 +- applicationset/generators/merge.go | 2 +- applicationset/generators/plugin.go | 4 +-- applicationset/generators/plugin_test.go | 2 +- applicationset/generators/pull_request.go | 20 ++++++------- .../generators/pull_request_test.go | 6 +++- applicationset/generators/scm_provider.go | 30 +++++++++---------- .../services/internal/http/client.go | 2 +- .../services/internal/http/client_test.go | 6 ++-- .../services/plugin/plugin_service.go | 6 ++-- .../services/plugin/plugin_service_test.go | 2 +- .../services/pull_request/bitbucket_cloud.go | 10 +++---- .../services/pull_request/bitbucket_server.go | 4 +-- .../services/pull_request/gitlab.go | 4 +-- applicationset/services/pull_request/utils.go | 4 +-- .../services/scm_provider/aws_codecommit.go | 6 ++-- .../services/scm_provider/azure_devops.go | 10 +++++-- .../services/scm_provider/bitbucket_cloud.go | 8 ++--- .../scm_provider/bitbucket_cloud_test.go | 12 ++++---- .../services/scm_provider/bitbucket_server.go | 13 ++++---- .../services/scm_provider/gitlab.go | 4 +-- applicationset/services/scm_provider/utils.go | 6 ++-- applicationset/utils/clusterUtils.go | 4 +-- applicationset/webhook/webhook.go | 8 ++--- 28 files changed, 106 insertions(+), 95 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 5e97da31c8759..973dfe321bb36 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -2,7 +2,7 @@ issues: exclude: - SA5011 exclude-rules: - - path: "(applicationset|cmpserver|reposerver|server)/" + - path: "(cmpserver|reposerver|server)/" linters: - errorlint max-issues-per-linter: 0 diff --git a/applicationset/controllers/applicationset_controller.go b/applicationset/controllers/applicationset_controller.go index 111c63459979a..e0cba5955fe56 100644 --- a/applicationset/controllers/applicationset_controller.go +++ b/applicationset/controllers/applicationset_controller.go @@ -429,7 +429,7 @@ func (r *ApplicationSetReconciler) setApplicationSetStatusCondition(ctx context. if client.IgnoreNotFound(err) != nil { return nil } - return fmt.Errorf("error fetching updated application set: %v", err) + return fmt.Errorf("error fetching updated application set: %w", err) } applicationSet.Status.SetConditions( @@ -439,7 +439,7 @@ func (r *ApplicationSetReconciler) setApplicationSetStatusCondition(ctx context. // Update the newly fetched object with new set of conditions err := r.Client.Status().Update(ctx, applicationSet) if err != nil && !apierr.IsNotFound(err) { - return fmt.Errorf("unable to set application set condition: %v", err) + return fmt.Errorf("unable to set application set condition: %w", err) } } @@ -1364,14 +1364,14 @@ func (r *ApplicationSetReconciler) updateResourcesStatus(ctx context.Context, lo err := r.Client.Status().Update(ctx, appset) if err != nil { logCtx.Errorf("unable to set application set status: %v", err) - return fmt.Errorf("unable to set application set status: %v", err) + return fmt.Errorf("unable to set application set status: %w", err) } if err := r.Get(ctx, namespacedName, appset); err != nil { if client.IgnoreNotFound(err) != nil { return nil } - return fmt.Errorf("error fetching updated application set: %v", err) + return fmt.Errorf("error fetching updated application set: %w", err) } return nil @@ -1465,14 +1465,14 @@ func (r *ApplicationSetReconciler) setAppSetApplicationStatus(ctx context.Contex err := r.Client.Status().Update(ctx, applicationSet) if err != nil { logCtx.Errorf("unable to set application set status: %v", err) - return fmt.Errorf("unable to set application set status: %v", err) + return fmt.Errorf("unable to set application set status: %w", err) } if err := r.Get(ctx, namespacedName, applicationSet); err != nil { if client.IgnoreNotFound(err) != nil { return nil } - return fmt.Errorf("error fetching updated application set: %v", err) + return fmt.Errorf("error fetching updated application set: %w", err) } } diff --git a/applicationset/generators/git.go b/applicationset/generators/git.go index b1f6c574aa613..821ad66118762 100644 --- a/applicationset/generators/git.go +++ b/applicationset/generators/git.go @@ -142,7 +142,7 @@ func (g *GitGenerator) generateParamsForGitFiles(appSetGenerator *argoprojiov1al // A JSON / YAML file path can contain multiple sets of parameters (ie it is an array) paramsArray, err := g.generateParamsFromGitFile(path, allFiles[path], appSetGenerator.Git.Values, useGoTemplate, goTemplateOptions, appSetGenerator.Git.PathParamPrefix) if err != nil { - return nil, fmt.Errorf("unable to process file '%s': %v", path, err) + return nil, fmt.Errorf("unable to process file '%s': %w", path, err) } res = append(res, paramsArray...) @@ -160,7 +160,7 @@ func (g *GitGenerator) generateParamsFromGitFile(filePath string, fileContent [] singleObj := make(map[string]interface{}) err = yaml.Unmarshal(fileContent, &singleObj) if err != nil { - return nil, fmt.Errorf("unable to parse file: %v", err) + return nil, fmt.Errorf("unable to parse file: %w", err) } objectsFound = append(objectsFound, singleObj) } else if len(objectsFound) == 0 { diff --git a/applicationset/generators/list.go b/applicationset/generators/list.go index 7ff1010205ab1..fad6a6af5c6d9 100644 --- a/applicationset/generators/list.go +++ b/applicationset/generators/list.go @@ -44,7 +44,7 @@ func (g *ListGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha1.Appli var element map[string]interface{} err := json.Unmarshal(tmpItem.Raw, &element) if err != nil { - return nil, fmt.Errorf("error unmarshling list element %v", err) + return nil, fmt.Errorf("error unmarshling list element %w", err) } if appSet.Spec.GoTemplate { @@ -59,14 +59,14 @@ func (g *ListGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha1.Appli for k, v := range values { value, ok := v.(string) if !ok { - return nil, fmt.Errorf("error parsing value as string %v", err) + return nil, fmt.Errorf("error parsing value as string %w", err) } params[fmt.Sprintf("values.%s", k)] = value } } else { v, ok := value.(string) if !ok { - return nil, fmt.Errorf("error parsing value as string %v", err) + return nil, fmt.Errorf("error parsing value as string %w", err) } params[key] = v } @@ -80,7 +80,7 @@ func (g *ListGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha1.Appli var yamlElements []map[string]interface{} err := yaml.Unmarshal([]byte(appSetGenerator.List.ElementsYaml), &yamlElements) if err != nil { - return nil, fmt.Errorf("error unmarshling decoded ElementsYaml %v", err) + return nil, fmt.Errorf("error unmarshling decoded ElementsYaml %w", err) } res = append(res, yamlElements...) } diff --git a/applicationset/generators/matrix.go b/applicationset/generators/matrix.go index 35e85a45a9632..2a44d97b71ac5 100644 --- a/applicationset/generators/matrix.go +++ b/applicationset/generators/matrix.go @@ -121,7 +121,7 @@ func (m *MatrixGenerator) getParams(appSetBaseGenerator argoprojiov1alpha1.Appli params, client) if err != nil { - return nil, fmt.Errorf("child generator returned an error on parameter generation: %v", err) + return nil, fmt.Errorf("child generator returned an error on parameter generation: %w", err) } if len(t) == 0 { diff --git a/applicationset/generators/merge.go b/applicationset/generators/merge.go index 107ce7710a19a..e9af81fadae4e 100644 --- a/applicationset/generators/merge.go +++ b/applicationset/generators/merge.go @@ -178,7 +178,7 @@ func (m *MergeGenerator) getParams(appSetBaseGenerator argoprojiov1alpha1.Applic appSet, map[string]interface{}{}, client) if err != nil { - return nil, fmt.Errorf("child generator returned an error on parameter generation: %v", err) + return nil, fmt.Errorf("child generator returned an error on parameter generation: %w", err) } if len(t) == 0 { diff --git a/applicationset/generators/plugin.go b/applicationset/generators/plugin.go index 92e798047be90..6b6ba1ec4027e 100644 --- a/applicationset/generators/plugin.go +++ b/applicationset/generators/plugin.go @@ -93,7 +93,7 @@ func (g *PluginGenerator) getPluginFromGenerator(ctx context.Context, appSetName } token, err := g.getToken(ctx, cm["token"]) if err != nil { - return nil, fmt.Errorf("error fetching Secret token: %v", err) + return nil, fmt.Errorf("error fetching Secret token: %w", err) } var requestTimeout int @@ -165,7 +165,7 @@ func (g *PluginGenerator) getToken(ctx context.Context, tokenRef string) (string }, secret) if err != nil { - return "", fmt.Errorf("error fetching secret %s/%s: %v", g.namespace, secretName, err) + return "", fmt.Errorf("error fetching secret %s/%s: %w", g.namespace, secretName, err) } secretValues := make(map[string]string, len(secret.Data)) diff --git a/applicationset/generators/plugin_test.go b/applicationset/generators/plugin_test.go index d6ed24c8b80c0..e5f8be7ec8658 100644 --- a/applicationset/generators/plugin_test.go +++ b/applicationset/generators/plugin_test.go @@ -654,7 +654,7 @@ func TestPluginGenerateParams(t *testing.T) { w.Header().Set("Content-Type", "application/json") _, err := w.Write(testCase.content) if err != nil { - assert.NoError(t, fmt.Errorf("Error Write %v", err)) + assert.NoError(t, fmt.Errorf("Error Write %w", err)) } }) diff --git a/applicationset/generators/pull_request.go b/applicationset/generators/pull_request.go index c74d506f65133..54fcb73a2d77f 100644 --- a/applicationset/generators/pull_request.go +++ b/applicationset/generators/pull_request.go @@ -73,7 +73,7 @@ func (g *PullRequestGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha pulls, err := pullrequest.ListPullRequests(ctx, svc, appSetGenerator.PullRequest.Filters) if err != nil { - return nil, fmt.Errorf("error listing repos: %v", err) + return nil, fmt.Errorf("error listing repos: %w", err) } params := make([]map[string]interface{}, 0, len(pulls)) @@ -137,7 +137,7 @@ func (g *PullRequestGenerator) selectServiceProvider(ctx context.Context, genera providerConfig := generatorConfig.GitLab token, err := g.getSecretRef(ctx, providerConfig.TokenRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Secret token: %v", err) + return nil, fmt.Errorf("error fetching Secret token: %w", err) } return pullrequest.NewGitLabService(ctx, token, providerConfig.API, providerConfig.Project, providerConfig.Labels, providerConfig.PullRequestState, g.scmRootCAPath, providerConfig.Insecure) } @@ -145,7 +145,7 @@ func (g *PullRequestGenerator) selectServiceProvider(ctx context.Context, genera providerConfig := generatorConfig.Gitea token, err := g.getSecretRef(ctx, providerConfig.TokenRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Secret token: %v", err) + return nil, fmt.Errorf("error fetching Secret token: %w", err) } return pullrequest.NewGiteaService(ctx, token, providerConfig.API, providerConfig.Owner, providerConfig.Repo, providerConfig.Insecure) } @@ -154,7 +154,7 @@ func (g *PullRequestGenerator) selectServiceProvider(ctx context.Context, genera if providerConfig.BasicAuth != nil { password, err := g.getSecretRef(ctx, providerConfig.BasicAuth.PasswordRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Secret token: %v", err) + return nil, fmt.Errorf("error fetching Secret token: %w", err) } return pullrequest.NewBitbucketServiceBasicAuth(ctx, providerConfig.BasicAuth.Username, password, providerConfig.API, providerConfig.Project, providerConfig.Repo) } else { @@ -166,13 +166,13 @@ func (g *PullRequestGenerator) selectServiceProvider(ctx context.Context, genera if providerConfig.BearerToken != nil { appToken, err := g.getSecretRef(ctx, providerConfig.BearerToken.TokenRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Secret Bearer token: %v", err) + return nil, fmt.Errorf("error fetching Secret Bearer token: %w", err) } return pullrequest.NewBitbucketCloudServiceBearerToken(providerConfig.API, appToken, providerConfig.Owner, providerConfig.Repo) } else if providerConfig.BasicAuth != nil { password, err := g.getSecretRef(ctx, providerConfig.BasicAuth.PasswordRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Secret token: %v", err) + return nil, fmt.Errorf("error fetching Secret token: %w", err) } return pullrequest.NewBitbucketCloudServiceBasicAuth(providerConfig.API, providerConfig.BasicAuth.Username, password, providerConfig.Owner, providerConfig.Repo) } else { @@ -183,7 +183,7 @@ func (g *PullRequestGenerator) selectServiceProvider(ctx context.Context, genera providerConfig := generatorConfig.AzureDevOps token, err := g.getSecretRef(ctx, providerConfig.TokenRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Secret token: %v", err) + return nil, fmt.Errorf("error fetching Secret token: %w", err) } return pullrequest.NewAzureDevOpsService(ctx, token, providerConfig.API, providerConfig.Organization, providerConfig.Project, providerConfig.Repo, providerConfig.Labels) } @@ -195,7 +195,7 @@ func (g *PullRequestGenerator) github(ctx context.Context, cfg *argoprojiov1alph if cfg.AppSecretName != "" { auth, err := g.auth.GitHubApps.GetAuthSecret(ctx, cfg.AppSecretName) if err != nil { - return nil, fmt.Errorf("error getting GitHub App secret: %v", err) + return nil, fmt.Errorf("error getting GitHub App secret: %w", err) } return pullrequest.NewGithubAppService(*auth, cfg.API, cfg.Owner, cfg.Repo, cfg.Labels) } @@ -203,7 +203,7 @@ func (g *PullRequestGenerator) github(ctx context.Context, cfg *argoprojiov1alph // always default to token, even if not set (public access) token, err := g.getSecretRef(ctx, cfg.TokenRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Secret token: %v", err) + return nil, fmt.Errorf("error fetching Secret token: %w", err) } return pullrequest.NewGithubService(ctx, token, cfg.API, cfg.Owner, cfg.Repo, cfg.Labels) } @@ -223,7 +223,7 @@ func (g *PullRequestGenerator) getSecretRef(ctx context.Context, ref *argoprojio }, secret) if err != nil { - return "", fmt.Errorf("error fetching secret %s/%s: %v", namespace, ref.SecretName, err) + return "", fmt.Errorf("error fetching secret %s/%s: %w", namespace, ref.SecretName, err) } tokenBytes, ok := secret.Data[ref.Key] if !ok { diff --git a/applicationset/generators/pull_request_test.go b/applicationset/generators/pull_request_test.go index 31c5841d8be46..7be1a2f8025dd 100644 --- a/applicationset/generators/pull_request_test.go +++ b/applicationset/generators/pull_request_test.go @@ -204,7 +204,11 @@ func TestPullRequestGithubGenerateParams(t *testing.T) { } got, gotErr := gen.GenerateParams(&generatorConfig, &c.applicationSet, nil) - assert.Equal(t, c.expectedErr, gotErr) + if c.expectedErr != nil { + assert.Equal(t, c.expectedErr.Error(), gotErr.Error()) + } else { + assert.NoError(t, gotErr) + } assert.ElementsMatch(t, c.expected, got) } } diff --git a/applicationset/generators/scm_provider.go b/applicationset/generators/scm_provider.go index c8ecf1c778b2e..0f90240fdb25c 100644 --- a/applicationset/generators/scm_provider.go +++ b/applicationset/generators/scm_provider.go @@ -141,20 +141,20 @@ func (g *SCMProviderGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha } else if providerConfig.Gitlab != nil { token, err := g.getSecretRef(ctx, providerConfig.Gitlab.TokenRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Gitlab token: %v", err) + return nil, fmt.Errorf("error fetching Gitlab token: %w", err) } provider, err = scm_provider.NewGitlabProvider(ctx, providerConfig.Gitlab.Group, token, providerConfig.Gitlab.API, providerConfig.Gitlab.AllBranches, providerConfig.Gitlab.IncludeSubgroups, providerConfig.Gitlab.WillIncludeSharedProjects(), providerConfig.Gitlab.Insecure, g.scmRootCAPath, providerConfig.Gitlab.Topic) if err != nil { - return nil, fmt.Errorf("error initializing Gitlab service: %v", err) + return nil, fmt.Errorf("error initializing Gitlab service: %w", err) } } else if providerConfig.Gitea != nil { token, err := g.getSecretRef(ctx, providerConfig.Gitea.TokenRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Gitea token: %v", err) + return nil, fmt.Errorf("error fetching Gitea token: %w", err) } provider, err = scm_provider.NewGiteaProvider(ctx, providerConfig.Gitea.Owner, token, providerConfig.Gitea.API, providerConfig.Gitea.AllBranches, providerConfig.Gitea.Insecure) if err != nil { - return nil, fmt.Errorf("error initializing Gitea service: %v", err) + return nil, fmt.Errorf("error initializing Gitea service: %w", err) } } else if providerConfig.BitbucketServer != nil { providerConfig := providerConfig.BitbucketServer @@ -162,38 +162,38 @@ func (g *SCMProviderGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha if providerConfig.BasicAuth != nil { password, err := g.getSecretRef(ctx, providerConfig.BasicAuth.PasswordRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Secret token: %v", err) + return nil, fmt.Errorf("error fetching Secret token: %w", err) } provider, scmError = scm_provider.NewBitbucketServerProviderBasicAuth(ctx, providerConfig.BasicAuth.Username, password, providerConfig.API, providerConfig.Project, providerConfig.AllBranches) } else { provider, scmError = scm_provider.NewBitbucketServerProviderNoAuth(ctx, providerConfig.API, providerConfig.Project, providerConfig.AllBranches) } if scmError != nil { - return nil, fmt.Errorf("error initializing Bitbucket Server service: %v", scmError) + return nil, fmt.Errorf("error initializing Bitbucket Server service: %w", scmError) } } else if providerConfig.AzureDevOps != nil { token, err := g.getSecretRef(ctx, providerConfig.AzureDevOps.AccessTokenRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Azure Devops access token: %v", err) + return nil, fmt.Errorf("error fetching Azure Devops access token: %w", err) } provider, err = scm_provider.NewAzureDevOpsProvider(ctx, token, providerConfig.AzureDevOps.Organization, providerConfig.AzureDevOps.API, providerConfig.AzureDevOps.TeamProject, providerConfig.AzureDevOps.AllBranches) if err != nil { - return nil, fmt.Errorf("error initializing Azure Devops service: %v", err) + return nil, fmt.Errorf("error initializing Azure Devops service: %w", err) } } else if providerConfig.Bitbucket != nil { appPassword, err := g.getSecretRef(ctx, providerConfig.Bitbucket.AppPasswordRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Bitbucket cloud appPassword: %v", err) + return nil, fmt.Errorf("error fetching Bitbucket cloud appPassword: %w", err) } provider, err = scm_provider.NewBitBucketCloudProvider(ctx, providerConfig.Bitbucket.Owner, providerConfig.Bitbucket.User, appPassword, providerConfig.Bitbucket.AllBranches) if err != nil { - return nil, fmt.Errorf("error initializing Bitbucket cloud service: %v", err) + return nil, fmt.Errorf("error initializing Bitbucket cloud service: %w", err) } } else if providerConfig.AWSCodeCommit != nil { var awsErr error provider, awsErr = scm_provider.NewAWSCodeCommitProvider(ctx, providerConfig.AWSCodeCommit.TagFilters, providerConfig.AWSCodeCommit.Role, providerConfig.AWSCodeCommit.Region, providerConfig.AWSCodeCommit.AllBranches) if awsErr != nil { - return nil, fmt.Errorf("error initializing AWS codecommit service: %v", awsErr) + return nil, fmt.Errorf("error initializing AWS codecommit service: %w", awsErr) } } else { return nil, fmt.Errorf("no SCM provider implementation configured") @@ -202,7 +202,7 @@ func (g *SCMProviderGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha // Find all the available repos. repos, err := scm_provider.ListRepos(ctx, provider, providerConfig.Filters, providerConfig.CloneProtocol) if err != nil { - return nil, fmt.Errorf("error listing repos: %v", err) + return nil, fmt.Errorf("error listing repos: %w", err) } paramsArray := make([]map[string]interface{}, 0, len(repos)) var shortSHALength int @@ -254,7 +254,7 @@ func (g *SCMProviderGenerator) getSecretRef(ctx context.Context, ref *argoprojio }, secret) if err != nil { - return "", fmt.Errorf("error fetching secret %s/%s: %v", namespace, ref.SecretName, err) + return "", fmt.Errorf("error fetching secret %s/%s: %w", namespace, ref.SecretName, err) } tokenBytes, ok := secret.Data[ref.Key] if !ok { @@ -267,7 +267,7 @@ func (g *SCMProviderGenerator) githubProvider(ctx context.Context, github *argop if github.AppSecretName != "" { auth, err := g.GitHubApps.GetAuthSecret(ctx, github.AppSecretName) if err != nil { - return nil, fmt.Errorf("error fetching Github app secret: %v", err) + return nil, fmt.Errorf("error fetching Github app secret: %w", err) } return scm_provider.NewGithubAppProviderFor( @@ -280,7 +280,7 @@ func (g *SCMProviderGenerator) githubProvider(ctx context.Context, github *argop token, err := g.getSecretRef(ctx, github.TokenRef, applicationSetInfo.Namespace) if err != nil { - return nil, fmt.Errorf("error fetching Github token: %v", err) + return nil, fmt.Errorf("error fetching Github token: %w", err) } return scm_provider.NewGithubProvider(ctx, github.Organization, token, github.API, github.AllBranches) } diff --git a/applicationset/services/internal/http/client.go b/applicationset/services/internal/http/client.go index e6e59f346cfac..df43d89f873bb 100644 --- a/applicationset/services/internal/http/client.go +++ b/applicationset/services/internal/http/client.go @@ -140,7 +140,7 @@ func CheckResponse(resp *http.Response) error { data, err := io.ReadAll(resp.Body) if err != nil { - return fmt.Errorf("API error with status code %d: %v", resp.StatusCode, err) + return fmt.Errorf("API error with status code %d: %w", resp.StatusCode, err) } var raw map[string]interface{} diff --git a/applicationset/services/internal/http/client_test.go b/applicationset/services/internal/http/client_test.go index 1919917bd60fc..9235ce5ab3e7f 100644 --- a/applicationset/services/internal/http/client_test.go +++ b/applicationset/services/internal/http/client_test.go @@ -17,7 +17,7 @@ func TestClient(t *testing.T) { w.WriteHeader(http.StatusOK) _, err := w.Write([]byte("Hello, World!")) if err != nil { - assert.NoError(t, fmt.Errorf("Error Write %v", err)) + assert.NoError(t, fmt.Errorf("Error Write %w", err)) } })) defer server.Close() @@ -61,7 +61,7 @@ func TestClientDo(t *testing.T) { "key3": 123 }]`)) if err != nil { - assert.NoError(t, fmt.Errorf("Error Write %v", err)) + assert.NoError(t, fmt.Errorf("Error Write %w", err)) } })), clientOptionFns: nil, @@ -104,7 +104,7 @@ func TestClientDo(t *testing.T) { "key3": 123 }]`)) if err != nil { - assert.NoError(t, fmt.Errorf("Error Write %v", err)) + assert.NoError(t, fmt.Errorf("Error Write %w", err)) } })), clientOptionFns: nil, diff --git a/applicationset/services/plugin/plugin_service.go b/applicationset/services/plugin/plugin_service.go index 0b6cdec24a48a..175683c434d72 100644 --- a/applicationset/services/plugin/plugin_service.go +++ b/applicationset/services/plugin/plugin_service.go @@ -45,7 +45,7 @@ func NewPluginService(ctx context.Context, appSetName string, baseURL string, to client, err := internalhttp.NewClient(baseURL, clientOptionFns...) if err != nil { - return nil, fmt.Errorf("error creating plugin client: %v", err) + return nil, fmt.Errorf("error creating plugin client: %w", err) } return &Service{ @@ -57,14 +57,14 @@ func NewPluginService(ctx context.Context, appSetName string, baseURL string, to func (p *Service) List(ctx context.Context, parameters v1alpha1.PluginParameters) (*ServiceResponse, error) { req, err := p.client.NewRequest(http.MethodPost, "api/v1/getparams.execute", ServiceRequest{ApplicationSetName: p.appSetName, Input: v1alpha1.PluginInput{Parameters: parameters}}, nil) if err != nil { - return nil, fmt.Errorf("NewRequest returned unexpected error: %v", err) + return nil, fmt.Errorf("NewRequest returned unexpected error: %w", err) } var data ServiceResponse _, err = p.client.Do(ctx, req, &data) if err != nil { - return nil, fmt.Errorf("error get api '%s': %v", p.appSetName, err) + return nil, fmt.Errorf("error get api '%s': %w", p.appSetName, err) } return &data, err diff --git a/applicationset/services/plugin/plugin_service_test.go b/applicationset/services/plugin/plugin_service_test.go index f21d91fe68292..75e7f2c4a095f 100644 --- a/applicationset/services/plugin/plugin_service_test.go +++ b/applicationset/services/plugin/plugin_service_test.go @@ -24,7 +24,7 @@ func TestPlugin(t *testing.T) { } _, err := w.Write([]byte(expectedJSON)) if err != nil { - assert.NoError(t, fmt.Errorf("Error Write %v", err)) + assert.NoError(t, fmt.Errorf("Error Write %w", err)) } }) ts := httptest.NewServer(handler) diff --git a/applicationset/services/pull_request/bitbucket_cloud.go b/applicationset/services/pull_request/bitbucket_cloud.go index 5d5f8208f9b06..88efafe15bee1 100644 --- a/applicationset/services/pull_request/bitbucket_cloud.go +++ b/applicationset/services/pull_request/bitbucket_cloud.go @@ -60,7 +60,7 @@ func parseUrl(uri string) (*url.URL, error) { func NewBitbucketCloudServiceBasicAuth(baseUrl, username, password, owner, repositorySlug string) (PullRequestService, error) { url, err := parseUrl(baseUrl) if err != nil { - return nil, fmt.Errorf("error parsing base url of %s for %s/%s: %v", baseUrl, owner, repositorySlug, err) + return nil, fmt.Errorf("error parsing base url of %s for %s/%s: %w", baseUrl, owner, repositorySlug, err) } bitbucketClient := bitbucket.NewBasicAuth(username, password) @@ -76,7 +76,7 @@ func NewBitbucketCloudServiceBasicAuth(baseUrl, username, password, owner, repos func NewBitbucketCloudServiceBearerToken(baseUrl, bearerToken, owner, repositorySlug string) (PullRequestService, error) { url, err := parseUrl(baseUrl) if err != nil { - return nil, fmt.Errorf("error parsing base url of %s for %s/%s: %v", baseUrl, owner, repositorySlug, err) + return nil, fmt.Errorf("error parsing base url of %s for %s/%s: %w", baseUrl, owner, repositorySlug, err) } bitbucketClient := bitbucket.NewOAuthbearerToken(bearerToken) @@ -102,7 +102,7 @@ func (b *BitbucketCloudService) List(_ context.Context) ([]*PullRequest, error) response, err := b.client.Repositories.PullRequests.Gets(opts) if err != nil { - return nil, fmt.Errorf("error listing pull requests for %s/%s: %v", b.owner, b.repositorySlug, err) + return nil, fmt.Errorf("error listing pull requests for %s/%s: %w", b.owner, b.repositorySlug, err) } resp, ok := response.(map[string]interface{}) @@ -117,12 +117,12 @@ func (b *BitbucketCloudService) List(_ context.Context) ([]*PullRequest, error) jsonStr, err := json.Marshal(repoArray) if err != nil { - return nil, fmt.Errorf("error marshalling response body to json: %v", err) + return nil, fmt.Errorf("error marshalling response body to json: %w", err) } var pulls []BitbucketCloudPullRequest if err := json.Unmarshal(jsonStr, &pulls); err != nil { - return nil, fmt.Errorf("error unmarshalling json to type '[]BitbucketCloudPullRequest': %v", err) + return nil, fmt.Errorf("error unmarshalling json to type '[]BitbucketCloudPullRequest': %w", err) } pullRequests := []*PullRequest{} diff --git a/applicationset/services/pull_request/bitbucket_server.go b/applicationset/services/pull_request/bitbucket_server.go index c204b41bc5812..22c78f5323418 100644 --- a/applicationset/services/pull_request/bitbucket_server.go +++ b/applicationset/services/pull_request/bitbucket_server.go @@ -57,12 +57,12 @@ func (b *BitbucketService) List(_ context.Context) ([]*PullRequest, error) { for { response, err := b.client.DefaultApi.GetPullRequestsPage(b.projectKey, b.repositorySlug, paged) if err != nil { - return nil, fmt.Errorf("error listing pull requests for %s/%s: %v", b.projectKey, b.repositorySlug, err) + return nil, fmt.Errorf("error listing pull requests for %s/%s: %w", b.projectKey, b.repositorySlug, err) } pulls, err := bitbucketv1.GetPullRequestsResponse(response) if err != nil { log.Errorf("error parsing pull request response '%v'", response.Values) - return nil, fmt.Errorf("error parsing pull request response for %s/%s: %v", b.projectKey, b.repositorySlug, err) + return nil, fmt.Errorf("error parsing pull request response for %s/%s: %w", b.projectKey, b.repositorySlug, err) } for _, pull := range pulls { diff --git a/applicationset/services/pull_request/gitlab.go b/applicationset/services/pull_request/gitlab.go index f75d529cc1176..7f88c4a230706 100644 --- a/applicationset/services/pull_request/gitlab.go +++ b/applicationset/services/pull_request/gitlab.go @@ -43,7 +43,7 @@ func NewGitLabService(ctx context.Context, token, url, project string, labels [] client, err := gitlab.NewClient(token, clientOptionFns...) if err != nil { - return nil, fmt.Errorf("error creating Gitlab client: %v", err) + return nil, fmt.Errorf("error creating Gitlab client: %w", err) } return &GitLabService{ @@ -76,7 +76,7 @@ func (g *GitLabService) List(ctx context.Context) ([]*PullRequest, error) { for { mrs, resp, err := g.client.MergeRequests.ListProjectMergeRequests(g.project, opts) if err != nil { - return nil, fmt.Errorf("error listing merge requests for project '%s': %v", g.project, err) + return nil, fmt.Errorf("error listing merge requests for project '%s': %w", g.project, err) } for _, mr := range mrs { pullRequests = append(pullRequests, &PullRequest{ diff --git a/applicationset/services/pull_request/utils.go b/applicationset/services/pull_request/utils.go index 50d4e5a3c0098..09b5b6ca10eb1 100644 --- a/applicationset/services/pull_request/utils.go +++ b/applicationset/services/pull_request/utils.go @@ -16,13 +16,13 @@ func compileFilters(filters []argoprojiov1alpha1.PullRequestGeneratorFilter) ([] if filter.BranchMatch != nil { outFilter.BranchMatch, err = regexp.Compile(*filter.BranchMatch) if err != nil { - return nil, fmt.Errorf("error compiling BranchMatch regexp %q: %v", *filter.BranchMatch, err) + return nil, fmt.Errorf("error compiling BranchMatch regexp %q: %w", *filter.BranchMatch, err) } } if filter.TargetBranchMatch != nil { outFilter.TargetBranchMatch, err = regexp.Compile(*filter.TargetBranchMatch) if err != nil { - return nil, fmt.Errorf("error compiling TargetBranchMatch regexp %q: %v", *filter.TargetBranchMatch, err) + return nil, fmt.Errorf("error compiling TargetBranchMatch regexp %q: %w", *filter.TargetBranchMatch, err) } } outFilters = append(outFilters, outFilter) diff --git a/applicationset/services/scm_provider/aws_codecommit.go b/applicationset/services/scm_provider/aws_codecommit.go index daf12fa50c8bf..7732ff5361aa9 100644 --- a/applicationset/services/scm_provider/aws_codecommit.go +++ b/applicationset/services/scm_provider/aws_codecommit.go @@ -2,6 +2,7 @@ package scm_provider import ( "context" + "errors" "fmt" pathpkg "path" "path/filepath" @@ -327,7 +328,8 @@ func getCodeCommitFIPSEndpoint(repoUrl string) (string, error) { } func hasAwsError(err error, codes ...string) bool { - if awsErr, ok := err.(awserr.Error); ok { + var awsErr awserr.Error + if errors.As(err, &awsErr) { return slices.Contains(codes, awsErr.Code()) } return false @@ -356,7 +358,7 @@ func createAWSDiscoveryClients(_ context.Context, role string, region string) (* Credentials: assumeRoleCreds, }) if err != nil { - return nil, nil, fmt.Errorf("error creating new AWS discovery session: %s", err) + return nil, nil, fmt.Errorf("error creating new AWS discovery session: %w", err) } } else { log.Debugf("role is not provided for AWS CodeCommit discovery, using pod role") diff --git a/applicationset/services/scm_provider/azure_devops.go b/applicationset/services/scm_provider/azure_devops.go index 01225950ac8be..a4bb50a0232e3 100644 --- a/applicationset/services/scm_provider/azure_devops.go +++ b/applicationset/services/scm_provider/azure_devops.go @@ -2,6 +2,7 @@ package scm_provider import ( "context" + "errors" "fmt" netUrl "net/url" "strings" @@ -116,7 +117,8 @@ func (g *AzureDevOpsProvider) RepoHasPath(ctx context.Context, repo *Repository, getItemArgs := azureGit.GetItemArgs{RepositoryId: &repoId, Project: &g.teamProject, Path: &path, VersionDescriptor: &azureGit.GitVersionDescriptor{Version: &branchName}} _, err = gitClient.GetItem(ctx, getItemArgs) if err != nil { - if wrappedError, isWrappedError := err.(azuredevops.WrappedError); isWrappedError && wrappedError.TypeKey != nil { + var wrappedError azuredevops.WrappedError + if errors.As(err, &wrappedError) && wrappedError.TypeKey != nil { if *wrappedError.TypeKey == AzureDevOpsErrorsTypeKeyValues.GitItemNotFound { return false, nil } @@ -141,7 +143,8 @@ func (g *AzureDevOpsProvider) GetBranches(ctx context.Context, repo *Repository) getBranchArgs := azureGit.GetBranchArgs{RepositoryId: &repo.Repository, Project: &g.teamProject, Name: &defaultBranchName} branchResult, err := gitClient.GetBranch(ctx, getBranchArgs) if err != nil { - if wrappedError, isWrappedError := err.(azuredevops.WrappedError); isWrappedError && wrappedError.TypeKey != nil { + var wrappedError azuredevops.WrappedError + if errors.As(err, &wrappedError) && wrappedError.TypeKey != nil { if *wrappedError.TypeKey == AzureDevOpsErrorsTypeKeyValues.GitRepositoryNotFound { return repos, nil } @@ -169,7 +172,8 @@ func (g *AzureDevOpsProvider) GetBranches(ctx context.Context, repo *Repository) getBranchesRequest := azureGit.GetBranchesArgs{RepositoryId: &repo.Repository, Project: &g.teamProject} branches, err := gitClient.GetBranches(ctx, getBranchesRequest) if err != nil { - if wrappedError, isWrappedError := err.(azuredevops.WrappedError); isWrappedError && wrappedError.TypeKey != nil { + var wrappedError azuredevops.WrappedError + if errors.As(err, &wrappedError) && wrappedError.TypeKey != nil { if *wrappedError.TypeKey == AzureDevOpsErrorsTypeKeyValues.GitRepositoryNotFound { return repos, nil } diff --git a/applicationset/services/scm_provider/bitbucket_cloud.go b/applicationset/services/scm_provider/bitbucket_cloud.go index 37eabbf532e8e..da8f3fea54c54 100644 --- a/applicationset/services/scm_provider/bitbucket_cloud.go +++ b/applicationset/services/scm_provider/bitbucket_cloud.go @@ -65,13 +65,13 @@ func (g *BitBucketCloudProvider) GetBranches(ctx context.Context, repo *Reposito repos := []*Repository{} branches, err := g.listBranches(repo) if err != nil { - return nil, fmt.Errorf("error listing branches for %s/%s: %v", repo.Organization, repo.Repository, err) + return nil, fmt.Errorf("error listing branches for %s/%s: %w", repo.Organization, repo.Repository, err) } for _, branch := range branches { hash, ok := branch.Target["hash"].(string) if !ok { - return nil, fmt.Errorf("error getting SHA for branch for %s/%s/%s: %v", g.owner, repo.Repository, branch.Name, err) + return nil, fmt.Errorf("error getting SHA for branch for %s/%s/%s: %w", g.owner, repo.Repository, branch.Name, err) } repos = append(repos, &Repository{ Organization: repo.Organization, @@ -97,12 +97,12 @@ func (g *BitBucketCloudProvider) ListRepos(ctx context.Context, cloneProtocol st repos := []*Repository{} accountReposResp, err := g.client.Repositories.ListForAccount(opt) if err != nil { - return nil, fmt.Errorf("error listing repositories for %s: %v", g.owner, err) + return nil, fmt.Errorf("error listing repositories for %s: %w", g.owner, err) } for _, bitBucketRepo := range accountReposResp.Items { cloneUrl, err := findCloneURL(cloneProtocol, &bitBucketRepo) if err != nil { - return nil, fmt.Errorf("error fetching clone url for repo %s: %v", bitBucketRepo.Slug, err) + return nil, fmt.Errorf("error fetching clone url for repo %s: %w", bitBucketRepo.Slug, err) } repos = append(repos, &Repository{ Organization: g.owner, diff --git a/applicationset/services/scm_provider/bitbucket_cloud_test.go b/applicationset/services/scm_provider/bitbucket_cloud_test.go index fca03e1693ade..dc7732e9f6850 100644 --- a/applicationset/services/scm_provider/bitbucket_cloud_test.go +++ b/applicationset/services/scm_provider/bitbucket_cloud_test.go @@ -18,7 +18,7 @@ func TestBitbucketHasRepo(t *testing.T) { res.WriteHeader(http.StatusNotFound) _, err := res.Write([]byte("")) if err != nil { - assert.NoError(t, fmt.Errorf("Error in mock response %v", err)) + assert.NoError(t, fmt.Errorf("Error in mock response %w", err)) } } if req.URL.Path == "/repositories/test-owner/testmike/src/dc1edb6c7d650d8ba67719ddf7b662ad8f8fb798/.gitignore" { @@ -55,7 +55,7 @@ func TestBitbucketHasRepo(t *testing.T) { "size": 624 }`)) if err != nil { - assert.NoError(t, fmt.Errorf("Error in mock response %v", err)) + assert.NoError(t, fmt.Errorf("Error in mock response %w", err)) } } })) @@ -95,7 +95,7 @@ func TestBitbucketHasRepo(t *testing.T) { } hasPath, err := provider.RepoHasPath(context.Background(), repo, c.path) if err != nil { - assert.Error(t, fmt.Errorf("Error in test %v", err)) + assert.Error(t, fmt.Errorf("Error in test %w", err)) } if c.status != http.StatusOK { assert.False(t, hasPath) @@ -208,7 +208,7 @@ func TestBitbucketListRepos(t *testing.T) { "size": 1 }`)) if err != nil { - assert.NoError(t, fmt.Errorf("Error in mock response %v", err)) + assert.NoError(t, fmt.Errorf("Error in mock response %w", err)) } } if req.URL.Path == "/repositories/test-owner/testmike/refs/branches/main" { @@ -303,7 +303,7 @@ func TestBitbucketListRepos(t *testing.T) { } }`)) if err != nil { - assert.NoError(t, fmt.Errorf("Error in mock response %v", err)) + assert.NoError(t, fmt.Errorf("Error in mock response %w", err)) } } if req.URL.Path == "/repositories/test-owner" { @@ -442,7 +442,7 @@ func TestBitbucketListRepos(t *testing.T) { "size": 1 }`)) if err != nil { - assert.NoError(t, fmt.Errorf("Error in mock response %v", err)) + assert.NoError(t, fmt.Errorf("Error in mock response %w", err)) } } })) diff --git a/applicationset/services/scm_provider/bitbucket_server.go b/applicationset/services/scm_provider/bitbucket_server.go index 3c1b3edff86fe..d1b66c89a66c3 100644 --- a/applicationset/services/scm_provider/bitbucket_server.go +++ b/applicationset/services/scm_provider/bitbucket_server.go @@ -2,6 +2,7 @@ package scm_provider import ( "context" + "errors" "fmt" "io" @@ -55,12 +56,12 @@ func (b *BitbucketServerProvider) ListRepos(_ context.Context, cloneProtocol str for { response, err := b.client.DefaultApi.GetRepositoriesWithOptions(b.projectKey, paged) if err != nil { - return nil, fmt.Errorf("error listing repositories for %s: %v", b.projectKey, err) + return nil, fmt.Errorf("error listing repositories for %s: %w", b.projectKey, err) } repositories, err := bitbucketv1.GetRepositoriesResponse(response) if err != nil { log.Errorf("error parsing repositories response '%v'", response.Values) - return nil, fmt.Errorf("error parsing repositories response %s: %v", b.projectKey, err) + return nil, fmt.Errorf("error parsing repositories response %s: %w", b.projectKey, err) } for _, bitbucketRepo := range repositories { var url string @@ -127,7 +128,7 @@ func (b *BitbucketServerProvider) GetBranches(_ context.Context, repo *Repositor repos := []*Repository{} branches, err := b.listBranches(repo) if err != nil { - return nil, fmt.Errorf("error listing branches for %s/%s: %v", repo.Organization, repo.Repository, err) + return nil, fmt.Errorf("error listing branches for %s/%s: %w", repo.Organization, repo.Repository, err) } for _, branch := range branches { @@ -164,12 +165,12 @@ func (b *BitbucketServerProvider) listBranches(repo *Repository) ([]bitbucketv1. for { response, err := b.client.DefaultApi.GetBranches(repo.Organization, repo.Repository, paged) if err != nil { - return nil, fmt.Errorf("error listing branches for %s/%s: %v", repo.Organization, repo.Repository, err) + return nil, fmt.Errorf("error listing branches for %s/%s: %w", repo.Organization, repo.Repository, err) } bitbucketBranches, err := bitbucketv1.GetBranchesResponse(response) if err != nil { log.Errorf("error parsing branches response '%v'", response.Values) - return nil, fmt.Errorf("error parsing branches response for %s/%s: %v", repo.Organization, repo.Repository, err) + return nil, fmt.Errorf("error parsing branches response for %s/%s: %w", repo.Organization, repo.Repository, err) } branches = append(branches, bitbucketBranches...) @@ -187,7 +188,7 @@ func (b *BitbucketServerProvider) getDefaultBranch(org string, repo string) (*bi response, err := b.client.DefaultApi.GetDefaultBranch(org, repo) // The API will return 404 if a default branch is set but doesn't exist. In case the repo is empty and default branch is unset, // we will get an EOF and a nil response. - if (response != nil && response.StatusCode == 404) || (response == nil && err == io.EOF) { + if (response != nil && response.StatusCode == 404) || (response == nil && err != nil && errors.Is(err, io.EOF)) { return nil, nil } if err != nil { diff --git a/applicationset/services/scm_provider/gitlab.go b/applicationset/services/scm_provider/gitlab.go index 21b242c2a13a5..974be7bc21e16 100644 --- a/applicationset/services/scm_provider/gitlab.go +++ b/applicationset/services/scm_provider/gitlab.go @@ -58,7 +58,7 @@ func (g *GitlabProvider) GetBranches(ctx context.Context, repo *Repository) ([]* repos := []*Repository{} branches, err := g.listBranches(ctx, repo) if err != nil { - return nil, fmt.Errorf("error listing branches for %s/%s: %v", repo.Organization, repo.Repository, err) + return nil, fmt.Errorf("error listing branches for %s/%s: %w", repo.Organization, repo.Repository, err) } for _, branch := range branches { @@ -87,7 +87,7 @@ func (g *GitlabProvider) ListRepos(ctx context.Context, cloneProtocol string) ([ for { gitlabRepos, resp, err := g.client.Groups.ListGroupProjects(g.organization, opt) if err != nil { - return nil, fmt.Errorf("error listing projects for %s: %v", g.organization, err) + return nil, fmt.Errorf("error listing projects for %s: %w", g.organization, err) } for _, gitlabRepo := range gitlabRepos { var url string diff --git a/applicationset/services/scm_provider/utils.go b/applicationset/services/scm_provider/utils.go index e92923f52707b..b7cdbf460605b 100644 --- a/applicationset/services/scm_provider/utils.go +++ b/applicationset/services/scm_provider/utils.go @@ -17,14 +17,14 @@ func compileFilters(filters []argoprojiov1alpha1.SCMProviderGeneratorFilter) ([] if filter.RepositoryMatch != nil { outFilter.RepositoryMatch, err = regexp.Compile(*filter.RepositoryMatch) if err != nil { - return nil, fmt.Errorf("error compiling RepositoryMatch regexp %q: %v", *filter.RepositoryMatch, err) + return nil, fmt.Errorf("error compiling RepositoryMatch regexp %q: %w", *filter.RepositoryMatch, err) } outFilter.FilterType = FilterTypeRepo } if filter.LabelMatch != nil { outFilter.LabelMatch, err = regexp.Compile(*filter.LabelMatch) if err != nil { - return nil, fmt.Errorf("error compiling LabelMatch regexp %q: %v", *filter.LabelMatch, err) + return nil, fmt.Errorf("error compiling LabelMatch regexp %q: %w", *filter.LabelMatch, err) } outFilter.FilterType = FilterTypeRepo } @@ -39,7 +39,7 @@ func compileFilters(filters []argoprojiov1alpha1.SCMProviderGeneratorFilter) ([] if filter.BranchMatch != nil { outFilter.BranchMatch, err = regexp.Compile(*filter.BranchMatch) if err != nil { - return nil, fmt.Errorf("error compiling BranchMatch regexp %q: %v", *filter.BranchMatch, err) + return nil, fmt.Errorf("error compiling BranchMatch regexp %q: %w", *filter.BranchMatch, err) } outFilter.FilterType = FilterTypeBranch } diff --git a/applicationset/utils/clusterUtils.go b/applicationset/utils/clusterUtils.go index 21e37d40ddfbf..f1d30674a7ebc 100644 --- a/applicationset/utils/clusterUtils.go +++ b/applicationset/utils/clusterUtils.go @@ -55,7 +55,7 @@ func ValidateDestination(ctx context.Context, dest *appv1.ApplicationDestination if dest.Server == "" { server, err := getDestinationServer(ctx, dest.Name, clientset, argoCDNamespace) if err != nil { - return fmt.Errorf("unable to find destination server: %v", err) + return fmt.Errorf("unable to find destination server: %w", err) } if server == "" { return fmt.Errorf("application references destination cluster %s which does not exist", dest.Name) @@ -113,7 +113,7 @@ func ListClusters(ctx context.Context, clientset kubernetes.Interface, namespace // This line has changed from the original Argo CD code: now receives an error, and handles it cluster, err := secretToCluster(&clusterSecret) if err != nil || cluster == nil { - return nil, fmt.Errorf("unable to convert cluster secret to cluster object '%s': %v", clusterSecret.Name, err) + return nil, fmt.Errorf("unable to convert cluster secret to cluster object '%s': %w", clusterSecret.Name, err) } clusterList.Items[i] = *cluster diff --git a/applicationset/webhook/webhook.go b/applicationset/webhook/webhook.go index 7a74ddae35d4b..30f1a2eb1ad0e 100644 --- a/applicationset/webhook/webhook.go +++ b/applicationset/webhook/webhook.go @@ -70,19 +70,19 @@ func NewWebhookHandler(namespace string, argocdSettingsMgr *argosettings.Setting // register the webhook secrets stored under "argocd-secret" for verifying incoming payloads argocdSettings, err := argocdSettingsMgr.GetSettings() if err != nil { - return nil, fmt.Errorf("Failed to get argocd settings: %v", err) + return nil, fmt.Errorf("Failed to get argocd settings: %w", err) } githubHandler, err := github.New(github.Options.Secret(argocdSettings.WebhookGitHubSecret)) if err != nil { - return nil, fmt.Errorf("Unable to init GitHub webhook: %v", err) + return nil, fmt.Errorf("Unable to init GitHub webhook: %w", err) } gitlabHandler, err := gitlab.New(gitlab.Options.Secret(argocdSettings.WebhookGitLabSecret)) if err != nil { - return nil, fmt.Errorf("Unable to init GitLab webhook: %v", err) + return nil, fmt.Errorf("Unable to init GitLab webhook: %w", err) } azuredevopsHandler, err := azuredevops.New() if err != nil { - return nil, fmt.Errorf("Unable to init Azure DevOps webhook: %v", err) + return nil, fmt.Errorf("Unable to init Azure DevOps webhook: %w", err) } azuredevopsAuthHandler := func(r *http.Request) error { if argocdSettings.WebhookAzureDevOpsUsername != "" && argocdSettings.WebhookAzureDevOpsPassword != "" { From e0bc7cfbcd7f35949f89290eb1d19ddb14b2655b Mon Sep 17 00:00:00 2001 From: Alexy Mantha Date: Wed, 12 Jun 2024 16:31:28 -0400 Subject: [PATCH 02/74] feat(appset): make K8s client configurable Signed-off-by: Alexy Mantha --- .../commands/applicationset_controller.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go index b90bd7dbd1f65..b0b984b8ad2b1 100644 --- a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go +++ b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go @@ -126,7 +126,14 @@ func NewCommand() *cobra.Command { } } - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + cfg := ctrl.GetConfigOrDie() + err = appv1alpha1.SetK8SConfigDefaults(cfg) + if err != nil { + log.Error(err, "Unable to apply K8s REST config defaults") + os.Exit(1) + } + + mgr, err := ctrl.NewManager(cfg, ctrl.Options{ Scheme: scheme, Metrics: metricsserver.Options{ BindAddress: metricsAddr, From f1848f5455972aa72493546e840da29825051ccf Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Thu, 13 Jun 2024 01:43:25 +0200 Subject: [PATCH 03/74] chore: enable errorlint linter on server folder (#18624) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 2 +- server/application/application.go | 11 +++++---- server/application/logs.go | 5 ++-- server/applicationset/applicationset.go | 2 +- server/extension/extension.go | 32 ++++++++++++------------- 5 files changed, 27 insertions(+), 25 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 973dfe321bb36..8852a508e0261 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -2,7 +2,7 @@ issues: exclude: - SA5011 exclude-rules: - - path: "(cmpserver|reposerver|server)/" + - path: "(cmpserver|reposerver)/" linters: - errorlint max-issues-per-linter: 0 diff --git a/server/application/application.go b/server/application/application.go index b3b60ca7085fa..ec517a30c89fa 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -491,7 +491,7 @@ func (s *Server) GetManifests(ctx context.Context, q *application.ApplicationMan // Store the map of all sources having ref field into a map for applications with sources field refSources, err := argo.GetRefSources(context.Background(), sources, appSpec.Project, s.db.GetRepository, []string{}, false) if err != nil { - return fmt.Errorf("failed to get ref sources: %v", err) + return fmt.Errorf("failed to get ref sources: %w", err) } for _, source := range sources { @@ -1048,7 +1048,8 @@ func (s *Server) getAppProject(ctx context.Context, a *appv1.Application, logCtx return nil, vagueError } - if _, ok := err.(*appv1.ErrApplicationNotAllowedToUseProject); ok { + var applicationNotAllowedToUseProjectErr *appv1.ErrApplicationNotAllowedToUseProject + if errors.As(err, &applicationNotAllowedToUseProjectErr) { logCtx.WithFields(map[string]interface{}{ "project": a.Spec.Project, argocommon.SecurityField: argocommon.SecurityMedium, @@ -1289,7 +1290,7 @@ func (s *Server) getApplicationClusterConfig(ctx context.Context, a *appv1.Appli // getCachedAppState loads the cached state and trigger app refresh if cache is missing func (s *Server) getCachedAppState(ctx context.Context, a *appv1.Application, getFromCache func() error) error { err := getFromCache() - if err != nil && err == servercache.ErrCacheMiss { + if err != nil && errors.Is(err, servercache.ErrCacheMiss) { conditions := a.Status.GetConditions(map[appv1.ApplicationConditionType]bool{ appv1.ApplicationConditionComparisonError: true, appv1.ApplicationConditionInvalidSpecError: true, @@ -1323,7 +1324,7 @@ func (s *Server) getAppResources(ctx context.Context, a *appv1.Application) (*ap func (s *Server) getAppLiveResource(ctx context.Context, action string, q *application.ApplicationResourceRequest) (*appv1.ResourceNode, *rest.Config, *appv1.Application, error) { a, _, err := s.getApplicationEnforceRBACInformer(ctx, action, q.GetProject(), q.GetAppNamespace(), q.GetName()) - if err == permissionDeniedErr && (action == rbacpolicy.ActionDelete || action == rbacpolicy.ActionUpdate) { + if err != nil && errors.Is(err, permissionDeniedErr) && (action == rbacpolicy.ActionDelete || action == rbacpolicy.ActionUpdate) { // If users dont have permission on the whole applications, maybe they have fine-grained access to the specific resources action = fmt.Sprintf("%s/%s/%s/%s/%s", action, q.GetGroup(), q.GetKind(), q.GetNamespace(), q.GetResourceName()) a, _, err = s.getApplicationEnforceRBACInformer(ctx, action, q.GetProject(), q.GetAppNamespace(), q.GetName()) @@ -1671,7 +1672,7 @@ func (s *Server) PodLogs(q *application.ApplicationPodLogsQuery, ws application. var untilTime *metav1.Time if q.GetUntilTime() != "" { if val, err := time.Parse(time.RFC3339Nano, q.GetUntilTime()); err != nil { - return fmt.Errorf("invalid untilTime parameter value: %v", err) + return fmt.Errorf("invalid untilTime parameter value: %w", err) } else { untilTimeVal := metav1.NewTime(val) untilTime = &untilTimeVal diff --git a/server/application/logs.go b/server/application/logs.go index ce110523d07d1..9034da9471212 100644 --- a/server/application/logs.go +++ b/server/application/logs.go @@ -2,6 +2,7 @@ package application import ( "bufio" + "errors" "io" "strings" "sync" @@ -22,13 +23,13 @@ func parseLogsStream(podName string, stream io.ReadCloser, ch chan logEntry) { eof := false for !eof { line, err := bufReader.ReadString('\n') - if err == io.EOF { + if err != nil && errors.Is(err, io.EOF) { eof = true // stop if we reached end of stream and the next line is empty if line == "" { break } - } else if err != nil && err != io.EOF { + } else if err != nil && !errors.Is(err, io.EOF) { ch <- logEntry{err: err} break } diff --git a/server/applicationset/applicationset.go b/server/applicationset/applicationset.go index a9385e3c2c45d..5f2b7508b9a2e 100644 --- a/server/applicationset/applicationset.go +++ b/server/applicationset/applicationset.go @@ -163,7 +163,7 @@ func (s *Server) Create(ctx context.Context, q *applicationset.ApplicationSetCre } if err := s.checkCreatePermissions(ctx, appset, projectName); err != nil { - return nil, fmt.Errorf("error checking create permissions for ApplicationSets %s : %s", appset.Name, err) + return nil, fmt.Errorf("error checking create permissions for ApplicationSets %s : %w", appset.Name, err) } s.projectLock.RLock(projectName) diff --git a/server/extension/extension.go b/server/extension/extension.go index 642a739af01b2..95dc539a70af1 100644 --- a/server/extension/extension.go +++ b/server/extension/extension.go @@ -92,7 +92,7 @@ func ValidateHeaders(r *http.Request) (*RequestResources, error) { } appNamespace, appName, err := getAppName(appHeader) if err != nil { - return nil, fmt.Errorf("error getting app details: %s", err) + return nil, fmt.Errorf("error getting app details: %w", err) } if !argo.IsValidNamespaceName(appNamespace) { return nil, errors.New("invalid value for namespace") @@ -370,23 +370,23 @@ func parseAndValidateConfig(s *settings.ArgoCDSettings) (*ExtensionConfigs, erro extConfigMap := map[string]interface{}{} err := yaml.Unmarshal([]byte(s.ExtensionConfig), &extConfigMap) if err != nil { - return nil, fmt.Errorf("invalid extension config: %s", err) + return nil, fmt.Errorf("invalid extension config: %w", err) } parsedExtConfig := settings.ReplaceMapSecrets(extConfigMap, s.Secrets) parsedExtConfigBytes, err := yaml.Marshal(parsedExtConfig) if err != nil { - return nil, fmt.Errorf("error marshaling parsed extension config: %s", err) + return nil, fmt.Errorf("error marshaling parsed extension config: %w", err) } configs := ExtensionConfigs{} err = yaml.Unmarshal(parsedExtConfigBytes, &configs) if err != nil { - return nil, fmt.Errorf("invalid parsed extension config: %s", err) + return nil, fmt.Errorf("invalid parsed extension config: %w", err) } err = validateConfigs(&configs) if err != nil { - return nil, fmt.Errorf("validation error: %s", err) + return nil, fmt.Errorf("validation error: %w", err) } return &configs, nil } @@ -442,7 +442,7 @@ func validateConfigs(configs *ExtensionConfigs) error { func NewProxy(targetURL string, headers []Header, config ProxyConfig) (*httputil.ReverseProxy, error) { url, err := url.Parse(targetURL) if err != nil { - return nil, fmt.Errorf("failed to parse proxy URL: %s", err) + return nil, fmt.Errorf("failed to parse proxy URL: %w", err) } proxy := &httputil.ReverseProxy{ Transport: newTransport(config), @@ -497,7 +497,7 @@ func applyProxyConfigDefaults(c *ProxyConfig) { func (m *Manager) RegisterExtensions() error { settings, err := m.settings.Get() if err != nil { - return fmt.Errorf("error getting settings: %s", err) + return fmt.Errorf("error getting settings: %w", err) } if settings.ExtensionConfig == "" { m.log.Infof("No extensions configured.") @@ -505,7 +505,7 @@ func (m *Manager) RegisterExtensions() error { } err = m.UpdateExtensionRegistry(settings) if err != nil { - return fmt.Errorf("error updating extension registry: %s", err) + return fmt.Errorf("error updating extension registry: %w", err) } return nil } @@ -517,7 +517,7 @@ func (m *Manager) RegisterExtensions() error { func (m *Manager) UpdateExtensionRegistry(s *settings.ArgoCDSettings) error { extConfigs, err := parseAndValidateConfig(s) if err != nil { - return fmt.Errorf("error parsing extension config: %s", err) + return fmt.Errorf("error parsing extension config: %w", err) } extReg := make(map[string]ProxyRegistry) for _, ext := range extConfigs.Extensions { @@ -526,11 +526,11 @@ func (m *Manager) UpdateExtensionRegistry(s *settings.ArgoCDSettings) error { for _, service := range ext.Backend.Services { proxy, err := NewProxy(service.URL, service.Headers, ext.Backend.ProxyConfig) if err != nil { - return fmt.Errorf("error creating proxy: %s", err) + return fmt.Errorf("error creating proxy: %w", err) } err = appendProxy(proxyReg, ext.Name, service, proxy, singleBackend) if err != nil { - return fmt.Errorf("error appending proxy: %s", err) + return fmt.Errorf("error appending proxy: %w", err) } } extReg[ext.Name] = proxyReg @@ -593,17 +593,17 @@ func (m *Manager) authorize(ctx context.Context, rr *RequestResources, extName s } appRBACName := security.RBACName(rr.ApplicationNamespace, rr.ProjectName, rr.ApplicationNamespace, rr.ApplicationName) if err := m.rbac.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplications, rbacpolicy.ActionGet, appRBACName); err != nil { - return nil, fmt.Errorf("application authorization error: %s", err) + return nil, fmt.Errorf("application authorization error: %w", err) } if err := m.rbac.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceExtensions, rbacpolicy.ActionInvoke, extName); err != nil { - return nil, fmt.Errorf("unauthorized to invoke extension %q: %s", extName, err) + return nil, fmt.Errorf("unauthorized to invoke extension %q: %w", extName, err) } // just retrieve the app after checking if subject has access to it app, err := m.application.Get(rr.ApplicationNamespace, rr.ApplicationName) if err != nil { - return nil, fmt.Errorf("error getting application: %s", err) + return nil, fmt.Errorf("error getting application: %w", err) } if app == nil { return nil, fmt.Errorf("invalid Application provided in the %q header", HeaderArgoCDApplicationName) @@ -615,14 +615,14 @@ func (m *Manager) authorize(ctx context.Context, rr *RequestResources, extName s proj, err := m.project.Get(app.Spec.GetProject()) if err != nil { - return nil, fmt.Errorf("error getting project: %s", err) + return nil, fmt.Errorf("error getting project: %w", err) } if proj == nil { return nil, fmt.Errorf("invalid project provided in the %q header", HeaderArgoCDProjectName) } permitted, err := proj.IsDestinationPermitted(app.Spec.Destination, m.project.GetClusters) if err != nil { - return nil, fmt.Errorf("error validating project destinations: %s", err) + return nil, fmt.Errorf("error validating project destinations: %w", err) } if !permitted { return nil, fmt.Errorf("the provided project is not allowed to access the cluster configured in the Application destination") From 311c0599d9b733fd80fc1eb6a7e02b18f528649a Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Thu, 13 Jun 2024 03:53:29 +0200 Subject: [PATCH 04/74] chore: enable require-error rule from testifylint linter (#18621) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 9 +++++++- util/app/discovery/discovery_test.go | 15 ++++++------ util/app/path/path_test.go | 34 ++++++++++++++-------------- util/exec/exec_test.go | 3 ++- util/github_app/repos_test.go | 3 ++- util/jwt/jwt_test.go | 5 ++-- util/proxy/proxy_test.go | 5 ++-- util/text/label/label_test.go | 7 +++--- 8 files changed, 47 insertions(+), 34 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 8852a508e0261..318d039275918 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -5,6 +5,14 @@ issues: - path: "(cmpserver|reposerver)/" linters: - errorlint + - path: "(applicationset|cmd|cmpserver|controller|pkg|reposerver|server|test)/" + text: "require-error:" + linters: + - testifylint + - path: "util/(argo|cache|cert|clusterauth|config|db|dex|git|gpg|grpc|helm|http|io|kube|kustomize|lua|notification|oidc|rbac|security|session|settings|tls|webhook)/" + text: "require-error:" + linters: + - testifylint max-issues-per-linter: 0 max-same-issues: 0 linters: @@ -30,6 +38,5 @@ linters-settings: - error-is-as - float-compare - go-require - - require-error run: timeout: 50m diff --git a/util/app/discovery/discovery_test.go b/util/app/discovery/discovery_test.go index 771a1942eb467..c8340847e7702 100644 --- a/util/app/discovery/discovery_test.go +++ b/util/app/discovery/discovery_test.go @@ -7,11 +7,12 @@ import ( "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestDiscover(t *testing.T) { apps, err := Discover(context.Background(), "./testdata", "./testdata", map[string]bool{}, []string{}, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, map[string]string{ "foo": "Kustomize", "baz": "Helm", @@ -20,15 +21,15 @@ func TestDiscover(t *testing.T) { func TestAppType(t *testing.T) { appType, err := AppType(context.Background(), "./testdata/foo", "./testdata", map[string]bool{}, []string{}, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Kustomize", appType) appType, err = AppType(context.Background(), "./testdata/baz", "./testdata", map[string]bool{}, []string{}, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Helm", appType) appType, err = AppType(context.Background(), "./testdata", "./testdata", map[string]bool{}, []string{}, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Directory", appType) } @@ -38,14 +39,14 @@ func TestAppType_Disabled(t *testing.T) { string(v1alpha1.ApplicationSourceTypeHelm): false, } appType, err := AppType(context.Background(), "./testdata/foo", "./testdata", enableManifestGeneration, []string{}, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Directory", appType) appType, err = AppType(context.Background(), "./testdata/baz", "./testdata", enableManifestGeneration, []string{}, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Directory", appType) appType, err = AppType(context.Background(), "./testdata", "./testdata", enableManifestGeneration, []string{}, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Directory", appType) } diff --git a/util/app/path/path_test.go b/util/app/path/path_test.go index ebdbe507ee24f..06826f2d8be2e 100644 --- a/util/app/path/path_test.go +++ b/util/app/path/path_test.go @@ -16,70 +16,70 @@ import ( func TestPathRoot(t *testing.T) { _, err := Path("./testdata", "/") - assert.EqualError(t, err, "/: app path is absolute") + require.EqualError(t, err, "/: app path is absolute") } func TestPathAbsolute(t *testing.T) { _, err := Path("./testdata", "/etc/passwd") - assert.EqualError(t, err, "/etc/passwd: app path is absolute") + require.EqualError(t, err, "/etc/passwd: app path is absolute") } func TestPathDotDot(t *testing.T) { _, err := Path("./testdata", "..") - assert.EqualError(t, err, "..: app path outside root") + require.EqualError(t, err, "..: app path outside root") } func TestPathDotDotSlash(t *testing.T) { _, err := Path("./testdata", "../") - assert.EqualError(t, err, "../: app path outside root") + require.EqualError(t, err, "../: app path outside root") } func TestPathDot(t *testing.T) { _, err := Path("./testdata", ".") - assert.NoError(t, err) + require.NoError(t, err) } func TestPathDotSlash(t *testing.T) { _, err := Path("./testdata", "./") - assert.NoError(t, err) + require.NoError(t, err) } func TestNonExistentPath(t *testing.T) { _, err := Path("./testdata", "does-not-exist") - assert.EqualError(t, err, "does-not-exist: app path does not exist") + require.EqualError(t, err, "does-not-exist: app path does not exist") } func TestPathNotDir(t *testing.T) { _, err := Path("./testdata", "file.txt") - assert.EqualError(t, err, "file.txt: app path is not a directory") + require.EqualError(t, err, "file.txt: app path is not a directory") } func TestGoodSymlinks(t *testing.T) { err := CheckOutOfBoundsSymlinks("./testdata/goodlink") - assert.NoError(t, err) + require.NoError(t, err) } // Simple check of leaving the repo func TestBadSymlinks(t *testing.T) { err := CheckOutOfBoundsSymlinks("./testdata/badlink") - oobError := &OutOfBoundsSymlinkError{} - assert.ErrorAs(t, err, &oobError) + var oobError *OutOfBoundsSymlinkError + require.ErrorAs(t, err, &oobError) assert.Equal(t, "badlink", oobError.File) } // Crazy formatting check func TestBadSymlinks2(t *testing.T) { err := CheckOutOfBoundsSymlinks("./testdata/badlink2") - oobError := &OutOfBoundsSymlinkError{} - assert.ErrorAs(t, err, &oobError) + var oobError *OutOfBoundsSymlinkError + require.ErrorAs(t, err, &oobError) assert.Equal(t, "badlink", oobError.File) } // Make sure no part of the symlink can leave the repo, even if it ultimately targets inside the repo func TestBadSymlinks3(t *testing.T) { err := CheckOutOfBoundsSymlinks("./testdata/badlink3") - oobError := &OutOfBoundsSymlinkError{} - assert.ErrorAs(t, err, &oobError) + var oobError *OutOfBoundsSymlinkError + require.ErrorAs(t, err, &oobError) assert.Equal(t, "badlink", oobError.File) } @@ -89,8 +89,8 @@ func TestAbsSymlink(t *testing.T) { require.NoError(t, fileutil.CreateSymlink(t, testDir, "/somethingbad", "abslink")) defer os.Remove(path.Join(testDir, "abslink")) err := CheckOutOfBoundsSymlinks(testDir) - oobError := &OutOfBoundsSymlinkError{} - assert.ErrorAs(t, err, &oobError) + var oobError *OutOfBoundsSymlinkError + require.ErrorAs(t, err, &oobError) assert.Equal(t, "abslink", oobError.File) } diff --git a/util/exec/exec_test.go b/util/exec/exec_test.go index 0347abf0955e0..d7dd75c61a1bd 100644 --- a/util/exec/exec_test.go +++ b/util/exec/exec_test.go @@ -9,6 +9,7 @@ import ( argoexec "github.com/argoproj/pkg/exec" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_timeout(t *testing.T) { @@ -25,7 +26,7 @@ func Test_timeout(t *testing.T) { func TestRun(t *testing.T) { out, err := Run(exec.Command("ls")) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, out) } diff --git a/util/github_app/repos_test.go b/util/github_app/repos_test.go index 86e695e8d8d8a..67f49412ce2f0 100644 --- a/util/github_app/repos_test.go +++ b/util/github_app/repos_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/applicationset/services/github_app_auth" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" @@ -51,7 +52,7 @@ func Test_repoAsCredentials_GetAuth(t *testing.T) { assert.Error(t, err) return } - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, tt.want, auth) }) } diff --git a/util/jwt/jwt_test.go b/util/jwt/jwt_test.go index 4af7eefa14379..7daf855e3d9fb 100644 --- a/util/jwt/jwt_test.go +++ b/util/jwt/jwt_test.go @@ -7,6 +7,7 @@ import ( jwt "github.com/golang-jwt/jwt/v4" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestGetSingleStringScope(t *testing.T) { @@ -43,7 +44,7 @@ func TestIssuedAtTime_Int64(t *testing.T) { // Tuesday, 1 December 2020 14:00:00 claims := jwt.MapClaims{"iat": int64(1606831200)} issuedAt, err := IssuedAtTime(claims) - assert.NoError(t, err) + require.NoError(t, err) str := fmt.Sprint(issuedAt.UTC().Format("Mon Jan _2 15:04:05 2006")) assert.Equal(t, "Tue Dec 1 14:00:00 2020", str) } @@ -57,7 +58,7 @@ func TestIssuedAtTime_Error_NoInt(t *testing.T) { func TestIssuedAtTime_Error_Missing(t *testing.T) { claims := jwt.MapClaims{} iat, err := IssuedAtTime(claims) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, time.Unix(0, 0), iat) } diff --git a/util/proxy/proxy_test.go b/util/proxy/proxy_test.go index b32f6992ad157..2224e611dad23 100644 --- a/util/proxy/proxy_test.go +++ b/util/proxy/proxy_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestAddProxyEnvIfAbsent(t *testing.T) { @@ -30,14 +31,14 @@ func TestGetCallBack(t *testing.T) { t.Run("custom proxy present", func(t *testing.T) { proxy := "http://proxy:8888" url, err := GetCallback(proxy)(nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, proxy, url.String()) }) t.Run("custom proxy absent", func(t *testing.T) { proxyEnv := "http://proxy:8888" t.Setenv("http_proxy", "http://proxy:8888") url, err := GetCallback("")(httptest.NewRequest(http.MethodGet, proxyEnv, nil)) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, proxyEnv, url.String()) }) } diff --git a/util/text/label/label_test.go b/util/text/label/label_test.go index 50938de3f3b8c..020ee4142c699 100644 --- a/util/text/label/label_test.go +++ b/util/text/label/label_test.go @@ -4,21 +4,22 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestParseLabels(t *testing.T) { validLabels := []string{"key=value", "foo=bar", "intuit=inc"} result, err := Parse(validLabels) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, result, 3) invalidLabels := []string{"key=value", "too=many=equals"} _, err = Parse(invalidLabels) - assert.Error(t, err) + require.Error(t, err) emptyLabels := []string{} result, err = Parse(emptyLabels) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, result) } From f7341ae652f515c34c1f7bcf5c0ef5e7fd681952 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Thu, 13 Jun 2024 09:29:03 +0200 Subject: [PATCH 05/74] chore: enable errorlint linter on cmpserver and reposerver folders (#18629) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 3 --- cmpserver/server.go | 2 +- reposerver/cache/cache.go | 9 ++++--- reposerver/repository/repository.go | 40 ++++++++++++++--------------- 4 files changed, 26 insertions(+), 28 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 318d039275918..e17d06ec997a9 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -2,9 +2,6 @@ issues: exclude: - SA5011 exclude-rules: - - path: "(cmpserver|reposerver)/" - linters: - - errorlint - path: "(applicationset|cmd|cmpserver|controller|pkg|reposerver|server|test)/" text: "require-error:" linters: diff --git a/cmpserver/server.go b/cmpserver/server.go index 115908fb1b20e..5d7eacd2fd35f 100644 --- a/cmpserver/server.go +++ b/cmpserver/server.go @@ -111,7 +111,7 @@ func (a *ArgoCDCMPServer) CreateGRPC() (*grpc.Server, error) { pluginService := plugin.NewService(a.initConstants) err := pluginService.Init(common.GetCMPWorkDir()) if err != nil { - return nil, fmt.Errorf("error initializing plugin service: %s", err) + return nil, fmt.Errorf("error initializing plugin service: %w", err) } apiclient.RegisterConfigManagementPluginServiceServer(server, pluginService) diff --git a/reposerver/cache/cache.go b/reposerver/cache/cache.go index 35ecf86d53a87..fde5a81748ab0 100644 --- a/reposerver/cache/cache.go +++ b/reposerver/cache/cache.go @@ -3,6 +3,7 @@ package cache import ( "encoding/base64" "encoding/json" + "errors" "fmt" "hash/fnv" "math" @@ -230,7 +231,7 @@ func (c *Cache) GetGitReferences(repo string, references *[]*plumbing.Reference) valueExists := len(input) > 0 && len(input[0]) > 0 switch { // Unexpected Error - case err != nil && err != ErrCacheMiss: + case err != nil && !errors.Is(err, ErrCacheMiss): log.Errorf("Error attempting to retrieve git references from cache: %v", err) return "", err // Value is set @@ -336,7 +337,7 @@ func (c *Cache) GetManifests(revision string, appSrc *appv1.ApplicationSource, s hash, err := res.generateCacheEntryHash() if err != nil { - return fmt.Errorf("Unable to generate hash value: %s", err) + return fmt.Errorf("Unable to generate hash value: %w", err) } // If cached result does not have manifests or the expected hash of the cache entry does not match the actual hash value... @@ -347,7 +348,7 @@ func (c *Cache) GetManifests(revision string, appSrc *appv1.ApplicationSource, s err = c.DeleteManifests(revision, appSrc, srcRefs, clusterInfo, namespace, trackingMethod, appLabelKey, appName, refSourceCommitSHAs) if err != nil { - return fmt.Errorf("Unable to delete manifest after hash mismatch, %v", err) + return fmt.Errorf("Unable to delete manifest after hash mismatch, %w", err) } // Treat hash mismatches as cache misses, so that the underlying resource is reacquired @@ -371,7 +372,7 @@ func (c *Cache) SetManifests(revision string, appSrc *appv1.ApplicationSource, s res = res.shallowCopy() hash, err := res.generateCacheEntryHash() if err != nil { - return fmt.Errorf("Unable to generate hash value: %s", err) + return fmt.Errorf("Unable to generate hash value: %w", err) } res.CacheEntryHash = hash } diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go index a632f10304924..2e97812dfc118 100644 --- a/reposerver/repository/repository.go +++ b/reposerver/repository/repository.go @@ -1517,23 +1517,23 @@ func mergeSourceParameters(source *v1alpha1.ApplicationSource, path, appName str data, err := json.Marshal(merged) if err != nil { - return fmt.Errorf("%s: %v", filename, err) + return fmt.Errorf("%s: %w", filename, err) } patch, err := os.ReadFile(filename) if err != nil { - return fmt.Errorf("%s: %v", filename, err) + return fmt.Errorf("%s: %w", filename, err) } patch, err = yaml.YAMLToJSON(patch) if err != nil { - return fmt.Errorf("%s: %v", filename, err) + return fmt.Errorf("%s: %w", filename, err) } data, err = jsonpatch.MergePatch(data, patch) if err != nil { - return fmt.Errorf("%s: %v", filename, err) + return fmt.Errorf("%s: %w", filename, err) } err = json.Unmarshal(data, &merged) if err != nil { - return fmt.Errorf("%s: %v", filename, err) + return fmt.Errorf("%s: %w", filename, err) } } @@ -1551,7 +1551,7 @@ func mergeSourceParameters(source *v1alpha1.ApplicationSource, path, appName str func GetAppSourceType(ctx context.Context, source *v1alpha1.ApplicationSource, appPath, repoPath, appName string, enableGenerateManifests map[string]bool, tarExcludedGlobs []string, env []string) (v1alpha1.ApplicationSourceType, error) { err := mergeSourceParameters(source, appPath, appName) if err != nil { - return "", fmt.Errorf("error while parsing source parameters: %v", err) + return "", fmt.Errorf("error while parsing source parameters: %w", err) } appSourceType, err := source.ExplicitType() @@ -1567,7 +1567,7 @@ func GetAppSourceType(ctx context.Context, source *v1alpha1.ApplicationSource, a } appType, err := discovery.AppType(ctx, appPath, repoPath, enableGenerateManifests, tarExcludedGlobs, env) if err != nil { - return "", fmt.Errorf("error getting app source type: %v", err) + return "", fmt.Errorf("error getting app source type: %w", err) } return v1alpha1.ApplicationSourceType(appType), nil } @@ -1699,10 +1699,10 @@ func splitYAMLOrJSON(reader goio.Reader) ([]*unstructured.Unstructured, error) { for { u := &unstructured.Unstructured{} if err := d.Decode(&u); err != nil { - if err == goio.EOF { + if errors.Is(err, goio.EOF) { break } - return objs, fmt.Errorf("failed to unmarshal manifest: %v", err) + return objs, fmt.Errorf("failed to unmarshal manifest: %w", err) } if u == nil { continue @@ -1928,7 +1928,7 @@ func runConfigManagementPluginSidecars(ctx context.Context, appPath, repoPath, p // generate manifests using commands provided in plugin config file in detected cmp-server sidecar cmpManifests, err := generateManifestsCMP(ctx, appPath, repoPath, env, cmpClient, tarDoneCh, tarExcludedGlobs) if err != nil { - return nil, fmt.Errorf("error generating manifests in cmp: %s", err) + return nil, fmt.Errorf("error generating manifests in cmp: %w", err) } var manifests []*unstructured.Unstructured for _, manifestString := range cmpManifests.Manifests { @@ -1960,7 +1960,7 @@ func generateManifestsCMP(ctx context.Context, appPath, repoPath string, env []s err = cmp.SendRepoStream(generateManifestStream.Context(), appPath, repoPath, generateManifestStream, env, tarExcludedGlobs, opts...) if err != nil { - return nil, fmt.Errorf("error sending file to cmp-server: %s", err) + return nil, fmt.Errorf("error sending file to cmp-server: %w", err) } return generateManifestStream.CloseAndRecv() @@ -2186,7 +2186,7 @@ func populatePluginAppDetails(ctx context.Context, res *apiclient.RepoAppDetails err = cmp.SendRepoStream(parametersAnnouncementStream.Context(), appPath, repoPath, parametersAnnouncementStream, env, tarExcludedGlobs) if err != nil { - return fmt.Errorf("error sending file to cmp-server: %s", err) + return fmt.Errorf("error sending file to cmp-server: %w", err) } announcement, err := parametersAnnouncementStream.CloseAndRecv() @@ -2291,25 +2291,25 @@ func (s *Service) GetRevisionChartDetails(ctx context.Context, q *apiclient.Repo } helmClient, revision, err := s.newHelmClientResolveRevision(q.Repo, q.Revision, q.Name, true) if err != nil { - return nil, fmt.Errorf("helm client error: %v", err) + return nil, fmt.Errorf("helm client error: %w", err) } chartPath, closer, err := helmClient.ExtractChart(q.Name, revision, q.Repo.Project, false, s.initConstants.HelmManifestMaxExtractedSize, s.initConstants.DisableHelmManifestMaxExtractedSize) if err != nil { - return nil, fmt.Errorf("error extracting chart: %v", err) + return nil, fmt.Errorf("error extracting chart: %w", err) } defer io.Close(closer) helmCmd, err := helm.NewCmdWithVersion(chartPath, helm.HelmV3, q.Repo.EnableOCI, q.Repo.Proxy) if err != nil { - return nil, fmt.Errorf("error creating helm cmd: %v", err) + return nil, fmt.Errorf("error creating helm cmd: %w", err) } defer helmCmd.Close() helmDetails, err := helmCmd.InspectChart() if err != nil { - return nil, fmt.Errorf("error inspecting chart: %v", err) + return nil, fmt.Errorf("error inspecting chart: %w", err) } details, err = getChartDetails(helmDetails) if err != nil { - return nil, fmt.Errorf("error getting chart details: %v", err) + return nil, fmt.Errorf("error getting chart details: %w", err) } _ = s.cache.SetRevisionChartDetails(q.Repo.Repo, q.Name, q.Revision, details) return details, nil @@ -2358,18 +2358,18 @@ func (s *Service) newHelmClientResolveRevision(repo *v1alpha1.Repository, revisi } constraints, err := semver.NewConstraint(revision) if err != nil { - return nil, "", fmt.Errorf("invalid revision '%s': %v", revision, err) + return nil, "", fmt.Errorf("invalid revision '%s': %w", revision, err) } if enableOCI { tags, err := helmClient.GetTags(chart, noRevisionCache) if err != nil { - return nil, "", fmt.Errorf("unable to get tags: %v", err) + return nil, "", fmt.Errorf("unable to get tags: %w", err) } version, err := tags.MaxVersion(constraints) if err != nil { - return nil, "", fmt.Errorf("no version for constraints: %v", err) + return nil, "", fmt.Errorf("no version for constraints: %w", err) } return helmClient, version.String(), nil } From fba3c2eac38213b1f20a7894e36caac9d6b46670 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:29:35 +0300 Subject: [PATCH 06/74] chore(deps): bump library/golang from `969349b` to `0f76912` (#18628) Bumps library/golang from `969349b` to `0f76912`. --- updated-dependencies: - dependency-name: library/golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 359c2381af812..3eb8e14415550 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ ARG BASE_IMAGE=docker.io/library/ubuntu:24.04@sha256:3f85b7caad41a95462cf5b787d8 # Initial stage which pulls prepares build dependencies and CLI tooling we need for our final image # Also used as the image in CI jobs so needs all dependencies #################################################################################################### -FROM docker.io/library/golang:1.22.4@sha256:969349b8121a56d51c74f4c273ab974c15b3a8ae246a5cffc1df7d28b66cf978 AS builder +FROM docker.io/library/golang:1.22.4@sha256:0f7691253e132744318ff4b02e0824fec9fa4f3b43b08afd1195599660d51521 AS builder RUN echo 'deb http://archive.debian.org/debian buster-backports main' >> /etc/apt/sources.list @@ -101,7 +101,7 @@ RUN HOST_ARCH=$TARGETARCH NODE_ENV='production' NODE_ONLINE_ENV='online' NODE_OP #################################################################################################### # Argo CD Build stage which performs the actual build of Argo CD binaries #################################################################################################### -FROM --platform=$BUILDPLATFORM docker.io/library/golang:1.22.4@sha256:969349b8121a56d51c74f4c273ab974c15b3a8ae246a5cffc1df7d28b66cf978 AS argocd-build +FROM --platform=$BUILDPLATFORM docker.io/library/golang:1.22.4@sha256:0f7691253e132744318ff4b02e0824fec9fa4f3b43b08afd1195599660d51521 AS argocd-build WORKDIR /go/src/github.com/argoproj/argo-cd From 6232d73c4509c9d8f9e9e061033393b115e523b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:30:29 +0300 Subject: [PATCH 07/74] chore(deps): bump bitnami/kubectl in /test/container (#18626) Bumps bitnami/kubectl from `cdca6c1` to `e704ebf`. --- updated-dependencies: - dependency-name: bitnami/kubectl dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/container/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/container/Dockerfile b/test/container/Dockerfile index 8c3a98fb944c8..395af3fbdcfee 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -12,7 +12,7 @@ FROM docker.io/library/golang:1.22.4@sha256:969349b8121a56d51c74f4c273ab974c15b3 FROM docker.io/library/registry:2.8@sha256:4fac7a8257b1d7a86599043fcc181dfbdf9c8f57e337db763ac94b0e67c6cfb5 as registry -FROM docker.io/bitnami/kubectl:1.30@sha256:cdca6c19721eaaaf3bbacb33da88d340c94b358f503621a5c2063342294d8960 as kubectl +FROM docker.io/bitnami/kubectl:1.30@sha256:e704ebf9f6974d506d2dbff33dea28b6e996887e60c4ab298c78e10a3d81e249 as kubectl FROM docker.io/library/ubuntu:24.04@sha256:3f85b7caad41a95462cf5b787d8a04604c8262cdcdf9a472b8c52ef83375fe15 From 6f76e7130f84d682aba1bb9a11a3df26bc709baf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:42:32 +0300 Subject: [PATCH 08/74] chore(deps): bump chromedriver from 125.0.3 to 126.0.0 in /ui-test (#18627) Bumps [chromedriver](https://github.com/giggio/node-chromedriver) from 125.0.3 to 126.0.0. - [Commits](https://github.com/giggio/node-chromedriver/compare/125.0.3...126.0.0) --- updated-dependencies: - dependency-name: chromedriver dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui-test/package.json | 2 +- ui-test/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui-test/package.json b/ui-test/package.json index b4aa5deee901b..90b1d8b95363e 100644 --- a/ui-test/package.json +++ b/ui-test/package.json @@ -14,7 +14,7 @@ "dependencies": { "@types/selenium-webdriver": "^4.1.23", "assert": "^2.1.0", - "chromedriver": "^125.0.3", + "chromedriver": "^126.0.0", "selenium-webdriver": "^4.21.0" }, "devDependencies": { diff --git a/ui-test/yarn.lock b/ui-test/yarn.lock index dd01dfeec3e2f..53e040160e378 100644 --- a/ui-test/yarn.lock +++ b/ui-test/yarn.lock @@ -262,10 +262,10 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" -chromedriver@^125.0.3: - version "125.0.3" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-125.0.3.tgz#4c7cf13e54cd3575b88d4376a53d659cabb0ae05" - integrity sha512-Qzuk5Wian2o3EVGjtbz6V/jv+pT/AV9246HbG6kUljZXXjsKZLZxqJC+kHR3qEh/wdv4EJD0YwAOWV72v9hogw== +chromedriver@^126.0.0: + version "126.0.0" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-126.0.0.tgz#a92f116fc9a9f45b531adb708d5e00f97722cd56" + integrity sha512-rzwKp1okI9RmFtSyIzkk9+GTlTK62ai5P3/AS2qMwl86+gw84d2S/IyLkQMm5cqieFs4dgDAuqqPu0AqQACScg== dependencies: "@testim/chrome-version" "^1.1.4" axios "^1.6.7" From 7adec6efb2abdd4f4730eb984f8fe78bd4bc1268 Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Thu, 13 Jun 2024 04:20:24 -1000 Subject: [PATCH 09/74] ci: updated yarn version (#18631) With the Dependabot Node bump in #18610, the test container no longer builds due to a change in Yarn version. Signed-off-by: Blake Pettersson --- test/container/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/container/Dockerfile b/test/container/Dockerfile index 395af3fbdcfee..b2cde8b8ec3ef 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -85,7 +85,7 @@ COPY --from=registry /etc/docker/registry/config.yml /etc/docker/registry/config # Copy node binaries COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules COPY --from=node /usr/local/bin/node /usr/local/bin -COPY --from=node /opt/yarn-v1.22.19 /opt/yarn-v1.22.19 +COPY --from=node /opt/yarn-v1.22.22 /opt/yarn-v1.22.22 # Entrypoint is required for container's user management COPY ./test/container/entrypoint.sh /usr/local/bin @@ -111,8 +111,8 @@ RUN useradd -l -u ${UID} -d /home/user -s /bin/bash user && \ ln -s /usr/local/bin/node /usr/local/bin/nodejs && \ ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm && \ ln -s /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx && \ - ln -s /opt/yarn-v1.22.19/bin/yarn /usr/local/bin/yarn && \ - ln -s /opt/yarn-v1.22.19/bin/yarnpkg /usr/local/bin/yarnpkg && \ + ln -s /opt/yarn-v1.22.22/bin/yarn /usr/local/bin/yarn && \ + ln -s /opt/yarn-v1.22.22/bin/yarnpkg /usr/local/bin/yarnpkg && \ mkdir -p /var/lib/registry ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] From 9bc157805508517efb93236a96103e65f8882631 Mon Sep 17 00:00:00 2001 From: Keith Chong Date: Thu, 13 Jun 2024 12:53:24 -0400 Subject: [PATCH 10/74] feat: Support Rollback multi-source apps; Follow-up to PR 14124 (#18615) * feat: Support Rollback multi-source apps; Follow-up to PR 14124 Signed-off-by: Keith Chong * Common up code Signed-off-by: Keith Chong --------- Signed-off-by: Keith Chong --- .../application-details.tsx | 334 ++++++++++++------ .../application-operation-state.tsx | 8 +- .../application-status-panel.tsx | 55 +-- ui/src/app/applications/components/utils.tsx | 32 +- ui/src/app/shared/models.ts | 1 + 5 files changed, 288 insertions(+), 142 deletions(-) diff --git a/ui/src/app/applications/components/application-details/application-details.tsx b/ui/src/app/applications/components/application-details/application-details.tsx index 9da12bff17be5..53e9a9d77914f 100644 --- a/ui/src/app/applications/components/application-details/application-details.tsx +++ b/ui/src/app/applications/components/application-details/application-details.tsx @@ -34,7 +34,7 @@ import {AppViewExtension, StatusPanelExtension} from '../../../shared/services/e interface ApplicationDetailsState { page: number; - revision?: string; + revision?: string; // Which type of revision panelto show SYNC_STATUS_REVISION or OPERATION_STATE_REVISION groupedResources?: ResourceStatus[]; slidingPanelPage?: number; filteredGraph?: any[]; @@ -180,6 +180,210 @@ export class ApplicationDetails extends React.Component + message.split(/\s/).map(part => + urlPattern.test(part) ? ( + + {part}{' '} + + ) : ( + part + ' ' + ) + ); + + const getContentForChart = (aRevision: string, aSourceIndex: number, aVersionId: number, indx: number, aSource: models.ApplicationSource, sourceHeader?: JSX.Element) => { + const showChartNonMetadataInfo = (aRevision: string, aRepoUrl: string) => { + return ( + <> +
+
Revision:
+
{aRevision}
+
+
+
Chart Source:
+
{aRepoUrl}
+
+ + ); + }; + return ( + services.applications.revisionChartDetails(input.metadata.name, input.metadata.namespace, aRevision, aSourceIndex, aVersionId)}> + {(m: ChartDetails) => { + return m ? ( +
+ {sourceHeader && sourceHeader} +
+ {showChartNonMetadataInfo(aRevision, aSource.repoURL)} +
+
Helm Chart:
+
+ {aSource.chart}  + {m.home && ( + { + e.stopPropagation(); + window.open(m.home); + }}> + + + )} +
+
+ {m.description && ( +
+
Description:
+
{m.description}
+
+ )} + {m.maintainers && m.maintainers.length > 0 && ( +
+
Maintainers:
+
{m.maintainers.join(', ')}
+
+ )} +
+
+ ) : ( +
+
Source {indx + 1}
+
+ {showChartNonMetadataInfo(aRevision, aSource.repoURL)} +
+
Helm Chart:
+ +
+
+
+ ); + }} +
+ ); + }; + + const getContentForNonChart = ( + aRevision: string, + aSourceIndex: number, + aVersionId: number, + indx: number, + aSource: models.ApplicationSource, + sourceHeader?: JSX.Element + ) => { + const showNonMetadataInfo = (aSource: models.ApplicationSource, aRevision: string) => { + return ( + <> +
+
+
SHA:
+
+ +
+
+
+
+
+
Source:
+
{aSource.repoURL}
+
+
+ + ); + }; + return ( + services.applications.revisionMetadata(application.metadata.name, application.metadata.namespace, aRevision, aSourceIndex, aVersionId)}> + {metadata => + metadata ? ( +
+ {sourceHeader && sourceHeader} + {showNonMetadataInfo(aSource, aRevision)} +
+
+
Date:
+
+ +
+
+
+
+
+
Tags:
+
{((metadata.tags || []).length > 0 && metadata.tags.join(', ')) || 'No tags'}
+
+
+
+
+
Author:
+
{metadata.author}
+
+
+
+
+
Message:
+
+
{renderCommitMessage(metadata.message)}
+
+
+
+
+ ) : ( +
+
Source {indx + 1}
+ {showNonMetadataInfo(aSource, aRevision)} +
+ ) + } +
+ ); + }; + const cont: JSX.Element[] = []; + const sources: models.ApplicationSource[] = application.spec.sources; + if (sources?.length > 0 && revisions) { + revisions.forEach((rev, indx) => { + if (sources[indx].chart) { + cont.push(getContentForChart(rev, indx, getAppCurrentVersion(application), indx, sources[indx],
Source {indx + 1}
)); + } else { + cont.push(getContentForNonChart(rev, indx, getAppCurrentVersion(application), indx, sources[indx],
Source {indx + 1}
)); + } + }); + return <>{cont}; + } else if (application.spec.source) { + if (source.chart) { + cont.push(getContentForChart(revision, 0, 0, 0, source)); + } else { + cont.push(getContentForNonChart(revision, 0, getAppCurrentVersion(application), 0, source)); + } + return <>{cont}; + } else { + return ( +
+
+
+
No other information available
+
+
+
+ ); + } + } + public render() { return ( @@ -283,17 +487,6 @@ export class ApplicationDetails extends React.Component - message.split(/\s/).map(part => - urlPattern.test(part) ? ( - - {part}{' '} - - ) : ( - part + ' ' - ) - ); const {Tree, Pods, Network, List} = AppsDetailsViewKey; const zoomNum = (pref.zoom * 100).toFixed(0); const setZoom = (s: number) => { @@ -649,108 +842,21 @@ export class ApplicationDetails extends React.Component this.setConditionsStatusVisible(false)}> {conditions && } - this.setState({revision: null})}> - {this.state.revision && - (source.chart ? ( - - services.applications.revisionChartDetails(input.metadata.name, input.metadata.namespace, this.state.revision, 0, 0) - }> - {(m: ChartDetails) => ( -
-
-
-
Revision:
-
{this.state.revision}
-
-
-
Helm Chart:
-
- {source.chart}  - {m.home && ( - { - e.stopPropagation(); - window.open(m.home); - }}> - - - )} -
-
- {m.description && ( -
-
Description:
-
{m.description}
-
- )} - {m.maintainers && m.maintainers.length > 0 && ( -
-
Maintainers:
-
{m.maintainers.join(', ')}
-
- )} -
-
- )} -
- ) : ( - - services.applications.revisionMetadata( - application.metadata.name, - application.metadata.namespace, - this.state.revision, - 0, - getAppCurrentVersion(application) - ) - }> - {metadata => ( -
-
-
-
SHA:
-
- -
-
-
-
-
-
Date:
-
- -
-
-
-
-
-
Tags:
-
- {((metadata.tags || []).length > 0 && metadata.tags.join(', ')) || 'No tags'} -
-
-
-
-
-
Author:
-
{metadata.author}
-
-
-
-
-
Message:
-
-
{renderCommitMessage(metadata.message)}
-
-
-
-
- )} -
- ))} + this.setState({revision: null})}> + {this.state.revision === 'SYNC_STATUS_REVISION' && + (application.status.sync.revisions || application.status.sync.revision) && + this.getContent(application, source, application.status.sync.revisions, application.status.sync.revision)} + {this.state.revision === 'OPERATION_STATE_REVISION' && + (application.status.operationState.syncResult.revisions || application.status.operationState.syncResult.revision) && + this.getContent( + application, + source, + application.status.operationState.syncResult.revisions, + application.status.operationState.syncResult.revision + )} = ({appl operationAttributes.push({ title: 'REVISION', value: ( - +
+ + {utils.getAppDefaultOperationSyncRevisionExtra(application)} +
) }); } diff --git a/ui/src/app/applications/components/application-status-panel/application-status-panel.tsx b/ui/src/app/applications/components/application-status-panel/application-status-panel.tsx index 6945dade58c1e..643e24034d54a 100644 --- a/ui/src/app/applications/components/application-status-panel/application-status-panel.tsx +++ b/ui/src/app/applications/components/application-status-panel/application-status-panel.tsx @@ -6,7 +6,7 @@ import {Timestamp} from '../../../shared/components/timestamp'; import * as models from '../../../shared/models'; import {services} from '../../../shared/services'; import {ApplicationSyncWindowStatusIcon, ComparisonStatusIcon, getAppDefaultSource, getAppDefaultSyncRevisionExtra, getAppOperationState} from '../utils'; -import {getConditionCategory, HealthStatusIcon, OperationState, syncStatusMessage, getAppDefaultSyncRevision} from '../utils'; +import {getConditionCategory, HealthStatusIcon, OperationState, syncStatusMessage, getAppDefaultSyncRevision, getAppDefaultOperationSyncRevision} from '../utils'; import {RevisionMetadataPanel} from './revision-metadata-panel'; import * as utils from '../utils'; @@ -37,7 +37,11 @@ const sectionHeader = (info: SectionInfo, onClick?: () => any) => { return (
{sectionLabel(info)} - {onClick && + )}
); }; @@ -62,11 +66,13 @@ export const ApplicationStatusPanel = ({application, showDiff, showOperation, sh const statusExtensions = services.extensions.getStatusPanelExtensions(); - let revision = getAppDefaultSyncRevision(application); + const revision = getAppDefaultSyncRevision(application); + const operationStateRevision = getAppDefaultOperationSyncRevision(application); const infos = cntByCategory.get('info'); const warnings = cntByCategory.get('warning'); const errors = cntByCategory.get('error'); const source = getAppDefaultSource(application); + const hasMultipleSources = application.spec.sources?.length > 0; return (
@@ -85,7 +91,7 @@ export const ApplicationStatusPanel = ({application, showDiff, showOperation, sh title: 'SYNC STATUS', helpContent: 'Whether or not the version of your app is up to date with your repo. You may wish to sync your app if it is out-of-sync.' }, - () => showMetadataInfo((revision += getAppDefaultSyncRevisionExtra(application))) + () => showMetadataInfo(application.status.sync ? 'SYNC_STATUS_REVISION' : null) )}
@@ -102,17 +108,21 @@ export const ApplicationStatusPanel = ({application, showDiff, showOperation, sh
{application.spec.syncPolicy?.automated ? 'Auto sync is enabled.' : 'Auto sync is not enabled.'}
- {application.status && application.status.sync && application.status.sync.revision && revision && !application.spec.source.chart && ( -
- -
- )} + {application.status && + application.status.sync && + (hasMultipleSources + ? application.status.sync.revisions && application.status.sync.revisions[0] && application.spec.sources && !application.spec.sources[0].chart + : application.status.sync.revision && !application.spec.source.chart) && ( +
+ +
+ )}
{appOperationState && ( @@ -126,27 +136,32 @@ export const ApplicationStatusPanel = ({application, showDiff, showOperation, sh daysSinceLastSynchronized + ' days since last sync. Click for the status of that sync.' }, - () => showMetadataInfo((revision += getAppDefaultSyncRevisionExtra(application))) + () => + showMetadataInfo( + appOperationState.syncResult && (appOperationState.syncResult.revisions || appOperationState.syncResult.revision) + ? 'OPERATION_STATE_REVISION' + : null + ) )}
showOperation && showOperation()}> {' '} - {appOperationState.syncResult && revision && ( + {appOperationState.syncResult && (appOperationState.syncResult.revision || appOperationState.syncResult.revisions) && (
- to + to {getAppDefaultSyncRevisionExtra(application)}
)}
{appOperationState.phase}
- {(appOperationState.syncResult && revision && ( + {(appOperationState.syncResult && operationStateRevision && ( )) ||
{appOperationState.message}
} diff --git a/ui/src/app/applications/components/utils.tsx b/ui/src/app/applications/components/utils.tsx index 9a30ac8464e34..b20dedfe7a25a 100644 --- a/ui/src/app/applications/components/utils.tsx +++ b/ui/src/app/applications/components/utils.tsx @@ -717,8 +717,6 @@ export function syncStatusMessage(app: appModels.Application) { } } - message += getAppDefaultSyncRevisionExtra(app); - switch (app.status.sync.status) { case appModels.SyncStatuses.Synced: return ( @@ -726,7 +724,8 @@ export function syncStatusMessage(app: appModels.Application) { to{' '} {message} - {' '} + + {getAppDefaultSyncRevisionExtra(app)}{' '} ); case appModels.SyncStatuses.OutOfSync: @@ -735,7 +734,8 @@ export function syncStatusMessage(app: appModels.Application) { from{' '} {message} - {' '} + + {getAppDefaultSyncRevisionExtra(app)}{' '} ); default: @@ -1118,6 +1118,17 @@ export function getAppDefaultSyncRevision(app?: appModels.Application) { return app.status.sync.revisions && app.status.sync.revisions.length > 0 ? app.status.sync.revisions[0] : app.status.sync.revision; } +// getAppDefaultOperationSyncRevision gets the first app revisions from `status.operationState.syncResult.revisions` or, if that list is missing or empty, the `revision` +// field. +export function getAppDefaultOperationSyncRevision(app?: appModels.Application) { + if (!app || !app.status || !app.status.operationState || !app.status.operationState.syncResult) { + return ''; + } + return app.status.operationState.syncResult.revisions && app.status.operationState.syncResult.revisions.length > 0 + ? app.status.operationState.syncResult.revisions[0] + : app.status.operationState.syncResult.revision; +} + // getAppCurrentVersion gets the first app revisions from `status.sync.revisions` or, if that list is missing or empty, the `revision` // field. export function getAppCurrentVersion(app?: appModels.Application) { @@ -1140,6 +1151,19 @@ export function getAppDefaultSyncRevisionExtra(app?: appModels.Application) { return ''; } +// getAppDefaultOperationSyncRevisionExtra gets the first app revisions from `status.operationState.syncResult.revisions` or, if that list is missing or empty, the `revision` +// field. +export function getAppDefaultOperationSyncRevisionExtra(app?: appModels.Application) { + if (!app || !app.status || !app.status.operationState || !app.status.operationState.syncResult || !app.status.operationState.syncResult.revisions) { + return ''; + } + + if (app.status.operationState.syncResult.revisions.length > 0) { + return ` and (${app.status.operationState.syncResult.revisions.length - 1}) more`; + } + return ''; +} + export function getAppSpecDefaultSource(spec: appModels.ApplicationSpec) { return spec.sources && spec.sources.length > 0 ? spec.sources[0] : spec.source; } diff --git a/ui/src/app/shared/models.ts b/ui/src/app/shared/models.ts index bb88dcf3cc443..b8bd07b0321d8 100644 --- a/ui/src/app/shared/models.ts +++ b/ui/src/app/shared/models.ts @@ -103,6 +103,7 @@ export interface ChartDetails { export interface SyncOperationResult { resources: ResourceResult[]; revision: string; + revisions: string[]; } export type ResultCode = 'Synced' | 'SyncFailed' | 'Pruned' | 'PruneSkipped'; From 2040bd68711919bf5e903e9df71160716d9270c9 Mon Sep 17 00:00:00 2001 From: Raghavi Date: Thu, 13 Jun 2024 22:28:01 +0530 Subject: [PATCH 11/74] fix: Correction in Rocket.chat documentation (#18498) * Replaced email to SAMAccountName Signed-off-by: Raghavi Shirur Signed-off-by: Raghavi Shirur * Replaced email to SAMAccountName Signed-off-by: Raghavi Shirur Signed-off-by: Raghavi Shirur * Updated go.mod Signed-off-by: Raghavi Shirur Signed-off-by: Raghavi Shirur * Revert "Updated go.mod" This reverts commit a6466530041cb541fca020024c77047dcfed2ba5. Signed-off-by: Raghavi Shirur Signed-off-by: Raghavi Shirur * Updated go.mod Signed-off-by: Raghavi Shirur Signed-off-by: Raghavi Shirur * Fixed failing CI Signed-off-by: Raghavi Shirur Signed-off-by: Raghavi Shirur * Fixed failing CI Signed-off-by: Raghavi Shirur Signed-off-by: Raghavi Shirur * Fixed failing CI Signed-off-by: Raghavi Shirur Signed-off-by: Raghavi Shirur * Fixed failing CI Signed-off-by: Raghavi Shirur Signed-off-by: Raghavi Shirur --------- Signed-off-by: Raghavi Shirur Signed-off-by: Raghavi Shirur --- docs/operator-manual/notifications/services/github.md | 4 +++- docs/operator-manual/notifications/services/rocketchat.md | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/operator-manual/notifications/services/github.md b/docs/operator-manual/notifications/services/github.md index 36fbda5a100ba..4cd2523908ba1 100755 --- a/docs/operator-manual/notifications/services/github.md +++ b/docs/operator-manual/notifications/services/github.md @@ -7,7 +7,9 @@ The GitHub notification service changes commit status using [GitHub Apps](https: - `appID` - the app id - `installationID` - the app installation id - `privateKey` - the app private key -- `enterpriseBaseURL` - optional URL, e.g. https://git.example.com/ +- `enterpriseBaseURL` - optional URL, e.g. https://git.example.com/api/v3 + +> ⚠️ _NOTE:_ Specifying `/api/v3` in the `enterpriseBaseURL` is required until [argoproj/notifications-engine#205](https://github.com/argoproj/notifications-engine/issues/205) is resolved. ## Configuration diff --git a/docs/operator-manual/notifications/services/rocketchat.md b/docs/operator-manual/notifications/services/rocketchat.md index 20aaa405c80d0..b84861b54bd8f 100755 --- a/docs/operator-manual/notifications/services/rocketchat.md +++ b/docs/operator-manual/notifications/services/rocketchat.md @@ -4,7 +4,7 @@ The Rocket.Chat notification service configuration includes following settings: -* `email` - the Rocker.Chat user's email +* `email` - the Rocker.Chat user's SAMAccountName * `password` - the Rocker.Chat user's password * `alias` - optional alias that should be used to post message * `icon` - optional message icon @@ -25,7 +25,7 @@ The Rocket.Chat notification service configuration includes following settings: 4. Copy username and password that you was created for bot user 5. Create a public or private channel, or a team, for this example `my_channel` 6. Add your bot to this channel **otherwise it won't work** -7. Store email and password in argocd_notifications-secret Secret +7. Store email and password in argocd-notifications-secret Secret ```yaml apiVersion: v1 diff --git a/go.mod b/go.mod index 78629716df4f0..facded3d767d2 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/alicebob/miniredis/v2 v2.30.4 github.com/antonmedv/expr v1.15.2 github.com/argoproj/gitops-engine v0.7.1-0.20240514190100-8a3ce6d85caa - github.com/argoproj/notifications-engine v0.4.1-0.20240403133627-f48567108f01 + github.com/argoproj/notifications-engine v0.4.1-0.20240606074338-0802cd427621 github.com/argoproj/pkg v0.13.7-0.20230626144333-d56162821bd1 github.com/aws/aws-sdk-go v1.50.8 github.com/bmatcuk/doublestar/v4 v4.6.0 diff --git a/go.sum b/go.sum index f8cb33fd100d8..7af93eca1a17e 100644 --- a/go.sum +++ b/go.sum @@ -697,8 +697,8 @@ github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2 github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/gitops-engine v0.7.1-0.20240514190100-8a3ce6d85caa h1:RcIYoAbkaGA7yzpY1YItaTLgKYABDfkITyQ4jUl3Y6c= github.com/argoproj/gitops-engine v0.7.1-0.20240514190100-8a3ce6d85caa/go.mod h1:Vet2xN0akQpggQJZGmThA8Lozpn26RLagZFmLXw/oSI= -github.com/argoproj/notifications-engine v0.4.1-0.20240403133627-f48567108f01 h1:/V8+HM0VPPTrdjTwUrkIj5a+SjaU//tJwfIXJ1QAOvg= -github.com/argoproj/notifications-engine v0.4.1-0.20240403133627-f48567108f01/go.mod h1:N0A4sEws2soZjEpY4hgZpQS8mRIEw6otzwfkgc3g9uQ= +github.com/argoproj/notifications-engine v0.4.1-0.20240606074338-0802cd427621 h1:Yg1nt+D2uDK1SL2jSlfukA4yc7db184TTN7iWy3voRE= +github.com/argoproj/notifications-engine v0.4.1-0.20240606074338-0802cd427621/go.mod h1:N0A4sEws2soZjEpY4hgZpQS8mRIEw6otzwfkgc3g9uQ= github.com/argoproj/pkg v0.13.7-0.20230626144333-d56162821bd1 h1:qsHwwOJ21K2Ao0xPju1sNuqphyMnMYkyB3ZLoLtxWpo= github.com/argoproj/pkg v0.13.7-0.20230626144333-d56162821bd1/go.mod h1:CZHlkyAD1/+FbEn6cB2DQTj48IoLGvEYsWEvtzP3238= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= From 5efa4048436388385151c8cef059dc329f5c771c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:22:04 -0700 Subject: [PATCH 12/74] chore(deps): bump library/golang in /test/container (#18625) Bumps library/golang from `969349b` to `0f76912`. --- updated-dependencies: - dependency-name: library/golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: pasha-codefresh --- test/container/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/container/Dockerfile b/test/container/Dockerfile index b2cde8b8ec3ef..5ff49015bd112 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -8,7 +8,7 @@ RUN ln -s /usr/lib/$(uname -m)-linux-gnu /usr/lib/linux-gnu # Please make sure to also check the contained yarn version and update the references below when upgrading this image's version FROM docker.io/library/node:22.3.0@sha256:f73cc32c7285fba333cc4fbe00d5ff8babf7ebfa6a2557ab22919bcfdff05f0e as node -FROM docker.io/library/golang:1.22.4@sha256:969349b8121a56d51c74f4c273ab974c15b3a8ae246a5cffc1df7d28b66cf978 as golang +FROM docker.io/library/golang:1.22.4@sha256:0f7691253e132744318ff4b02e0824fec9fa4f3b43b08afd1195599660d51521 as golang FROM docker.io/library/registry:2.8@sha256:4fac7a8257b1d7a86599043fcc181dfbdf9c8f57e337db763ac94b0e67c6cfb5 as registry From 9592b84bcbc18948a339d012d74536061b532de3 Mon Sep 17 00:00:00 2001 From: rumstead <37445536+rumstead@users.noreply.github.com> Date: Thu, 13 Jun 2024 14:17:07 -0400 Subject: [PATCH 13/74] feat: adding gocover to e2e tests (#18130) (#18537) * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> * try putting profiles in different directories Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * does this upload the whole directory? Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * create directories and only run one test Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * shut everything down before uploading coverage Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * don't fail on goreman failure Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * sleep 30 Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * always upload server output Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * fix: implement graceful shutdown for api server Signed-off-by: Leonardo Luz Almeida * Shutdown servers in parallel Signed-off-by: Leonardo Luz Almeida * add noop shutdown function on api server constructor Signed-off-by: Leonardo Luz Almeida * fix waitgroup Signed-off-by: Leonardo Luz Almeida * more attempts to gracefully shut down Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * more tests Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * cleanup Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * revert graceful shutdown work, needs more work Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * more graceful shutdown cleanup Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * lint Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * feat: adding go coverage to e2e tests Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> --------- Signed-off-by: rumstead <37445536+rumstead@users.noreply.github.com> Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Signed-off-by: Leonardo Luz Almeida Co-authored-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Co-authored-by: Leonardo Luz Almeida --- .github/workflows/ci-build.yaml | 55 ++++++++++++++------- Makefile | 26 +++++++--- Procfile | 11 ++--- cmd/argocd-server/commands/argocd_server.go | 3 +- hack/test.sh | 2 +- 5 files changed, 65 insertions(+), 32 deletions(-) diff --git a/.github/workflows/ci-build.yaml b/.github/workflows/ci-build.yaml index c122d6e391678..bb07c1cd71e0c 100644 --- a/.github/workflows/ci-build.yaml +++ b/.github/workflows/ci-build.yaml @@ -171,16 +171,11 @@ jobs: go mod download - name: Run all unit tests run: make test-local - - name: Generate code coverage artifacts - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 - with: - name: code-coverage - path: coverage.out - name: Generate test results artifacts uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: test-results - path: test-results/ + path: test-results test-go-race: name: Run unit tests with -race for Go packages @@ -341,6 +336,7 @@ jobs: - test-go - build-ui - changes + - test-e2e env: sonar_secret: ${{ secrets.SONAR_TOKEN }} steps: @@ -357,22 +353,26 @@ jobs: - name: Remove other node_modules directory run: | rm -rf ui/node_modules/argo-ui/node_modules - - name: Create test-results directory - run: | - mkdir -p test-results - - name: Get code coverage artifact + - name: Get e2e code coverage uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 with: - name: code-coverage - - name: Get test result artifact + name: e2e-code-coverage + path: e2e-code-coverage + - name: Get unit test code coverage uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 with: name: test-results path: test-results + - name: combine-go-coverage + # We generate coverage reports for all Argo CD components, but only the applicationset-controller report + # contains coverage data. The other components currently don't shut down gracefully, so no coverage data is + # produced. Once those components are fixed, we can add references to their coverage output directories. + run: | + go tool covdata percent -i=test-results,e2e-code-coverage/applicationset-controller -o test-results/full-coverage.out - name: Upload code coverage information to codecov.io uses: codecov/codecov-action@125fc84a9a348dbcf27191600683ec096ec9021c # v4.4.1 with: - file: coverage.out + file: test-results/full-coverage.out fail_ci_if_error: true env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} @@ -389,7 +389,18 @@ jobs: strategy: fail-fast: false matrix: - k3s-version: [v1.29.1, v1.28.6, v1.27.10, v1.26.13, v1.25.16] + k3s: + - version: v1.29.1 + # We designate the latest version because we only collect code coverage for that version. + latest: true + - version: v1.28.6 + latest: false + - version: v1.27.10 + latest: false + - version: v1.26.13 + latest: false + - version: v1.25.16 + latest: false needs: - build-go - changes @@ -418,7 +429,7 @@ jobs: sudo pkill mono || true - name: Install K3S env: - INSTALL_K3S_VERSION: ${{ matrix.k3s-version }}+k3s1 + INSTALL_K3S_VERSION: ${{ matrix.k3s.version }}+k3s1 run: | set -x curl -sfL https://get.k3s.io | sh - @@ -470,7 +481,7 @@ jobs: # port 8080 which is not visible in netstat -tulpen, but still there # with a HTTP listener. We have API server listening on port 8088 # instead. - make start-e2e-local 2>&1 | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g" > /tmp/e2e-server.log & + make start-e2e-local COVERAGE_ENABLED=true 2>&1 | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g" > /tmp/e2e-server.log & count=1 until curl -f http://127.0.0.1:8088/healthz; do sleep 10; @@ -484,10 +495,18 @@ jobs: run: | set -x make test-e2e-local + goreman run stop-all || echo "goreman trouble" + sleep 30 + - name: Upload e2e coverage report + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 + with: + name: e2e-code-coverage + path: /tmp/coverage + if: ${{ matrix.k3s.latest }} - name: Upload e2e-server logs uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: - name: e2e-server-k8s${{ matrix.k3s-version }}.log + name: e2e-server-k8s${{ matrix.k3s.version }}.log path: /tmp/e2e-server.log if: ${{ failure() }} @@ -512,4 +531,4 @@ jobs: exit 0 else exit 1 - fi + fi \ No newline at end of file diff --git a/Makefile b/Makefile index fa108122d02a1..edcb8bfbcf9d0 100644 --- a/Makefile +++ b/Makefile @@ -153,6 +153,13 @@ DEV_IMAGE?=false ARGOCD_GPG_ENABLED?=true ARGOCD_E2E_APISERVER_PORT?=8080 +ifeq (${COVERAGE_ENABLED}, true) +# We use this in the cli-local target to enable code coverage for e2e tests. +COVERAGE_FLAG=-cover +else +COVERAGE_FLAG= +endif + override LDFLAGS += \ -X ${PACKAGE}.version=${VERSION} \ -X ${PACKAGE}.buildDate=${BUILD_DATE} \ @@ -240,7 +247,7 @@ cli: test-tools-image .PHONY: cli-local cli-local: clean-debug - CGO_ENABLED=${CGO_FLAG} GODEBUG="tarinsecurepath=0,zipinsecurepath=0" go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${CLI_NAME} ./cmd + CGO_ENABLED=${CGO_FLAG} GODEBUG="tarinsecurepath=0,zipinsecurepath=0" go build $(COVERAGE_FLAG) -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${CLI_NAME} ./cmd .PHONY: gen-resources-cli-local gen-resources-cli-local: clean-debug @@ -391,9 +398,9 @@ test: test-tools-image .PHONY: test-local test-local: if test "$(TEST_MODULE)" = ""; then \ - DIST_DIR=${DIST_DIR} RERUN_FAILS=0 PACKAGES=`go list ./... | grep -v 'test/e2e'` ./hack/test.sh -coverprofile=coverage.out; \ + DIST_DIR=${DIST_DIR} RERUN_FAILS=0 PACKAGES=`go list ./... | grep -v 'test/e2e'` ./hack/test.sh -args -test.gocoverdir="$(PWD)/test-results"; \ else \ - DIST_DIR=${DIST_DIR} RERUN_FAILS=0 PACKAGES="$(TEST_MODULE)" ./hack/test.sh -coverprofile=coverage.out "$(TEST_MODULE)"; \ + DIST_DIR=${DIST_DIR} RERUN_FAILS=0 PACKAGES="$(TEST_MODULE)" ./hack/test.sh -args -test.gocoverdir="$(PWD)/test-results" "$(TEST_MODULE)"; \ fi .PHONY: test-race @@ -405,9 +412,9 @@ test-race: test-tools-image .PHONY: test-race-local test-race-local: if test "$(TEST_MODULE)" = ""; then \ - DIST_DIR=${DIST_DIR} RERUN_FAILS=0 PACKAGES=`go list ./... | grep -v 'test/e2e'` ./hack/test.sh -race -coverprofile=coverage.out; \ + DIST_DIR=${DIST_DIR} RERUN_FAILS=0 PACKAGES=`go list ./... | grep -v 'test/e2e'` ./hack/test.sh -race -args -test.gocoverdir="$(PWD)/test-results"; \ else \ - DIST_DIR=${DIST_DIR} RERUN_FAILS=0 PACKAGES="$(TEST_MODULE)" ./hack/test.sh -race -coverprofile=coverage.out; \ + DIST_DIR=${DIST_DIR} RERUN_FAILS=0 PACKAGES="$(TEST_MODULE)" ./hack/test.sh -race -args -test.gocoverdir="$(PWD)/test-results"; \ fi # Run the E2E test suite. E2E test servers (see start-e2e target) must be @@ -421,7 +428,7 @@ test-e2e: test-e2e-local: cli-local # NO_PROXY ensures all tests don't go out through a proxy if one is configured on the test system export GO111MODULE=off - DIST_DIR=${DIST_DIR} RERUN_FAILS=5 PACKAGES="./test/e2e" ARGOCD_E2E_RECORD=${ARGOCD_E2E_RECORD} ARGOCD_GPG_ENABLED=true NO_PROXY=* ./hack/test.sh -timeout $(ARGOCD_E2E_TEST_TIMEOUT) -v + DIST_DIR=${DIST_DIR} RERUN_FAILS=5 PACKAGES="./test/e2e" ARGOCD_E2E_RECORD=${ARGOCD_E2E_RECORD} ARGOCD_GPG_ENABLED=true NO_PROXY=* ./hack/test.sh -timeout $(ARGOCD_E2E_TEST_TIMEOUT) -v -args -test.gocoverdir="$(PWD)/test-results" # Spawns a shell in the test server container for debugging purposes debug-test-server: test-tools-image @@ -452,6 +459,12 @@ start-e2e-local: mod-vendor-local dep-ui-local cli-local mkdir -p /tmp/argo-e2e/app/config/gpg/keys && chmod 0700 /tmp/argo-e2e/app/config/gpg/keys mkdir -p /tmp/argo-e2e/app/config/gpg/source && chmod 0700 /tmp/argo-e2e/app/config/gpg/source mkdir -p /tmp/argo-e2e/app/config/plugin && chmod 0700 /tmp/argo-e2e/app/config/plugin + # create folders to hold go coverage results for each component + mkdir -p /tmp/coverage/app-controller + mkdir -p /tmp/coverage/api-server + mkdir -p /tmp/coverage/repo-server + mkdir -p /tmp/coverage/applicationset-controller + mkdir -p /tmp/coverage/notification # set paths for locally managed ssh known hosts and tls certs data ARGOCD_SSH_DATA_PATH=/tmp/argo-e2e/app/config/ssh \ ARGOCD_TLS_DATA_PATH=/tmp/argo-e2e/app/config/tls \ @@ -469,6 +482,7 @@ start-e2e-local: mod-vendor-local dep-ui-local cli-local ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS=http://127.0.0.1:8341,http://127.0.0.1:8342,http://127.0.0.1:8343,http://127.0.0.1:8344 \ ARGOCD_E2E_TEST=true \ goreman -f $(ARGOCD_PROCFILE) start ${ARGOCD_START} + ls -lrt /tmp/coverage # Cleans VSCode debug.test files from sub-dirs to prevent them from being included in by golang embed .PHONY: clean-debug diff --git a/Procfile b/Procfile index 4862b0230062f..25f9c7206eef6 100644 --- a/Procfile +++ b/Procfile @@ -1,13 +1,12 @@ -controller: [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "HOSTNAME=testappcontroller-1 FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-application-controller $COMMAND --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081} --otlp-address=${ARGOCD_OTLP_ADDRESS} --application-namespaces=${ARGOCD_APPLICATION_NAMESPACES:-''} --server-side-diff-enabled=${ARGOCD_APPLICATION_CONTROLLER_SERVER_SIDE_DIFF:-'false'}" -api-server: [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-server $COMMAND --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --disable-auth=${ARGOCD_E2E_DISABLE_AUTH:-'true'} --insecure --dex-server http://localhost:${ARGOCD_E2E_DEX_PORT:-5556} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081} --port ${ARGOCD_E2E_APISERVER_PORT:-8080} --otlp-address=${ARGOCD_OTLP_ADDRESS} --application-namespaces=${ARGOCD_APPLICATION_NAMESPACES:-''}" +controller: [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "GOCOVERDIR=${ARGOCD_COVERAGE_DIR:-/tmp/coverage/app-controller} HOSTNAME=testappcontroller-1 FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-application-controller $COMMAND --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081} --otlp-address=${ARGOCD_OTLP_ADDRESS} --application-namespaces=${ARGOCD_APPLICATION_NAMESPACES:-''} --server-side-diff-enabled=${ARGOCD_APPLICATION_CONTROLLER_SERVER_SIDE_DIFF:-'false'}" +api-server: [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "GOCOVERDIR=${ARGOCD_COVERAGE_DIR:-/tmp/coverage/api-server} FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-server $COMMAND --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --disable-auth=${ARGOCD_E2E_DISABLE_AUTH:-'true'} --insecure --dex-server http://localhost:${ARGOCD_E2E_DEX_PORT:-5556} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081} --port ${ARGOCD_E2E_APISERVER_PORT:-8080} --otlp-address=${ARGOCD_OTLP_ADDRESS} --application-namespaces=${ARGOCD_APPLICATION_NAMESPACES:-''}" dex: sh -c "ARGOCD_BINARY_NAME=argocd-dex go run github.com/argoproj/argo-cd/v2/cmd gendexcfg -o `pwd`/dist/dex.yaml && (test -f dist/dex.yaml || { echo 'Failed to generate dex configuration'; exit 1; }) && docker run --rm -p ${ARGOCD_E2E_DEX_PORT:-5556}:${ARGOCD_E2E_DEX_PORT:-5556} -v `pwd`/dist/dex.yaml:/dex.yaml ghcr.io/dexidp/dex:$(grep "image: ghcr.io/dexidp/dex" manifests/base/dex/argocd-dex-server-deployment.yaml | cut -d':' -f3) dex serve /dex.yaml" redis: bash -c "if [ \"$ARGOCD_REDIS_LOCAL\" = 'true' ]; then redis-server --save '' --appendonly no --port ${ARGOCD_E2E_REDIS_PORT:-6379}; else docker run --rm --name argocd-redis -i -p ${ARGOCD_E2E_REDIS_PORT:-6379}:${ARGOCD_E2E_REDIS_PORT:-6379} docker.io/library/redis:$(grep "image: redis" manifests/base/redis/argocd-redis-deployment.yaml | cut -d':' -f3) --save '' --appendonly no --port ${ARGOCD_E2E_REDIS_PORT:-6379}; fi" -repo-server: [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_GNUPGHOME=${ARGOCD_GNUPGHOME:-/tmp/argocd-local/gpg/keys} ARGOCD_PLUGINSOCKFILEPATH=${ARGOCD_PLUGINSOCKFILEPATH:-./test/cmp} ARGOCD_GPG_DATA_PATH=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source} ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-repo-server ARGOCD_GPG_ENABLED=${ARGOCD_GPG_ENABLED:-false} $COMMAND --loglevel debug --port ${ARGOCD_E2E_REPOSERVER_PORT:-8081} --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --otlp-address=${ARGOCD_OTLP_ADDRESS}" +repo-server: [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "GOCOVERDIR=${ARGOCD_COVERAGE_DIR:-/tmp/coverage/repo-server} FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_GNUPGHOME=${ARGOCD_GNUPGHOME:-/tmp/argocd-local/gpg/keys} ARGOCD_PLUGINSOCKFILEPATH=${ARGOCD_PLUGINSOCKFILEPATH:-./test/cmp} ARGOCD_GPG_DATA_PATH=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source} ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-repo-server ARGOCD_GPG_ENABLED=${ARGOCD_GPG_ENABLED:-false} $COMMAND --loglevel debug --port ${ARGOCD_E2E_REPOSERVER_PORT:-8081} --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --otlp-address=${ARGOCD_OTLP_ADDRESS}" cmp-server: [ "$ARGOCD_E2E_TEST" = 'true' ] && exit 0 || [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_BINARY_NAME=argocd-cmp-server ARGOCD_PLUGINSOCKFILEPATH=${ARGOCD_PLUGINSOCKFILEPATH:-./test/cmp} $COMMAND --config-dir-path ./test/cmp --loglevel debug --otlp-address=${ARGOCD_OTLP_ADDRESS}" ui: sh -c 'cd ui && ${ARGOCD_E2E_YARN_CMD:-yarn} start' git-server: test/fixture/testrepos/start-git.sh helm-registry: test/fixture/testrepos/start-helm-registry.sh dev-mounter: [[ "$ARGOCD_E2E_TEST" != "true" ]] && go run hack/dev-mounter/main.go --configmap argocd-ssh-known-hosts-cm=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} --configmap argocd-tls-certs-cm=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} --configmap argocd-gpg-keys-cm=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source} -applicationset-controller: [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "FORCE_LOG_COLORS=4 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-applicationset-controller $COMMAND --loglevel debug --metrics-addr localhost:12345 --probe-addr localhost:12346 --argocd-repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081}" -notification: [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "FORCE_LOG_COLORS=4 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_BINARY_NAME=argocd-notifications $COMMAND --loglevel debug --application-namespaces=${ARGOCD_APPLICATION_NAMESPACES:-''} --self-service-notification-enabled=${ARGOCD_NOTIFICATION_CONTROLLER_SELF_SERVICE_NOTIFICATION_ENABLED:-'false'}" - +applicationset-controller: [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "GOCOVERDIR=${ARGOCD_COVERAGE_DIR:-/tmp/coverage/applicationset-controller} FORCE_LOG_COLORS=4 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-applicationset-controller $COMMAND --loglevel debug --metrics-addr localhost:12345 --probe-addr localhost:12346 --argocd-repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081}" +notification: [ "$BIN_MODE" = 'true' ] && COMMAND=./dist/argocd || COMMAND='go run ./cmd/main.go' && sh -c "GOCOVERDIR=${ARGOCD_COVERAGE_DIR:-/tmp/coverage/notification} FORCE_LOG_COLORS=4 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_BINARY_NAME=argocd-notifications $COMMAND --loglevel debug --application-namespaces=${ARGOCD_APPLICATION_NAMESPACES:-''} --self-service-notification-enabled=${ARGOCD_NOTIFICATION_CONTROLLER_SELF_SERVICE_NOTIFICATION_ENABLED:-'false'}" \ No newline at end of file diff --git a/cmd/argocd-server/commands/argocd_server.go b/cmd/argocd-server/commands/argocd_server.go index 30f6d711f8390..707cc2d80eaf5 100644 --- a/cmd/argocd-server/commands/argocd_server.go +++ b/cmd/argocd-server/commands/argocd_server.go @@ -7,8 +7,9 @@ import ( "strings" "time" - "github.com/argoproj/pkg/stats" "github.com/redis/go-redis/v9" + + "github.com/argoproj/pkg/stats" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "k8s.io/client-go/kubernetes" diff --git a/hack/test.sh b/hack/test.sh index 5eda0512692c4..c13718063b862 100755 --- a/hack/test.sh +++ b/hack/test.sh @@ -15,4 +15,4 @@ fi mkdir -p $TEST_RESULTS -GODEBUG="tarinsecurepath=0,zipinsecurepath=0" ${DIST_DIR}/gotestsum --rerun-fails-report=rerunreport.txt --junitfile=$TEST_RESULTS/junit.xml --format=testname --rerun-fails="$RERUN_FAILS" --packages="$PACKAGES" -- $TEST_FLAGS $* +GODEBUG="tarinsecurepath=0,zipinsecurepath=0" ${DIST_DIR}/gotestsum --rerun-fails-report=rerunreport.txt --junitfile=$TEST_RESULTS/junit.xml --format=testname --rerun-fails="$RERUN_FAILS" --packages="$PACKAGES" -- -cover $TEST_FLAGS $* From 9f1e2e84530e94a110a66c3cd95793584c8f313e Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Thu, 13 Jun 2024 21:10:00 +0200 Subject: [PATCH 14/74] chore: enable gocritic linter (#18633) * chore: enable gocritic linter Signed-off-by: Matthieu MOREL * Update settings.go Signed-off-by: Matthieu MOREL * Update app.go Signed-off-by: Matthieu MOREL * Update grpcproxy.go Signed-off-by: Matthieu MOREL * Update grpcproxy.go Signed-off-by: Matthieu MOREL * Update util.go Signed-off-by: Matthieu MOREL * Update server.go Signed-off-by: Matthieu MOREL * Update app_management_ns_test.go Signed-off-by: Matthieu MOREL * Update app_management_test.go Signed-off-by: Matthieu MOREL * Update path_traversal.go Signed-off-by: Matthieu MOREL * Update sessionmanager.go Signed-off-by: Matthieu MOREL * Update .golangci.yaml Signed-off-by: Matthieu MOREL --------- Signed-off-by: Matthieu MOREL --- .golangci.yaml | 13 +++++++ applicationset/generators/git.go | 4 +- applicationset/generators/plugin_test.go | 2 +- applicationset/utils/clusterUtils.go | 6 +-- applicationset/utils/utils.go | 4 +- .../commands/admin/project_allowlist.go | 2 +- cmd/argocd/commands/app.go | 6 +-- cmd/util/app.go | 6 +-- controller/appcontroller.go | 12 +++--- controller/metrics/metrics.go | 6 +-- .../controller/controller.go | 4 +- pkg/apis/application/v1alpha1/generated.proto | 4 +- .../application/v1alpha1/openapi_generated.go | 4 +- pkg/apis/application/v1alpha1/types.go | 10 ++--- server/application/application.go | 8 ++-- server/badge/badge.go | 6 +-- server/project/project_test.go | 2 +- test/e2e/app_management_ns_test.go | 6 +-- test/e2e/app_management_test.go | 6 +-- util/argo/argo.go | 8 ++-- util/cache/cache.go | 2 +- util/cert/cert.go | 4 +- util/db/certificate.go | 8 ++-- util/dex/dex.go | 4 +- util/grpc/sanitizer.go | 2 +- util/lua/lua.go | 10 ++--- util/lua/oslib_safe.go | 38 +++++++++---------- .../expression/shared/appdetail.go | 10 ++--- util/session/sessionmanager.go | 8 ++-- util/session/sessionmanager_test.go | 2 +- util/settings/settings_test.go | 2 +- 31 files changed, 98 insertions(+), 111 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index e17d06ec997a9..528cd85e5078e 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,5 +1,6 @@ issues: exclude: + - SA1019 - SA5011 exclude-rules: - path: "(applicationset|cmd|cmpserver|controller|pkg|reposerver|server|test)/" @@ -16,6 +17,7 @@ linters: enable: - errcheck - errorlint + - gocritic - gofumpt - goimports - gosimple @@ -27,6 +29,17 @@ linters: - unused - whitespace linters-settings: + gocritic: + disabled-checks: + - appendAssign + - assignOp # Keep it disabled for readability + - badCond + - commentFormatting + - exitAfterDefer + - ifElseChain + - mapKey + - singleCaseSwitch + - typeSwitchVar goimports: local-prefixes: github.com/argoproj/argo-cd/v2 testifylint: diff --git a/applicationset/generators/git.go b/applicationset/generators/git.go index 821ad66118762..a5fb2576f8f6a 100644 --- a/applicationset/generators/git.go +++ b/applicationset/generators/git.go @@ -226,13 +226,13 @@ func (g *GitGenerator) generateParamsFromGitFile(filePath string, fileContent [] return res, nil } -func (g *GitGenerator) filterApps(Directories []argoprojiov1alpha1.GitDirectoryGeneratorItem, allPaths []string) []string { +func (g *GitGenerator) filterApps(directories []argoprojiov1alpha1.GitDirectoryGeneratorItem, allPaths []string) []string { res := []string{} for _, appPath := range allPaths { appInclude := false appExclude := false // Iterating over each appPath and check whether directories object has requestedPath that matches the appPath - for _, requestedPath := range Directories { + for _, requestedPath := range directories { match, err := path.Match(requestedPath.Path, appPath) if err != nil { log.WithError(err).WithField("requestedPath", requestedPath). diff --git a/applicationset/generators/plugin_test.go b/applicationset/generators/plugin_test.go index e5f8be7ec8658..0b3deb9e0ab04 100644 --- a/applicationset/generators/plugin_test.go +++ b/applicationset/generators/plugin_test.go @@ -645,7 +645,7 @@ func TestPluginGenerateParams(t *testing.T) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { authHeader := r.Header.Get("Authorization") _, tokenKey := plugin.ParseSecretKey(testCase.configmap.Data["token"]) - expectedToken := testCase.secret.Data[strings.Replace(tokenKey, "$", "", -1)] + expectedToken := testCase.secret.Data[strings.ReplaceAll(tokenKey, "$", "")] if authHeader != "Bearer "+string(expectedToken) { w.WriteHeader(http.StatusUnauthorized) return diff --git a/applicationset/utils/clusterUtils.go b/applicationset/utils/clusterUtils.go index f1d30674a7ebc..a56be51fdb7a2 100644 --- a/applicationset/utils/clusterUtils.go +++ b/applicationset/utils/clusterUtils.go @@ -61,10 +61,8 @@ func ValidateDestination(ctx context.Context, dest *appv1.ApplicationDestination return fmt.Errorf("application references destination cluster %s which does not exist", dest.Name) } dest.SetInferredServer(server) - } else { - if !dest.IsServerInferred() { - return fmt.Errorf("application destination can't have both name and server defined: %s %s", dest.Name, dest.Server) - } + } else if !dest.IsServerInferred() { + return fmt.Errorf("application destination can't have both name and server defined: %s %s", dest.Name, dest.Server) } } return nil diff --git a/applicationset/utils/utils.go b/applicationset/utils/utils.go index 749e810d3b6e5..dfcc11cbdd35a 100644 --- a/applicationset/utils/utils.go +++ b/applicationset/utils/utils.go @@ -268,8 +268,8 @@ func (r *Render) RenderTemplateParams(tmpl *argoappsv1.Application, syncPolicy * // b) there IS a syncPolicy, but preserveResourcesOnDeletion is set to false // See TestRenderTemplateParamsFinalizers in util_test.go for test-based definition of behaviour if (syncPolicy == nil || !syncPolicy.PreserveResourcesOnDeletion) && - ((*replacedTmpl).ObjectMeta.Finalizers == nil || len((*replacedTmpl).ObjectMeta.Finalizers) == 0) { - (*replacedTmpl).ObjectMeta.Finalizers = []string{"resources-finalizer.argocd.argoproj.io"} + (replacedTmpl.ObjectMeta.Finalizers == nil || len(replacedTmpl.ObjectMeta.Finalizers) == 0) { + replacedTmpl.ObjectMeta.Finalizers = []string{"resources-finalizer.argocd.argoproj.io"} } return replacedTmpl, nil diff --git a/cmd/argocd/commands/admin/project_allowlist.go b/cmd/argocd/commands/admin/project_allowlist.go index bbc72284daa20..9f436f2f3a81c 100644 --- a/cmd/argocd/commands/admin/project_allowlist.go +++ b/cmd/argocd/commands/admin/project_allowlist.go @@ -120,7 +120,7 @@ func generateProjectAllowList(serverResources []*metav1.APIResourceList, cluster resourceList := make([]metav1.GroupKind, 0) for _, rule := range clusterRole.Rules { - if len(rule.APIGroups) <= 0 { + if len(rule.APIGroups) == 0 { continue } diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index 6aee6bee8d0ae..b4d03c618692f 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -2544,10 +2544,8 @@ func setParameterOverrides(app *argoappv1.Application, parameters []string, sour sourceType = *st } else if app.Status.SourceType != "" { sourceType = app.Status.SourceType - } else { - if len(strings.SplitN(parameters[0], "=", 2)) == 2 { - sourceType = argoappv1.ApplicationSourceTypeHelm - } + } else if len(strings.SplitN(parameters[0], "=", 2)) == 2 { + sourceType = argoappv1.ApplicationSourceTypeHelm } switch sourceType { diff --git a/cmd/util/app.go b/cmd/util/app.go index f1d0254aa5a54..1ac606a22ba5c 100644 --- a/cmd/util/app.go +++ b/cmd/util/app.go @@ -434,10 +434,8 @@ func SetParameterOverrides(app *argoappv1.Application, parameters []string, inde sourceType = *st } else if app.Status.SourceType != "" { sourceType = app.Status.SourceType - } else { - if len(strings.SplitN(parameters[0], "=", 2)) == 2 { - sourceType = argoappv1.ApplicationSourceTypeHelm - } + } else if len(strings.SplitN(parameters[0], "=", 2)) == 2 { + sourceType = argoappv1.ApplicationSourceTypeHelm } switch sourceType { diff --git a/controller/appcontroller.go b/controller/appcontroller.go index 9d500a7af0b59..a15628d8b640f 100644 --- a/controller/appcontroller.go +++ b/controller/appcontroller.go @@ -305,13 +305,11 @@ func (ctrl *ApplicationController) InvalidateProjectsCache(names ...string) { for _, name := range names { ctrl.projByNameCache.Delete(name) } - } else { - if ctrl != nil { - ctrl.projByNameCache.Range(func(key, _ interface{}) bool { - ctrl.projByNameCache.Delete(key) - return true - }) - } + } else if ctrl != nil { + ctrl.projByNameCache.Range(func(key, _ interface{}) bool { + ctrl.projByNameCache.Delete(key) + return true + }) } } diff --git a/controller/metrics/metrics.go b/controller/metrics/metrics.go index 85169bf217d62..3e7e70ae05da5 100644 --- a/controller/metrics/metrics.go +++ b/controller/metrics/metrics.go @@ -62,21 +62,21 @@ var ( append(descAppDefaultLabels, "autosync_enabled", "repo", "dest_server", "dest_namespace", "sync_status", "health_status", "operation"), nil, ) - // DEPRECATED + // Deprecated descAppCreated = prometheus.NewDesc( "argocd_app_created_time", "Creation time in unix timestamp for an application.", descAppDefaultLabels, nil, ) - // DEPRECATED: superseded by sync_status label in argocd_app_info + // Deprecated: superseded by sync_status label in argocd_app_info descAppSyncStatusCode = prometheus.NewDesc( "argocd_app_sync_status", "The application current sync status.", append(descAppDefaultLabels, "sync_status"), nil, ) - // DEPRECATED: superseded by health_status label in argocd_app_info + // Deprecated: superseded by health_status label in argocd_app_info descAppHealthStatus = prometheus.NewDesc( "argocd_app_health_status", "The application current health status.", diff --git a/notification_controller/controller/controller.go b/notification_controller/controller/controller.go index 39efef32b0749..1bc3e73a6fbd7 100644 --- a/notification_controller/controller/controller.go +++ b/notification_controller/controller/controller.go @@ -166,9 +166,7 @@ func newInformer(resClient dynamic.ResourceInterface, controllerNamespace string &unstructured.Unstructured{}, resyncPeriod, cache.Indexers{ - cache.NamespaceIndex: func(obj interface{}) ([]string, error) { - return cache.MetaNamespaceIndexFunc(obj) - }, + cache.NamespaceIndex: cache.MetaNamespaceIndexFunc, }, ) return informer diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index f1d958b6db1d4..bc162dca1fc3f 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -729,11 +729,11 @@ message Cluster { // Config holds cluster information for connecting to a cluster optional ClusterConfig config = 3; - // DEPRECATED: use Info.ConnectionState field instead. + // Deprecated: use Info.ConnectionState field instead. // ConnectionState contains information about cluster connection state optional ConnectionState connectionState = 4; - // DEPRECATED: use Info.ServerVersion field instead. + // Deprecated: use Info.ServerVersion field instead. // The server version optional string serverVersion = 5; diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index 28755d785d364..2fcbbb94edb0b 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -2645,14 +2645,14 @@ func schema_pkg_apis_application_v1alpha1_Cluster(ref common.ReferenceCallback) }, "connectionState": { SchemaProps: spec.SchemaProps{ - Description: "DEPRECATED: use Info.ConnectionState field instead. ConnectionState contains information about cluster connection state", + Description: "Deprecated: use Info.ConnectionState field instead. ConnectionState contains information about cluster connection state", Default: map[string]interface{}{}, Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ConnectionState"), }, }, "serverVersion": { SchemaProps: spec.SchemaProps{ - Description: "DEPRECATED: use Info.ServerVersion field instead. The server version", + Description: "Deprecated: use Info.ServerVersion field instead. The server version", Type: []string{"string"}, Format: "", }, diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index f998a9956beea..f31ae025e452a 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -1770,10 +1770,10 @@ type Cluster struct { Name string `json:"name" protobuf:"bytes,2,opt,name=name"` // Config holds cluster information for connecting to a cluster Config ClusterConfig `json:"config" protobuf:"bytes,3,opt,name=config"` - // DEPRECATED: use Info.ConnectionState field instead. + // Deprecated: use Info.ConnectionState field instead. // ConnectionState contains information about cluster connection state ConnectionState ConnectionState `json:"connectionState,omitempty" protobuf:"bytes,4,opt,name=connectionState"` - // DEPRECATED: use Info.ServerVersion field instead. + // Deprecated: use Info.ServerVersion field instead. // The server version ServerVersion string `json:"serverVersion,omitempty" protobuf:"bytes,5,opt,name=serverVersion"` // Holds list of namespaces which are accessible in that cluster. Cluster level resources will be ignored if namespace list is not empty. @@ -2472,10 +2472,8 @@ func (w *SyncWindows) hasDeny() (bool, bool) { if a.Kind == "deny" { if !denyFound { manualEnabled = a.ManualSync - } else { - if manualEnabled { - manualEnabled = a.ManualSync - } + } else if manualEnabled { + manualEnabled = a.ManualSync } denyFound = true } diff --git a/server/application/application.go b/server/application/application.go index ec517a30c89fa..7fd22c37458d6 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -1091,11 +1091,9 @@ func (s *Server) Delete(ctx context.Context, q *application.ApplicationDeleteReq a.SetCascadedDeletion(policyFinalizer) patchFinalizer = true } - } else { - if a.CascadedDeletion() { - a.UnSetCascadedDeletion() - patchFinalizer = true - } + } else if a.CascadedDeletion() { + a.UnSetCascadedDeletion() + patchFinalizer = true } if patchFinalizer { diff --git a/server/badge/badge.go b/server/badge/badge.go index 1fcd29f305114..bc599e61ca0b2 100644 --- a/server/badge/badge.go +++ b/server/badge/badge.go @@ -132,10 +132,8 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if app.Status.OperationState != nil && app.Status.OperationState.SyncResult != nil { revision = app.Status.OperationState.SyncResult.Revision } - } else { - if errors.IsNotFound(err) { - notFound = true - } + } else if errors.IsNotFound(err) { + notFound = true } } else { w.WriteHeader(http.StatusBadRequest) diff --git a/server/project/project_test.go b/server/project/project_test.go index 11626925e3b28..00354ae6ffebe 100644 --- a/server/project/project_test.go +++ b/server/project/project_test.go @@ -646,7 +646,7 @@ p, role:admin, projects, update, *, allow`) projWithRole := existingProj.DeepCopy() role := v1alpha1.ProjectRole{Name: roleName, JWTTokens: []v1alpha1.JWTToken{{IssuedAt: 1}}} - noSpacesPolicyTemplate := strings.Replace(policyTemplate, " ", "", -1) + noSpacesPolicyTemplate := strings.ReplaceAll(policyTemplate, " ", "") invalidPolicy := fmt.Sprintf(noSpacesPolicyTemplate, projWithRole.Name, roleName, action, projWithRole.Name, object, effect) role.Policies = append(role.Policies, invalidPolicy) projWithRole.Spec.Roles = append(projWithRole.Spec.Roles, role) diff --git a/test/e2e/app_management_ns_test.go b/test/e2e/app_management_ns_test.go index fb991a5df7957..f84b43b3db7f4 100644 --- a/test/e2e/app_management_ns_test.go +++ b/test/e2e/app_management_ns_test.go @@ -1092,10 +1092,8 @@ func assertNSResourceActions(t *testing.T, appName string, successful bool) { assertError := func(err error, message string) { if successful { assert.NoError(t, err) - } else { - if assert.Error(t, err) { - assert.Contains(t, err.Error(), message) - } + } else if assert.Error(t, err) { + assert.Contains(t, err.Error(), message) } } diff --git a/test/e2e/app_management_test.go b/test/e2e/app_management_test.go index 428f0ee0765f6..5c28cf28992cf 100644 --- a/test/e2e/app_management_test.go +++ b/test/e2e/app_management_test.go @@ -1450,10 +1450,8 @@ func assertResourceActions(t *testing.T, appName string, successful bool) { assertError := func(err error, message string) { if successful { assert.NoError(t, err) - } else { - if assert.Error(t, err) { - assert.Contains(t, err.Error(), message) - } + } else if assert.Error(t, err) { + assert.Contains(t, err.Error(), message) } } diff --git a/util/argo/argo.go b/util/argo/argo.go index f5f7cefe585f3..8024e07bcddab 100644 --- a/util/argo/argo.go +++ b/util/argo/argo.go @@ -501,10 +501,8 @@ func ValidateDestination(ctx context.Context, dest *argoappv1.ApplicationDestina return fmt.Errorf("application references destination cluster %s which does not exist", dest.Name) } dest.SetInferredServer(server) - } else { - if !dest.IsServerInferred() { - return fmt.Errorf("application destination can't have both name and server defined: %s %s", dest.Name, dest.Server) - } + } else if !dest.IsServerInferred() { + return fmt.Errorf("application destination can't have both name and server defined: %s %s", dest.Name, dest.Server) } } return nil @@ -1005,7 +1003,7 @@ func GenerateSpecIsDifferentErrorMessage(entity string, a, b interface{}) string if len(difference) == 0 { return basicMsg } - return fmt.Sprintf("%s; difference in keys \"%s\"", basicMsg, strings.Join(difference[:], ",")) + return fmt.Sprintf("%s; difference in keys \"%s\"", basicMsg, strings.Join(difference, ",")) } func GetDifferentPathsBetweenStructs(a, b interface{}) ([]string, error) { diff --git a/util/cache/cache.go b/util/cache/cache.go index 616cfa870d023..fb1d20c5b723b 100644 --- a/util/cache/cache.go +++ b/util/cache/cache.go @@ -96,7 +96,7 @@ func (o *Options) callOnClientCreated(client *redis.Client) { } func (o *Options) getEnvPrefix() string { - return strings.Replace(strings.ToUpper(o.FlagPrefix), "-", "_", -1) + return strings.ReplaceAll(strings.ToUpper(o.FlagPrefix), "-", "_") } func mergeOptions(opts ...Options) Options { diff --git a/util/cert/cert.go b/util/cert/cert.go index 3826c72b7d6e7..4fe39299666a9 100644 --- a/util/cert/cert.go +++ b/util/cert/cert.go @@ -271,8 +271,8 @@ func TokenizedDataToPublicKey(hostname string, subType string, rawKeyData string // Returns the requested pattern with all possible square brackets escaped func nonBracketedPattern(pattern string) string { - ret := strings.Replace(pattern, "[", `\[`, -1) - return strings.Replace(ret, "]", `\]`, -1) + ret := strings.ReplaceAll(pattern, "[", `\[`) + return strings.ReplaceAll(ret, "]", `\]`) } // We do not use full fledged regular expression for matching the hostname. diff --git a/util/db/certificate.go b/util/db/certificate.go index 9674a1489a71e..3bedbc5e6f4ea 100644 --- a/util/db/certificate.go +++ b/util/db/certificate.go @@ -289,13 +289,11 @@ func (db *db) CreateRepoCertificate(ctx context.Context, certificates *appsv1.Re Data: string(certificate.CertData), } tlsCertificates = append(tlsCertificates, tlsCertificate) - } else { + } else if tlsCertificate.Data != string(certificate.CertData) { // We have made sure the upsert flag was set above. Now just figure out // again if we have to actually update the data in the existing cert. - if tlsCertificate.Data != string(certificate.CertData) { - tlsCertificate.Data = string(certificate.CertData) - upserted = true - } + tlsCertificate.Data = string(certificate.CertData) + upserted = true } if newEntry || upserted { diff --git a/util/dex/dex.go b/util/dex/dex.go index 9dec26a0ec060..34b3c552f32be 100644 --- a/util/dex/dex.go +++ b/util/dex/dex.go @@ -102,11 +102,11 @@ func NewDexHTTPReverseProxy(serverAddr string, baseHRef string, tlsConfig *DexTL } // NewDexRewriteURLRoundTripper creates a new DexRewriteURLRoundTripper -func NewDexRewriteURLRoundTripper(dexServerAddr string, T http.RoundTripper) DexRewriteURLRoundTripper { +func NewDexRewriteURLRoundTripper(dexServerAddr string, t http.RoundTripper) DexRewriteURLRoundTripper { dexURL, _ := url.Parse(dexServerAddr) return DexRewriteURLRoundTripper{ DexURL: dexURL, - T: T, + T: t, } } diff --git a/util/grpc/sanitizer.go b/util/grpc/sanitizer.go index 8d471a5521c19..36739e7def1cb 100644 --- a/util/grpc/sanitizer.go +++ b/util/grpc/sanitizer.go @@ -64,7 +64,7 @@ func NewSanitizer() *sanitizer { // AddReplacement adds a replacement to the Sanitizer func (s *sanitizer) AddReplacement(val string, replacement string) { s.replacers = append(s.replacers, func(in string) string { - return strings.Replace(in, val, replacement, -1) + return strings.ReplaceAll(in, val, replacement) }) } diff --git a/util/lua/lua.go b/util/lua/lua.go index 704f817bc64d7..956235751df09 100644 --- a/util/lua/lua.go +++ b/util/lua/lua.go @@ -423,7 +423,7 @@ func isValidHealthStatusCode(statusCode health.HealthStatusCode) bool { // Took logic from the link below and added the int, int32, and int64 types since the value would have type int64 // while actually running in the controller and it was not reproducible through testing. // https://github.com/layeh/gopher-json/blob/97fed8db84274c421dbfffbb28ec859901556b97/json.go#L154 -func decodeValue(L *lua.LState, value interface{}) lua.LValue { +func decodeValue(l *lua.LState, value interface{}) lua.LValue { switch converted := value.(type) { case bool: return lua.LBool(converted) @@ -440,15 +440,15 @@ func decodeValue(L *lua.LState, value interface{}) lua.LValue { case int64: return lua.LNumber(converted) case []interface{}: - arr := L.CreateTable(len(converted), 0) + arr := l.CreateTable(len(converted), 0) for _, item := range converted { - arr.Append(decodeValue(L, item)) + arr.Append(decodeValue(l, item)) } return arr case map[string]interface{}: - tbl := L.CreateTable(0, len(converted)) + tbl := l.CreateTable(0, len(converted)) for key, item := range converted { - tbl.RawSetH(lua.LString(key), decodeValue(L, item)) + tbl.RawSetH(lua.LString(key), decodeValue(l, item)) } return tbl case nil: diff --git a/util/lua/oslib_safe.go b/util/lua/oslib_safe.go index d933c7f23000a..1b84a18b61905 100644 --- a/util/lua/oslib_safe.go +++ b/util/lua/oslib_safe.go @@ -13,15 +13,15 @@ import ( lua "github.com/yuin/gopher-lua" ) -func OpenSafeOs(L *lua.LState) int { - tabmod := L.RegisterModule(lua.TabLibName, osFuncs) - L.Push(tabmod) +func OpenSafeOs(l *lua.LState) int { + tabmod := l.RegisterModule(lua.TabLibName, osFuncs) + l.Push(tabmod) return 1 } -func SafeOsLoader(L *lua.LState) int { - mod := L.SetFuncs(L.NewTable(), osFuncs) - L.Push(mod) +func SafeOsLoader(l *lua.LState) int { + mod := l.SetFuncs(l.NewTable(), osFuncs) + l.Push(mod) return 1 } @@ -30,11 +30,11 @@ var osFuncs = map[string]lua.LGFunction{ "date": osDate, } -func osTime(L *lua.LState) int { - if L.GetTop() == 0 { - L.Push(lua.LNumber(time.Now().Unix())) +func osTime(l *lua.LState) int { + if l.GetTop() == 0 { + l.Push(lua.LNumber(time.Now().Unix())) } else { - tbl := L.CheckTable(1) + tbl := l.CheckTable(1) sec := getIntField(tbl, "sec", 0) min := getIntField(tbl, "min", 0) hour := getIntField(tbl, "hour", 12) @@ -47,7 +47,7 @@ func osTime(L *lua.LState) int { if false { print(isdst) } - L.Push(lua.LNumber(t.Unix())) + l.Push(lua.LNumber(t.Unix())) } return 1 } @@ -68,20 +68,20 @@ func getBoolField(tb *lua.LTable, key string, v bool) bool { return v } -func osDate(L *lua.LState) int { +func osDate(l *lua.LState) int { t := time.Now() cfmt := "%c" - if L.GetTop() >= 1 { - cfmt = L.CheckString(1) + if l.GetTop() >= 1 { + cfmt = l.CheckString(1) if strings.HasPrefix(cfmt, "!") { t = time.Now().UTC() cfmt = strings.TrimLeft(cfmt, "!") } - if L.GetTop() >= 2 { - t = time.Unix(L.CheckInt64(2), 0) + if l.GetTop() >= 2 { + t = time.Unix(l.CheckInt64(2), 0) } if strings.HasPrefix(cfmt, "*t") { - ret := L.NewTable() + ret := l.NewTable() ret.RawSetString("year", lua.LNumber(t.Year())) ret.RawSetString("month", lua.LNumber(t.Month())) ret.RawSetString("day", lua.LNumber(t.Day())) @@ -92,11 +92,11 @@ func osDate(L *lua.LState) int { // TODO yday & dst ret.RawSetString("yday", lua.LNumber(0)) ret.RawSetString("isdst", lua.LFalse) - L.Push(ret) + l.Push(ret) return 1 } } - L.Push(lua.LString(strftime(t, cfmt))) + l.Push(lua.LString(strftime(t, cfmt))) return 1 } diff --git a/util/notification/expression/shared/appdetail.go b/util/notification/expression/shared/appdetail.go index bdde222a4268b..e3156ff4a0e44 100644 --- a/util/notification/expression/shared/appdetail.go +++ b/util/notification/expression/shared/appdetail.go @@ -35,26 +35,26 @@ type CustomHelmAppSpec struct { HelmParameterOverrides []v1alpha1.HelmParameter } -func (has CustomHelmAppSpec) GetParameterValueByName(Name string) string { +func (has CustomHelmAppSpec) GetParameterValueByName(name string) string { // Check in overrides first for i := range has.HelmParameterOverrides { - if has.HelmParameterOverrides[i].Name == Name { + if has.HelmParameterOverrides[i].Name == name { return has.HelmParameterOverrides[i].Value } } for i := range has.HelmAppSpec.Parameters { - if has.HelmAppSpec.Parameters[i].Name == Name { + if has.HelmAppSpec.Parameters[i].Name == name { return has.HelmAppSpec.Parameters[i].Value } } return "" } -func (has CustomHelmAppSpec) GetFileParameterPathByName(Name string) string { +func (has CustomHelmAppSpec) GetFileParameterPathByName(name string) string { var path string for i := range has.HelmAppSpec.FileParameters { - if has.HelmAppSpec.FileParameters[i].Name == Name { + if has.HelmAppSpec.FileParameters[i].Name == name { path = has.HelmAppSpec.FileParameters[i].Path break } diff --git a/util/session/sessionmanager.go b/util/session/sessionmanager.go index 16e88665934d0..09ba6aa43cd38 100644 --- a/util/session/sessionmanager.go +++ b/util/session/sessionmanager.go @@ -366,11 +366,9 @@ func (mgr *SessionManager) updateFailureCount(username string, failed bool) { attempt.LastFailed = time.Now() failures[username] = attempt log.Warnf("User %s failed login %d time(s)", username, attempt.FailCount) - } else { - if attempt.FailCount > 0 { - // Forget username for cache size enforcement, since entry in cache was deleted - delete(failures, username) - } + } else if attempt.FailCount > 0 { + // Forget username for cache size enforcement, since entry in cache was deleted + delete(failures, username) } err := mgr.storage.SetLoginAttempts(failures) diff --git a/util/session/sessionmanager_test.go b/util/session/sessionmanager_test.go index 4f0367a82f365..b5e51a977a2c7 100644 --- a/util/session/sessionmanager_test.go +++ b/util/session/sessionmanager_test.go @@ -653,7 +653,7 @@ clientSecret: yyy requestedScopes: ["oidc"] rootCA: | %s -`, oidcTestServer.URL, strings.Replace(string(cert), "\n", "\n ", -1)), +`, oidcTestServer.URL, strings.ReplaceAll(string(cert), "\n", "\n ")), } settingsMgr := settings.NewSettingsManager(context.Background(), getKubeClientWithConfig(dexConfig, nil), "argocd") diff --git a/util/settings/settings_test.go b/util/settings/settings_test.go index 169e4148b9dec..aa78730ace513 100644 --- a/util/settings/settings_test.go +++ b/util/settings/settings_test.go @@ -1450,7 +1450,7 @@ clientSecret: yyy requestedScopes: ["oidc"] rootCA: | %s -`, strings.Replace(string(test.Cert), "\n", "\n ", -1))}, +`, strings.ReplaceAll(string(test.Cert), "\n", "\n "))}, }, { name: "OIDC configured, invalid root CA", From ae61752c298612947d3889aa77cb0f5869955559 Mon Sep 17 00:00:00 2001 From: Keith Chong Date: Fri, 14 Jun 2024 08:46:22 -0400 Subject: [PATCH 15/74] feat: Provide Edit support in Sources tab for multi-source app (#17588) (#17890) Signed-off-by: Keith Chong --- .../application-parameters-source.tsx | 112 ++++ .../application-parameters.scss | 80 +++ .../application-parameters.tsx | 607 ++++++++++++------ .../application-summary.tsx | 33 +- .../resource-details/resource-details.tsx | 61 +- .../revision-form-field.tsx | 3 +- .../editable-panel/editable-panel.scss | 15 + .../editable-panel/editable-section.tsx | 164 +++++ 8 files changed, 822 insertions(+), 253 deletions(-) create mode 100644 ui/src/app/applications/components/application-parameters/application-parameters-source.tsx create mode 100644 ui/src/app/applications/components/application-parameters/application-parameters.scss create mode 100644 ui/src/app/shared/components/editable-panel/editable-section.tsx diff --git a/ui/src/app/applications/components/application-parameters/application-parameters-source.tsx b/ui/src/app/applications/components/application-parameters/application-parameters-source.tsx new file mode 100644 index 0000000000000..4acbcdd82fcf6 --- /dev/null +++ b/ui/src/app/applications/components/application-parameters/application-parameters-source.tsx @@ -0,0 +1,112 @@ +import * as classNames from 'classnames'; +import * as React from 'react'; +import {FormApi} from 'react-form'; +import {EditablePanelItem} from '../../../shared/components'; +import {EditableSection} from '../../../shared/components/editable-panel/editable-section'; +import {Consumer} from '../../../shared/context'; +import '../../../shared/components/editable-panel/editable-panel.scss'; + +export interface ApplicationParametersPanelProps { + floatingTitle?: string | React.ReactNode; + titleTop?: string | React.ReactNode; + titleBottom?: string | React.ReactNode; + index: number; + valuesTop?: T; + valuesBottom?: T; + validateTop?: (values: T) => any; + validateBottom?: (values: T) => any; + saveTop?: (input: T, query: {validate?: boolean}) => Promise; + saveBottom?: (input: T, query: {validate?: boolean}) => Promise; + itemsTop?: EditablePanelItem[]; + itemsBottom?: EditablePanelItem[]; + onModeSwitch?: () => any; + viewTop?: string | React.ReactNode; + viewBottom?: string | React.ReactNode; + editTop?: (formApi: FormApi) => React.ReactNode; + editBottom?: (formApi: FormApi) => React.ReactNode; + noReadonlyMode?: boolean; + collapsible?: boolean; +} + +interface ApplicationParametersPanelState { + editTop: boolean; + editBottom: boolean; + savingTop: boolean; + savingBottom: boolean; +} + +// Currently two editable sections, but can be modified to support N panels in general. This should be part of a white-box, editable-panel. +export class ApplicationParametersSource extends React.Component, ApplicationParametersPanelState> { + constructor(props: ApplicationParametersPanelProps) { + super(props); + this.state = {editTop: !!props.noReadonlyMode, editBottom: !!props.noReadonlyMode, savingTop: false, savingBottom: false}; + } + + public render() { + return ( + + {ctx => ( +
+ {this.props.floatingTitle &&
{this.props.floatingTitle}
} + + this.onModeSwitch()} + noReadonlyMode={this.props.noReadonlyMode} + edit={this.props.editTop} + collapsible={this.props.collapsible} + ctx={ctx} + isTopSection={true} + disabledState={this.state.editTop || this.state.editTop === null} + updateButtons={editClicked => { + this.setState({editBottom: editClicked}); + }} + /> + + {this.props.itemsTop && ( + +
+

 

+
+
+ + )} + + this.onModeSwitch()} + noReadonlyMode={this.props.noReadonlyMode} + edit={this.props.editBottom} + collapsible={this.props.collapsible} + ctx={ctx} + isTopSection={false} + disabledState={this.state.editBottom || this.state.editBottom === null} + updateButtons={editClicked => { + this.setState({editTop: editClicked}); + }} + /> + +
+ )} + + ); + } + + private onModeSwitch() { + if (this.props.onModeSwitch) { + this.props.onModeSwitch(); + } + } +} diff --git a/ui/src/app/applications/components/application-parameters/application-parameters.scss b/ui/src/app/applications/components/application-parameters/application-parameters.scss new file mode 100644 index 0000000000000..e49945dc85324 --- /dev/null +++ b/ui/src/app/applications/components/application-parameters/application-parameters.scss @@ -0,0 +1,80 @@ +@import 'node_modules/argo-ui/src/styles/config'; +@import 'node_modules/argo-ui/src/styles/theme'; + +.application-parameters { + &__labels { + line-height: 28px; + display: flex; + align-items: center; + height: 100%; + flex-wrap: wrap; + padding-top: 0.5em; + } + + &__label { + background-color: $argo-color-gray-5; + color: white; + border-radius: 5px; + padding: 4px; + line-height: 14px; + margin: 0.3em 0; + margin-right: 2px; + } + + &__sort-icon { + cursor: pointer; + position: absolute; + font-size: 1.3em; + left: -1em; + + &.fa-sort-up { + top: 10px; + } + + &.fa-sort-down { + bottom: 10px; + } + } + &__remove-icon { + cursor: pointer; + position: absolute; + top: 1em; + right: 1em; + } + + .argo-field { + line-height: 1.15; + } + + .white-box__details p { + font-weight: 500; + @include themify($themes) { + color: themed('text-1'); + } + } + + .white-box__details-row .row { + padding-left: 1em; + padding-right: 1em; + } + + .white-box__details-row .row .columns:last-child { + padding-left: 1em; + } + + .select { + padding-bottom: 0; + } + + .row.application-retry-options { + .columns.application-retry-options__item{ + padding-left: 0; + padding-right: 10px; + } + + .argo-form-row__error-msg { + position: static; + line-height: 1; + } + } +} diff --git a/ui/src/app/applications/components/application-parameters/application-parameters.tsx b/ui/src/app/applications/components/application-parameters/application-parameters.tsx index 6ab9134343167..3961b61d26656 100644 --- a/ui/src/app/applications/components/application-parameters/application-parameters.tsx +++ b/ui/src/app/applications/components/application-parameters/application-parameters.tsx @@ -6,8 +6,6 @@ import { ArrayInputField, ArrayValueField, CheckboxField, - EditablePanel, - EditablePanelItem, Expandable, MapValueField, NameValueEditor, @@ -18,7 +16,9 @@ import { Paginate, RevisionHelpIcon, Revision, - Repo + Repo, + EditablePanel, + EditablePanelItem } from '../../../shared/components'; import * as models from '../../../shared/models'; import {ApplicationSourceDirectory, Plugin} from '../../../shared/models'; @@ -27,9 +27,13 @@ import {ImageTagFieldEditor} from './kustomize'; import * as kustomize from './kustomize-image'; import {VarsInputField} from './vars-input-field'; import {concatMaps} from '../../../shared/utils'; -import {getAppDefaultSource, helpTip} from '../utils'; +import {getAppDefaultSource} from '../utils'; import * as jsYaml from 'js-yaml'; import {RevisionFormField} from '../revision-form-field/revision-form-field'; +import classNames from 'classnames'; +import {ApplicationParametersSource} from './application-parameters-source'; + +import './application-parameters.scss'; const TextWithMetadataField = ReactFormField((props: {metadata: {value: string}; fieldApi: FieldApi; className: string}) => { const { @@ -138,99 +142,267 @@ function getParamsEditableItems( export const ApplicationParameters = (props: { application: models.Application; details?: models.RepoAppDetails; - detailsList?: models.RepoAppDetails[]; save?: (application: models.Application, query: {validate?: boolean}) => Promise; noReadonlyMode?: boolean; pageNumber?: number; setPageNumber?: (x: number) => any; + collapsedSources?: boolean[]; + handleCollapse?: (i: number, isCollapsed: boolean) => void; }) => { const app = cloneDeep(props.application); const source = getAppDefaultSource(app); // For source field const appSources = app?.spec.sources; const [removedOverrides, setRemovedOverrides] = React.useState(new Array()); - - let attributes: EditablePanelItem[] = []; - const multipleAttributes = new Array(); - + const collapsible = props.collapsedSources !== undefined && props.handleCollapse !== undefined; const [appParamsDeletedState, setAppParamsDeletedState] = React.useState([]); - if (appSources && props.detailsList && props.detailsList.length > 1) { - for (let i: number = 0; i < props.detailsList.length; i++) { - multipleAttributes.push( - gatherDetails(props.detailsList[i], attributes, appSources[i], app, setRemovedOverrides, removedOverrides, appParamsDeletedState, setAppParamsDeletedState) + if (app.spec.sources?.length > 0 && !props.details) { + return ( +
+ { + props.setPageNumber(page); + }}> + {data => { + const listOfPanels: JSX.Element[] = []; + data.forEach(appSource => { + const i = app.spec.sources.indexOf(appSource); + listOfPanels.push(getEditablePanelForSources(i, appSource)); + }); + return listOfPanels; + }} + +
+ ); + } else { + // For the other old/existings references of ApplicationParameters that have details already loaded. They are single source + let attributes: EditablePanelItem[] = []; + if (props.details) { + return getEditablePanel( + gatherDetails(0, props.details, attributes, source, app, setRemovedOverrides, removedOverrides, appParamsDeletedState, setAppParamsDeletedState, false), + props.details + ); + } else { + // For single source field, for resource details where we have to do the load. + return ( + getSingleSource(application)}> + {(details: models.RepoAppDetails) => { + attributes = []; + const attr = gatherDetails( + 0, + details, + attributes, + source, + app, + setRemovedOverrides, + removedOverrides, + appParamsDeletedState, + setAppParamsDeletedState, + false + ); + return getEditablePanel(attr, details); + }} + ); - attributes = []; } - } else { - // For source field. Delete this when source field is removed - attributes = gatherDetails(props.details, attributes, source, app, setRemovedOverrides, removedOverrides, appParamsDeletedState, setAppParamsDeletedState); } - if (props.detailsList && props.detailsList.length > 1) { - return ( - { - props.setPageNumber(page); + // Collapse button is separate + function getEditablePanelForSources(index: number, appSource: models.ApplicationSource): JSX.Element { + return (collapsible && props.collapsedSources[index] === undefined) || props.collapsedSources[index] ? ( +
{ + const currentState = props.collapsedSources[index] !== undefined ? props.collapsedSources[index] : true; + props.handleCollapse(index, !currentState); }}> - {data => { - const listOfPanels: any[] = []; - data.forEach(attr => { - const repoAppDetails = props.detailsList[multipleAttributes.indexOf(attr)]; - listOfPanels.push(getEditablePanel(attr, repoAppDetails, multipleAttributes.indexOf(attr), app.spec.sources)); - }); - return listOfPanels; - }} - +
+ +
+
+
Source {index + 1 + ': ' + appSource.repoURL}
+
+ {(appSource.path ? 'PATH=' + appSource.path : '') + (appSource.targetRevision ? (appSource.path ? ', ' : '') + 'REVISION=' + appSource.targetRevision : '')} +
+
+
+ ) : ( +
+
+ {collapsible && ( + +
+ { + props.handleCollapse(index, !props.collapsedSources[index]); + }} + /> +
+
+ )} + getSourceFromSources(application, index)}> + {(details: models.RepoAppDetails) => getEditablePanelForOneSource(details, index, source)} + +
+
+ ); + } + + function getEditablePanel(items: EditablePanelItem[], repoAppDetails: models.RepoAppDetails): any { + return ( +
+ { + const updatedSrc = input.spec.source; + + function isDefined(item: any) { + return item !== null && item !== undefined; + } + function isDefinedWithVersion(item: any) { + return item !== null && item !== undefined && item.match(/:/); + } + if (updatedSrc.helm && updatedSrc.helm.parameters) { + updatedSrc.helm.parameters = updatedSrc.helm.parameters.filter(isDefined); + } + if (updatedSrc.kustomize && updatedSrc.kustomize.images) { + updatedSrc.kustomize.images = updatedSrc.kustomize.images.filter(isDefinedWithVersion); + } + + let params = input.spec?.source?.plugin?.parameters; + if (params) { + for (const param of params) { + if (param.map && param.array) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + param.map = param.array.reduce((acc, {name, value}) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + acc[name] = value; + return acc; + }, {}); + delete param.array; + } + } + params = params.filter(param => !appParamsDeletedState.includes(param.name)); + input.spec.source.plugin.parameters = params; + } + if (input.spec.source.helm && input.spec.source.helm.valuesObject) { + input.spec.source.helm.valuesObject = jsYaml.load(input.spec.source.helm.values); // Deserialize json + input.spec.source.helm.values = ''; + } + await props.save(input, {}); + setRemovedOverrides(new Array()); + }) + } + values={((repoAppDetails.plugin || app?.spec?.source?.plugin) && cloneDeep(app)) || app} + validate={updatedApp => { + const errors = {} as any; + + for (const fieldPath of ['spec.source.directory.jsonnet.tlas', 'spec.source.directory.jsonnet.extVars']) { + const invalid = ((getNestedField(updatedApp, fieldPath) || []) as Array).filter(item => !item.name && !item.code); + errors[fieldPath] = invalid.length > 0 ? 'All fields must have name' : null; + } + + if (updatedApp.spec.source.helm && updatedApp.spec.source.helm.values) { + const parsedValues = jsYaml.load(updatedApp.spec.source.helm.values); + errors['spec.source.helm.values'] = typeof parsedValues === 'object' ? null : 'Values must be a map'; + } + + return errors; + }} + onModeSwitch={ + repoAppDetails.plugin && + (() => { + setAppParamsDeletedState([]); + }) + } + title={repoAppDetails.type.toLocaleUpperCase()} + items={items as EditablePanelItem[]} + noReadonlyMode={props.noReadonlyMode} + hasMultipleSources={false} + /> +
); - } else { - const v: models.ApplicationSource[] = new Array(); - v.push(app.spec.source); - return getEditablePanel(attributes, props.details, 0, v, true); } - function getEditablePanel(panel: EditablePanelItem[], repoAppDetails: models.RepoAppDetails, ind: number, sources: models.ApplicationSource[], isSingleSource?: boolean): any { - const src: models.ApplicationSource = sources[ind]; - let descriptionCollapsed: string; + function getEditablePanelForOneSource(repoAppDetails: models.RepoAppDetails, ind: number, src: models.ApplicationSource): any { let floatingTitle: string; - if (sources.length > 1) { - if (repoAppDetails.type === 'Directory') { - floatingTitle = 'TYPE=' + repoAppDetails.type + ', URL=' + src.repoURL; - descriptionCollapsed = - 'TYPE=' + repoAppDetails.type + (src.path ? ', PATH=' + src.path : '' + (src.targetRevision ? ', TARGET REVISION=' + src.targetRevision : '')); - } else if (repoAppDetails.type === 'Helm') { - floatingTitle = 'TYPE=' + repoAppDetails.type + ', URL=' + src.repoURL + (src.chart ? ', CHART=' + src.chart + ':' + src.targetRevision : ''); - descriptionCollapsed = - 'TYPE=' + - repoAppDetails.type + - (src.chart ? ', CHART=' + src.chart + ':' + src.targetRevision : '') + - (src.path ? ', PATH=' + src.path : '') + - (src.helm && src.helm.valueFiles ? ', VALUES=' + src.helm.valueFiles[0] : ''); - } else if (repoAppDetails.type === 'Kustomize') { - floatingTitle = 'TYPE=' + repoAppDetails.type + ', URL=' + src.repoURL; - descriptionCollapsed = 'TYPE=' + repoAppDetails.type + ', VERSION=' + src.kustomize.version + (src.path ? ', PATH=' + src.path : ''); - } else if (repoAppDetails.type === 'Plugin') { - floatingTitle = - 'TYPE=' + - repoAppDetails.type + - ', URL=' + - src.repoURL + - (src.path ? ', PATH=' + src.path : '') + - (src.targetRevision ? ', TARGET REVISION=' + src.targetRevision : ''); - descriptionCollapsed = - 'TYPE=' + repoAppDetails.type + '' + (src.path ? ', PATH=' + src.path : '') + (src.targetRevision ? ', TARGET REVISION=' + src.targetRevision : ''); - } + const lowerPanelAttributes: EditablePanelItem[] = []; + const upperPanelAttributes: EditablePanelItem[] = []; + + const upperPanel = gatherCoreSourceDetails(ind, upperPanelAttributes, appSources[ind], app); + const lowerPanel = gatherDetails( + ind, + repoAppDetails, + lowerPanelAttributes, + appSources[ind], + app, + setRemovedOverrides, + removedOverrides, + appParamsDeletedState, + setAppParamsDeletedState, + true + ); + + if (repoAppDetails.type === 'Directory') { + floatingTitle = + 'Source ' + + (ind + 1) + + ': TYPE=' + + repoAppDetails.type + + ', URL=' + + src.repoURL + + (repoAppDetails.path ? ', PATH=' + repoAppDetails.path : '') + + (src.targetRevision ? ', TARGET REVISION=' + src.targetRevision : ''); + } else if (repoAppDetails.type === 'Helm') { + floatingTitle = + 'Source ' + + (ind + 1) + + ': TYPE=' + + repoAppDetails.type + + ', URL=' + + src.repoURL + + (src.chart ? ', CHART=' + src.chart + ':' + src.targetRevision : '') + + (src.path ? ', PATH=' + src.path : '') + + (src.targetRevision ? ', REVISION=' + src.targetRevision : ''); + } else if (repoAppDetails.type === 'Kustomize') { + floatingTitle = + 'Source ' + + (ind + 1) + + ': TYPE=' + + repoAppDetails.type + + ', URL=' + + src.repoURL + + (repoAppDetails.path ? ', PATH=' + repoAppDetails.path : '') + + (src.targetRevision ? ', TARGET REVISION=' + src.targetRevision : ''); + } else if (repoAppDetails.type === 'Plugin') { + floatingTitle = + 'Source ' + + (ind + 1) + + ': TYPE=' + + repoAppDetails.type + + ', URL=' + + src.repoURL + + (repoAppDetails.path ? ', PATH=' + repoAppDetails.path : '') + + (src.targetRevision ? ', TARGET REVISION=' + src.targetRevision : ''); } return ( - { - const updatedSrc = isSingleSource ? input.spec.source : input.spec.sources[ind]; + const updatedSrc = input.spec.sources[ind]; function isDefined(item: any) { return item !== null && item !== undefined; @@ -246,7 +418,7 @@ export const ApplicationParameters = (props: { updatedSrc.kustomize.images = updatedSrc.kustomize.images.filter(isDefinedWithVersion); } - let params = input.spec?.source?.plugin?.parameters; + let params = input.spec?.sources[ind]?.plugin?.parameters; if (params) { for (const param of params) { if (param.map && param.array) { @@ -263,32 +435,40 @@ export const ApplicationParameters = (props: { } params = params.filter(param => !appParamsDeletedState.includes(param.name)); - input.spec.source.plugin.parameters = params; + updatedSrc.plugin.parameters = params; } - if (input.spec.source.helm && input.spec.source.helm.valuesObject) { - input.spec.source.helm.valuesObject = jsYaml.load(input.spec.source.helm.values); // Deserialize json - input.spec.source.helm.values = ''; + if (updatedSrc.helm && updatedSrc.helm.valuesObject) { + updatedSrc.helm.valuesObject = jsYaml.load(updatedSrc.helm.values); // Deserialize json + updatedSrc.helm.values = ''; } + await props.save(input, {}); setRemovedOverrides(new Array()); }) } - values={ - app?.spec?.source - ? ((props.details.plugin || app?.spec?.source?.plugin) && cloneDeep(app)) || app - : ((repoAppDetails.plugin || app?.spec?.sources[ind]?.plugin) && cloneDeep(app)) || app - } - validate={updatedApp => { + valuesTop={(app?.spec?.sources && (repoAppDetails.plugin || app?.spec?.sources[ind]?.plugin) && cloneDeep(app)) || app} + valuesBottom={(app?.spec?.sources && (repoAppDetails.plugin || app?.spec?.sources[ind]?.plugin) && cloneDeep(app)) || app} + validateTop={updatedApp => { + const errors = [] as any; + const repoURL = updatedApp.spec.sources[ind].repoURL; + if (repoURL === null || repoURL.length === 0) { + errors['spec.sources[' + ind + '].repoURL'] = 'The source repo URL cannot be empty'; + } else { + errors['spec.sources[' + ind + '].repoURL'] = null; + } + return errors; + }} + validateBottom={updatedApp => { const errors = {} as any; - for (const fieldPath of ['spec.source.directory.jsonnet.tlas', 'spec.source.directory.jsonnet.extVars']) { + for (const fieldPath of ['spec.sources[' + ind + '].directory.jsonnet.tlas', 'spec.sources[' + ind + '].directory.jsonnet.extVars']) { const invalid = ((getNestedField(updatedApp, fieldPath) || []) as Array).filter(item => !item.name && !item.code); errors[fieldPath] = invalid.length > 0 ? 'All fields must have name' : null; } - if (updatedApp.spec.source.helm && updatedApp.spec.source.helm.values) { - const parsedValues = jsYaml.load(updatedApp.spec.source.helm.values); - errors['spec.source.helm.values'] = typeof parsedValues === 'object' ? null : 'Values must be a map'; + if (updatedApp.spec.sources[ind].helm?.values) { + const parsedValues = jsYaml.load(updatedApp.spec.sources[ind].helm.values); + errors['spec.sources[' + ind + '].helm.values'] = typeof parsedValues === 'object' ? null : 'Values must be a map'; } return errors; @@ -299,43 +479,33 @@ export const ApplicationParameters = (props: { setAppParamsDeletedState([]); }) } - title={repoAppDetails.type.toLocaleUpperCase()} - titleCollapsed={src.repoURL} - floatingTitle={floatingTitle} - items={panel as EditablePanelItem[]} + titleBottom={repoAppDetails.type.toLocaleUpperCase()} + titleTop={'SOURCE ' + (ind + 1)} + floatingTitle={floatingTitle ? floatingTitle : null} + itemsBottom={lowerPanel as EditablePanelItem[]} + itemsTop={upperPanel as EditablePanelItem[]} noReadonlyMode={props.noReadonlyMode} - collapsible={sources.length > 1} - collapsed={true} - collapsedDescription={descriptionCollapsed} - hasMultipleSources={app.spec.sources && app.spec.sources.length > 0} + collapsible={collapsible} /> ); } }; -function gatherDetails( - repoDetails: models.RepoAppDetails, - attributes: EditablePanelItem[], - source: models.ApplicationSource, - app: models.Application, - setRemovedOverrides: any, - removedOverrides: any, - appParamsDeletedState: any[], - setAppParamsDeletedState: any -): EditablePanelItem[] { +function gatherCoreSourceDetails(i: number, attributes: EditablePanelItem[], source: models.ApplicationSource, app: models.Application): EditablePanelItem[] { const hasMultipleSources = app.spec.sources && app.spec.sources.length > 0; // eslint-disable-next-line no-prototype-builtins const isHelm = source.hasOwnProperty('chart'); + const repoUrlField = 'spec.sources[' + i + '].repoURL'; + const sourcesPathField = 'spec.sources[' + i + '].path'; + const refField = 'spec.sources[' + i + '].ref'; + const chartField = 'spec.sources[' + i + '].chart'; + const revisionField = 'spec.sources[' + i + '].targetRevision'; + // For single source apps using the source field, these fields are shown in the Summary tab. if (hasMultipleSources) { attributes.push({ title: 'REPO URL', view: , - edit: (formApi: FormApi) => - hasMultipleSources ? ( - helpTip('REPO URL is not editable for applications with multiple sources. You can edit them in the "Manifest" tab.') - ) : ( - - ) + edit: (formApi: FormApi) => }); if (isHelm) { attributes.push({ @@ -345,59 +515,51 @@ function gatherDetails( {source.chart}:{source.targetRevision} ), - edit: (formApi: FormApi) => - hasMultipleSources ? ( - helpTip('CHART is not editable for applications with multiple sources. You can edit them in the "Manifest" tab.') - ) : ( - services.repos.charts(src.repoURL).catch(() => new Array())}> - {(charts: models.HelmChart[]) => ( -
-
- chart.name), - filterSuggestions: true - }} - /> -
- { - const chartInfo = data.charts.find(chart => chart.name === data.chart); - return (chartInfo && chartInfo.versions) || new Array(); - }}> - {(versions: string[]) => ( -
- - -
- )} -
+ edit: (formApi: FormApi) => ( + services.repos.charts(src.repoURL).catch(() => new Array())}> + {(charts: models.HelmChart[]) => ( +
+
+ chart.name), + filterSuggestions: true + }} + />
- )} - - ) + { + const chartInfo = data.charts.find(chart => chart.name === data.chart); + return (chartInfo && chartInfo.versions) || new Array(); + }}> + {(versions: string[]) => ( +
+ + +
+ )} +
+
+ )} +
+ ) }); } else { attributes.push({ title: 'TARGET REVISION', view: , - edit: (formApi: FormApi) => - hasMultipleSources ? ( - helpTip('TARGET REVISION is not editable for applications with multiple sources. You can edit them in the "Manifest" tab.') - ) : ( - - ) + edit: (formApi: FormApi) => }); attributes.push({ title: 'PATH', @@ -406,20 +568,30 @@ function gatherDetails( {processPath(source.path)} ), - edit: (formApi: FormApi) => - hasMultipleSources ? ( - helpTip('PATH is not editable for applications with multiple sources. You can edit them in the "Manifest" tab.') - ) : ( - - ) + edit: (formApi: FormApi) => }); attributes.push({ title: 'REF', - view: source.ref, - edit: (formApi: FormApi) => + view: {source.ref}, + edit: (formApi: FormApi) => }); } } + return attributes; +} + +function gatherDetails( + ind: number, + repoDetails: models.RepoAppDetails, + attributes: EditablePanelItem[], + source: models.ApplicationSource, + app: models.Application, + setRemovedOverrides: any, + removedOverrides: any, + appParamsDeletedState: any[], + setAppParamsDeletedState: any, + isMultiSource: boolean +): EditablePanelItem[] { if (repoDetails.type === 'Kustomize' && repoDetails.kustomize) { attributes.push({ title: 'VERSION', @@ -428,7 +600,12 @@ function gatherDetails( services.authService.settings()}> {settings => ((settings.kustomizeVersions || []).length > 0 && ( - + )) || default } @@ -438,19 +615,25 @@ function gatherDetails( attributes.push({ title: 'NAME PREFIX', view: source.kustomize && source.kustomize.namePrefix, - edit: (formApi: FormApi) => + edit: (formApi: FormApi) => ( + + ) }); attributes.push({ title: 'NAME SUFFIX', view: source.kustomize && source.kustomize.nameSuffix, - edit: (formApi: FormApi) => + edit: (formApi: FormApi) => ( + + ) }); attributes.push({ title: 'NAMESPACE', - view: app.spec.source.kustomize && app.spec.source.kustomize.namespace, - edit: (formApi: FormApi) => + view: source.kustomize && source.kustomize.namespace, + edit: (formApi: FormApi) => ( + + ) }); const srcImages = ((repoDetails && repoDetails.kustomize && repoDetails.kustomize.images) || []).map(val => kustomize.parse(val)); @@ -467,7 +650,7 @@ function gatherDetails( getParamsEditableItems( app, 'IMAGES', - 'spec.source.kustomize.images', + isMultiSource ? 'spec.sources[' + ind + '].kustomize.images' : 'spec.source.kustomize.images', removedOverrides, setRemovedOverrides, distinct(imagesByName.keys(), overridesByName.keys()).map(name => { @@ -493,7 +676,7 @@ function gatherDetails( edit: (formApi: FormApi) => (
-                            
+                            
                         
); @@ -532,7 +715,7 @@ function gatherDetails( getParamsEditableItems( app, 'PARAMETERS', - 'spec.source.helm.parameters', + isMultiSource ? 'spec.sources[' + ind + '].helm.parameters' : 'spec.source.helm.parameters', removedOverrides, setRemovedOverrides, distinct(paramsByName.keys(), overridesByName.keys()).map(name => { @@ -555,7 +738,7 @@ function gatherDetails( getParamsEditableItems( app, 'PARAMETERS', - 'spec.source.helm.parameters', + isMultiSource ? 'spec.sources[' + ind + '].helm.parameters' : 'spec.source.helm.parameters', removedOverrides, setRemovedOverrides, distinct(fileParamsByName.keys(), fileOverridesByName.keys()).map(name => { @@ -577,7 +760,12 @@ function gatherDetails( edit: (formApi: FormApi) => ( services.authService.plugins()}> {(plugins: Plugin[]) => ( - p.name)}} /> + p.name)}} + /> )} ) @@ -593,7 +781,9 @@ function gatherDetails( ))}
), - edit: (formApi: FormApi) => + edit: (formApi: FormApi) => ( + + ) }); const parametersSet = new Set(); if (repoDetails?.plugin?.parametersAnnouncement) { @@ -645,7 +835,7 @@ function gatherDetails( ), edit: (formApi: FormApi) => ( ( ( + edit: (formApi: FormApi) => }); attributes.push({ title: 'TOP-LEVEL ARGUMENTS', @@ -751,7 +942,13 @@ function gatherDetails( {i.name}='{i.value}' {i.code && 'code'} )), - edit: (formApi: FormApi) => + edit: (formApi: FormApi) => ( + + ) }); attributes.push({ title: 'EXTERNAL VARIABLES', @@ -760,20 +957,56 @@ function gatherDetails( {i.name}='{i.value}' {i.code && 'code'} )), - edit: (formApi: FormApi) => + edit: (formApi: FormApi) => ( + + ) }); attributes.push({ title: 'INCLUDE', view: directory && directory.include, - edit: (formApi: FormApi) => + edit: (formApi: FormApi) => ( + + ) }); attributes.push({ title: 'EXCLUDE', view: directory && directory.exclude, - edit: (formApi: FormApi) => + edit: (formApi: FormApi) => ( + + ) }); } return attributes; } + +// For Sources field. Get one source with index i from the list +async function getSourceFromSources(app: models.Application, i: number) { + const sources: models.ApplicationSource[] = app.spec.sources; + if (sources && i < sources.length) { + const aSource = sources[i]; + const repoDetail = await services.repos.appDetails(aSource, app.metadata.name, app.spec.project, i, 0).catch(() => ({ + type: 'Directory' as models.AppSourceType, + path: aSource.path + })); + return repoDetail; + } + return null; +} + +// Delete when source field is removed +async function getSingleSource(app: models.Application) { + if (app.spec.source) { + const repoDetail = await services.repos.appDetails(getAppDefaultSource(app), app.metadata.name, app.spec.project, 0, 0).catch(() => ({ + type: 'Directory' as models.AppSourceType, + path: getAppDefaultSource(app).path + })); + return repoDetail; + } + return null; +} diff --git a/ui/src/app/applications/components/application-summary/application-summary.tsx b/ui/src/app/applications/components/application-summary/application-summary.tsx index 702030be3b288..1747e943af69f 100644 --- a/ui/src/app/applications/components/application-summary/application-summary.tsx +++ b/ui/src/app/applications/components/application-summary/application-summary.tsx @@ -31,7 +31,6 @@ import {EditAnnotations} from './edit-annotations'; import './application-summary.scss'; import {DeepLinks} from '../../../shared/components/deep-links'; -import {ExternalLinks} from '../application-urls'; function swap(array: any[], a: number, b: number) { array = array.slice(); @@ -174,12 +173,7 @@ export const ApplicationSummary = (props: ApplicationSummaryProps) => { !hasMultipleSources && { title: 'REPO URL', view: , - edit: (formApi: FormApi) => - hasMultipleSources ? ( - helpTip('REPO URL is not editable for applications with multiple sources. You can edit them in the "Manifest" tab.') - ) : ( - - ) + edit: (formApi: FormApi) => }, ...(!hasMultipleSources ? isHelm @@ -269,12 +263,7 @@ export const ApplicationSummary = (props: ApplicationSummaryProps) => { view: app.spec.revisionHistoryLimit, edit: (formApi: FormApi) => (
- +
- {urls.map((url, i) => { - return ( - - {url.title}   + {urls + .map(item => item.split('|')) + .map((parts, i) => ( + 1 ? parts[1] : parts[0]} target='__blank'> + {parts[0]}   - ); - })} + ))} ) }); @@ -495,6 +485,7 @@ export const ApplicationSummary = (props: ApplicationSummaryProps) => {
This is a multi-source app, see the Sources tab for repository URLs and source-related information. : <>} validate={input => ({ 'spec.project': !input.spec.project && 'Project name is required', 'spec.destination.server': !input.spec.destination.server && input.spec.destination.hasOwnProperty('server') && 'Cluster server is required', @@ -511,7 +502,7 @@ export const ApplicationSummary = (props: ApplicationSummaryProps) => {

SYNC POLICY

-
{(app.spec.syncPolicy && app.spec.syncPolicy.automated && AUTOMATED) || MANUAL}
+
{(app.spec.syncPolicy && app.spec.syncPolicy.automated && AUTOMATED) || NONE}
{(app.spec.syncPolicy && app.spec.syncPolicy.automated && (
); }; - -// Maintain compatibility with single source field. Remove else block when source field is removed -async function getSources(app: models.Application) { - const listOfDetails = new Array(); - const sources: models.ApplicationSource[] = app.spec.sources; - if (sources) { - const length = sources.length; - for (let i = 0; i < length; i++) { - const aSource = sources[i]; - const repoDetail = await services.repos.appDetails(aSource, app.metadata.name, app.spec.project, i, 0).catch(() => ({ - type: 'Directory' as AppSourceType, - path: aSource.path - })); - if (repoDetail) { - listOfDetails.push(repoDetail); - } - } - return listOfDetails; - } else { - const repoDetail = await services.repos.appDetails(AppUtils.getAppDefaultSource(app), app.metadata.name, app.spec.project, 0, 0).catch(() => ({ - type: 'Directory' as AppSourceType, - path: AppUtils.getAppDefaultSource(app).path - })); - if (repoDetail) { - listOfDetails.push(repoDetail); - } - return listOfDetails; - } -} diff --git a/ui/src/app/applications/components/revision-form-field/revision-form-field.tsx b/ui/src/app/applications/components/revision-form-field/revision-form-field.tsx index 8174896d3e64f..8064e0a8f5ba5 100644 --- a/ui/src/app/applications/components/revision-form-field/revision-form-field.tsx +++ b/ui/src/app/applications/components/revision-form-field/revision-form-field.tsx @@ -10,6 +10,7 @@ interface RevisionFormFieldProps { helpIconTop?: string; hideLabel?: boolean; repoURL: string; + fieldValue?: string; } export class RevisionFormField extends React.PureComponent { @@ -49,7 +50,7 @@ export class RevisionFormField extends React.PureComponent { + title?: string | React.ReactNode; + uniqueId: string; + values: T; + validate?: (values: T) => any; + save?: (input: T, query: {validate?: boolean}) => Promise; + items: EditablePanelItem[]; + onModeSwitch?: () => any; + noReadonlyMode?: boolean; + view?: string | React.ReactNode; + edit?: (formApi: FormApi) => React.ReactNode; + collapsible?: boolean; + ctx: ContextApis; + isTopSection?: boolean; + disabledState?: boolean; + updateButtons?: (pressed: boolean) => void; +} + +interface EditableSectionState { + isEditing: boolean; + isSaving: boolean; +} + +// Similar to editable-panel but it should be part of a white-box, editable-panel HOC and it can be reused one after another +export class EditableSection extends React.Component, EditableSectionState> { + private formApi: FormApi; + + constructor(props: EditableSectionProps) { + super(props); + this.state = {isEditing: !!props.noReadonlyMode, isSaving: false}; + } + + public UNSAFE_componentWillReceiveProps(nextProps: EditableSectionProps) { + if (this.formApi && JSON.stringify(this.props.values) !== JSON.stringify(nextProps.values)) { + if (nextProps.noReadonlyMode) { + this.formApi.setAllValues(nextProps.values); + } + } + } + + public render() { + return ( +
+ {!this.props.noReadonlyMode && this.props.save && ( +
+ {!this.state.isEditing && ( + + )} + {this.state.isEditing && ( +
+ + {' '} + + +
+ )} +
+ )} + + {this.props.title && ( +
+

{this.props.title}

+
+ )} + + {(!this.state.isEditing && ( + + {this.props.view} + {this.props.items + .filter(item => item.view) + .map(item => ( + + {item.before} +
+
{item.customTitle || item.title}
+
{item.view}
+
+
+ ))} +
+ )) || ( +
(this.formApi = api)} + formDidUpdate={async form => { + if (this.props.noReadonlyMode && this.props.save) { + await this.props.save(form.values as any, {}); + } + }} + onSubmit={async input => { + try { + this.setState({isSaving: true}); + await this.props.save(input as any, {}); + this.setState({isEditing: false, isSaving: false}); + this.props.onModeSwitch(); + } catch (e) { + this.props.ctx.notifications.show({ + content: , + type: NotificationType.Error + }); + } finally { + this.setState({isSaving: false}); + } + }} + defaultValues={this.props.values} + validateError={this.props.validate}> + {api => ( + + {this.props.edit && this.props.edit(api)} + {this.props.items?.map(item => ( + + {item.before} +
+
{(item.titleEdit && item.titleEdit(api)) || item.customTitle || item.title}
+
{(item.edit && item.edit(api)) || item.view}
+
+
+ ))} +
+ )} + + )} +
+ ); + } +} From 7efde25890f41d7874b421ad1ebba21a01094ba2 Mon Sep 17 00:00:00 2001 From: Ishita Sequeira <46771830+ishitasequeira@users.noreply.github.com> Date: Fri, 14 Jun 2024 09:04:16 -0400 Subject: [PATCH 16/74] docs: update multiple sources docs (#18662) Signed-off-by: ishitasequeira --- docs/user-guide/multiple_sources.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/user-guide/multiple_sources.md b/docs/user-guide/multiple_sources.md index be8f8852e609f..462bfa13475f3 100644 --- a/docs/user-guide/multiple_sources.md +++ b/docs/user-guide/multiple_sources.md @@ -1,9 +1,7 @@ # Multiple Sources for an Application !!! warning "Beta Feature" - Specifying multiple sources for an application is a beta feature. The UI and CLI still generally behave as if only - the first source is specified. Full UI/CLI support will be added in a future release. - This feature is subject to change in backwards incompatible ways until it is marked stable. + Specifying multiple sources for an application is a beta feature. This feature is subject to change in backwards incompatible ways until it is marked stable. By default an Argo CD application is a link between a single source and a cluster. Sometimes however, you want to combine files from multiple locations to form a single Application. From 1757b7e285f54b29c13ef96f27fe2bf9141e4e7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 09:12:40 -0400 Subject: [PATCH 17/74] chore(deps): bump SonarSource/sonarqube-scan-action from 2.1.0 to 2.2 (#18649) Bumps [SonarSource/sonarqube-scan-action](https://github.com/sonarsource/sonarqube-scan-action) from 2.1.0 to 2.2. - [Release notes](https://github.com/sonarsource/sonarqube-scan-action/releases) - [Commits](https://github.com/sonarsource/sonarqube-scan-action/compare/86fe81775628f1c6349c28baab87881a2170f495...540792c588b5c2740ad2bb4667db5cd46ae678f2) --- updated-dependencies: - dependency-name: SonarSource/sonarqube-scan-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-build.yaml b/.github/workflows/ci-build.yaml index bb07c1cd71e0c..8f2675a3051e3 100644 --- a/.github/workflows/ci-build.yaml +++ b/.github/workflows/ci-build.yaml @@ -380,7 +380,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - uses: SonarSource/sonarqube-scan-action@86fe81775628f1c6349c28baab87881a2170f495 # v2.1.0 + uses: SonarSource/sonarqube-scan-action@540792c588b5c2740ad2bb4667db5cd46ae678f2 # v2.2 if: env.sonar_secret != '' test-e2e: name: Run end-to-end tests From f8557d2586379578a80b1a191ebea7a4be1c3d8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 09:13:25 -0400 Subject: [PATCH 18/74] chore(deps): bump codecov/codecov-action from 4.4.1 to 4.5.0 (#18650) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.4.1 to 4.5.0. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/125fc84a9a348dbcf27191600683ec096ec9021c...e28ff129e5465c2c0dcc6f003fc735cb6ae0c673) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-build.yaml b/.github/workflows/ci-build.yaml index 8f2675a3051e3..e45ad69230831 100644 --- a/.github/workflows/ci-build.yaml +++ b/.github/workflows/ci-build.yaml @@ -370,7 +370,7 @@ jobs: run: | go tool covdata percent -i=test-results,e2e-code-coverage/applicationset-controller -o test-results/full-coverage.out - name: Upload code coverage information to codecov.io - uses: codecov/codecov-action@125fc84a9a348dbcf27191600683ec096ec9021c # v4.4.1 + uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0 with: file: test-results/full-coverage.out fail_ci_if_error: true From c9ea5b13d204447df294528553e9143aad045124 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Fri, 14 Jun 2024 15:15:31 +0200 Subject: [PATCH 19/74] chore: extend require-error rule from testifylint (#18658) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 2 +- util/oidc/oidc_test.go | 26 ++-- util/rbac/rbac_norace_test.go | 3 +- util/rbac/rbac_test.go | 72 ++++------ util/security/path_traversal_test.go | 9 +- util/session/sessionmanager_norace_test.go | 5 +- util/session/sessionmanager_test.go | 38 ++--- util/settings/accounts_test.go | 37 ++--- util/settings/settings_test.go | 154 ++++++++++----------- util/tls/tls_test.go | 56 ++++---- util/webhook/webhook_test.go | 23 +-- 11 files changed, 202 insertions(+), 223 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 528cd85e5078e..6f5e5dd7ae554 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -7,7 +7,7 @@ issues: text: "require-error:" linters: - testifylint - - path: "util/(argo|cache|cert|clusterauth|config|db|dex|git|gpg|grpc|helm|http|io|kube|kustomize|lua|notification|oidc|rbac|security|session|settings|tls|webhook)/" + - path: "util/(argo|cache|cert|clusterauth|config|db|dex|git|gpg|grpc|helm|http|io|kube|kustomize|lua|notification)/" text: "require-error:" linters: - testifylint diff --git a/util/oidc/oidc_test.go b/util/oidc/oidc_test.go index 7114bf771c70f..12a715f6a3e9a 100644 --- a/util/oidc/oidc_test.go +++ b/util/oidc/oidc_test.go @@ -33,10 +33,10 @@ func TestInferGrantType(t *testing.T) { for _, path := range []string{"dex", "okta", "auth0", "onelogin"} { t.Run(path, func(t *testing.T) { rawConfig, err := os.ReadFile("testdata/" + path + ".json") - assert.NoError(t, err) + require.NoError(t, err) var config OIDCConfiguration err = json.Unmarshal(rawConfig, &config) - assert.NoError(t, err) + require.NoError(t, err) grantType := InferGrantType(&config) assert.Equal(t, GrantTypeAuthorizationCode, grantType) @@ -74,10 +74,10 @@ func TestIDTokenClaims(t *testing.T) { assert.Len(t, opts, 1) authCodeURL, err := url.Parse(oauth2Config.AuthCodeURL("TEST", opts...)) - assert.NoError(t, err) + require.NoError(t, err) values, err := url.ParseQuery(authCodeURL.RawQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "{\"id_token\":{\"groups\":{\"essential\":true}}}", values.Get("claims")) } @@ -421,7 +421,7 @@ func TestGenerateAppState(t *testing.T) { } returnURL, err := app.verifyAppState(req, httptest.NewRecorder(), state) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedReturnURL, returnURL) }) @@ -432,7 +432,7 @@ func TestGenerateAppState(t *testing.T) { } _, err := app.verifyAppState(req, httptest.NewRecorder(), "wrong state") - assert.Error(t, err) + require.Error(t, err) }) } @@ -465,7 +465,7 @@ func TestGenerateAppState_XSS(t *testing.T) { } returnURL, err := app.verifyAppState(req, httptest.NewRecorder(), state) - assert.ErrorIs(t, err, InvalidRedirectURLError) + require.ErrorIs(t, err, InvalidRedirectURLError) assert.Empty(t, returnURL) }) @@ -481,7 +481,7 @@ func TestGenerateAppState_XSS(t *testing.T) { } returnURL, err := app.verifyAppState(req, httptest.NewRecorder(), state) - assert.NoError(t, err, InvalidRedirectURLError) + require.NoError(t, err, InvalidRedirectURLError) assert.Equal(t, expectedReturnURL, returnURL) }) } @@ -502,7 +502,7 @@ func TestGenerateAppState_NoReturnURL(t *testing.T) { req.AddCookie(&http.Cookie{Name: common.StateCookieName, Value: hex.EncodeToString(encrypted)}) returnURL, err := app.verifyAppState(req, httptest.NewRecorder(), "123") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "/argo-cd", returnURL) } @@ -728,7 +728,7 @@ func TestGetUserInfo(t *testing.T) { require.NoError(t, err) cdSettings := &settings.ArgoCDSettings{ServerSignature: signature} encryptionKey, err := cdSettings.GetServerEncryptionKey() - assert.NoError(t, err) + require.NoError(t, err) a, _ := NewClientApp(cdSettings, "", nil, "/argo-cd", tt.cache) for _, item := range tt.cacheItems { @@ -736,7 +736,7 @@ func TestGetUserInfo(t *testing.T) { newValue = []byte(item.value) if item.encrypt { newValue, err = crypto.Encrypt([]byte(item.value), encryptionKey) - assert.NoError(t, err) + require.NoError(t, err) } err := a.clientCache.Set(&cache.Item{ Key: item.key, @@ -749,9 +749,9 @@ func TestGetUserInfo(t *testing.T) { assert.Equal(t, tt.expectedOutput, got) assert.Equal(t, tt.expectUnauthenticated, unauthenticated) if tt.expectError { - assert.Error(t, err) + require.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) } for _, item := range tt.expectedCacheItems { var tmpValue []byte diff --git a/util/rbac/rbac_norace_test.go b/util/rbac/rbac_norace_test.go index 5d558f716ac7b..41503746cd540 100644 --- a/util/rbac/rbac_norace_test.go +++ b/util/rbac/rbac_norace_test.go @@ -9,6 +9,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" apiv1 "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes/fake" ) @@ -48,7 +49,7 @@ func TestPolicyInformer(t *testing.T) { // update the configmap and update policy delete(cm.Data, ConfigMapPolicyCSVKey) err := enf.syncUpdate(cm, noOpUpdate) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, enf.Enforce("admin", "applications", "delete", "foo/bar")) } diff --git a/util/rbac/rbac_test.go b/util/rbac/rbac_test.go index bbc2eaa3a5cf8..f0843952cd2e9 100644 --- a/util/rbac/rbac_test.go +++ b/util/rbac/rbac_test.go @@ -108,8 +108,7 @@ func TestPolicyCSV(t *testing.T) { func TestBuiltinPolicyEnforcer(t *testing.T) { kubeclientset := fake.NewSimpleClientset() enf := NewEnforcer(kubeclientset, fakeNamespace, fakeConfigMapName, nil) - err := enf.syncUpdate(fakeConfigMap(), noOpUpdate) - assert.NoError(t, err) + require.NoError(t, enf.syncUpdate(fakeConfigMap(), noOpUpdate)) // Without setting builtin policy, this should fail assert.False(t, enf.Enforce("admin", "applications", "get", "foo/bar")) @@ -181,8 +180,7 @@ g, alice, role:foo-readonly func TestDefaultRole(t *testing.T) { kubeclientset := fake.NewSimpleClientset() enf := NewEnforcer(kubeclientset, fakeNamespace, fakeConfigMapName, nil) - err := enf.syncUpdate(fakeConfigMap(), noOpUpdate) - assert.NoError(t, err) + require.NoError(t, enf.syncUpdate(fakeConfigMap(), noOpUpdate)) _ = enf.SetBuiltinPolicy(assets.BuiltinPolicyCSV) assert.False(t, enf.Enforce("bob", "applications", "get", "foo/bar")) @@ -195,8 +193,7 @@ func TestDefaultRole(t *testing.T) { func TestURLAsObjectName(t *testing.T) { kubeclientset := fake.NewSimpleClientset() enf := NewEnforcer(kubeclientset, fakeNamespace, fakeConfigMapName, nil) - err := enf.syncUpdate(fakeConfigMap(), noOpUpdate) - assert.NoError(t, err) + require.NoError(t, enf.syncUpdate(fakeConfigMap(), noOpUpdate)) policy := ` p, alice, repositories, *, foo/*, allow p, bob, repositories, *, foo/https://github.com/argoproj/argo-cd.git, allow @@ -294,8 +291,7 @@ func TestClaimsEnforcerFunc(t *testing.T) { func TestDefaultRoleWithRuntimePolicy(t *testing.T) { kubeclientset := fake.NewSimpleClientset() enf := NewEnforcer(kubeclientset, fakeNamespace, fakeConfigMapName, nil) - err := enf.syncUpdate(fakeConfigMap(), noOpUpdate) - assert.NoError(t, err) + require.NoError(t, enf.syncUpdate(fakeConfigMap(), noOpUpdate)) runtimePolicy := assets.BuiltinPolicyCSV assert.False(t, enf.EnforceRuntimePolicy("", runtimePolicy, "bob", "applications", "get", "foo/bar")) enf.SetDefaultRole("role:readonly") @@ -307,8 +303,7 @@ func TestDefaultRoleWithRuntimePolicy(t *testing.T) { func TestClaimsEnforcerFuncWithRuntimePolicy(t *testing.T) { kubeclientset := fake.NewSimpleClientset() enf := NewEnforcer(kubeclientset, fakeNamespace, fakeConfigMapName, nil) - err := enf.syncUpdate(fakeConfigMap(), noOpUpdate) - assert.NoError(t, err) + require.NoError(t, enf.syncUpdate(fakeConfigMap(), noOpUpdate)) runtimePolicy := assets.BuiltinPolicyCSV claims := jwt.RegisteredClaims{ Subject: "foo", @@ -325,8 +320,7 @@ func TestInvalidRuntimePolicy(t *testing.T) { cm := fakeConfigMap() kubeclientset := fake.NewSimpleClientset(cm) enf := NewEnforcer(kubeclientset, fakeNamespace, fakeConfigMapName, nil) - err := enf.syncUpdate(fakeConfigMap(), noOpUpdate) - assert.NoError(t, err) + require.NoError(t, enf.syncUpdate(fakeConfigMap(), noOpUpdate)) _ = enf.SetBuiltinPolicy(assets.BuiltinPolicyCSV) assert.True(t, enf.EnforceRuntimePolicy("", "", "admin", "applications", "update", "foo/bar")) assert.False(t, enf.EnforceRuntimePolicy("", "", "role:readonly", "applications", "update", "foo/bar")) @@ -344,14 +338,14 @@ func TestValidatePolicy(t *testing.T) { ` p, role:admin, projects, delete, *, allow `, } for _, good := range goodPolicies { - assert.NoError(t, ValidatePolicy(good)) + require.NoError(t, ValidatePolicy(good)) } badPolicies := []string{ "this, is, not, a, good, policy", "this\ttoo", } for _, bad := range badPolicies { - assert.Error(t, ValidatePolicy(bad)) + require.Error(t, ValidatePolicy(bad)) } } @@ -360,20 +354,20 @@ func TestEnforceErrorMessage(t *testing.T) { kubeclientset := fake.NewSimpleClientset() enf := NewEnforcer(kubeclientset, fakeNamespace, fakeConfigMapName, nil) err := enf.syncUpdate(fakeConfigMap(), noOpUpdate) - assert.NoError(t, err) + require.NoError(t, err) err = enf.EnforceErr("admin", "applications", "get", "foo/bar") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "rpc error: code = PermissionDenied desc = permission denied: applications, get, foo/bar", err.Error()) err = enf.EnforceErr() - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "rpc error: code = PermissionDenied desc = permission denied", err.Error()) // nolint:staticcheck ctx := context.WithValue(context.Background(), "claims", &jwt.RegisteredClaims{Subject: "proj:default:admin"}) err = enf.EnforceErr(ctx.Value("claims"), "project") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "rpc error: code = PermissionDenied desc = permission denied: project, sub: proj:default:admin", err.Error()) iat := time.Unix(int64(1593035962), 0).Format(time.RFC3339) @@ -381,27 +375,26 @@ func TestEnforceErrorMessage(t *testing.T) { // nolint:staticcheck ctx = context.WithValue(context.Background(), "claims", &jwt.RegisteredClaims{Subject: "proj:default:admin", IssuedAt: jwt.NewNumericDate(time.Unix(int64(1593035962), 0))}) err = enf.EnforceErr(ctx.Value("claims"), "project") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, exp, err.Error()) // nolint:staticcheck ctx = context.WithValue(context.Background(), "claims", &jwt.RegisteredClaims{ExpiresAt: jwt.NewNumericDate(time.Now())}) err = enf.EnforceErr(ctx.Value("claims"), "project") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "rpc error: code = PermissionDenied desc = permission denied: project", err.Error()) // nolint:staticcheck ctx = context.WithValue(context.Background(), "claims", &jwt.RegisteredClaims{Subject: "proj:default:admin", IssuedAt: nil}) err = enf.EnforceErr(ctx.Value("claims"), "project") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "rpc error: code = PermissionDenied desc = permission denied: project, sub: proj:default:admin", err.Error()) } func TestDefaultGlobMatchMode(t *testing.T) { kubeclientset := fake.NewSimpleClientset() enf := NewEnforcer(kubeclientset, fakeNamespace, fakeConfigMapName, nil) - err := enf.syncUpdate(fakeConfigMap(), noOpUpdate) - assert.NoError(t, err) + require.NoError(t, enf.syncUpdate(fakeConfigMap(), noOpUpdate)) policy := ` p, alice, clusters, get, "https://github.com/*/*.git", allow ` @@ -416,8 +409,7 @@ func TestGlobMatchMode(t *testing.T) { cm.Data[ConfigMapMatchModeKey] = GlobMatchMode kubeclientset := fake.NewSimpleClientset() enf := NewEnforcer(kubeclientset, fakeNamespace, fakeConfigMapName, nil) - err := enf.syncUpdate(cm, noOpUpdate) - assert.NoError(t, err) + require.NoError(t, enf.syncUpdate(cm, noOpUpdate)) policy := ` p, alice, clusters, get, "https://github.com/*/*.git", allow ` @@ -432,8 +424,7 @@ func TestRegexMatchMode(t *testing.T) { cm.Data[ConfigMapMatchModeKey] = RegexMatchMode kubeclientset := fake.NewSimpleClientset() enf := NewEnforcer(kubeclientset, fakeNamespace, fakeConfigMapName, nil) - err := enf.syncUpdate(cm, noOpUpdate) - assert.NoError(t, err) + require.NoError(t, enf.syncUpdate(cm, noOpUpdate)) policy := ` p, alice, clusters, get, "https://github.com/argo[a-z]{4}/argo-[a-z]+.git", allow ` @@ -461,55 +452,46 @@ func TestLoadPolicyLine(t *testing.T) { t.Run("Valid permission line", func(t *testing.T) { policy := `p, role:Myrole, applications, *, myproj/*, allow` model := newBuiltInModel() - err := loadPolicyLine(policy, model) - require.NoError(t, err) + require.NoError(t, loadPolicyLine(policy, model)) }) t.Run("Valid grant line", func(t *testing.T) { policy := `g, your-github-org:your-team, role:org-admin` model := newBuiltInModel() - err := loadPolicyLine(policy, model) - require.NoError(t, err) + require.NoError(t, loadPolicyLine(policy, model)) }) t.Run("Empty policy line", func(t *testing.T) { policy := "" model := newBuiltInModel() - err := loadPolicyLine(policy, model) - require.NoError(t, err) + require.NoError(t, loadPolicyLine(policy, model)) }) t.Run("Comment policy line", func(t *testing.T) { policy := "# Some comment" model := newBuiltInModel() - err := loadPolicyLine(policy, model) - require.NoError(t, err) + require.NoError(t, loadPolicyLine(policy, model)) }) t.Run("Invalid policy line: single token", func(t *testing.T) { policy := "p" model := newBuiltInModel() - err := loadPolicyLine(policy, model) - require.Error(t, err) + require.Error(t, loadPolicyLine(policy, model)) }) t.Run("Invalid policy line: plain text", func(t *testing.T) { policy := "Some comment" model := newBuiltInModel() - err := loadPolicyLine(policy, model) - require.Error(t, err) + require.Error(t, loadPolicyLine(policy, model)) }) t.Run("Invalid policy line", func(t *testing.T) { policy := "agh, foo, bar" model := newBuiltInModel() - err := loadPolicyLine(policy, model) - require.Error(t, err) + require.Error(t, loadPolicyLine(policy, model)) }) t.Run("Invalid policy line missing comma", func(t *testing.T) { policy := "p, role:Myrole, applications, *, myproj/* allow" model := newBuiltInModel() - err := loadPolicyLine(policy, model) - require.Error(t, err) + require.Error(t, loadPolicyLine(policy, model)) }) t.Run("Invalid policy line missing policy type", func(t *testing.T) { policy := ", role:Myrole, applications, *, myproj/*, allow" model := newBuiltInModel() - err := loadPolicyLine(policy, model) - require.Error(t, err) + require.Error(t, loadPolicyLine(policy, model)) }) } diff --git a/util/security/path_traversal_test.go b/util/security/path_traversal_test.go index 79c41ab6c0ee8..449d031e393d4 100644 --- a/util/security/path_traversal_test.go +++ b/util/security/path_traversal_test.go @@ -4,23 +4,24 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestEnforceToCurrentRoot(t *testing.T) { cleanDir, err := EnforceToCurrentRoot("/home/argo/helmapp/", "/home/argo/helmapp/values.yaml") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "/home/argo/helmapp/values.yaml", cleanDir) // File is outside current working directory _, err = EnforceToCurrentRoot("/home/argo/helmapp/", "/home/values.yaml") - assert.Error(t, err) + require.Error(t, err) // File is outside current working directory _, err = EnforceToCurrentRoot("/home/argo/helmapp/", "/home/argo/helmapp/../differentapp/values.yaml") - assert.Error(t, err) + require.Error(t, err) // Goes back and forth, but still legal cleanDir, err = EnforceToCurrentRoot("/home/argo/helmapp/", "/home/argo/helmapp/../../argo/helmapp/values.yaml") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "/home/argo/helmapp/values.yaml", cleanDir) } diff --git a/util/session/sessionmanager_norace_test.go b/util/session/sessionmanager_norace_test.go index 3f116a06bfcda..ae6e22b030897 100644 --- a/util/session/sessionmanager_norace_test.go +++ b/util/session/sessionmanager_norace_test.go @@ -9,6 +9,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/util/settings" ) @@ -30,9 +31,7 @@ func TestRandomPasswordVerificationDelay(t *testing.T) { for i := 0; i < 10; i++ { sleptFor = 0 start := time.Now() - if !assert.NoError(t, mgr.VerifyUsernamePassword("admin", "password")) { - return - } + require.NoError(t, mgr.VerifyUsernamePassword("admin", "password")) totalDuration := time.Since(start) + sleptFor assert.GreaterOrEqual(t, totalDuration.Nanoseconds(), verificationDelayNoiseMin.Nanoseconds()) assert.LessOrEqual(t, totalDuration.Nanoseconds(), verificationDelayNoiseMax.Nanoseconds()) diff --git a/util/session/sessionmanager_test.go b/util/session/sessionmanager_test.go index b5e51a977a2c7..7a3d5a65f5f5a 100644 --- a/util/session/sessionmanager_test.go +++ b/util/session/sessionmanager_test.go @@ -95,7 +95,7 @@ func TestSessionManager_AdminToken(t *testing.T) { } claims, newToken, err := mgr.Parse(token) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, newToken) mapClaims := *(claims.(*jwt.MapClaims)) @@ -119,12 +119,12 @@ func TestSessionManager_AdminToken_ExpiringSoon(t *testing.T) { // verify new token is generated is login token is expiring soon _, newToken, err := mgr.Parse(token) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, newToken) // verify that new token is valid and for the same user claims, _, err := mgr.Parse(newToken) - assert.NoError(t, err) + require.NoError(t, err) mapClaims := *(claims.(*jwt.MapClaims)) subject := mapClaims["sub"].(string) assert.Equal(t, "admin", subject) @@ -200,7 +200,7 @@ func TestSessionManager_ProjectToken(t *testing.T) { require.NoError(t, err) _, _, err = mgr.Parse(jwtToken) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Token Revoked", func(t *testing.T) { @@ -341,7 +341,7 @@ func TestSessionManager_WithAuthMiddleware(t *testing.T) { resp, err := http.DefaultClient.Do(req) // then - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, resp) assert.Equal(t, tc.expectedStatusCode, resp.StatusCode) if tc.expectedResponseBody != nil { @@ -431,7 +431,7 @@ func TestVerifyUsernamePassword(t *testing.T) { err := mgr.VerifyUsernamePassword(tc.userName, tc.password) if tc.expected == nil { - assert.NoError(t, err) + require.NoError(t, err) } else { assert.EqualError(t, err, tc.expected.Error()) } @@ -502,31 +502,31 @@ func TestLoginRateLimiter(t *testing.T) { t.Run("Test login delay valid user", func(t *testing.T) { for i := 0; i < getMaxLoginFailures(); i++ { err := mgr.VerifyUsernamePassword("admin", "wrong") - assert.Error(t, err) + require.Error(t, err) } // The 11th time should fail even if password is right { err := mgr.VerifyUsernamePassword("admin", "password") - assert.Error(t, err) + require.Error(t, err) } storage.attempts = map[string]LoginAttempts{} // Failed counter should have been reset, should validate immediately { err := mgr.VerifyUsernamePassword("admin", "password") - assert.NoError(t, err) + require.NoError(t, err) } }) t.Run("Test login delay invalid user", func(t *testing.T) { for i := 0; i < getMaxLoginFailures(); i++ { err := mgr.VerifyUsernamePassword("invalid", "wrong") - assert.Error(t, err) + require.Error(t, err) } err := mgr.VerifyUsernamePassword("invalid", "wrong") - assert.Error(t, err) + require.Error(t, err) }) } @@ -538,7 +538,7 @@ func TestMaxUsernameLength(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), getKubeClient("password", true), "argocd") mgr := newSessionManager(settingsMgr, getProjLister(), NewUserStateStorage(nil)) err := mgr.VerifyUsernamePassword(username, "password") - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf(usernameTooLongError, maxUsernameLength)) } @@ -552,7 +552,7 @@ func TestMaxCacheSize(t *testing.T) { for _, user := range invalidUsers { err := mgr.VerifyUsernamePassword(user, "password") - assert.Error(t, err) + require.Error(t, err) } assert.Len(t, mgr.GetLoginFailures(), 5) @@ -568,13 +568,13 @@ func TestFailedAttemptsExpiry(t *testing.T) { for _, user := range invalidUsers { err := mgr.VerifyUsernamePassword(user, "password") - assert.Error(t, err) + require.Error(t, err) } time.Sleep(2 * time.Second) err := mgr.VerifyUsernamePassword("invalid8", "password") - assert.Error(t, err) + require.Error(t, err) assert.Len(t, mgr.GetLoginFailures(), 1) } @@ -878,7 +878,7 @@ requestedScopes: ["oidc"]`, oidcTestServer.URL), require.NoError(t, err) _, _, err = mgr.VerifyToken(tokenString) - assert.Error(t, err) + require.Error(t, err) }) t.Run("OIDC provider is external, audience is not specified, absent audience is allowed", func(t *testing.T) { @@ -914,7 +914,7 @@ skipAudienceCheckWhenTokenHasNoAudience: true`, oidcTestServer.URL), require.NoError(t, err) _, _, err = mgr.VerifyToken(tokenString) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("OIDC provider is external, audience is not specified but is required", func(t *testing.T) { @@ -1023,7 +1023,7 @@ allowedAudiences: require.NoError(t, err) _, _, err = mgr.VerifyToken(tokenString) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("OIDC provider is external, audience is not in allowed list", func(t *testing.T) { @@ -1171,7 +1171,7 @@ allowedAudiences: ["aud-a", "aud-b"]`, oidcTestServer.URL), require.NoError(t, err) _, _, err = mgr.VerifyToken(tokenString) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("OIDC provider is external, audience is not specified, token is signed with the wrong key", func(t *testing.T) { diff --git a/util/settings/accounts_test.go b/util/settings/accounts_test.go index 0b00b31ad300a..1415ce226de3d 100644 --- a/util/settings/accounts_test.go +++ b/util/settings/accounts_test.go @@ -6,6 +6,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" v1 "k8s.io/api/core/v1" @@ -17,7 +18,7 @@ import ( func TestGetAccounts_NoAccountsConfigured(t *testing.T) { _, settingsManager := fixtures(nil) accounts, err := settingsManager.GetAccounts() - assert.NoError(t, err) + require.NoError(t, err) adminAccount, ok := accounts[common.ArgoCDAdminUsername] assert.True(t, ok) @@ -29,7 +30,7 @@ func TestGetAccounts_HasConfiguredAccounts(t *testing.T) { secret.Data["accounts.test.tokens"] = []byte(`[{"id":"123","iat":1583789194,"exp":1583789194}]`) }) accounts, err := settingsManager.GetAccounts() - assert.NoError(t, err) + require.NoError(t, err) acc, ok := accounts["test"] assert.True(t, ok) @@ -44,7 +45,7 @@ func TestGetAccounts_DisableAccount(t *testing.T) { "accounts.test.enabled": "false", }) accounts, err := settingsManager.GetAccounts() - assert.NoError(t, err) + require.NoError(t, err) acc, ok := accounts["test"] assert.True(t, ok) @@ -59,13 +60,13 @@ func TestGetAccount(t *testing.T) { t.Run("ExistingUserName", func(t *testing.T) { _, err := settingsManager.GetAccount("test") - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("IncorrectName", func(t *testing.T) { _, err := settingsManager.GetAccount("incorrect-name") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, codes.NotFound, status.Code(err)) }) } @@ -88,7 +89,7 @@ func TestGetAccount_WithInvalidToken(t *testing.T) { ) _, err := settingsManager.GetAccounts() - assert.NoError(t, err) + require.NoError(t, err) } func TestGetAdminAccount(t *testing.T) { @@ -99,7 +100,7 @@ func TestGetAdminAccount(t *testing.T) { }) acc, err := settingsManager.GetAccount(common.ArgoCDAdminUsername) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "admin-password", acc.PasswordHash) assert.Equal(t, mTime, acc.FormatPasswordMtime()) @@ -150,16 +151,16 @@ func TestAddAccount_AccountAdded(t *testing.T) { PasswordMtime: &mTime, } err := settingsManager.AddAccount("test", addedAccount) - assert.NoError(t, err) + require.NoError(t, err) cm, err := clientset.CoreV1().ConfigMaps("default").Get(context.Background(), common.ArgoCDConfigMapName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "login", cm.Data["accounts.test"]) assert.Equal(t, "false", cm.Data["accounts.test.enabled"]) secret, err := clientset.CoreV1().Secrets("default").Get(context.Background(), common.ArgoCDSecretName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "hash", string(secret.Data["accounts.test.password"])) assert.Equal(t, mTime.Format(time.RFC3339), string(secret.Data["accounts.test.passwordMtime"])) @@ -169,13 +170,13 @@ func TestAddAccount_AccountAdded(t *testing.T) { func TestAddAccount_AlreadyExists(t *testing.T) { _, settingsManager := fixtures(map[string]string{"accounts.test": "login"}) err := settingsManager.AddAccount("test", Account{}) - assert.Error(t, err) + require.Error(t, err) } func TestAddAccount_CannotAddAdmin(t *testing.T) { _, settingsManager := fixtures(nil) err := settingsManager.AddAccount("admin", Account{}) - assert.Error(t, err) + require.Error(t, err) } func TestUpdateAccount_SuccessfullyUpdated(t *testing.T) { @@ -190,16 +191,16 @@ func TestUpdateAccount_SuccessfullyUpdated(t *testing.T) { account.PasswordMtime = &mTime return nil }) - assert.NoError(t, err) + require.NoError(t, err) cm, err := clientset.CoreV1().ConfigMaps("default").Get(context.Background(), common.ArgoCDConfigMapName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "login", cm.Data["accounts.test"]) assert.Equal(t, "false", cm.Data["accounts.test.enabled"]) secret, err := clientset.CoreV1().Secrets("default").Get(context.Background(), common.ArgoCDSecretName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "hash", string(secret.Data["accounts.test.password"])) assert.Equal(t, mTime.Format(time.RFC3339), string(secret.Data["accounts.test.passwordMtime"])) @@ -215,10 +216,10 @@ func TestUpdateAccount_UpdateAdminPassword(t *testing.T) { account.PasswordMtime = &mTime return nil }) - assert.NoError(t, err) + require.NoError(t, err) secret, err := clientset.CoreV1().Secrets("default").Get(context.Background(), common.ArgoCDSecretName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "newPassword", string(secret.Data["admin.password"])) assert.Equal(t, mTime.Format(time.RFC3339), string(secret.Data["admin.passwordMtime"])) @@ -231,5 +232,5 @@ func TestUpdateAccount_AccountDoesNotExist(t *testing.T) { account.Enabled = false return nil }) - assert.Error(t, err) + require.Error(t, err) } diff --git a/util/settings/settings_test.go b/util/settings/settings_test.go index aa78730ace513..0011a79adcf59 100644 --- a/util/settings/settings_test.go +++ b/util/settings/settings_test.go @@ -57,20 +57,20 @@ func TestGetRepositories(t *testing.T) { "repositories": "\n - url: http://foo\n", }) filter, err := settingsManager.GetRepositories() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []Repository{{URL: "http://foo"}}, filter) } func TestSaveRepositories(t *testing.T) { kubeClient, settingsManager := fixtures(nil) err := settingsManager.SaveRepositories([]Repository{{URL: "http://foo"}}) - assert.NoError(t, err) + require.NoError(t, err) cm, err := kubeClient.CoreV1().ConfigMaps("default").Get(context.Background(), common.ArgoCDConfigMapName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "- url: http://foo\n", cm.Data["repositories"]) repos, err := settingsManager.GetRepositories() - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, repos, []Repository{{URL: "http://foo"}}) } @@ -79,22 +79,22 @@ func TestSaveRepositoriesNoConfigMap(t *testing.T) { settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") err := settingsManager.SaveRepositories([]Repository{{URL: "http://foo"}}) - assert.NoError(t, err) + require.NoError(t, err) cm, err := kubeClient.CoreV1().ConfigMaps("default").Get(context.Background(), common.ArgoCDConfigMapName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "- url: http://foo\n", cm.Data["repositories"]) } func TestSaveRepositoryCredentials(t *testing.T) { kubeClient, settingsManager := fixtures(nil) err := settingsManager.SaveRepositoryCredentials([]RepositoryCredentials{{URL: "http://foo"}}) - assert.NoError(t, err) + require.NoError(t, err) cm, err := kubeClient.CoreV1().ConfigMaps("default").Get(context.Background(), common.ArgoCDConfigMapName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "- url: http://foo\n", cm.Data["repository.credentials"]) creds, err := settingsManager.GetRepositoryCredentials() - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, creds, []RepositoryCredentials{{URL: "http://foo"}}) } @@ -103,7 +103,7 @@ func TestGetRepositoryCredentials(t *testing.T) { "repository.credentials": "\n - url: http://foo\n", }) filter, err := settingsManager.GetRepositoryCredentials() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []RepositoryCredentials{{URL: "http://foo"}}, filter) } @@ -114,7 +114,7 @@ func TestGetResourceFilter(t *testing.T) { } _, settingsManager := fixtures(data) filter, err := settingsManager.GetResourcesFilter() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &ResourcesFilter{ ResourceExclusions: []FilteredResource{{APIGroups: []string{"group1"}, Kinds: []string{"kind1"}, Clusters: []string{"cluster1"}}}, ResourceInclusions: []FilteredResource{{APIGroups: []string{"group2"}, Kinds: []string{"kind2"}, Clusters: []string{"cluster2"}}}, @@ -126,14 +126,14 @@ func TestInClusterServerAddressEnabled(t *testing.T) { "cluster.inClusterEnabled": "true", }) argoCDCM, err := settingsManager.getConfigMap() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "true", argoCDCM.Data[inClusterEnabledKey]) _, settingsManager = fixtures(map[string]string{ "cluster.inClusterEnabled": "false", }) argoCDCM, err = settingsManager.getConfigMap() - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, "true", argoCDCM.Data[inClusterEnabledKey]) } @@ -165,7 +165,7 @@ func TestInClusterServerAddressEnabledByDefault(t *testing.T) { ) settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") settings, err := settingsManager.GetSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, settings.InClusterEnabled) } @@ -174,14 +174,14 @@ func TestGetAppInstanceLabelKey(t *testing.T) { "application.instanceLabelKey": "testLabel", }) label, err := settingsManager.GetAppInstanceLabelKey() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "testLabel", label) } func TestGetServerRBACLogEnforceEnableKeyDefaultFalse(t *testing.T) { _, settingsManager := fixtures(nil) serverRBACLogEnforceEnable, err := settingsManager.GetServerRBACLogEnforceEnable() - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, serverRBACLogEnforceEnable) } @@ -190,14 +190,14 @@ func TestGetIsIgnoreResourceUpdatesEnabled(t *testing.T) { "resource.ignoreResourceUpdatesEnabled": "true", }) ignoreResourceUpdatesEnabled, err := settingsManager.GetIsIgnoreResourceUpdatesEnabled() - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, ignoreResourceUpdatesEnabled) } func TestGetIsIgnoreResourceUpdatesEnabledDefaultFalse(t *testing.T) { _, settingsManager := fixtures(nil) ignoreResourceUpdatesEnabled, err := settingsManager.GetIsIgnoreResourceUpdatesEnabled() - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, ignoreResourceUpdatesEnabled) } @@ -206,7 +206,7 @@ func TestGetServerRBACLogEnforceEnableKey(t *testing.T) { "server.rbac.log.enforce.enable": "true", }) serverRBACLogEnforceEnable, err := settingsManager.GetServerRBACLogEnforceEnable() - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, serverRBACLogEnforceEnable) } @@ -234,7 +234,7 @@ func TestGetResourceOverrides(t *testing.T) { - .webhooks[1].clientConfig.caBundle`, }) overrides, err := settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) webHookOverrides := overrides["admissionregistration.k8s.io/MutatingWebhookConfiguration"] assert.NotNil(t, webHookOverrides) @@ -261,7 +261,7 @@ func TestGetResourceOverrides(t *testing.T) { ignoreResourceStatusField: all`, }) overrides, err = settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) globalOverrides := overrides["*/*"] assert.NotNil(t, globalOverrides) @@ -281,7 +281,7 @@ func TestGetResourceOverrides(t *testing.T) { - .webhooks[0].clientConfig.caBundle`, }) overrides, err = settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) crdOverrides = overrides[crdGK] assert.NotNil(t, crdOverrides) @@ -296,7 +296,7 @@ func TestGetResourceOverrides(t *testing.T) { ignoreResourceStatusField: foobar`, }) overrides, err = settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) defaultOverrides := overrides[crdGK] assert.NotNil(t, defaultOverrides) @@ -309,7 +309,7 @@ func TestGetResourceOverrides(t *testing.T) { ignoreResourceStatusField: off`, }) overrides, err = settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, overrides) } @@ -325,7 +325,7 @@ func TestGetResourceOverridesHealthWithWildcard(t *testing.T) { _, settingsManager := fixtures(data) overrides, err := settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, overrides, 2) assert.Equal(t, "foo", overrides["*.aws.crossplane.io/*"].HealthLua) }) @@ -336,7 +336,7 @@ func TestSettingsManager_GetResourceOverrides_with_empty_string(t *testing.T) { resourceCustomizationsKey: "", }) overrides, err := settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, overrides, 1) } @@ -368,7 +368,7 @@ func TestGetResourceOverrides_with_splitted_keys(t *testing.T) { _, settingsManager := fixtures(data) overrides, err := settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, overrides, 5) assert.Len(t, overrides[crdGK].IgnoreDifferences.JSONPointers, 2) assert.Len(t, overrides["admissionregistration.k8s.io/MutatingWebhookConfiguration"].IgnoreDifferences.JSONPointers, 1) @@ -417,7 +417,7 @@ func TestGetResourceOverrides_with_splitted_keys(t *testing.T) { _, settingsManager := fixtures(mergemaps(data, newData)) overrides, err := settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, overrides, 9) assert.Len(t, overrides[crdGK].IgnoreDifferences.JSONPointers, 2) assert.Equal(t, "/status", overrides[crdGK].IgnoreDifferences.JSONPointers[0]) @@ -457,7 +457,7 @@ func TestGetResourceOverrides_with_splitted_keys(t *testing.T) { _, settingsManager := fixtures(mergemaps(data, newData)) overrides, err := settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, overrides, 5) assert.Len(t, overrides["*/*"].IgnoreDifferences.JSONPointers, 1) assert.Len(t, overrides["admissionregistration.k8s.io/MutatingWebhookConfiguration"].IgnoreDifferences.JSONPointers, 1) @@ -475,7 +475,7 @@ func TestGetResourceOverrides_with_splitted_keys(t *testing.T) { _, settingsManager := fixtures(mergemaps(data, newData)) overrides, err := settingsManager.GetResourceOverrides() - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, overrides, 4) assert.Len(t, overrides["admissionregistration.k8s.io/MutatingWebhookConfiguration"].IgnoreDifferences.JSONPointers, 1) assert.Equal(t, "foo\n", overrides["certmanager.k8s.io/Certificate"].HealthLua) @@ -514,7 +514,7 @@ func TestGetIgnoreResourceUpdatesOverrides(t *testing.T) { _, settingsManager := fixtures(testCustomizations) overrides, err := settingsManager.GetIgnoreResourceUpdatesOverrides() - assert.NoError(t, err) + require.NoError(t, err) // default overrides should always be present allOverrides := overrides[allGK] @@ -537,7 +537,7 @@ func TestGetIgnoreResourceUpdatesOverrides(t *testing.T) { ignoreDifferencesOnResourceUpdates: true`, })) overrides, err = settingsManager.GetIgnoreResourceUpdatesOverrides() - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, overrides["admissionregistration.k8s.io/MutatingWebhookConfiguration"]) assert.Equal(t, v1alpha1.ResourceOverride{ @@ -551,18 +551,18 @@ func TestGetIgnoreResourceUpdatesOverrides(t *testing.T) { func TestConvertToOverrideKey(t *testing.T) { key, err := convertToOverrideKey("cert-manager.io_Certificate") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "cert-manager.io/Certificate", key) key, err = convertToOverrideKey("Certificate") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Certificate", key) _, err = convertToOverrideKey("") - assert.Error(t, err) + require.Error(t, err) _, err = convertToOverrideKey("_") - assert.NoError(t, err) + require.NoError(t, err) } func TestGetResourceCompareOptions(t *testing.T) { @@ -572,7 +572,7 @@ func TestGetResourceCompareOptions(t *testing.T) { "resource.compareoptions": "ignoreAggregatedRoles: true", }) compareOptions, err := settingsManager.GetResourceCompareOptions() - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, compareOptions.IgnoreAggregatedRoles) } @@ -582,7 +582,7 @@ func TestGetResourceCompareOptions(t *testing.T) { "resource.compareoptions": "ignoreAggregatedRoles: false", }) compareOptions, err := settingsManager.GetResourceCompareOptions() - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, compareOptions.IgnoreAggregatedRoles) } @@ -592,7 +592,7 @@ func TestGetResourceCompareOptions(t *testing.T) { "resource.compareoptions": "ignoreDifferencesOnResourceUpdates: true", }) compareOptions, err := settingsManager.GetResourceCompareOptions() - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, compareOptions.IgnoreDifferencesOnResourceUpdates) } @@ -602,7 +602,7 @@ func TestGetResourceCompareOptions(t *testing.T) { "resource.compareoptions": "ignoreDifferencesOnResourceUpdates: false", }) compareOptions, err := settingsManager.GetResourceCompareOptions() - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, compareOptions.IgnoreDifferencesOnResourceUpdates) } @@ -613,7 +613,7 @@ func TestGetResourceCompareOptions(t *testing.T) { }) compareOptions, err := settingsManager.GetResourceCompareOptions() defaultOptions := GetDefaultDiffOptions() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, defaultOptions.IgnoreAggregatedRoles, compareOptions.IgnoreAggregatedRoles) assert.Equal(t, defaultOptions.IgnoreDifferencesOnResourceUpdates, compareOptions.IgnoreDifferencesOnResourceUpdates) } @@ -623,7 +623,7 @@ func TestGetResourceCompareOptions(t *testing.T) { _, settingsManager := fixtures(map[string]string{}) compareOptions, err := settingsManager.GetResourceCompareOptions() defaultOptions := GetDefaultDiffOptions() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, defaultOptions.IgnoreAggregatedRoles, compareOptions.IgnoreAggregatedRoles) assert.Equal(t, defaultOptions.IgnoreDifferencesOnResourceUpdates, compareOptions.IgnoreDifferencesOnResourceUpdates) } @@ -635,7 +635,7 @@ func TestSettingsManager_GetKustomizeBuildOptions(t *testing.T) { settings, err := settingsManager.GetKustomizeSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, settings.BuildOptions) assert.Empty(t, settings.Versions) }) @@ -647,7 +647,7 @@ func TestSettingsManager_GetKustomizeBuildOptions(t *testing.T) { options, err := settingsManager.GetKustomizeSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "foo", options.BuildOptions) assert.Equal(t, []KustomizeVersion{{Name: "v3.2.1", Path: "somePath"}}, options.Versions) }) @@ -665,7 +665,7 @@ func TestSettingsManager_GetKustomizeBuildOptions(t *testing.T) { got, err := settingsManager.GetKustomizeSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "--global true", got.BuildOptions) want := &KustomizeSettings{ BuildOptions: "--global true", @@ -695,7 +695,7 @@ func TestSettingsManager_GetKustomizeBuildOptions(t *testing.T) { }) got, err := settingsManager.GetKustomizeSettings() - assert.ErrorContains(t, err, "found duplicate kustomize version: v3.2.1") + require.ErrorContains(t, err, "found duplicate kustomize version: v3.2.1") assert.Empty(t, got) }) @@ -705,7 +705,7 @@ func TestSettingsManager_GetKustomizeBuildOptions(t *testing.T) { }) got, err := settingsManager.GetKustomizeSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, got) }) } @@ -724,14 +724,12 @@ func TestKustomizeSettings_GetOptions(t *testing.T) { _, err := settings.GetOptions(v1alpha1.ApplicationSource{ Kustomize: &v1alpha1.ApplicationSourceKustomize{Version: "v4"}, }) - assert.Error(t, err) + require.Error(t, err) }) t.Run("DefaultBuildOptions", func(t *testing.T) { ver, err := settings.GetOptions(v1alpha1.ApplicationSource{}) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) assert.Equal(t, "", ver.BinaryPath) assert.Equal(t, "--opt1 val1", ver.BuildOptions) }) @@ -740,9 +738,7 @@ func TestKustomizeSettings_GetOptions(t *testing.T) { ver, err := settings.GetOptions(v1alpha1.ApplicationSource{ Kustomize: &v1alpha1.ApplicationSourceKustomize{Version: "v2"}, }) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) assert.Equal(t, "path_v2", ver.BinaryPath) assert.Equal(t, "", ver.BuildOptions) }) @@ -751,9 +747,7 @@ func TestKustomizeSettings_GetOptions(t *testing.T) { ver, err := settings.GetOptions(v1alpha1.ApplicationSource{ Kustomize: &v1alpha1.ApplicationSourceKustomize{Version: "v3"}, }) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) assert.Equal(t, "path_v3", ver.BinaryPath) assert.Equal(t, "--opt2 val2", ver.BuildOptions) }) @@ -764,7 +758,7 @@ func TestGetGoogleAnalytics(t *testing.T) { "ga.trackingid": "123", }) ga, err := settingsManager.GetGoogleAnalytics() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "123", ga.TrackingID) assert.True(t, ga.AnonymizeUsers) } @@ -773,7 +767,7 @@ func TestSettingsManager_GetHelp(t *testing.T) { t.Run("Default", func(t *testing.T) { _, settingsManager := fixtures(nil) h, err := settingsManager.GetHelp() - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, h.ChatURL) assert.Empty(t, h.ChatText) }) @@ -783,7 +777,7 @@ func TestSettingsManager_GetHelp(t *testing.T) { "help.chatText": "bar", }) h, err := settingsManager.GetHelp() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "foo", h.ChatURL) assert.Equal(t, "bar", h.ChatText) }) @@ -792,7 +786,7 @@ func TestSettingsManager_GetHelp(t *testing.T) { "help.chatUrl": "foo", }) h, err := settingManager.GetHelp() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "foo", h.ChatURL) assert.Equal(t, "Chat now!", h.ChatText) }) @@ -801,7 +795,7 @@ func TestSettingsManager_GetHelp(t *testing.T) { "help.chatText": "bar", }) h, err := settingManager.GetHelp() - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, h.ChatURL) assert.Empty(t, h.ChatText) }) @@ -812,7 +806,7 @@ func TestSettingsManager_GetHelp(t *testing.T) { "help.download.unsupported": "nowhere", }) h, err := settingsManager.GetHelp() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, map[string]string{"darwin-amd64": "amd64-path", "linux-s390x": "s390x-path"}, h.BinaryURLs) }) } @@ -845,7 +839,7 @@ func TestSettingsManager_GetSettings(t *testing.T) { ) settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") s, err := settingsManager.GetSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, time.Hour*24, s.UserSessionDuration) }) t.Run("UserSessionDurationInvalidFormat", func(t *testing.T) { @@ -877,7 +871,7 @@ func TestSettingsManager_GetSettings(t *testing.T) { ) settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") s, err := settingsManager.GetSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, time.Hour*24, s.UserSessionDuration) }) t.Run("UserSessionDurationProvided", func(t *testing.T) { @@ -909,7 +903,7 @@ func TestSettingsManager_GetSettings(t *testing.T) { ) settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") s, err := settingsManager.GetSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, time.Hour*10, s.UserSessionDuration) }) } @@ -944,7 +938,7 @@ func TestGetOIDCConfig(t *testing.T) { ) settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") settings, err := settingsManager.GetSettings() - assert.NoError(t, err) + require.NoError(t, err) oidcConfig := settings.OIDCConfig() assert.NotNil(t, oidcConfig) @@ -964,10 +958,10 @@ func TestRedirectURL(t *testing.T) { for given, expected := range cases { settings := ArgoCDSettings{URL: given} redirectURL, err := settings.RedirectURL() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expected[0], redirectURL) dexRedirectURL, err := settings.DexRedirectURL() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expected[1], dexRedirectURL) } } @@ -988,7 +982,7 @@ func Test_validateExternalURL(t *testing.T) { if tt.errMsg != "" { assert.EqualError(t, err, tt.errMsg) } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } @@ -1024,7 +1018,7 @@ func TestGetOIDCSecretTrim(t *testing.T) { ) settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") settings, err := settingsManager.GetSettings() - assert.NoError(t, err) + require.NoError(t, err) oidcConfig := settings.OIDCConfig() assert.NotNil(t, oidcConfig) @@ -1080,7 +1074,7 @@ func Test_GetTLSConfiguration(t *testing.T) { ) settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") settings, err := settingsManager.GetSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, settings.CertificateIsExternal) assert.NotNil(t, settings.Certificate) assert.Contains(t, getCNFromCertificate(settings.Certificate), "localhost") @@ -1128,7 +1122,7 @@ func Test_GetTLSConfiguration(t *testing.T) { ) settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") settings, err := settingsManager.GetSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, settings.CertificateIsExternal) assert.NotNil(t, settings.Certificate) assert.Contains(t, getCNFromCertificate(settings.Certificate), "localhost") @@ -1173,7 +1167,7 @@ func Test_GetTLSConfiguration(t *testing.T) { ) settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") settings, err := settingsManager.GetSettings() - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "could not read from secret") assert.NotNil(t, settings) }) @@ -1209,7 +1203,7 @@ func Test_GetTLSConfiguration(t *testing.T) { ) settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") settings, err := settingsManager.GetSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, settings.CertificateIsExternal) assert.NotNil(t, settings.Certificate) assert.Contains(t, getCNFromCertificate(settings.Certificate), "Argo CD E2E") @@ -1221,21 +1215,21 @@ func TestDownloadArgoCDBinaryUrls(t *testing.T) { "help.download.darwin-amd64": "some-url", }) argoCDCM, err := settingsManager.getConfigMap() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "some-url", argoCDCM.Data["help.download.darwin-amd64"]) _, settingsManager = fixtures(map[string]string{ "help.download.linux-s390x": "some-url", }) argoCDCM, err = settingsManager.getConfigMap() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "some-url", argoCDCM.Data["help.download.linux-s390x"]) _, settingsManager = fixtures(map[string]string{ "help.download.unsupported": "some-url", }) argoCDCM, err = settingsManager.getConfigMap() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "some-url", argoCDCM.Data["help.download.unsupported"]) } @@ -1289,7 +1283,7 @@ requestedIDTokenClaims: {"groups": {"essential": true}}`, settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") settings, err := settingsManager.GetSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "mywebhooksecret", settings.WebhookGitHubSecret) oidcConfig := settings.OIDCConfig() @@ -1416,7 +1410,7 @@ func TestGetHelmSettings(t *testing.T) { settingsManager := NewSettingsManager(context.Background(), kubeClient, "default") helmSettings, err := settingsManager.GetHelmSettings() - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, tc.expected, helmSettings.ValuesFileSchemes) }) diff --git a/util/tls/tls_test.go b/util/tls/tls_test.go index b0038f1847abb..69f7f7f60ef7f 100644 --- a/util/tls/tls_test.go +++ b/util/tls/tls_test.go @@ -125,19 +125,19 @@ func TestGetTLSVersionByString(t *testing.T) { t.Run("Valid versions", func(t *testing.T) { for k, v := range tlsVersionByString { r, err := getTLSVersionByString(k) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, v, r) } }) t.Run("Invalid versions", func(t *testing.T) { _, err := getTLSVersionByString("1.4") - assert.Error(t, err) + require.Error(t, err) }) t.Run("Empty versions", func(t *testing.T) { r, err := getTLSVersionByString("") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, uint16(0), r) }) } @@ -147,7 +147,7 @@ func TestGetTLSCipherSuitesByString(t *testing.T) { for _, s := range tls.CipherSuites() { t.Run(fmt.Sprintf("Test for valid suite %s", s.Name), func(t *testing.T) { ids, err := getTLSCipherSuitesByString(s.Name) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, ids, 1) assert.Equal(t, s.ID, ids[0]) suites = append(suites, s.Name) @@ -156,14 +156,14 @@ func TestGetTLSCipherSuitesByString(t *testing.T) { t.Run("Test colon separated list", func(t *testing.T) { ids, err := getTLSCipherSuitesByString(strings.Join(suites, ":")) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, ids, len(suites)) }) suites = append([]string{"invalid"}, suites...) t.Run("Test invalid values", func(t *testing.T) { _, err := getTLSCipherSuitesByString(strings.Join(suites, ":")) - assert.Error(t, err) + require.Error(t, err) }) } @@ -187,21 +187,21 @@ func TestGenerate(t *testing.T) { t.Run("Invalid: No hosts specified", func(t *testing.T) { opts := CertOptions{Hosts: []string{}, Organization: "Acme", ValidFrom: time.Now(), ValidFor: 10 * time.Hour} _, _, err := generate(opts) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "hosts not supplied") }) t.Run("Invalid: No organization specified", func(t *testing.T) { opts := CertOptions{Hosts: []string{"localhost"}, Organization: "", ValidFrom: time.Now(), ValidFor: 10 * time.Hour} _, _, err := generate(opts) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "organization not supplied") }) t.Run("Invalid: Unsupported curve specified", func(t *testing.T) { opts := CertOptions{Hosts: []string{"localhost"}, Organization: "Acme", ECDSACurve: "Curve?", ValidFrom: time.Now(), ValidFor: 10 * time.Hour} _, _, err := generate(opts) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "Unrecognized elliptic curve") }) @@ -209,17 +209,17 @@ func TestGenerate(t *testing.T) { t.Run(fmt.Sprintf("Create certificate with curve %s", curve), func(t *testing.T) { opts := CertOptions{Hosts: []string{"localhost"}, Organization: "Acme", ECDSACurve: curve} _, _, err := generate(opts) - assert.NoError(t, err) + require.NoError(t, err) }) } t.Run("Create certificate with default options", func(t *testing.T) { opts := CertOptions{Hosts: []string{"localhost"}, Organization: "Acme"} certBytes, privKey, err := generate(opts) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, privKey) cert, err := x509.ParseCertificate(certBytes) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, cert) assert.Len(t, cert.DNSNames, 1) assert.Equal(t, "localhost", cert.DNSNames[0]) @@ -230,10 +230,10 @@ func TestGenerate(t *testing.T) { t.Run("Create certificate with IP ", func(t *testing.T) { opts := CertOptions{Hosts: []string{"localhost", "127.0.0.1"}, Organization: "Acme"} certBytes, privKey, err := generate(opts) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, privKey) cert, err := x509.ParseCertificate(certBytes) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, cert) assert.Len(t, cert.DNSNames, 1) assert.Equal(t, "localhost", cert.DNSNames[0]) @@ -245,10 +245,10 @@ func TestGenerate(t *testing.T) { t.Run("Create certificate with specific validity timeframe", func(t *testing.T) { opts := CertOptions{Hosts: []string{"localhost"}, Organization: "Acme", ValidFrom: time.Now().Add(1 * time.Hour)} certBytes, privKey, err := generate(opts) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, privKey) cert, err := x509.ParseCertificate(certBytes) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, cert) assert.GreaterOrEqual(t, (time.Now().Unix())+int64(1*time.Hour), cert.NotBefore.Unix()) }) @@ -258,10 +258,10 @@ func TestGenerate(t *testing.T) { validFrom, validFor := time.Now(), 365*24*time.Hour*time.Duration(year) opts := CertOptions{Hosts: []string{"localhost"}, Organization: "Acme", ValidFrom: validFrom, ValidFor: validFor} certBytes, privKey, err := generate(opts) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, privKey) cert, err := x509.ParseCertificate(certBytes) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, cert) t.Logf("certificate expiration time %s", cert.NotAfter) assert.Equal(t, validFrom.Unix()+int64(validFor.Seconds()), cert.NotAfter.Unix()) @@ -273,7 +273,7 @@ func TestGeneratePEM(t *testing.T) { t.Run("Invalid - PEM creation failure", func(t *testing.T) { opts := CertOptions{Hosts: nil, Organization: "Acme"} cert, key, err := generatePEM(opts) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, cert) assert.Nil(t, key) }) @@ -281,7 +281,7 @@ func TestGeneratePEM(t *testing.T) { t.Run("Create PEM from certficate options", func(t *testing.T) { opts := CertOptions{Hosts: []string{"localhost"}, Organization: "Acme"} cert, key, err := generatePEM(opts) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, cert) assert.NotNil(t, key) }) @@ -289,7 +289,7 @@ func TestGeneratePEM(t *testing.T) { t.Run("Create X509KeyPair", func(t *testing.T) { opts := CertOptions{Hosts: []string{"localhost"}, Organization: "Acme"} cert, err := GenerateX509KeyPair(opts) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, cert) }) } @@ -297,7 +297,7 @@ func TestGeneratePEM(t *testing.T) { func TestGetTLSConfigCustomizer(t *testing.T) { t.Run("Valid TLS customization", func(t *testing.T) { cfunc, err := getTLSConfigCustomizer(DefaultTLSMinVersion, DefaultTLSMaxVersion, DefaultTLSCipherSuite) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, cfunc) config := tls.Config{} cfunc(&config) @@ -307,7 +307,7 @@ func TestGetTLSConfigCustomizer(t *testing.T) { t.Run("Valid TLS customization - No cipher customization for TLSv1.3 only with default ciphers", func(t *testing.T) { cfunc, err := getTLSConfigCustomizer("1.3", "1.3", DefaultTLSCipherSuite) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, cfunc) config := tls.Config{} cfunc(&config) @@ -318,7 +318,7 @@ func TestGetTLSConfigCustomizer(t *testing.T) { t.Run("Valid TLS customization - No cipher customization for TLSv1.3 only with custom ciphers", func(t *testing.T) { cfunc, err := getTLSConfigCustomizer("1.3", "1.3", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, cfunc) config := tls.Config{} cfunc(&config) @@ -329,25 +329,25 @@ func TestGetTLSConfigCustomizer(t *testing.T) { t.Run("Invalid TLS customization - Min version higher than max version", func(t *testing.T) { cfunc, err := getTLSConfigCustomizer("1.3", "1.2", DefaultTLSCipherSuite) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, cfunc) }) t.Run("Invalid TLS customization - Invalid min version given", func(t *testing.T) { cfunc, err := getTLSConfigCustomizer("2.0", "1.2", DefaultTLSCipherSuite) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, cfunc) }) t.Run("Invalid TLS customization - Invalid max version given", func(t *testing.T) { cfunc, err := getTLSConfigCustomizer("1.2", "2.0", DefaultTLSCipherSuite) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, cfunc) }) t.Run("Invalid TLS customization - Unknown cipher suite given", func(t *testing.T) { cfunc, err := getTLSConfigCustomizer("1.3", "1.2", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:invalid") - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, cfunc) }) } diff --git a/util/webhook/webhook_test.go b/util/webhook/webhook_test.go index b6beb0f979df8..2e00e599fce40 100644 --- a/util/webhook/webhook_test.go +++ b/util/webhook/webhook_test.go @@ -29,6 +29,7 @@ import ( "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" @@ -80,7 +81,7 @@ func TestGitHubCommitEvent(t *testing.T) { req := httptest.NewRequest(http.MethodPost, "/api/webhook", nil) req.Header.Set("X-GitHub-Event", "push") eventJSON, err := os.ReadFile("testdata/github-commit-event.json") - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() h.Handler(w, req) @@ -96,7 +97,7 @@ func TestAzureDevOpsCommitEvent(t *testing.T) { req := httptest.NewRequest(http.MethodPost, "/api/webhook", nil) req.Header.Set("X-Vss-Activityid", "abc") eventJSON, err := os.ReadFile("testdata/azuredevops-git-push-event.json") - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() h.Handler(w, req) @@ -151,7 +152,7 @@ func TestGitHubCommitEvent_MultiSource_Refresh(t *testing.T) { req := httptest.NewRequest(http.MethodPost, "/api/webhook", nil) req.Header.Set("X-GitHub-Event", "push") eventJSON, err := os.ReadFile("testdata/github-commit-event.json") - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() h.Handler(w, req) @@ -232,7 +233,7 @@ func TestGitHubCommitEvent_AppsInOtherNamespaces(t *testing.T) { req := httptest.NewRequest("POST", "/api/webhook", nil) req.Header.Set("X-GitHub-Event", "push") eventJSON, err := os.ReadFile("testdata/github-commit-event.json") - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() h.Handler(w, req) @@ -264,7 +265,7 @@ func TestGitHubTagEvent(t *testing.T) { req := httptest.NewRequest(http.MethodPost, "/api/webhook", nil) req.Header.Set("X-GitHub-Event", "push") eventJSON, err := os.ReadFile("testdata/github-tag-event.json") - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() h.Handler(w, req) @@ -280,7 +281,7 @@ func TestGitHubPingEvent(t *testing.T) { req := httptest.NewRequest(http.MethodPost, "/api/webhook", nil) req.Header.Set("X-GitHub-Event", "ping") eventJSON, err := os.ReadFile("testdata/github-ping-event.json") - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() h.Handler(w, req) @@ -296,7 +297,7 @@ func TestBitbucketServerRepositoryReferenceChangedEvent(t *testing.T) { req := httptest.NewRequest(http.MethodPost, "/api/webhook", nil) req.Header.Set("X-Event-Key", "repo:refs_changed") eventJSON, err := os.ReadFile("testdata/bitbucket-server-event.json") - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() h.Handler(w, req) @@ -328,7 +329,7 @@ func TestGogsPushEvent(t *testing.T) { req := httptest.NewRequest(http.MethodPost, "/api/webhook", nil) req.Header.Set("X-Gogs-Event", "push") eventJSON, err := os.ReadFile("testdata/gogs-event.json") - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() h.Handler(w, req) @@ -344,7 +345,7 @@ func TestGitLabPushEvent(t *testing.T) { req := httptest.NewRequest(http.MethodPost, "/api/webhook", nil) req.Header.Set("X-Gitlab-Event", "Push Hook") eventJSON, err := os.ReadFile("testdata/gitlab-event.json") - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() h.Handler(w, req) @@ -360,7 +361,7 @@ func TestGitLabSystemEvent(t *testing.T) { req := httptest.NewRequest(http.MethodPost, "/api/webhook", nil) req.Header.Set("X-Gitlab-Event", "System Hook") eventJSON, err := os.ReadFile("testdata/gitlab-event.json") - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() h.Handler(w, req) @@ -596,7 +597,7 @@ func Test_getWebUrlRegex(t *testing.T) { t.Run(testCopy.name, func(t *testing.T) { t.Parallel() regexp, err := getWebUrlRegex(testCopy.webURL) - assert.NoError(t, err) + require.NoError(t, err) if matches := regexp.MatchString(testCopy.repo); matches != testCopy.shouldMatch { t.Errorf("sourceRevisionHasChanged() = %v, want %v", matches, testCopy.shouldMatch) } From e02519467c12f12776aa7638700f8938fdf58288 Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Fri, 14 Jun 2024 03:20:54 -1000 Subject: [PATCH 20/74] fix: minor ui fixes for repositories (#18648) * minor fixes Signed-off-by: Alexander Matyushentsev * fix: remove double import Signed-off-by: Blake Pettersson --------- Signed-off-by: Alexander Matyushentsev Signed-off-by: Blake Pettersson Co-authored-by: Alexander Matyushentsev --- server/repository/repository.go | 12 +++++++++--- .../settings/components/repos-list/repos-list.tsx | 14 ++++++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/server/repository/repository.go b/server/repository/repository.go index d65616147f147..5507b91bffb7f 100644 --- a/server/repository/repository.go +++ b/server/repository/repository.go @@ -4,8 +4,8 @@ import ( "context" "fmt" "reflect" - - "github.com/argoproj/argo-cd/v2/util/git" + "sort" + "strings" "github.com/argoproj/gitops-engine/pkg/utils/kube" "github.com/argoproj/gitops-engine/pkg/utils/text" @@ -27,6 +27,7 @@ import ( "github.com/argoproj/argo-cd/v2/util/argo" "github.com/argoproj/argo-cd/v2/util/db" "github.com/argoproj/argo-cd/v2/util/errors" + "github.com/argoproj/argo-cd/v2/util/git" "github.com/argoproj/argo-cd/v2/util/io" "github.com/argoproj/argo-cd/v2/util/rbac" "github.com/argoproj/argo-cd/v2/util/settings" @@ -208,6 +209,11 @@ func (s *Server) ListRepositories(ctx context.Context, q *repositorypkg.RepoQuer if err != nil { return nil, err } + sort.Slice(items, func(i, j int) bool { + first := items[i] + second := items[j] + return strings.Compare(fmt.Sprintf("%s/%s", first.Project, first.Repo), fmt.Sprintf("%s/%s", second.Project, second.Repo)) < 0 + }) return &appsv1.RepositoryList{Items: items}, nil } @@ -482,7 +488,7 @@ func (s *Server) DeleteRepository(ctx context.Context, q *repositorypkg.RepoQuer } // invalidate cache - if err := s.cache.SetRepoConnectionState(repo.Repo, repo.Project, nil); err == nil { + if err := s.cache.SetRepoConnectionState(repo.Repo, repo.Project, nil); err != nil { log.Errorf("error invalidating cache: %v", err) } diff --git a/ui/src/app/settings/components/repos-list/repos-list.tsx b/ui/src/app/settings/components/repos-list/repos-list.tsx index c2aedd630ee4f..86c8f26352050 100644 --- a/ui/src/app/settings/components/repos-list/repos-list.tsx +++ b/ui/src/app/settings/components/repos-list/repos-list.tsx @@ -287,8 +287,9 @@ export class ReposList extends React.Component<
TYPE
NAME
-
REPOSITORY
-
CONNECTION STATUS
+
PROJECT
+
REPOSITORY
+
CONNECTION STATUS
{repos.map(repo => ( @@ -309,14 +310,19 @@ export class ReposList extends React.Component< {repo.name}
-
+
+ + {repo.project} + +
+
-
+
{repo.connectionState.status} ( From 03e6f8ae3f19cdd9ba910bc88d421f519763b287 Mon Sep 17 00:00:00 2001 From: Ishita Sequeira <46771830+ishitasequeira@users.noreply.github.com> Date: Fri, 14 Jun 2024 10:11:52 -0400 Subject: [PATCH 21/74] chore: update docs and skip gpg tests on appset (#18637) Signed-off-by: ishitasequeira --- docs/user-guide/gpg-verification.md | 8 ++++---- test/e2e/applicationset_test.go | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/user-guide/gpg-verification.md b/docs/user-guide/gpg-verification.md index 07f9f474647b3..bf632cabdfbc5 100644 --- a/docs/user-guide/gpg-verification.md +++ b/docs/user-guide/gpg-verification.md @@ -17,8 +17,8 @@ allowed public key. By default, signature verification is enabled but not enforced. If you wish to completely disable the GnuPG functionality in ArgoCD, you have to set the environment variable `ARGOCD_GPG_ENABLED` to `"false"` in the pod templates of -the `argocd-server`, `argocd-repo-server` and `argocd-application-controller` -deployment manifests. +the `argocd-server`, `argocd-repo-server`, `argocd-application-controller` and +`argocd-applicationset-controller` deployment manifests. Verification of GnuPG signatures is only supported with Git repositories. It is not possible using Helm repositories. @@ -282,8 +282,8 @@ spec: The GnuPG feature can be completely disabled if desired. In order to disable it, set the environment variable `ARGOCD_GPG_ENABLED` to `false` for the pod -templates of the `argocd-server`, `argocd-repo-server` and - `argocd-application-controller` deployments. +templates of the `argocd-server`, `argocd-repo-server`, `argocd-application-controller` +and `argocd-applicationset-controller` deployments. After the pods have been restarted, the GnuPG feature is disabled. diff --git a/test/e2e/applicationset_test.go b/test/e2e/applicationset_test.go index 886a645027c20..08bcb83c7c577 100644 --- a/test/e2e/applicationset_test.go +++ b/test/e2e/applicationset_test.go @@ -1432,6 +1432,7 @@ func TestSimpleGitDirectoryGeneratorGoTemplate(t *testing.T) { } func TestSimpleGitDirectoryGeneratorGPGEnabledUnsignedCommits(t *testing.T) { + fixture.SkipOnEnv(t, "GPG") expectedErrorMessage := `error generating params from git: error getting directories from repo: error retrieving Git Directories: rpc error: code = Unknown desc = permission denied` expectedConditionsParamsError := []v1alpha1.ApplicationSetCondition{ { @@ -1531,6 +1532,7 @@ func TestSimpleGitDirectoryGeneratorGPGEnabledUnsignedCommits(t *testing.T) { } func TestSimpleGitDirectoryGeneratorGPGEnabledWithoutKnownKeys(t *testing.T) { + fixture.SkipOnEnv(t, "GPG") expectedErrorMessage := `error generating params from git: error getting directories from repo: error retrieving Git Directories: rpc error: code = Unknown desc = permission denied` expectedConditionsParamsError := []v1alpha1.ApplicationSetCondition{ { @@ -1748,6 +1750,7 @@ func TestSimpleGitFilesGenerator(t *testing.T) { } func TestSimpleGitFilesGeneratorGPGEnabledUnsignedCommits(t *testing.T) { + fixture.SkipOnEnv(t, "GPG") expectedErrorMessage := `error generating params from git: error retrieving Git files: rpc error: code = Unknown desc = permission denied` expectedConditionsParamsError := []v1alpha1.ApplicationSetCondition{ { @@ -1847,6 +1850,7 @@ func TestSimpleGitFilesGeneratorGPGEnabledUnsignedCommits(t *testing.T) { } func TestSimpleGitFilesGeneratorGPGEnabledWithoutKnownKeys(t *testing.T) { + fixture.SkipOnEnv(t, "GPG") expectedErrorMessage := `error generating params from git: error retrieving Git files: rpc error: code = Unknown desc = permission denied` expectedConditionsParamsError := []v1alpha1.ApplicationSetCondition{ { From 48eb7f3608b129c299f8e1a8eddbda2971c8f94e Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Fri, 14 Jun 2024 10:18:21 -0400 Subject: [PATCH 22/74] docs: Improve the FAQ (#12039) (#18645) * docs: Fix whitespace around after open paren in FAQ Signed-off-by: Josh Soref * docs: Fix trailing whitespace Signed-off-by: Josh Soref * docs: Fix grammar in FAQ wrt redis auth Signed-off-by: Josh Soref * docs: Fix FAQ markdown for turning off redis auth Signed-off-by: Josh Soref * docs: Start talking about manifest generation Signed-off-by: Josh Soref --------- Signed-off-by: Josh Soref --- docs/faq.md | 55 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/docs/faq.md b/docs/faq.md index 5ce6ca134ff1b..9dcbc7e8f1e0e 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -70,14 +70,14 @@ kubectl -n argocd patch secret argocd-secret \ ``` Another option is to delete both the `admin.password` and `admin.passwordMtime` keys and restart argocd-server. This -will generate a new password as per [the getting started guide](getting_started.md), so either to the name of the pod ( -Argo CD 1.8 and earlier) +will generate a new password as per [the getting started guide](getting_started.md), so either to the name of the pod +(Argo CD 1.8 and earlier) or a randomly generated password stored in a secret (Argo CD 1.9 and later). ## How to disable admin user? -Add `admin.enabled: "false"` to the `argocd-cm` ConfigMap ( -see [user management](./operator-manual/user-management/index.md)). +Add `admin.enabled: "false"` to the `argocd-cm` ConfigMap +(see [user management](./operator-manual/user-management/index.md)). ## Argo CD cannot deploy Helm Chart based applications without internet access, how can I solve it? @@ -110,8 +110,8 @@ to all manifest generators. ## I've configured [cluster secret](./operator-manual/declarative-setup.md#clusters) but it does not show up in CLI/UI, how do I fix it? Check if cluster secret has `argocd.argoproj.io/secret-type: cluster` label. If secret has the label but the cluster is -still not visible then make sure it might be a permission issue. Try to list clusters using `admin` user ( -e.g. `argocd login --username admin && argocd cluster list`). +still not visible then make sure it might be a permission issue. Try to list clusters using `admin` user +(e.g. `argocd login --username admin && argocd cluster list`). ## Argo CD is unable to connect to my cluster, how do I troubleshoot it? @@ -127,7 +127,7 @@ Now you can manually verify that cluster is accessible from the Argo CD pod. ## How Can I Terminate A Sync? -To terminate the sync, click on the "synchronisation" then "terminate": +To terminate the sync, click on the "synchronization" then "terminate": ![Synchronization](assets/synchronization-button.png) ![Terminate](assets/terminate-button.png) @@ -270,7 +270,7 @@ The most common instance of this error is with `env:` fields for `containers`. It's possible that your application is being generated by a tool in which case the duplication might not be evident within the scope of a single file. If you have trouble debugging this problem, consider filing a ticket to the owner of the generator tool asking them to improve its validation and error reporting. ## How to rotate Redis secret? -* Delete `argocd-redis` secret in the namespace where Argo CD is installed. +* Delete `argocd-redis` secret in the namespace where Argo CD is installed. ```bash kubectl delete secret argocd-redis -n ``` @@ -291,22 +291,35 @@ kubectl rollout restart statefulset argocd-application-controller ## How to turn off Redis auth if users really want to? -Argo CD default installation is now configured automatically enable Redis authentication. +Argo CD default installation is now configured to automatically enable Redis authentication. If for some reason authenticated Redis does not work for you and you want to use non-authenticated Redis, here are the steps: -* You need to have your own Redis installation. -* Configure Argo CD to use your own Redis instance. See this [doc](https://argo-cd.readthedocs.io/en/stable/operator-manual/argocd-cmd-params-cm-yaml/) for the Argo CD configuration. -* If you already installed Redis shipped with Argo CD, you also need to clean up the existing components: - * When HA Redis is used: - * kubectl delete deployment argocd-redis-ha-haproxy - * kubectl delete statefulset argocd-redis-ha-server - * When non-HA Redis is used: - * kubectl delete deployment argocd-redis -* Remove environment variable `REDIS_PASSWORD` from the following manifests - * Deployment: argocd-repo-server: +1. You need to have your own Redis installation. +2. Configure Argo CD to use your own Redis instance. See this [doc](https://argo-cd.readthedocs.io/en/stable/operator-manual/argocd-cmd-params-cm-yaml/) for the Argo CD configuration. +3. If you already installed Redis shipped with Argo CD, you also need to clean up the existing components: + + * When HA Redis is used: + + - kubectl delete deployment argocd-redis-ha-haproxy + - kubectl delete statefulset argocd-redis-ha-server + + * When non-HA Redis is used: + + - kubectl delete deployment argocd-redis + +4. Remove environment variable `REDIS_PASSWORD` from the following manifests: + * Deployment: argocd-repo-server * Deployment: argocd-server * StatefulSet: argocd-application-controller - + ## How do I provide my own Redis credentials? The Redis password is stored in Kubernetes secret `argocd-redis` with key `auth` in the namespace where Argo CD is installed. -You can config your secret provider to generate Kubernetes secret accordingly. \ No newline at end of file +You can config your secret provider to generate Kubernetes secret accordingly. + +## How do I fix `Manifest generation error (cached)`? + +`Manifest generation error (cached)` means that there was an error when generating manifests and that the error message has been cached to avoid runaway retries. + +Doing a hard refresh (ignoring the cached error) can overcome transient issues. But if there's an ongoing reason manifest generation is failing, a hard refresh will not help. + +Instead, try searching the repo-server logs for the app name in order to identify the error that is causing manifest generation to fail. From 2d5c59c94e1a3a91a6df79176bbabecc3163f696 Mon Sep 17 00:00:00 2001 From: Suraj yadav Date: Fri, 14 Jun 2024 22:07:46 +0530 Subject: [PATCH 23/74] fix(ui): dropdown-fixed in logs (#18470) * dropdown-fixed Signed-off-by: Surajyadav * removed-extra-css Signed-off-by: Surajyadav --------- Signed-off-by: Surajyadav --- .../components/pod-logs-viewer/pod-logs-viewer.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ui/src/app/applications/components/pod-logs-viewer/pod-logs-viewer.scss b/ui/src/app/applications/components/pod-logs-viewer/pod-logs-viewer.scss index bd7ffbf490771..99475527c1798 100644 --- a/ui/src/app/applications/components/pod-logs-viewer/pod-logs-viewer.scss +++ b/ui/src/app/applications/components/pod-logs-viewer/pod-logs-viewer.scss @@ -35,6 +35,12 @@ } } + .argo-field { + @include themify($themes){ + background-color: themed('background-2'); + } + } + margin-bottom: 1em; > * { From 1405413ac9e975631c19c63f15e39eaee8ca4b73 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:15:41 -0400 Subject: [PATCH 24/74] chore(deps): bump library/node from `f73cc32` to `5e4044f` in /ui-test (#18656) Bumps library/node from `f73cc32` to `5e4044f`. --- updated-dependencies: - dependency-name: library/node dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui-test/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-test/Dockerfile b/ui-test/Dockerfile index 1cf797164c21e..88bf92ec46261 100644 --- a/ui-test/Dockerfile +++ b/ui-test/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/library/node:22.3.0@sha256:f73cc32c7285fba333cc4fbe00d5ff8babf7ebfa6a2557ab22919bcfdff05f0e as node +FROM docker.io/library/node:22.3.0@sha256:5e4044ff6001d06e7748e35bfa4f80c73cf5f5a7360a1b782995e038a01b0585 as node RUN apt-get update && apt-get install --no-install-recommends -y \ software-properties-common From 57ee536f5f48c87acba583362a714edce6b41669 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:15:51 -0400 Subject: [PATCH 25/74] chore(deps): bump library/node from `f73cc32` to `5e4044f` (#18654) Bumps library/node from `f73cc32` to `5e4044f`. --- updated-dependencies: - dependency-name: library/node dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3eb8e14415550..8193138f550e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -83,7 +83,7 @@ WORKDIR /home/argocd #################################################################################################### # Argo CD UI stage #################################################################################################### -FROM --platform=$BUILDPLATFORM docker.io/library/node:22.3.0@sha256:f73cc32c7285fba333cc4fbe00d5ff8babf7ebfa6a2557ab22919bcfdff05f0e AS argocd-ui +FROM --platform=$BUILDPLATFORM docker.io/library/node:22.3.0@sha256:5e4044ff6001d06e7748e35bfa4f80c73cf5f5a7360a1b782995e038a01b0585 AS argocd-ui WORKDIR /src COPY ["ui/package.json", "ui/yarn.lock", "./"] From 57965576f01f77ade431b10c225e4509dd77b02b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:16:02 -0400 Subject: [PATCH 26/74] chore(deps): bump library/node in /test/container (#18651) Bumps library/node from `f73cc32` to `5e4044f`. --- updated-dependencies: - dependency-name: library/node dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/container/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/container/Dockerfile b/test/container/Dockerfile index 5ff49015bd112..6a015a50bade5 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -6,7 +6,7 @@ FROM docker.io/library/redis:7.2.5@sha256:01afb31d6d633451d84475ff3eb95f8c48bf0e RUN ln -s /usr/lib/$(uname -m)-linux-gnu /usr/lib/linux-gnu # Please make sure to also check the contained yarn version and update the references below when upgrading this image's version -FROM docker.io/library/node:22.3.0@sha256:f73cc32c7285fba333cc4fbe00d5ff8babf7ebfa6a2557ab22919bcfdff05f0e as node +FROM docker.io/library/node:22.3.0@sha256:5e4044ff6001d06e7748e35bfa4f80c73cf5f5a7360a1b782995e038a01b0585 as node FROM docker.io/library/golang:1.22.4@sha256:0f7691253e132744318ff4b02e0824fec9fa4f3b43b08afd1195599660d51521 as golang From 170d5431d3ba278896a0522c1860522f7aaec35a Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Fri, 14 Jun 2024 17:29:42 -0400 Subject: [PATCH 27/74] chore(deps): bump library/golang from `0f76912` to `a1dc408` (#18674) Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- Dockerfile | 4 ++-- test/container/Dockerfile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8193138f550e7..ac5f16db425a7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ ARG BASE_IMAGE=docker.io/library/ubuntu:24.04@sha256:3f85b7caad41a95462cf5b787d8 # Initial stage which pulls prepares build dependencies and CLI tooling we need for our final image # Also used as the image in CI jobs so needs all dependencies #################################################################################################### -FROM docker.io/library/golang:1.22.4@sha256:0f7691253e132744318ff4b02e0824fec9fa4f3b43b08afd1195599660d51521 AS builder +FROM docker.io/library/golang:1.22.4@sha256:a0679accac8685cc5389bd2298e045e570100940e6bdcca666a8ca7b32a1276c AS builder RUN echo 'deb http://archive.debian.org/debian buster-backports main' >> /etc/apt/sources.list @@ -101,7 +101,7 @@ RUN HOST_ARCH=$TARGETARCH NODE_ENV='production' NODE_ONLINE_ENV='online' NODE_OP #################################################################################################### # Argo CD Build stage which performs the actual build of Argo CD binaries #################################################################################################### -FROM --platform=$BUILDPLATFORM docker.io/library/golang:1.22.4@sha256:0f7691253e132744318ff4b02e0824fec9fa4f3b43b08afd1195599660d51521 AS argocd-build +FROM --platform=$BUILDPLATFORM docker.io/library/golang:1.22.4@sha256:a0679accac8685cc5389bd2298e045e570100940e6bdcca666a8ca7b32a1276c AS argocd-build WORKDIR /go/src/github.com/argoproj/argo-cd diff --git a/test/container/Dockerfile b/test/container/Dockerfile index 6a015a50bade5..71cbdaaad3f6f 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -8,7 +8,7 @@ RUN ln -s /usr/lib/$(uname -m)-linux-gnu /usr/lib/linux-gnu # Please make sure to also check the contained yarn version and update the references below when upgrading this image's version FROM docker.io/library/node:22.3.0@sha256:5e4044ff6001d06e7748e35bfa4f80c73cf5f5a7360a1b782995e038a01b0585 as node -FROM docker.io/library/golang:1.22.4@sha256:0f7691253e132744318ff4b02e0824fec9fa4f3b43b08afd1195599660d51521 as golang +FROM docker.io/library/golang:1.22.4@sha256:a0679accac8685cc5389bd2298e045e570100940e6bdcca666a8ca7b32a1276c as golang FROM docker.io/library/registry:2.8@sha256:4fac7a8257b1d7a86599043fcc181dfbdf9c8f57e337db763ac94b0e67c6cfb5 as registry From 2c0cc027c235c8d79dc0cefcdcee9eacce682648 Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Fri, 14 Jun 2024 17:35:58 -0400 Subject: [PATCH 28/74] docs(cli): remove docs for non-existing `argocd app set` flags (#18671) (#18673) Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- cmd/argocd/commands/app.go | 6 ------ docs/user-guide/commands/argocd_app_set.md | 6 ------ 2 files changed, 12 deletions(-) diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index b4d03c618692f..2218eb2163a54 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -746,12 +746,6 @@ func NewApplicationSetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Com # Set and validate application parameters for "my-app" argocd app set my-app --parameter key1=value1 --parameter key2=value2 --validate - # Set and override application parameters with JSON or YAML file - argocd app set my-app --from-file path/to/parameters.json - - # Set and override application parameters with a parameter file - argocd app set my-app --parameter-file path/to/parameter-file.yaml - # Set and override application parameters for a source at position 1 under spec.sources of app my-app. source-position starts at 1. argocd app set my-app --source-position 1 --repo https://github.com/argoproj/argocd-example-apps.git diff --git a/docs/user-guide/commands/argocd_app_set.md b/docs/user-guide/commands/argocd_app_set.md index f5180d41a1be7..077f9ed175c70 100644 --- a/docs/user-guide/commands/argocd_app_set.md +++ b/docs/user-guide/commands/argocd_app_set.md @@ -17,12 +17,6 @@ argocd app set APPNAME [flags] # Set and validate application parameters for "my-app" argocd app set my-app --parameter key1=value1 --parameter key2=value2 --validate - # Set and override application parameters with JSON or YAML file - argocd app set my-app --from-file path/to/parameters.json - - # Set and override application parameters with a parameter file - argocd app set my-app --parameter-file path/to/parameter-file.yaml - # Set and override application parameters for a source at position 1 under spec.sources of app my-app. source-position starts at 1. argocd app set my-app --source-position 1 --repo https://github.com/argoproj/argocd-example-apps.git From 0d1d1a1b18bc0b33b59ee971b379ffb85bfe2d19 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Fri, 14 Jun 2024 23:40:33 +0200 Subject: [PATCH 29/74] chore: extend require-error rule from testifylint (#18675) * chore: extend require-error rule from testifylint Signed-off-by: Matthieu MOREL * Update helm_test.go Signed-off-by: Matthieu MOREL --------- Signed-off-by: Matthieu MOREL --- .golangci.yaml | 2 +- util/grpc/errors_test.go | 3 +- util/grpc/logging_test.go | 7 ++- util/helm/client_test.go | 30 ++++----- util/helm/cmd_test.go | 15 ++--- util/helm/helm_test.go | 71 ++++++++++----------- util/helm/index_test.go | 19 +++--- util/helm/tags_test.go | 5 +- util/http/http_test.go | 15 ++--- util/io/bytereadseeker_test.go | 6 +- util/io/files/tar_test.go | 8 +-- util/io/path/resolved_test.go | 36 +++++------ util/kube/kube_test.go | 75 ++++++++++++----------- util/kustomize/kustomize_test.go | 58 +++++++++--------- util/lua/custom_actions_test.go | 23 +++---- util/lua/lua_test.go | 73 +++++++++++----------- util/notification/settings/legacy_test.go | 9 ++- 17 files changed, 227 insertions(+), 228 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 6f5e5dd7ae554..b6a274caf3f8b 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -7,7 +7,7 @@ issues: text: "require-error:" linters: - testifylint - - path: "util/(argo|cache|cert|clusterauth|config|db|dex|git|gpg|grpc|helm|http|io|kube|kustomize|lua|notification)/" + - path: "util/(argo|cache|cert|clusterauth|config|db|dex|git|gpg)/" text: "require-error:" linters: - testifylint diff --git a/util/grpc/errors_test.go b/util/grpc/errors_test.go index ee716a72f6342..b0decf4ba1151 100644 --- a/util/grpc/errors_test.go +++ b/util/grpc/errors_test.go @@ -11,11 +11,12 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_gitErrToGRPC(t *testing.T) { var ok bool - assert.NoError(t, gitErrToGRPC(nil)) + require.NoError(t, gitErrToGRPC(nil)) defaultErrorMsg := "default error" defaultError := gitErrToGRPC(errors.New(defaultErrorMsg)) diff --git a/util/grpc/logging_test.go b/util/grpc/logging_test.go index 4dea4b83075ec..98be425928b69 100644 --- a/util/grpc/logging_test.go +++ b/util/grpc/logging_test.go @@ -9,6 +9,7 @@ import ( "github.com/golang-jwt/jwt/v4" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc" "github.com/argoproj/argo-cd/v2/pkg/apiclient/account" @@ -33,7 +34,7 @@ func Test_JSONLogging(t *testing.T) { } interceptor := PayloadUnaryServerInterceptor(entry, false, decider) _, err := interceptor(c, req, info, handler) - assert.NoError(t, err) + require.NoError(t, err) out := buf.String() assert.Contains(t, out, fmt.Sprintf(`"grpc.request.content":{"name":"%s"`, req.Name)) @@ -64,7 +65,7 @@ func Test_logRequest(t *testing.T) { interceptor := PayloadUnaryServerInterceptor(entry, true, decider) _, err := interceptor(c, req, info, handler) - assert.NoError(t, err) + require.NoError(t, err) out := buf.String() assert.Contains(t, out, "expected-group-claim") @@ -81,7 +82,7 @@ func Test_logRequest(t *testing.T) { interceptor := PayloadUnaryServerInterceptor(entry, true, decider) _, err := interceptor(c, req, info, handler) - assert.NoError(t, err) + require.NoError(t, err) out := buf.String() assert.NotContains(t, out, "expected-group-claim") diff --git a/util/helm/client_test.go b/util/helm/client_test.go index 70cf77766d5a4..63e6e1805e47a 100644 --- a/util/helm/client_test.go +++ b/util/helm/client_test.go @@ -37,12 +37,12 @@ func TestIndex(t *testing.T) { t.Run("Invalid", func(t *testing.T) { client := NewClient("", Creds{}, false, "") _, err := client.GetIndex(false, 10000) - assert.Error(t, err) + require.Error(t, err) }) t.Run("Stable", func(t *testing.T) { client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "") index, err := client.GetIndex(false, 10000) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, index) }) t.Run("BasicAuth", func(t *testing.T) { @@ -51,7 +51,7 @@ func TestIndex(t *testing.T) { Password: "my-username", }, false, "") index, err := client.GetIndex(false, 10000) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, index) }) @@ -64,7 +64,7 @@ func TestIndex(t *testing.T) { client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "", WithIndexCache(&fakeIndexCache{data: data.Bytes()})) index, err := client.GetIndex(false, 10000) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, fakeIndex, *index) }) @@ -79,26 +79,26 @@ func TestIndex(t *testing.T) { func Test_nativeHelmChart_ExtractChart(t *testing.T) { client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "") path, closer, err := client.ExtractChart("argo-cd", "0.7.1", "", false, math.MaxInt64, true) - assert.NoError(t, err) + require.NoError(t, err) defer io.Close(closer) info, err := os.Stat(path) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, info.IsDir()) } func Test_nativeHelmChart_ExtractChartWithLimiter(t *testing.T) { client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "") _, _, err := client.ExtractChart("argo-cd", "0.7.1", "", false, 100, false) - assert.Error(t, err, "error while iterating on tar reader: unexpected EOF") + require.Error(t, err, "error while iterating on tar reader: unexpected EOF") } func Test_nativeHelmChart_ExtractChart_insecure(t *testing.T) { client := NewClient("https://argoproj.github.io/argo-helm", Creds{InsecureSkipVerify: true}, false, "") path, closer, err := client.ExtractChart("argo-cd", "0.7.1", "", false, math.MaxInt64, true) - assert.NoError(t, err) + require.NoError(t, err) defer io.Close(closer) info, err := os.Stat(path) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, info.IsDir()) } @@ -147,20 +147,20 @@ func TestGetIndexURL(t *testing.T) { want := rawURL + "/index.yaml" got, err := getIndexURL(rawURL) assert.Equal(t, want, got) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("URL with escaped characters", func(t *testing.T) { rawURL := fmt.Sprintf(urlTemplate, "mygroup%2Fmyproject") want := rawURL + "/index.yaml" got, err := getIndexURL(rawURL) assert.Equal(t, want, got) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("URL with invalid escaped characters", func(t *testing.T) { rawURL := fmt.Sprintf(urlTemplate, "mygroup%**myproject") got, err := getIndexURL(rawURL) assert.Equal(t, "", got) - assert.Error(t, err) + require.Error(t, err) }) } @@ -193,7 +193,7 @@ func TestGetTagsFromUrl(t *testing.T) { client := NewClient(server.URL, Creds{InsecureSkipVerify: true}, true, "") tags, err := client.GetTags("mychart", true) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, tags.Tags, []string{ "first", "second", @@ -246,7 +246,7 @@ func TestGetTagsFromURLPrivateRepoAuthentication(t *testing.T) { t.Cleanup(server.Close) serverURL, err := url.Parse(server.URL) - assert.NoError(t, err) + require.NoError(t, err) testCases := []struct { name string @@ -280,7 +280,7 @@ func TestGetTagsFromURLPrivateRepoAuthentication(t *testing.T) { tags, err := client.GetTags("mychart", true) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, tags.Tags, []string{ "2.8.0", "2.8.0-prerelease", diff --git a/util/helm/cmd_test.go b/util/helm/cmd_test.go index 772d32c78b8dd..0f2d6379f61c8 100644 --- a/util/helm/cmd_test.go +++ b/util/helm/cmd_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_cmd_redactor(t *testing.T) { @@ -15,35 +16,35 @@ func Test_cmd_redactor(t *testing.T) { func TestCmd_template_kubeVersion(t *testing.T) { cmd, err := NewCmdWithVersion(".", HelmV3, false, "") - assert.NoError(t, err) + require.NoError(t, err) s, err := cmd.template("testdata/redis", &TemplateOpts{ KubeVersion: "1.14", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, s) } func TestCmd_template_noApiVersionsInError(t *testing.T) { cmd, err := NewCmdWithVersion(".", HelmV3, false, "") - assert.NoError(t, err) + require.NoError(t, err) _, err = cmd.template("testdata/chart-does-not-exist", &TemplateOpts{ KubeVersion: "1.14", APIVersions: []string{"foo", "bar"}, }) - assert.Error(t, err) + require.Error(t, err) assert.NotContains(t, err.Error(), "--api-version") assert.ErrorContains(t, err, " ") } func TestNewCmd_helmV3(t *testing.T) { cmd, err := NewCmd(".", "v3", "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "helm", cmd.HelmVer.binaryName) } func TestNewCmd_helmDefaultVersion(t *testing.T) { cmd, err := NewCmd(".", "", "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "helm", cmd.HelmVer.binaryName) } @@ -55,6 +56,6 @@ func TestNewCmd_helmInvalidVersion(t *testing.T) { func TestNewCmd_withProxy(t *testing.T) { cmd, err := NewCmd(".", "", "https://proxy:8888") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "https://proxy:8888", cmd.proxy) } diff --git a/util/helm/helm_test.go b/util/helm/helm_test.go index 17e57914e7ce4..d63e0c3ed70f0 100644 --- a/util/helm/helm_test.go +++ b/util/helm/helm_test.go @@ -26,7 +26,7 @@ func template(h Helm, opts *TemplateOpts) ([]*unstructured.Unstructured, error) func TestHelmTemplateParams(t *testing.T) { h, err := NewHelmApp("./testdata/minio", []HelmRepository{}, false, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) opts := TemplateOpts{ Name: "test", Set: map[string]string{ @@ -38,14 +38,14 @@ func TestHelmTemplateParams(t *testing.T) { }, } objs, err := template(h, &opts) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, objs, 5) for _, obj := range objs { if obj.GetKind() == "Service" && obj.GetName() == "test-minio" { var svc apiv1.Service err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &svc) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, apiv1.ServiceTypeLoadBalancer, svc.Spec.Type) assert.Equal(t, int32(1234), svc.Spec.Ports[0].TargetPort.IntVal) assert.Equal(t, "true", svc.ObjectMeta.Annotations["prometheus.io/scrape"]) @@ -58,7 +58,7 @@ func TestHelmTemplateValues(t *testing.T) { repoRootAbs, err := filepath.Abs(repoRoot) require.NoError(t, err) h, err := NewHelmApp(repoRootAbs, []HelmRepository{}, false, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) valuesPath, _, err := path.ResolveValueFilePathOrUrl(repoRootAbs, repoRootAbs, "values-production.yaml", nil) require.NoError(t, err) opts := TemplateOpts{ @@ -66,14 +66,14 @@ func TestHelmTemplateValues(t *testing.T) { Values: []path.ResolvedFilePath{valuesPath}, } objs, err := template(h, &opts) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, objs, 8) for _, obj := range objs { if obj.GetKind() == "Deployment" && obj.GetName() == "test-redis-slave" { var dep appsv1.Deployment err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &dep) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int32(3), *dep.Spec.Replicas) } } @@ -84,9 +84,9 @@ func TestHelmGetParams(t *testing.T) { repoRootAbs, err := filepath.Abs(repoRoot) require.NoError(t, err) h, err := NewHelmApp(repoRootAbs, nil, false, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) params, err := h.GetParameters(nil, repoRootAbs, repoRootAbs) - assert.NoError(t, err) + require.NoError(t, err) slaveCountParam := params["cluster.slaveCount"] assert.Equal(t, "1", slaveCountParam) @@ -97,11 +97,11 @@ func TestHelmGetParamsValueFiles(t *testing.T) { repoRootAbs, err := filepath.Abs(repoRoot) require.NoError(t, err) h, err := NewHelmApp(repoRootAbs, nil, false, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) valuesPath, _, err := path.ResolveValueFilePathOrUrl(repoRootAbs, repoRootAbs, "values-production.yaml", nil) require.NoError(t, err) params, err := h.GetParameters([]path.ResolvedFilePath{valuesPath}, repoRootAbs, repoRootAbs) - assert.NoError(t, err) + require.NoError(t, err) slaveCountParam := params["cluster.slaveCount"] assert.Equal(t, "3", slaveCountParam) @@ -112,13 +112,13 @@ func TestHelmGetParamsValueFilesThatExist(t *testing.T) { repoRootAbs, err := filepath.Abs(repoRoot) require.NoError(t, err) h, err := NewHelmApp(repoRootAbs, nil, false, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) valuesMissingPath, _, err := path.ResolveValueFilePathOrUrl(repoRootAbs, repoRootAbs, "values-missing.yaml", nil) require.NoError(t, err) valuesProductionPath, _, err := path.ResolveValueFilePathOrUrl(repoRootAbs, repoRootAbs, "values-production.yaml", nil) require.NoError(t, err) params, err := h.GetParameters([]path.ResolvedFilePath{valuesMissingPath, valuesProductionPath}, repoRootAbs, repoRootAbs) - assert.NoError(t, err) + require.NoError(t, err) slaveCountParam := params["cluster.slaveCount"] assert.Equal(t, "3", slaveCountParam) @@ -126,17 +126,17 @@ func TestHelmGetParamsValueFilesThatExist(t *testing.T) { func TestHelmTemplateReleaseNameOverwrite(t *testing.T) { h, err := NewHelmApp("./testdata/redis", nil, false, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) objs, err := template(h, &TemplateOpts{Name: "my-release"}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, objs, 5) for _, obj := range objs { if obj.GetKind() == "StatefulSet" { var stateful appsv1.StatefulSet err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &stateful) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "my-release-redis-master", stateful.ObjectMeta.Name) } } @@ -144,16 +144,16 @@ func TestHelmTemplateReleaseNameOverwrite(t *testing.T) { func TestHelmTemplateReleaseName(t *testing.T) { h, err := NewHelmApp("./testdata/redis", nil, false, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) objs, err := template(h, &TemplateOpts{Name: "test"}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, objs, 5) for _, obj := range objs { if obj.GetKind() == "StatefulSet" { var stateful appsv1.StatefulSet err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &stateful) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test-redis-master", stateful.ObjectMeta.Name) } } @@ -174,7 +174,7 @@ func TestHelmArgCleaner(t *testing.T) { func TestVersion(t *testing.T) { ver, err := Version(false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, ver) } @@ -204,41 +204,32 @@ func Test_flatVals(t *testing.T) { func TestAPIVersions(t *testing.T) { h, err := NewHelmApp("./testdata/api-versions", nil, false, "", "", false) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) objs, err := template(h, &TemplateOpts{}) - if !assert.NoError(t, err) || !assert.Len(t, objs, 1) { - return - } + require.NoError(t, err) + require.Len(t, objs, 1) assert.Equal(t, "sample/v1", objs[0].GetAPIVersion()) objs, err = template(h, &TemplateOpts{APIVersions: []string{"sample/v2"}}) - if !assert.NoError(t, err) || !assert.Len(t, objs, 1) { - return - } + require.NoError(t, err) + require.Len(t, objs, 1) assert.Equal(t, "sample/v2", objs[0].GetAPIVersion()) } func TestSkipCrds(t *testing.T) { h, err := NewHelmApp("./testdata/crds", nil, false, "", "", false) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) objs, err := template(h, &TemplateOpts{SkipCrds: false}) - if !assert.NoError(t, err) || !assert.Len(t, objs, 1) { - return - } + require.NoError(t, err) + require.Len(t, objs, 1) objs, err = template(h, &TemplateOpts{}) - if !assert.NoError(t, err) || !assert.Len(t, objs, 1) { - return - } + require.NoError(t, err) + require.Len(t, objs, 1) objs, err = template(h, &TemplateOpts{SkipCrds: true}) - if !assert.NoError(t, err) || !assert.Empty(t, objs) { - return - } + require.NoError(t, err) + require.Empty(t, objs) } diff --git a/util/helm/index_test.go b/util/helm/index_test.go index e0a4932cbd3f9..c195710ff33cd 100644 --- a/util/helm/index_test.go +++ b/util/helm/index_test.go @@ -5,6 +5,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) var index = Index{ @@ -26,11 +27,11 @@ var index = Index{ func TestIndex_GetEntries(t *testing.T) { t.Run("NotFound", func(t *testing.T) { _, err := index.GetEntries("foo") - assert.EqualError(t, err, "chart 'foo' not found in index") + require.EqualError(t, err, "chart 'foo' not found in index") }) t.Run("Found", func(t *testing.T) { entries, err := index.GetEntries("argo-cd") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, entries, 9) }) } @@ -40,42 +41,42 @@ func TestEntries_MaxVersion(t *testing.T) { t.Run("NotFound", func(t *testing.T) { constraints, _ := semver.NewConstraint("0.8.1") _, err := entries.MaxVersion(constraints) - assert.EqualError(t, err, "constraint not found in index") + require.EqualError(t, err, "constraint not found in index") }) t.Run("Exact", func(t *testing.T) { constraints, _ := semver.NewConstraint("0.5.3") version, err := entries.MaxVersion(constraints) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, semver.MustParse("0.5.3"), version) }) t.Run("Constraint", func(t *testing.T) { constraints, _ := semver.NewConstraint("> 0.5.3") version, err := entries.MaxVersion(constraints) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, semver.MustParse("0.7.2"), version) }) t.Run("Constraint", func(t *testing.T) { constraints, _ := semver.NewConstraint("> 0.0.0") version, err := entries.MaxVersion(constraints) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, semver.MustParse("0.7.2"), version) }) t.Run("Constraint", func(t *testing.T) { constraints, _ := semver.NewConstraint(">0.5.0,<0.7.0") version, err := entries.MaxVersion(constraints) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, semver.MustParse("0.5.4"), version) }) t.Run("Constraint", func(t *testing.T) { constraints, _ := semver.NewConstraint("0.7.*") version, err := entries.MaxVersion(constraints) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, semver.MustParse("0.7.2"), version) }) t.Run("Constraint", func(t *testing.T) { constraints, _ := semver.NewConstraint("*") version, err := entries.MaxVersion(constraints) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, semver.MustParse("0.7.2"), version) }) } diff --git a/util/helm/tags_test.go b/util/helm/tags_test.go index b54cf92e5f425..6eb7cf902e63c 100644 --- a/util/helm/tags_test.go +++ b/util/helm/tags_test.go @@ -5,6 +5,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) var tags = TagsList{ @@ -30,13 +31,13 @@ func TestTagsList_MaxVersion(t *testing.T) { t.Run("Exact", func(t *testing.T) { constraints, _ := semver.NewConstraint("0.5.3") version, err := tags.MaxVersion(constraints) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, semver.MustParse("0.5.3"), version) }) t.Run("Constraint", func(t *testing.T) { constraints, _ := semver.NewConstraint("> 0.5.3") version, err := tags.MaxVersion(constraints) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, semver.MustParse("0.7.2"), version) }) } diff --git a/util/http/http_test.go b/util/http/http_test.go index f1f88677f6460..6421ce339fb27 100644 --- a/util/http/http_test.go +++ b/util/http/http_test.go @@ -6,16 +6,17 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestCookieMaxLength(t *testing.T) { cookies, err := MakeCookieMetadata("foo", "bar") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "foo=bar", cookies[0]) // keys will be of format foo, foo-1, foo-2 .. cookies, err = MakeCookieMetadata("foo", strings.Repeat("_", (maxCookieLength-5)*maxCookieNumber)) - assert.EqualError(t, err, "the authentication token is 81760 characters long and requires 21 cookies but the max number of cookies is 20. Contact your Argo CD administrator to increase the max number of cookies") + require.EqualError(t, err, "the authentication token is 81760 characters long and requires 21 cookies but the max number of cookies is 20. Contact your Argo CD administrator to increase the max number of cookies") assert.Empty(t, cookies) } @@ -23,14 +24,14 @@ func TestCookieWithAttributes(t *testing.T) { flags := []string{"SameSite=lax", "httpOnly"} cookies, err := MakeCookieMetadata("foo", "bar", flags...) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "foo=bar; SameSite=lax; httpOnly", cookies[0]) } func TestSplitCookie(t *testing.T) { cookieValue := strings.Repeat("_", (maxCookieLength-6)*4) cookies, err := MakeCookieMetadata("foo", cookieValue) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, cookies, 4) assert.Len(t, strings.Split(cookies[0], "="), 2) token := strings.Split(cookies[0], "=")[1] @@ -44,7 +45,7 @@ func TestSplitCookie(t *testing.T) { cookieList = append(cookieList, &http.Cookie{Name: parts[0], Value: parts[1]}) } token, err = JoinCookies("foo", cookieList) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, cookieValue, token) } @@ -73,7 +74,7 @@ func TestTransportWithHeader(t *testing.T) { RoundTripper: &TestRoundTripper{}, } resp, err := client.Do(req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, http.Header{ "Bar": []string{"req_1"}, "Foo": []string{"req_1"}, @@ -87,7 +88,7 @@ func TestTransportWithHeader(t *testing.T) { }, } resp, err = client.Do(req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, http.Header{ "Bar": []string{"req_1"}, "Foo": []string{"default_1", "default_2", "req_1"}, diff --git a/util/io/bytereadseeker_test.go b/util/io/bytereadseeker_test.go index b98f47b64bd20..cfaa1e9687720 100644 --- a/util/io/bytereadseeker_test.go +++ b/util/io/bytereadseeker_test.go @@ -17,7 +17,7 @@ func TestByteReadSeeker_Read(t *testing.T) { assert.Equal(t, len(inString), n) assert.Equal(t, inString, string(bytes)) _, err = reader.Read(bytes) - assert.ErrorIs(t, err, io.EOF) + require.ErrorIs(t, err, io.EOF) } func TestByteReadSeeker_Seek_Start(t *testing.T) { @@ -66,7 +66,7 @@ func TestByteReadSeeker_Seek_OutOfBounds(t *testing.T) { inString := "hello world" reader := NewByteReadSeeker([]byte(inString)) _, err := reader.Seek(12, io.SeekStart) - assert.Error(t, err) + require.Error(t, err) _, err = reader.Seek(-1, io.SeekStart) - assert.Error(t, err) + require.Error(t, err) } diff --git a/util/io/files/tar_test.go b/util/io/files/tar_test.go index d31e17ec78986..f8b140b5dc658 100644 --- a/util/io/files/tar_test.go +++ b/util/io/files/tar_test.go @@ -52,7 +52,7 @@ func TestTgz(t *testing.T) { // then assert.Equal(t, 3, filesWritten) - assert.NoError(t, err) + require.NoError(t, err) prepareRead(f) files, err := read(f.file) require.NoError(t, err) @@ -75,7 +75,7 @@ func TestTgz(t *testing.T) { // then assert.Equal(t, 2, filesWritten) - assert.NoError(t, err) + require.NoError(t, err) prepareRead(f) files, err := read(f.file) require.NoError(t, err) @@ -95,7 +95,7 @@ func TestTgz(t *testing.T) { // then assert.Equal(t, 1, filesWritten) - assert.NoError(t, err) + require.NoError(t, err) prepareRead(f) files, err := read(f.file) require.NoError(t, err) @@ -195,7 +195,7 @@ func TestUntgz(t *testing.T) { err := files.Untgz(destDir, tgzFile, math.MaxInt64, false) // then - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "illegal filepath in symlink") }) diff --git a/util/io/path/resolved_test.go b/util/io/path/resolved_test.go index afa7292fcca15..deecbec31055a 100644 --- a/util/io/path/resolved_test.go +++ b/util/io/path/resolved_test.go @@ -16,27 +16,27 @@ func Test_resolveSymlinkRecursive(t *testing.T) { } t.Run("Resolve non-symlink", func(t *testing.T) { r, err := resolveSymbolicLinkRecursive(testsDir+"/foo", 2) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testsDir+"/foo", r) }) t.Run("Successfully resolve symlink", func(t *testing.T) { r, err := resolveSymbolicLinkRecursive(testsDir+"/bar", 2) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testsDir+"/foo", r) }) t.Run("Do not allow symlink at all", func(t *testing.T) { r, err := resolveSymbolicLinkRecursive(testsDir+"/bar", 0) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "", r) }) t.Run("Error because too nested symlink", func(t *testing.T) { r, err := resolveSymbolicLinkRecursive(testsDir+"/bam", 2) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "", r) }) t.Run("No such file or directory", func(t *testing.T) { r, err := resolveSymbolicLinkRecursive(testsDir+"/foobar", 2) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testsDir+"/foobar", r) }) } @@ -99,19 +99,19 @@ var allowedRemoteProtocols = []string{"http", "https"} func Test_resolveFilePath(t *testing.T) { t.Run("Resolve normal relative path into absolute path", func(t *testing.T) { p, remote, err := ResolveValueFilePathOrUrl("/foo/bar", "/foo", "baz/bim.yaml", allowedRemoteProtocols) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, remote) assert.Equal(t, "/foo/bar/baz/bim.yaml", string(p)) }) t.Run("Resolve normal relative path into absolute path", func(t *testing.T) { p, remote, err := ResolveValueFilePathOrUrl("/foo/bar", "/foo", "baz/../../bim.yaml", allowedRemoteProtocols) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, remote) assert.Equal(t, "/foo/bim.yaml", string(p)) }) t.Run("Error on path resolving outside repository root", func(t *testing.T) { p, remote, err := ResolveValueFilePathOrUrl("/foo/bar", "/foo", "baz/../../../bim.yaml", allowedRemoteProtocols) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "outside repository root") assert.False(t, remote) assert.Equal(t, "", string(p)) @@ -119,26 +119,26 @@ func Test_resolveFilePath(t *testing.T) { t.Run("Return verbatim URL", func(t *testing.T) { url := "https://some.where/foo,yaml" p, remote, err := ResolveValueFilePathOrUrl("/foo/bar", "/foo", url, allowedRemoteProtocols) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, remote) assert.Equal(t, url, string(p)) }) t.Run("URL scheme not allowed", func(t *testing.T) { url := "file:///some.where/foo,yaml" p, remote, err := ResolveValueFilePathOrUrl("/foo/bar", "/foo", url, allowedRemoteProtocols) - assert.Error(t, err) + require.Error(t, err) assert.False(t, remote) assert.Equal(t, "", string(p)) }) t.Run("Implicit URL by absolute path", func(t *testing.T) { p, remote, err := ResolveValueFilePathOrUrl("/foo/bar", "/foo", "/baz.yaml", allowedRemoteProtocols) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, remote) assert.Equal(t, "/foo/baz.yaml", string(p)) }) t.Run("Relative app path", func(t *testing.T) { p, remote, err := ResolveValueFilePathOrUrl(".", "/foo", "/baz.yaml", allowedRemoteProtocols) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, remote) assert.Equal(t, "/foo/baz.yaml", string(p)) }) @@ -146,41 +146,41 @@ func Test_resolveFilePath(t *testing.T) { c, err := os.Getwd() require.NoError(t, err) p, remote, err := ResolveValueFilePathOrUrl(".", ".", "baz.yaml", allowedRemoteProtocols) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, remote) assert.Equal(t, c+"/baz.yaml", string(p)) }) t.Run("Overlapping root prefix without trailing slash", func(t *testing.T) { p, remote, err := ResolveValueFilePathOrUrl(".", "/foo", "../foo2/baz.yaml", allowedRemoteProtocols) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "outside repository root") assert.False(t, remote) assert.Equal(t, "", string(p)) }) t.Run("Overlapping root prefix with trailing slash", func(t *testing.T) { p, remote, err := ResolveValueFilePathOrUrl(".", "/foo/", "../foo2/baz.yaml", allowedRemoteProtocols) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "outside repository root") assert.False(t, remote) assert.Equal(t, "", string(p)) }) t.Run("Garbage input as values file", func(t *testing.T) { p, remote, err := ResolveValueFilePathOrUrl(".", "/foo/", "kfdj\\ks&&&321209.,---e32908923%$§!\"", allowedRemoteProtocols) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "outside repository root") assert.False(t, remote) assert.Equal(t, "", string(p)) }) t.Run("NUL-byte path input as values file", func(t *testing.T) { p, remote, err := ResolveValueFilePathOrUrl(".", "/foo/", "\000", allowedRemoteProtocols) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "outside repository root") assert.False(t, remote) assert.Equal(t, "", string(p)) }) t.Run("Resolve root path into absolute path - jsonnet library path", func(t *testing.T) { p, err := ResolveFileOrDirectoryPath("/foo", "/foo", "./") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "/foo", string(p)) }) } diff --git a/util/kube/kube_test.go b/util/kube/kube_test.go index 67f22fb9ca535..389a2d0f9870a 100644 --- a/util/kube/kube_test.go +++ b/util/kube/kube_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" apiv1 "k8s.io/api/core/v1" extv1beta1 "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -58,18 +59,18 @@ func TestSetLabels(t *testing.T) { for _, yamlStr := range []string{depWithoutSelector, depWithSelector} { var obj unstructured.Unstructured err := yaml.Unmarshal([]byte(yamlStr), &obj) - assert.NoError(t, err) + require.NoError(t, err) err = SetAppInstanceLabel(&obj, common.LabelKeyAppInstance, "my-app") - assert.NoError(t, err) + require.NoError(t, err) manifestBytes, err := json.MarshalIndent(obj.Object, "", " ") - assert.NoError(t, err) + require.NoError(t, err) log.Println(string(manifestBytes)) var depV1Beta1 extv1beta1.Deployment err = json.Unmarshal(manifestBytes, &depV1Beta1) - assert.NoError(t, err) + require.NoError(t, err) // the following makes sure we are not falling into legacy code which injects labels if yamlStr == depWithoutSelector { @@ -85,20 +86,20 @@ func TestSetLabels(t *testing.T) { func TestSetSvcLabel(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) err = SetAppInstanceLabel(&obj, common.LabelKeyAppInstance, "my-app") - assert.NoError(t, err) + require.NoError(t, err) manifestBytes, err := json.MarshalIndent(obj.Object, "", " ") - assert.NoError(t, err) + require.NoError(t, err) log.Println(string(manifestBytes)) var s apiv1.Service err = json.Unmarshal(manifestBytes, &s) - assert.NoError(t, err) + require.NoError(t, err) log.Println(s.Name) log.Println(s.ObjectMeta) @@ -114,20 +115,20 @@ func TestIsValidResourceName(t *testing.T) { func TestSetAppInstanceAnnotation(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) err = SetAppInstanceAnnotation(&obj, common.LabelKeyAppInstance, "my-app") - assert.NoError(t, err) + require.NoError(t, err) manifestBytes, err := json.MarshalIndent(obj.Object, "", " ") - assert.NoError(t, err) + require.NoError(t, err) log.Println(string(manifestBytes)) var s apiv1.Service err = json.Unmarshal(manifestBytes, &s) - assert.NoError(t, err) + require.NoError(t, err) log.Println(s.Name) log.Println(s.ObjectMeta) @@ -136,87 +137,87 @@ func TestSetAppInstanceAnnotation(t *testing.T) { func TestSetAppInstanceAnnotationWithInvalidData(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc-with-invalid-data.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) err = SetAppInstanceAnnotation(&obj, common.LabelKeyAppInstance, "my-app") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "failed to get annotations from target object /v1, Kind=Service /my-service: .metadata.annotations accessor error: contains non-string value in the map under key \"invalid-annotation\": is of the type , expected string", err.Error()) } func TestGetAppInstanceAnnotation(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) err = SetAppInstanceAnnotation(&obj, common.LabelKeyAppInstance, "my-app") - assert.NoError(t, err) + require.NoError(t, err) annotation, err := GetAppInstanceAnnotation(&obj, common.LabelKeyAppInstance) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "my-app", annotation) } func TestGetAppInstanceAnnotationWithInvalidData(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc-with-invalid-data.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) _, err = GetAppInstanceAnnotation(&obj, "valid-annotation") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "failed to get annotations from target object /v1, Kind=Service /my-service: .metadata.annotations accessor error: contains non-string value in the map under key \"invalid-annotation\": is of the type , expected string", err.Error()) } func TestGetAppInstanceLabel(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) err = SetAppInstanceLabel(&obj, common.LabelKeyAppInstance, "my-app") - assert.NoError(t, err) + require.NoError(t, err) label, err := GetAppInstanceLabel(&obj, common.LabelKeyAppInstance) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "my-app", label) } func TestGetAppInstanceLabelWithInvalidData(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc-with-invalid-data.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) _, err = GetAppInstanceLabel(&obj, "valid-label") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "failed to get labels for /v1, Kind=Service /my-service: .metadata.labels accessor error: contains non-string value in the map under key \"invalid-label\": is of the type , expected string", err.Error()) } func TestRemoveLabel(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) obj.SetLabels(map[string]string{"test": "value"}) err = RemoveLabel(&obj, "test") - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, obj.GetLabels()) } func TestRemoveLabelWithInvalidData(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc-with-invalid-data.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) err = RemoveLabel(&obj, "valid-label") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "failed to get labels for /v1, Kind=Service /my-service: .metadata.labels accessor error: contains non-string value in the map under key \"invalid-label\": is of the type , expected string", err.Error()) } diff --git a/util/kustomize/kustomize_test.go b/util/kustomize/kustomize_test.go index 7959bb31a7a2d..0178d6bb32bc4 100644 --- a/util/kustomize/kustomize_test.go +++ b/util/kustomize/kustomize_test.go @@ -39,7 +39,7 @@ func testDataDir(tb testing.TB, testData string) (string, error) { func TestKustomizeBuild(t *testing.T) { appPath, err := testDataDir(t, kustomization1) - assert.NoError(t, err) + require.NoError(t, err) namePrefix := "namePrefix-" nameSuffix := "-nameSuffix" namespace := "custom-namespace" @@ -73,7 +73,7 @@ func TestKustomizeBuild(t *testing.T) { }, } objs, images, err := kustomize.Build(&kustomizeSource, nil, env) - assert.NoError(t, err) + require.NoError(t, err) if err != nil { assert.Len(t, objs, 2) assert.Len(t, images, 2) @@ -125,7 +125,7 @@ func TestKustomizeBuild(t *testing.T) { func TestFailKustomizeBuild(t *testing.T) { appPath, err := testDataDir(t, kustomization1) - assert.NoError(t, err) + require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") kustomizeSource := v1alpha1.ApplicationSourceKustomize{ Replicas: []v1alpha1.KustomizeReplica{ @@ -147,7 +147,7 @@ func TestFindKustomization(t *testing.T) { func testFindKustomization(t *testing.T, set string, expected string) { kustomization, err := (&kustomize{path: "testdata/" + set}).findKustomization() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "testdata/"+set+"/"+expected, kustomization) } @@ -165,13 +165,13 @@ func TestParseKustomizeBuildOptions(t *testing.T) { func TestVersion(t *testing.T) { ver, err := Version(false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, ver) } func TestGetSemver(t *testing.T) { ver, err := getSemver() - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, ver) } @@ -224,14 +224,14 @@ func TestKustomizeBuildForceCommonLabels(t *testing.T) { } for _, tc := range testCases { appPath, err := testDataDir(t, tc.TestData) - assert.NoError(t, err) + require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") objs, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env) switch tc.ExpectErr { case true: - assert.Error(t, err) + require.Error(t, err) default: - assert.NoError(t, err) + require.NoError(t, err) if assert.Len(t, objs, 1) { assert.Equal(t, tc.ExpectedLabels, objs[0].GetLabels()) } @@ -316,14 +316,14 @@ func TestKustomizeBuildForceCommonAnnotations(t *testing.T) { } for _, tc := range testCases { appPath, err := testDataDir(t, tc.TestData) - assert.NoError(t, err) + require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") objs, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env) switch tc.ExpectErr { case true: - assert.Error(t, err) + require.Error(t, err) default: - assert.NoError(t, err) + require.NoError(t, err) if assert.Len(t, objs, 1) { assert.Equal(t, tc.ExpectedAnnotations, objs[0].GetAnnotations()) } @@ -383,22 +383,22 @@ func TestKustomizeLabelWithoutSelector(t *testing.T) { for _, tc := range testCases { appPath, err := testDataDir(t, tc.TestData) - assert.NoError(t, err) + require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") objs, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env) switch tc.ExpectErr { case true: - assert.Error(t, err) + require.Error(t, err) default: - assert.NoError(t, err) + require.NoError(t, err) if assert.Len(t, objs, 1) { obj := objs[0] sl, found, err := unstructured.NestedStringMap(obj.Object, "spec", "selector", "matchLabels") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, found) tl, found, err := unstructured.NestedStringMap(obj.Object, "spec", "template", "metadata", "labels") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, found) assert.Equal(t, tc.ExpectedMetadataLabels, obj.GetLabels()) assert.Equal(t, tc.ExpectedSelectorLabels, sl) @@ -410,9 +410,9 @@ func TestKustomizeLabelWithoutSelector(t *testing.T) { func TestKustomizeCustomVersion(t *testing.T) { appPath, err := testDataDir(t, kustomization1) - assert.NoError(t, err) + require.NoError(t, err) kustomizePath, err := testDataDir(t, kustomization4) - assert.NoError(t, err) + require.NoError(t, err) envOutputFile := kustomizePath + "/env_output" kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", kustomizePath+"/kustomize.special") kustomizeSource := v1alpha1.ApplicationSourceKustomize{ @@ -422,27 +422,27 @@ func TestKustomizeCustomVersion(t *testing.T) { &v1alpha1.EnvEntry{Name: "ARGOCD_APP_NAME", Value: "argo-cd-tests"}, } objs, images, err := kustomize.Build(&kustomizeSource, nil, env) - assert.NoError(t, err) + require.NoError(t, err) if err != nil { assert.Len(t, objs, 2) assert.Len(t, images, 2) } content, err := os.ReadFile(envOutputFile) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "ARGOCD_APP_NAME=argo-cd-tests\n", string(content)) } func TestKustomizeBuildComponents(t *testing.T) { appPath, err := testDataDir(t, kustomization6) - assert.NoError(t, err) + require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") kustomizeSource := v1alpha1.ApplicationSourceKustomize{ Components: []string{"./components"}, } objs, _, err := kustomize.Build(&kustomizeSource, nil, nil) - assert.NoError(t, err) + require.NoError(t, err) obj := objs[0] assert.Equal(t, "nginx-deployment", obj.GetName()) assert.Equal(t, map[string]string{ @@ -456,7 +456,7 @@ func TestKustomizeBuildComponents(t *testing.T) { func TestKustomizeBuildPatches(t *testing.T) { appPath, err := testDataDir(t, kustomization5) - assert.NoError(t, err) + require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") kustomizeSource := v1alpha1.ApplicationSourceKustomize{ @@ -475,10 +475,10 @@ func TestKustomizeBuildPatches(t *testing.T) { }, } objs, _, err := kustomize.Build(&kustomizeSource, nil, nil) - assert.NoError(t, err) + require.NoError(t, err) obj := objs[0] containers, found, err := unstructured.NestedSlice(obj.Object, "spec", "template", "spec", "containers") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, found) ports, found, err := unstructured.NestedSlice( @@ -486,7 +486,7 @@ func TestKustomizeBuildPatches(t *testing.T) { "ports", ) assert.True(t, found) - assert.NoError(t, err) + require.NoError(t, err) port, found, err := unstructured.NestedInt64( ports[0].(map[string]interface{}), @@ -494,7 +494,7 @@ func TestKustomizeBuildPatches(t *testing.T) { ) assert.True(t, found) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int64(443), port) name, found, err := unstructured.NestedString( @@ -502,6 +502,6 @@ func TestKustomizeBuildPatches(t *testing.T) { "name", ) assert.True(t, found) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test", name) } diff --git a/util/lua/custom_actions_test.go b/util/lua/custom_actions_test.go index 2b3039bb3fb54..04fe5eabe503c 100644 --- a/util/lua/custom_actions_test.go +++ b/util/lua/custom_actions_test.go @@ -9,6 +9,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "sigs.k8s.io/yaml" @@ -102,14 +103,14 @@ func TestLuaResourceActionsScript(t *testing.T) { if !strings.Contains(path, "action_test.yaml") { return nil } - assert.NoError(t, err) + require.NoError(t, err) dir := filepath.Dir(path) // TODO: Change to path yamlBytes, err := os.ReadFile(dir + "/action_test.yaml") - assert.NoError(t, err) + require.NoError(t, err) var resourceTest ActionTestStructure err = yaml.Unmarshal(yamlBytes, &resourceTest) - assert.NoError(t, err) + require.NoError(t, err) for i := range resourceTest.DiscoveryTests { test := resourceTest.DiscoveryTests[i] testName := fmt.Sprintf("discovery/%s", test.InputPath) @@ -119,9 +120,9 @@ func TestLuaResourceActionsScript(t *testing.T) { } obj := getObj(filepath.Join(dir, test.InputPath)) discoveryLua, err := vm.GetResourceActionDiscovery(obj) - assert.NoError(t, err) + require.NoError(t, err) result, err := vm.ExecuteResourceActionDiscovery(obj, discoveryLua) - assert.NoError(t, err) + require.NoError(t, err) for i := range result { assert.Contains(t, test.Result, result[i]) } @@ -141,11 +142,11 @@ func TestLuaResourceActionsScript(t *testing.T) { sourceObj := getObj(filepath.Join(dir, test.InputPath)) action, err := vm.GetResourceAction(sourceObj, test.Action) - assert.NoError(t, err) + require.NoError(t, err) - assert.NoError(t, err) + require.NoError(t, err) impactedResources, err := vm.ExecuteResourceAction(sourceObj, action.ActionLua) - assert.NoError(t, err) + require.NoError(t, err) // Treat the Lua expected output as a list expectedObjects := getExpectedObjectList(t, filepath.Join(dir, test.ExpectedOutputPath)) @@ -185,11 +186,11 @@ func TestLuaResourceActionsScript(t *testing.T) { } // Ideally, we would use a assert.Equal to detect the difference, but the Lua VM returns a object with float64 instead of the original int32. As a result, the assert.Equal is never true despite that the change has been applied. diffResult, err := diff.Diff(expectedObj, result, diff.WithNormalizer(testNormalizer{})) - assert.NoError(t, err) + require.NoError(t, err) if diffResult.Modified { t.Error("Output does not match input:") err = cli.PrintDiff(test.Action, expectedObj, result) - assert.NoError(t, err) + require.NoError(t, err) } } }) @@ -197,7 +198,7 @@ func TestLuaResourceActionsScript(t *testing.T) { return nil }) - assert.NoError(t, err) + require.NoError(t, err) } // Handling backward compatibility. diff --git a/util/lua/lua_test.go b/util/lua/lua_test.go index 33d5bc6056b6e..bcd1f644586d9 100644 --- a/util/lua/lua_test.go +++ b/util/lua/lua_test.go @@ -7,6 +7,7 @@ import ( "github.com/argoproj/gitops-engine/pkg/health" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" lua "github.com/yuin/gopher-lua" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "sigs.k8s.io/yaml" @@ -80,7 +81,7 @@ func TestExecuteNewHealthStatusFunction(t *testing.T) { testObj := StrToUnstructured(objJSON) vm := VM{} status, err := vm.ExecuteHealthLua(testObj, newHealthStatusFunction) - assert.NoError(t, err) + require.NoError(t, err) expectedHealthStatus := &health.HealthStatus{ Status: "Healthy", Message: "testMessage", @@ -92,7 +93,7 @@ func TestExecuteWildcardHealthStatusFunction(t *testing.T) { testObj := StrToUnstructured(ec2AWSCrossplaneObjJson) vm := VM{} status, err := vm.ExecuteHealthLua(testObj, newWildcardHealthStatusFunction) - assert.NoError(t, err) + require.NoError(t, err) expectedHealthStatus := &health.HealthStatus{ Status: "Healthy", Message: "testWildcardMessage", @@ -106,7 +107,7 @@ func TestFailExternalLibCall(t *testing.T) { testObj := StrToUnstructured(objJSON) vm := VM{} _, err := vm.ExecuteHealthLua(testObj, osLuaScript) - assert.Error(t, err, "") + require.Error(t, err, "") assert.IsType(t, &lua.ApiError{}, err) } @@ -128,7 +129,7 @@ func TestInvalidHealthStatusStatus(t *testing.T) { testObj := StrToUnstructured(objJSON) vm := VM{} status, err := vm.ExecuteHealthLua(testObj, invalidHealthStatusStatus) - assert.NoError(t, err) + require.NoError(t, err) expectedStatus := &health.HealthStatus{ Status: health.HealthStatusUnknown, Message: invalidHealthStatus, @@ -156,7 +157,7 @@ func TestGetHealthScriptWithOverride(t *testing.T) { }, } script, useOpenLibs, err := vm.GetHealthScript(testObj) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, useOpenLibs) assert.Equal(t, newHealthStatusFunction, script) } @@ -173,7 +174,7 @@ func TestGetHealthScriptWithKindWildcardOverride(t *testing.T) { } script, useOpenLibs, err := vm.GetHealthScript(testObj) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, useOpenLibs) assert.Equal(t, newHealthStatusFunction, script) } @@ -190,7 +191,7 @@ func TestGetHealthScriptWithGroupWildcardOverride(t *testing.T) { } script, useOpenLibs, err := vm.GetHealthScript(testObj) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, useOpenLibs) assert.Equal(t, newHealthStatusFunction, script) } @@ -207,7 +208,7 @@ func TestGetHealthScriptWithGroupAndKindWildcardOverride(t *testing.T) { } script, useOpenLibs, err := vm.GetHealthScript(testObj) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, useOpenLibs) assert.Equal(t, newHealthStatusFunction, script) } @@ -216,7 +217,7 @@ func TestGetHealthScriptPredefined(t *testing.T) { testObj := StrToUnstructured(objJSON) vm := VM{} script, useOpenLibs, err := vm.GetHealthScript(testObj) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, useOpenLibs) assert.NotEmpty(t, script) } @@ -225,7 +226,7 @@ func TestGetHealthScriptNoPredefined(t *testing.T) { testObj := StrToUnstructured(objWithNoScriptJSON) vm := VM{} script, useOpenLibs, err := vm.GetHealthScript(testObj) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, useOpenLibs) assert.Equal(t, "", script) } @@ -235,7 +236,7 @@ func TestGetResourceActionPredefined(t *testing.T) { vm := VM{} action, err := vm.GetResourceAction(testObj, "resume") - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, action) } @@ -243,7 +244,7 @@ func TestGetResourceActionNoPredefined(t *testing.T) { testObj := StrToUnstructured(objWithNoScriptJSON) vm := VM{} action, err := vm.GetResourceAction(testObj, "test") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, action.ActionLua) } @@ -266,7 +267,7 @@ func TestGetResourceActionWithOverride(t *testing.T) { }, } action, err := vm.GetResourceAction(testObj, "test") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, test, action) } @@ -275,7 +276,7 @@ func TestGetResourceActionDiscoveryPredefined(t *testing.T) { vm := VM{} discoveryLua, err := vm.GetResourceActionDiscovery(testObj) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, discoveryLua) } @@ -283,7 +284,7 @@ func TestGetResourceActionDiscoveryNoPredefined(t *testing.T) { testObj := StrToUnstructured(objWithNoScriptJSON) vm := VM{} discoveryLua, err := vm.GetResourceActionDiscovery(testObj) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, discoveryLua) } @@ -299,7 +300,7 @@ func TestGetResourceActionDiscoveryWithOverride(t *testing.T) { }, } discoveryLua, err := vm.GetResourceActionDiscovery(testObj) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, validDiscoveryLua, discoveryLua) } @@ -319,7 +320,7 @@ func TestExecuteResourceActionDiscovery(t *testing.T) { testObj := StrToUnstructured(objJSON) vm := VM{} actions, err := vm.ExecuteResourceActionDiscovery(testObj, validDiscoveryLua) - assert.NoError(t, err) + require.NoError(t, err) expectedActions := []appv1.ResourceAction{ { Name: "resume", @@ -347,7 +348,7 @@ func TestExecuteResourceActionDiscoveryInvalidResourceAction(t *testing.T) { testObj := StrToUnstructured(objJSON) vm := VM{} actions, err := vm.ExecuteResourceActionDiscovery(testObj, discoveryLuaWithInvalidResourceAction) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, actions) } @@ -361,7 +362,7 @@ func TestExecuteResourceActionDiscoveryInvalidReturn(t *testing.T) { vm := VM{} actions, err := vm.ExecuteResourceActionDiscovery(testObj, invalidDiscoveryLua) assert.Nil(t, actions) - assert.Error(t, err) + require.Error(t, err) } const validActionLua = ` @@ -387,7 +388,7 @@ func TestExecuteOldStyleResourceAction(t *testing.T) { expectedLuaUpdatedObj := StrToUnstructured(expectedLuaUpdatedResult) vm := VM{} newObjects, err := vm.ExecuteResourceAction(testObj, validActionLua) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, newObjects, 1) assert.Equal(t, newObjects[0].K8SOperation, K8SOperation("patch")) assert.Equal(t, expectedLuaUpdatedObj, newObjects[0].UnstructuredObj) @@ -554,39 +555,39 @@ return result func TestExecuteNewStyleCreateActionSingleResource(t *testing.T) { testObj := StrToUnstructured(cronJobObjYaml) jsonBytes, err := yaml.YAMLToJSON([]byte(expectedCreatedJobObjList)) - assert.NoError(t, err) + require.NoError(t, err) t.Log(bytes.NewBuffer(jsonBytes).String()) expectedObjects, err := UnmarshalToImpactedResources(bytes.NewBuffer(jsonBytes).String()) - assert.NoError(t, err) + require.NoError(t, err) vm := VM{} newObjects, err := vm.ExecuteResourceAction(testObj, createJobActionLua) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedObjects, newObjects) } func TestExecuteNewStyleCreateActionMultipleResources(t *testing.T) { testObj := StrToUnstructured(cronJobObjYaml) jsonBytes, err := yaml.YAMLToJSON([]byte(expectedCreatedMultipleJobsObjList)) - assert.NoError(t, err) + require.NoError(t, err) // t.Log(bytes.NewBuffer(jsonBytes).String()) expectedObjects, err := UnmarshalToImpactedResources(bytes.NewBuffer(jsonBytes).String()) - assert.NoError(t, err) + require.NoError(t, err) vm := VM{} newObjects, err := vm.ExecuteResourceAction(testObj, createMultipleJobsActionLua) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedObjects, newObjects) } func TestExecuteNewStyleActionMixedOperationsOk(t *testing.T) { testObj := StrToUnstructured(cronJobObjYaml) jsonBytes, err := yaml.YAMLToJSON([]byte(expectedActionMixedOperationObjList)) - assert.NoError(t, err) + require.NoError(t, err) // t.Log(bytes.NewBuffer(jsonBytes).String()) expectedObjects, err := UnmarshalToImpactedResources(bytes.NewBuffer(jsonBytes).String()) - assert.NoError(t, err) + require.NoError(t, err) vm := VM{} newObjects, err := vm.ExecuteResourceAction(testObj, mixedOperationActionLuaOk) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedObjects, newObjects) } @@ -594,7 +595,7 @@ func TestExecuteNewStyleActionMixedOperationsFailure(t *testing.T) { testObj := StrToUnstructured(cronJobObjYaml) vm := VM{} _, err := vm.ExecuteResourceAction(testObj, createMixedOperationActionLuaFailing) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "unsupported operation") } @@ -614,7 +615,7 @@ func TestExecuteResourceActionInvalidUnstructured(t *testing.T) { testObj := StrToUnstructured(objJSON) vm := VM{} _, err := vm.ExecuteResourceAction(testObj, invalidTableReturn) - assert.Error(t, err) + require.Error(t, err) } const objWithEmptyStruct = ` @@ -669,7 +670,7 @@ func TestCleanPatch(t *testing.T) { expectedObj := StrToUnstructured(expectedUpdatedObjWithEmptyStruct) vm := VM{} newObjects, err := vm.ExecuteResourceAction(testObj, pausedToFalseLua) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, newObjects, 1) assert.Equal(t, newObjects[0].K8SOperation, K8SOperation("patch")) assert.Equal(t, expectedObj, newObjects[0].UnstructuredObj) @@ -718,7 +719,7 @@ return hs` testObj := StrToUnstructured(testSA) overrides := getHealthOverride(true) status, err := overrides.GetResourceHealth(testObj) - assert.NoError(t, err) + require.NoError(t, err) expectedStatus := &health.HealthStatus{ Status: health.HealthStatusHealthy, Message: "Standard lib was used", @@ -732,7 +733,7 @@ return hs` status, err := overrides.GetResourceHealth(testObj) assert.IsType(t, &lua.ApiError{}, err) expectedErr := ":4: attempt to index a non-table object(nil) with key 'find'\nstack traceback:\n\t:4: in main chunk\n\t[G]: ?" - assert.EqualError(t, err, expectedErr) + require.EqualError(t, err, expectedErr) assert.Nil(t, status) }) @@ -740,7 +741,7 @@ return hs` testObj := StrToUnstructured(ec2AWSCrossplaneObjJson) overrides := getWildcardHealthOverride status, err := overrides.GetResourceHealth(testObj) - assert.NoError(t, err) + require.NoError(t, err) expectedStatus := &health.HealthStatus{ Status: health.HealthStatusHealthy, } @@ -751,7 +752,7 @@ return hs` testObj := StrToUnstructured(testSA) overrides := getWildcardHealthOverride status, err := overrides.GetResourceHealth(testObj) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, status) }) } diff --git a/util/notification/settings/legacy_test.go b/util/notification/settings/legacy_test.go index 1c7284371c288..00565767c38a5 100644 --- a/util/notification/settings/legacy_test.go +++ b/util/notification/settings/legacy_test.go @@ -8,6 +8,7 @@ import ( "github.com/argoproj/notifications-engine/pkg/subscriptions" "github.com/argoproj/notifications-engine/pkg/triggers" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" ) @@ -38,7 +39,7 @@ triggers: &v1.ConfigMap{Data: map[string]string{"config.yaml": configYAML}}, &v1.Secret{Data: map[string][]byte{}}, ) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []string{"my-trigger1"}, cfg.DefaultTriggers) } @@ -85,7 +86,7 @@ slack: &v1.Secret{Data: map[string][]byte{"notifiers.yaml": []byte(notifiersYAML)}}, ) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, map[string]services.Notification{ "my-template1": {Message: "bar"}, "my-template2": {Message: "foo"}, @@ -101,9 +102,7 @@ slack: }}, cfg.Triggers["my-trigger2"]) label, err := labels.Parse("test=true") - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) assert.Equal(t, subscriptions.DefaultSubscriptions([]subscriptions.DefaultSubscription{ {Triggers: []string{"my-trigger2"}, Selector: label}, }), cfg.Subscriptions) From cc700df89bef3e0ca2dc4db42b4cbd120de34b38 Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Fri, 14 Jun 2024 19:42:37 -0400 Subject: [PATCH 30/74] chore(ci): only test four latest k8s versions (#18676) Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- .github/workflows/ci-build.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci-build.yaml b/.github/workflows/ci-build.yaml index e45ad69230831..ac98529340eaf 100644 --- a/.github/workflows/ci-build.yaml +++ b/.github/workflows/ci-build.yaml @@ -399,8 +399,6 @@ jobs: latest: false - version: v1.26.13 latest: false - - version: v1.25.16 - latest: false needs: - build-go - changes From e3fa52dd83838006414690740ac31667688988a1 Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Fri, 14 Jun 2024 20:44:19 -0400 Subject: [PATCH 31/74] chore: bump version (#18677) Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 46b81d815a23b..d8b698973a491 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.11.0 +2.12.0 From eac08dcf79ad432b5ce8ef19777483338cac9853 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Sat, 15 Jun 2024 19:51:18 +0200 Subject: [PATCH 32/74] chore: extend require-error rule from testifylint (#18681) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 4 - util/argo/argo_test.go | 68 +++++------ util/argo/diff/diff_test.go | 2 +- .../argo/managedfields/managed_fields_test.go | 18 +-- util/argo/normalizers/diff_normalizer_test.go | 72 ++++++------ .../normalizers/knowntypes_normalizer_test.go | 104 +++++------------ util/argo/resource_tracking_test.go | 85 +++++++------- util/cache/appstate/cache_test.go | 11 +- util/cache/cache_test.go | 25 ++-- util/cache/client_test.go | 5 +- util/cache/inmemory_test.go | 5 +- util/cache/redis_test.go | 33 +++--- util/cert/cert_test.go | 57 +++++----- util/clusterauth/clusterauth_test.go | 41 +++---- util/config/reader_test.go | 5 +- util/db/certificate_test.go | 77 ++++++------- util/db/cluster_test.go | 28 ++--- util/db/db_test.go | 83 +++++++------- util/db/gpgkeys_test.go | 51 +++++---- util/db/repository_secrets_test.go | 85 +++++++------- util/db/repository_test.go | 39 +++---- util/dex/dex_test.go | 35 +++--- util/git/client_test.go | 26 ++--- util/git/creds_test.go | 16 +-- util/git/git_test.go | 107 +++++++++--------- util/gpg/gpg_test.go | 82 +++++++------- 26 files changed, 561 insertions(+), 603 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index b6a274caf3f8b..de8611c08c4f4 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -7,10 +7,6 @@ issues: text: "require-error:" linters: - testifylint - - path: "util/(argo|cache|cert|clusterauth|config|db|dex|git|gpg)/" - text: "require-error:" - linters: - - testifylint max-issues-per-linter: 0 max-same-issues: 0 linters: diff --git a/util/argo/argo_test.go b/util/argo/argo_test.go index f10534b83e246..885504d9c9ffa 100644 --- a/util/argo/argo_test.go +++ b/util/argo/argo_test.go @@ -42,7 +42,7 @@ func TestRefreshApp(t *testing.T) { appClientset := appclientset.NewSimpleClientset(&testApp) appIf := appClientset.ArgoprojV1alpha1().Applications("default") _, err := RefreshApp(appIf, "test-app", argoappv1.RefreshTypeNormal) - assert.NoError(t, err) + require.NoError(t, err) // For some reason, the fake Application interface doesn't reflect the patch status after Patch(), // so can't verify it was set in unit tests. //_, ok := newApp.Annotations[common.AnnotationKeyRefresh] @@ -82,7 +82,7 @@ func TestGetAppProjectWithNoProjDefined(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), kubeClient, test.FakeArgoCDNamespace) argoDB := db.NewDB("default", settingsMgr, kubeClient) proj, err := GetAppProject(&testApp, applisters.NewAppProjectLister(informer.GetIndexer()), namespace, settingsMgr, argoDB, ctx) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, proj.Name, projName) } @@ -283,7 +283,7 @@ func TestValidatePermissionsEmptyDestination(t *testing.T) { Destinations: []argoappv1.ApplicationDestination{{Server: "*", Namespace: "*"}}, }, }, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, conditions, []argoappv1.ApplicationCondition{{Type: argoappv1.ApplicationConditionInvalidSpecError, Message: "Destination server missing from app spec"}}) } @@ -305,7 +305,7 @@ func TestValidateChartWithoutRevision(t *testing.T) { Destinations: []argoappv1.ApplicationDestination{{Server: "*", Namespace: "*"}}, }, }, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Equal(t, argoappv1.ApplicationConditionInvalidSpecError, conditions[0].Type) assert.Equal(t, "spec.source.targetRevision is required if the manifest source is a helm chart", conditions[0].Message) @@ -332,7 +332,7 @@ func TestAPIResourcesToStrings(t *testing.T) { func TestValidateRepo(t *testing.T) { repoPath, err := filepath.Abs("./../..") - assert.NoError(t, err) + require.NoError(t, err) apiResources := []kube.APIResourceInfo{{ GroupVersionResource: schema.GroupVersionResource{Group: "apps", Version: "v1beta1"}, @@ -428,7 +428,7 @@ func TestValidateRepo(t *testing.T) { conditions, err := ValidateRepo(context.Background(), app, repoClientSet, db, &kubetest.MockKubectlCmd{Version: kubeVersion, APIResources: apiResources}, proj, settingsMgr) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, conditions) assert.ElementsMatch(t, []string{"apps/v1beta1", "apps/v1beta1/Deployment", "apps/v1beta2", "apps/v1beta2/Deployment"}, receivedRequest.ApiVersions) assert.Equal(t, kubeVersion, receivedRequest.KubeVersion) @@ -615,7 +615,7 @@ func TestValidatePermissions(t *testing.T) { proj := argoappv1.AppProject{} db := &dbmocks.ArgoDB{} conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Equal(t, argoappv1.ApplicationConditionInvalidSpecError, conditions[0].Type) assert.Contains(t, conditions[0].Message, "are required") @@ -632,7 +632,7 @@ func TestValidatePermissions(t *testing.T) { proj := argoappv1.AppProject{} db := &dbmocks.ArgoDB{} conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Equal(t, argoappv1.ApplicationConditionInvalidSpecError, conditions[0].Type) assert.Contains(t, conditions[0].Message, "are required") @@ -649,7 +649,7 @@ func TestValidatePermissions(t *testing.T) { proj := argoappv1.AppProject{} db := &dbmocks.ArgoDB{} conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Equal(t, argoappv1.ApplicationConditionInvalidSpecError, conditions[0].Type) assert.Contains(t, conditions[0].Message, "is required if the manifest source is a helm chart") @@ -683,7 +683,7 @@ func TestValidatePermissions(t *testing.T) { db := &dbmocks.ArgoDB{} db.On("GetCluster", context.Background(), spec.Destination.Server).Return(cluster, nil) conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Contains(t, conditions[0].Message, "application repo http://some/where is not permitted") }) @@ -716,7 +716,7 @@ func TestValidatePermissions(t *testing.T) { db := &dbmocks.ArgoDB{} db.On("GetCluster", context.Background(), spec.Destination.Server).Return(cluster, nil) conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Contains(t, conditions[0].Message, "application destination") }) @@ -748,7 +748,7 @@ func TestValidatePermissions(t *testing.T) { db := &dbmocks.ArgoDB{} db.On("GetCluster", context.Background(), spec.Destination.Server).Return(nil, status.Errorf(codes.NotFound, "Cluster does not exist")) conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Contains(t, conditions[0].Message, "has not been configured") }) @@ -780,7 +780,7 @@ func TestValidatePermissions(t *testing.T) { db := &dbmocks.ArgoDB{} db.On("GetClusterServersByName", context.Background(), "does-not-exist").Return(nil, nil) conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Contains(t, conditions[0].Message, "unable to find destination server: there are no clusters with this name: does-not-exist") }) @@ -812,7 +812,7 @@ func TestValidatePermissions(t *testing.T) { db := &dbmocks.ArgoDB{} db.On("GetCluster", context.Background(), spec.Destination.Server).Return(nil, fmt.Errorf("Unknown error occurred")) _, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.Error(t, err) + require.Error(t, err) }) t.Run("Destination cluster name resolves to valid server", func(t *testing.T) { @@ -847,7 +847,7 @@ func TestValidatePermissions(t *testing.T) { db.On("GetClusterServersByName", context.Background(), "does-exist").Return([]string{"https://127.0.0.1:6443"}, nil) db.On("GetCluster", context.Background(), "https://127.0.0.1:6443").Return(&cluster, nil) conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, conditions) }) } @@ -856,7 +856,7 @@ func TestSetAppOperations(t *testing.T) { t.Run("Application not existing", func(t *testing.T) { appIf := appclientset.NewSimpleClientset().ArgoprojV1alpha1().Applications("default") app, err := SetAppOperation(appIf, "someapp", &argoappv1.Operation{Sync: &argoappv1.SyncOperation{Revision: "aaa"}}) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, app) }) @@ -870,7 +870,7 @@ func TestSetAppOperations(t *testing.T) { } appIf := appclientset.NewSimpleClientset(&a).ArgoprojV1alpha1().Applications("default") app, err := SetAppOperation(appIf, "someapp", &argoappv1.Operation{Sync: &argoappv1.SyncOperation{Revision: "aaa"}}) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "operation is already in progress") assert.Nil(t, app) }) @@ -884,7 +884,7 @@ func TestSetAppOperations(t *testing.T) { } appIf := appclientset.NewSimpleClientset(&a).ArgoprojV1alpha1().Applications("default") app, err := SetAppOperation(appIf, "someapp", &argoappv1.Operation{Sync: nil}) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "Operation unspecified") assert.Nil(t, app) }) @@ -898,7 +898,7 @@ func TestSetAppOperations(t *testing.T) { } appIf := appclientset.NewSimpleClientset(&a).ArgoprojV1alpha1().Applications("default") app, err := SetAppOperation(appIf, "someapp", &argoappv1.Operation{Sync: &argoappv1.SyncOperation{Revision: "aaa"}}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app) }) } @@ -911,7 +911,7 @@ func TestValidateDestination(t *testing.T) { } appCond := ValidateDestination(context.Background(), &dest, nil) - assert.NoError(t, appCond) + require.NoError(t, appCond) assert.False(t, dest.IsServerInferred()) }) @@ -924,7 +924,7 @@ func TestValidateDestination(t *testing.T) { db.On("GetClusterServersByName", context.Background(), "minikube").Return([]string{"https://127.0.0.1:6443"}, nil) appCond := ValidateDestination(context.Background(), &dest, db) - assert.NoError(t, appCond) + require.NoError(t, appCond) assert.Equal(t, "https://127.0.0.1:6443", dest.Server) assert.True(t, dest.IsServerInferred()) }) @@ -1003,19 +1003,19 @@ func TestFilterByName(t *testing.T) { t.Run("Name is empty string", func(t *testing.T) { res, err := FilterByName(apps, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res, 2) }) t.Run("Single app by name", func(t *testing.T) { res, err := FilterByName(apps, "foo") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res, 1) }) t.Run("No such app", func(t *testing.T) { res, err := FilterByName(apps, "foobar") - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, res) }) } @@ -1263,7 +1263,7 @@ func Test_AppInstanceNameFromQualified(t *testing.T) { func Test_GetRefSources(t *testing.T) { repoPath, err := filepath.Abs("./../..") - assert.NoError(t, err) + require.NoError(t, err) getMultiSourceAppSpec := func(sources argoappv1.ApplicationSources) *argoappv1.ApplicationSpec { return &argoappv1.ApplicationSpec{ @@ -1288,7 +1288,7 @@ func Test_GetRefSources(t *testing.T) { Repo: *repo, }, } - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, refSources, 1) assert.Equal(t, expectedRefSource, refSources) }) @@ -1303,7 +1303,7 @@ func Test_GetRefSources(t *testing.T) { return nil, errors.New("repo does not exist") }, []string{}, false) - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, refSources) }) @@ -1317,7 +1317,7 @@ func Test_GetRefSources(t *testing.T) { return nil, err }, []string{}, false) - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, refSources) }) @@ -1331,7 +1331,7 @@ func Test_GetRefSources(t *testing.T) { return nil, err }, []string{}, false) - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, refSources) }) } @@ -1347,7 +1347,7 @@ func TestValidatePermissionsMultipleSources(t *testing.T) { proj := argoappv1.AppProject{} db := &dbmocks.ArgoDB{} conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Equal(t, argoappv1.ApplicationConditionInvalidSpecError, conditions[0].Type) assert.Contains(t, conditions[0].Message, "are required") @@ -1367,7 +1367,7 @@ func TestValidatePermissionsMultipleSources(t *testing.T) { proj := argoappv1.AppProject{} db := &dbmocks.ArgoDB{} conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Equal(t, argoappv1.ApplicationConditionInvalidSpecError, conditions[0].Type) assert.Contains(t, conditions[0].Message, "are required") @@ -1403,7 +1403,7 @@ func TestValidatePermissionsMultipleSources(t *testing.T) { db := &dbmocks.ArgoDB{} db.On("GetCluster", context.Background(), spec.Destination.Server).Return(cluster, nil) conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, conditions, 1) assert.Contains(t, conditions[0].Message, "application repo http://some/where is not permitted") }) @@ -1442,7 +1442,7 @@ func TestValidatePermissionsMultipleSources(t *testing.T) { db.On("GetClusterServersByName", context.Background(), "does-exist").Return([]string{"https://127.0.0.1:6443"}, nil) db.On("GetCluster", context.Background(), "https://127.0.0.1:6443").Return(&cluster, nil) conditions, err := ValidatePermissions(context.Background(), &spec, &proj, db) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, conditions) }) } @@ -1569,7 +1569,7 @@ func TestAugmentSyncMsg(t *testing.T) { require.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, tt.expectedMessage, msg) } }) diff --git a/util/argo/diff/diff_test.go b/util/argo/diff/diff_test.go index b8ead44bec26d..6051701dad749 100644 --- a/util/argo/diff/diff_test.go +++ b/util/argo/diff/diff_test.go @@ -140,7 +140,7 @@ func TestStateDiff(t *testing.T) { result, err := argo.StateDiff(tc.liveState, tc.desiredState, dc) // then - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, result) assert.True(t, result.Modified) normalized := testutil.YamlToUnstructured(string(result.NormalizedLive)) diff --git a/util/argo/managedfields/managed_fields_test.go b/util/argo/managedfields/managed_fields_test.go index b6cbca8b47fc7..e94f486a64b29 100644 --- a/util/argo/managedfields/managed_fields_test.go +++ b/util/argo/managedfields/managed_fields_test.go @@ -34,17 +34,17 @@ func TestNormalize(t *testing.T) { require.NotNil(t, desiredResult) desiredReplicas, ok, err := unstructured.NestedFloat64(desiredResult.Object, "spec", "replicas") assert.False(t, ok) - assert.NoError(t, err) + require.NoError(t, err) liveReplicas, ok, err := unstructured.NestedFloat64(liveResult.Object, "spec", "replicas") assert.False(t, ok) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, liveReplicas, desiredReplicas) liveRevisionHistory, ok, err := unstructured.NestedFloat64(liveResult.Object, "spec", "revisionHistoryLimit") assert.False(t, ok) - assert.NoError(t, err) + require.NoError(t, err) desiredRevisionHistory, ok, err := unstructured.NestedFloat64(desiredResult.Object, "spec", "revisionHistoryLimit") assert.False(t, ok) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, liveRevisionHistory, desiredRevisionHistory) }) t.Run("will keep conflicting fields if not from trusted manager", func(t *testing.T) { @@ -58,7 +58,7 @@ func TestNormalize(t *testing.T) { liveResult, desiredResult, err := managedfields.Normalize(liveState, desiredState, trustedManagers, &pt) // then - assert.NoError(t, err) + require.NoError(t, err) validateNestedFloat64(t, float64(3), desiredResult, "spec", "replicas") validateNestedFloat64(t, float64(1), desiredResult, "spec", "revisionHistoryLimit") validateNestedFloat64(t, float64(2), liveResult, "spec", "replicas") @@ -74,7 +74,7 @@ func TestNormalize(t *testing.T) { liveResult, desiredResult, err := managedfields.Normalize(nil, desiredState, trustedManagers, &pt) // then - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, liveResult) assert.Nil(t, desiredResult) validateNestedFloat64(t, float64(3), desiredState, "spec", "replicas") @@ -90,7 +90,7 @@ func TestNormalize(t *testing.T) { liveResult, desiredResult, err := managedfields.Normalize(liveState, nil, trustedManagers, &pt) // then - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, liveResult) assert.Nil(t, desiredResult) validateNestedFloat64(t, float64(2), liveState, "spec", "replicas") @@ -106,7 +106,7 @@ func TestNormalize(t *testing.T) { liveResult, desiredResult, err := managedfields.Normalize(liveState, desiredState, []string{}, &pt) // then - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, liveResult) assert.Nil(t, desiredResult) validateNestedFloat64(t, float64(3), desiredState, "spec", "replicas") @@ -153,7 +153,7 @@ func getNestedFloat64(t *testing.T, obj *unstructured.Unstructured, fields ...st t.Helper() current, ok, err := unstructured.NestedFloat64(obj.Object, fields...) assert.True(t, ok, "nested field not found") - assert.NoError(t, err) + require.NoError(t, err) return current } diff --git a/util/argo/normalizers/diff_normalizer_test.go b/util/argo/normalizers/diff_normalizer_test.go index f67e3136de71e..8feb8b3467157 100644 --- a/util/argo/normalizers/diff_normalizer_test.go +++ b/util/argo/normalizers/diff_normalizer_test.go @@ -21,22 +21,22 @@ func TestNormalizeObjectWithMatchedGroupKind(t *testing.T) { JSONPointers: []string{"/not-matching-path", "/spec/template/spec/containers"}, }}, make(map[string]v1alpha1.ResourceOverride), IgnoreNormalizerOpts{}) - assert.NoError(t, err) + require.NoError(t, err) deployment := test.NewDeployment() _, has, err := unstructured.NestedSlice(deployment.Object, "spec", "template", "spec", "containers") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, has) err = normalizer.Normalize(deployment) - assert.NoError(t, err) + require.NoError(t, err) _, has, err = unstructured.NestedSlice(deployment.Object, "spec", "template", "spec", "containers") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, has) err = normalizer.Normalize(nil) - assert.Error(t, err) + require.Error(t, err) } func TestNormalizeNoMatchedGroupKinds(t *testing.T) { @@ -46,15 +46,15 @@ func TestNormalizeNoMatchedGroupKinds(t *testing.T) { JSONPointers: []string{"/spec"}, }}, make(map[string]v1alpha1.ResourceOverride), IgnoreNormalizerOpts{}) - assert.NoError(t, err) + require.NoError(t, err) deployment := test.NewDeployment() err = normalizer.Normalize(deployment) - assert.NoError(t, err) + require.NoError(t, err) _, hasSpec, err := unstructured.NestedMap(deployment.Object, "spec") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, hasSpec) } @@ -65,18 +65,18 @@ func TestNormalizeMatchedResourceOverrides(t *testing.T) { }, }, IgnoreNormalizerOpts{}) - assert.NoError(t, err) + require.NoError(t, err) deployment := test.NewDeployment() _, has, err := unstructured.NestedSlice(deployment.Object, "spec", "template", "spec", "containers") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, has) err = normalizer.Normalize(deployment) - assert.NoError(t, err) + require.NoError(t, err) _, has, err = unstructured.NestedSlice(deployment.Object, "spec", "template", "spec", "containers") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, has) } @@ -119,19 +119,19 @@ func TestNormalizeMissingJsonPointer(t *testing.T) { IgnoreDifferences: v1alpha1.OverrideIgnoreDiff{JSONPointers: []string{"/spec/additionalPrinterColumns/0/priority"}}, }, }, IgnoreNormalizerOpts{}) - assert.NoError(t, err) + require.NoError(t, err) deployment := test.NewDeployment() err = normalizer.Normalize(deployment) - assert.NoError(t, err) + require.NoError(t, err) crd := unstructured.Unstructured{} err = yaml.Unmarshal([]byte(testCRDYAML), &crd) - assert.NoError(t, err) + require.NoError(t, err) err = normalizer.Normalize(&crd) - assert.NoError(t, err) + require.NoError(t, err) } func TestNormalizeGlobMatch(t *testing.T) { @@ -141,18 +141,18 @@ func TestNormalizeGlobMatch(t *testing.T) { }, }, IgnoreNormalizerOpts{}) - assert.NoError(t, err) + require.NoError(t, err) deployment := test.NewDeployment() _, has, err := unstructured.NestedSlice(deployment.Object, "spec", "template", "spec", "containers") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, has) err = normalizer.Normalize(deployment) - assert.NoError(t, err) + require.NoError(t, err) _, has, err = unstructured.NestedSlice(deployment.Object, "spec", "template", "spec", "containers") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, has) } @@ -163,7 +163,7 @@ func TestNormalizeJQPathExpression(t *testing.T) { JQPathExpressions: []string{".spec.template.spec.initContainers[] | select(.name == \"init-container-0\")"}, }}, make(map[string]v1alpha1.ResourceOverride), IgnoreNormalizerOpts{}) - assert.NoError(t, err) + require.NoError(t, err) deployment := test.NewDeployment() @@ -171,22 +171,22 @@ func TestNormalizeJQPathExpression(t *testing.T) { initContainers = append(initContainers, map[string]interface{}{"name": "init-container-0"}) initContainers = append(initContainers, map[string]interface{}{"name": "init-container-1"}) err = unstructured.SetNestedSlice(deployment.Object, initContainers, "spec", "template", "spec", "initContainers") - assert.NoError(t, err) + require.NoError(t, err) actualInitContainers, has, err := unstructured.NestedSlice(deployment.Object, "spec", "template", "spec", "initContainers") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, has) assert.Len(t, actualInitContainers, 2) err = normalizer.Normalize(deployment) - assert.NoError(t, err) + require.NoError(t, err) actualInitContainers, has, err = unstructured.NestedSlice(deployment.Object, "spec", "template", "spec", "initContainers") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, has) assert.Len(t, actualInitContainers, 1) actualInitContainerName, has, err := unstructured.NestedString(actualInitContainers[0].(map[string]interface{}), "name") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, has) assert.Equal(t, "init-container-1", actualInitContainerName) } @@ -199,7 +199,7 @@ func TestNormalizeIllegalJQPathExpression(t *testing.T) { // JSONPointers: []string{"no-starting-slash"}, }}, make(map[string]v1alpha1.ResourceOverride), IgnoreNormalizerOpts{}) - assert.Error(t, err) + require.Error(t, err) } func TestNormalizeJQPathExpressionWithError(t *testing.T) { @@ -209,17 +209,17 @@ func TestNormalizeJQPathExpressionWithError(t *testing.T) { JQPathExpressions: []string{".spec.fakeField.foo[]"}, }}, make(map[string]v1alpha1.ResourceOverride), IgnoreNormalizerOpts{}) - assert.NoError(t, err) + require.NoError(t, err) deployment := test.NewDeployment() originalDeployment, err := deployment.MarshalJSON() - assert.NoError(t, err) + require.NoError(t, err) err = normalizer.Normalize(deployment) - assert.NoError(t, err) + require.NoError(t, err) normalizedDeployment, err := deployment.MarshalJSON() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, originalDeployment, normalizedDeployment) } @@ -231,7 +231,7 @@ func TestNormalizeExpectedErrorAreSilenced(t *testing.T) { }, }, }, IgnoreNormalizerOpts{}) - assert.NoError(t, err) + require.NoError(t, err) ignoreNormalizer := normalizer.(*ignoreNormalizer) assert.Len(t, ignoreNormalizer.patches, 2) @@ -240,7 +240,7 @@ func TestNormalizeExpectedErrorAreSilenced(t *testing.T) { deployment := test.NewDeployment() deploymentData, err := json.Marshal(deployment) - assert.NoError(t, err) + require.NoError(t, err) // Error: "error in remove for path: '/invalid': Unable to remove nonexistent key: invalid: missing value" _, err = jsonPatch.Apply(deploymentData) @@ -261,7 +261,7 @@ func TestJqPathExpressionFailWithTimeout(t *testing.T) { }, }, }, IgnoreNormalizerOpts{}) - assert.NoError(t, err) + require.NoError(t, err) ignoreNormalizer := normalizer.(*ignoreNormalizer) assert.Len(t, ignoreNormalizer.patches, 1) @@ -269,7 +269,7 @@ func TestJqPathExpressionFailWithTimeout(t *testing.T) { deployment := test.NewDeployment() deploymentData, err := json.Marshal(deployment) - assert.NoError(t, err) + require.NoError(t, err) _, err = jqPatch.Apply(deploymentData) assert.ErrorContains(t, err, "JQ patch execution timed out") @@ -282,7 +282,7 @@ func TestJQPathExpressionReturnsHelpfulError(t *testing.T) { JQPathExpressions: []string{`.nothing) | .data["config.yaml"] |= (fromjson | del(.auth) | tojson`}, }}, nil, IgnoreNormalizerOpts{}) - assert.NoError(t, err) + require.NoError(t, err) configMap := test.NewConfigMap() require.NoError(t, err) diff --git a/util/argo/normalizers/knowntypes_normalizer_test.go b/util/argo/normalizers/knowntypes_normalizer_test.go index 37c34d37509b3..ea2a66ab9d6f8 100644 --- a/util/argo/normalizers/knowntypes_normalizer_test.go +++ b/util/argo/normalizers/knowntypes_normalizer_test.go @@ -77,36 +77,28 @@ func TestNormalize_MapField(t *testing.T) { }}, }, }) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) rollout := mustUnmarshalYAML(someCRDYaml) err = normalizer.Normalize(rollout) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) container, err := nestedSliceMap(rollout.Object, 0, "spec", "template", "spec", "containers") - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) cpu, ok, err := unstructured.NestedFieldNoCopy(container, "resources", "requests", "cpu") - if !assert.NoError(t, err) || !assert.True(t, ok) { - return - } + require.NoError(t, err) + require.True(t, ok) assert.Equal(t, "2", cpu) volumeMount, err := nestedSliceMap(container, 0, "volumeMounts") - if !assert.NoError(t, err) || !assert.True(t, ok) { - return - } + require.NoError(t, err) + require.True(t, ok) _, ok, err = unstructured.NestedBool(volumeMount, "readOnly") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, ok) } @@ -120,24 +112,17 @@ func TestNormalize_FieldInNestedSlice(t *testing.T) { }}, }, }) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) err = normalizer.Normalize(rollout) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) container, err := nestedSliceMap(rollout.Object, 0, "spec", "template", "spec", "containers") - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) cpu, ok, err := unstructured.NestedFieldNoCopy(container, "resources", "requests", "cpu") - if !assert.NoError(t, err) || !assert.True(t, ok) { - return - } + require.NoError(t, err) + require.True(t, ok) assert.Equal(t, "2", cpu) } @@ -172,29 +157,20 @@ spec: }}, }, }) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) err = normalizer.Normalize(rollout) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) template, err := nestedSliceMap(rollout.Object, 0, "spec", "templates") - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) container, err := nestedSliceMap(template, 0, "spec", "containers") - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) cpu, ok, err := unstructured.NestedFieldNoCopy(container, "resources", "requests", "cpu") - if !assert.NoError(t, err) || !assert.True(t, ok) { - return - } + require.NoError(t, err) + require.True(t, ok) assert.Equal(t, "2", cpu) } @@ -213,19 +189,14 @@ spec: }}, }, }) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) err = normalizer.Normalize(rollout) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) ram, ok, err := unstructured.NestedFieldNoCopy(rollout.Object, "spec", "ram") - if !assert.NoError(t, err) || !assert.True(t, ok) { - return - } + require.NoError(t, err) + require.True(t, ok) assert.Equal(t, "1250M", ram) } @@ -266,33 +237,24 @@ func TestFieldDoesNotExist(t *testing.T) { }}, }, }) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) err = normalizer.Normalize(rollout) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) container, err := nestedSliceMap(rollout.Object, 0, "spec", "template", "spec", "containers") - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) cpu, ok, err := unstructured.NestedFieldNoCopy(container, "resources", "requests", "cpu") - if !assert.NoError(t, err) || !assert.True(t, ok) { - return - } + require.NoError(t, err) + require.True(t, ok) assert.Equal(t, "2000m", cpu) } func TestRolloutPreConfigured(t *testing.T) { normalizer, err := NewKnownTypesNormalizer(map[string]v1alpha1.ResourceOverride{}) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) _, ok := normalizer.typeFields[schema.GroupKind{Group: application.Group, Kind: "Rollout"}] assert.True(t, ok) } @@ -306,18 +268,14 @@ func TestOverrideKeyWithoutGroup(t *testing.T) { }}, }, }) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) _, ok := normalizer.typeFields[schema.GroupKind{Group: "", Kind: "ConfigMap"}] assert.True(t, ok) } func TestKnownTypes(t *testing.T) { typesData, err := os.ReadFile("./diffing_known_types.txt") - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) for _, typeName := range strings.Split(string(typesData), "\n") { if typeName = strings.TrimSpace(typeName); typeName == "" { continue diff --git a/util/argo/resource_tracking_test.go b/util/argo/resource_tracking_test.go index 68aa81917adcc..08da8d878443e 100644 --- a/util/argo/resource_tracking_test.go +++ b/util/argo/resource_tracking_test.go @@ -7,6 +7,7 @@ import ( "github.com/argoproj/argo-cd/v2/util/kube" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "gopkg.in/yaml.v2" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -15,32 +16,32 @@ import ( func TestSetAppInstanceLabel(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) resourceTracking := NewResourceTracking() err = resourceTracking.SetAppInstance(&obj, common.LabelKeyAppInstance, "my-app", "", TrackingMethodLabel) - assert.NoError(t, err) + require.NoError(t, err) app := resourceTracking.GetAppName(&obj, common.LabelKeyAppInstance, TrackingMethodLabel) assert.Equal(t, "my-app", app) } func TestSetAppInstanceAnnotation(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) resourceTracking := NewResourceTracking() err = resourceTracking.SetAppInstance(&obj, common.AnnotationKeyAppInstance, "my-app", "", TrackingMethodAnnotation) - assert.NoError(t, err) + require.NoError(t, err) app := resourceTracking.GetAppName(&obj, common.AnnotationKeyAppInstance, TrackingMethodAnnotation) assert.Equal(t, "my-app", app) @@ -48,15 +49,15 @@ func TestSetAppInstanceAnnotation(t *testing.T) { func TestSetAppInstanceAnnotationAndLabel(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) resourceTracking := NewResourceTracking() err = resourceTracking.SetAppInstance(&obj, common.LabelKeyAppInstance, "my-app", "", TrackingMethodAnnotationAndLabel) - assert.NoError(t, err) + require.NoError(t, err) app := resourceTracking.GetAppName(&obj, common.LabelKeyAppInstance, TrackingMethodAnnotationAndLabel) assert.Equal(t, "my-app", app) @@ -64,15 +65,15 @@ func TestSetAppInstanceAnnotationAndLabel(t *testing.T) { func TestSetAppInstanceAnnotationAndLabelLongName(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) resourceTracking := NewResourceTracking() err = resourceTracking.SetAppInstance(&obj, common.LabelKeyAppInstance, "my-app-with-an-extremely-long-name-that-is-over-sixty-three-characters", "", TrackingMethodAnnotationAndLabel) - assert.NoError(t, err) + require.NoError(t, err) // the annotation should still work, so the name from GetAppName should not be truncated app := resourceTracking.GetAppName(&obj, common.LabelKeyAppInstance, TrackingMethodAnnotationAndLabel) @@ -84,15 +85,15 @@ func TestSetAppInstanceAnnotationAndLabelLongName(t *testing.T) { func TestSetAppInstanceAnnotationAndLabelLongNameBadEnding(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) resourceTracking := NewResourceTracking() err = resourceTracking.SetAppInstance(&obj, common.LabelKeyAppInstance, "the-very-suspicious-name-with-precisely-sixty-three-characters-with-hyphen", "", TrackingMethodAnnotationAndLabel) - assert.NoError(t, err) + require.NoError(t, err) // the annotation should still work, so the name from GetAppName should not be truncated app := resourceTracking.GetAppName(&obj, common.LabelKeyAppInstance, TrackingMethodAnnotationAndLabel) @@ -104,10 +105,10 @@ func TestSetAppInstanceAnnotationAndLabelLongNameBadEnding(t *testing.T) { func TestSetAppInstanceAnnotationAndLabelOutOfBounds(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) resourceTracking := NewResourceTracking() @@ -118,11 +119,11 @@ func TestSetAppInstanceAnnotationAndLabelOutOfBounds(t *testing.T) { func TestSetAppInstanceAnnotationNotFound(t *testing.T) { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - assert.NoError(t, err) + require.NoError(t, err) var obj unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - assert.NoError(t, err) + require.NoError(t, err) resourceTracking := NewResourceTracking() @@ -133,9 +134,7 @@ func TestSetAppInstanceAnnotationNotFound(t *testing.T) { func TestParseAppInstanceValue(t *testing.T) { resourceTracking := NewResourceTracking() appInstanceValue, err := resourceTracking.ParseAppInstanceValue("app:/:/") - if !assert.NoError(t, err) { - t.Fatal() - } + require.NoError(t, err) assert.Equal(t, "app", appInstanceValue.ApplicationName) assert.Equal(t, "", appInstanceValue.Group) assert.Equal(t, "", appInstanceValue.Kind) @@ -146,9 +145,7 @@ func TestParseAppInstanceValue(t *testing.T) { func TestParseAppInstanceValueColon(t *testing.T) { resourceTracking := NewResourceTracking() appInstanceValue, err := resourceTracking.ParseAppInstanceValue("app:/:/:") - if !assert.NoError(t, err) { - t.Fatal() - } + require.NoError(t, err) assert.Equal(t, "app", appInstanceValue.ApplicationName) assert.Equal(t, "", appInstanceValue.Group) assert.Equal(t, "", appInstanceValue.Kind) @@ -159,31 +156,27 @@ func TestParseAppInstanceValueColon(t *testing.T) { func TestParseAppInstanceValueWrongFormat1(t *testing.T) { resourceTracking := NewResourceTracking() _, err := resourceTracking.ParseAppInstanceValue("app") - assert.Error(t, err, WrongResourceTrackingFormat) + require.Error(t, err, WrongResourceTrackingFormat) } func TestParseAppInstanceValueWrongFormat2(t *testing.T) { resourceTracking := NewResourceTracking() _, err := resourceTracking.ParseAppInstanceValue("app;group/kind/ns") - assert.Error(t, err, WrongResourceTrackingFormat) + require.Error(t, err, WrongResourceTrackingFormat) } func TestParseAppInstanceValueCorrectFormat(t *testing.T) { resourceTracking := NewResourceTracking() _, err := resourceTracking.ParseAppInstanceValue("app:group/kind:test/ns") - assert.NoError(t, err) + require.NoError(t, err) } -func sampleResource() *unstructured.Unstructured { +func sampleResource(t *testing.T) *unstructured.Unstructured { yamlBytes, err := os.ReadFile("testdata/svc.yaml") - if err != nil { - panic(err) - } + require.NoError(t, err) var obj *unstructured.Unstructured err = yaml.Unmarshal(yamlBytes, &obj) - if err != nil { - panic(err) - } + require.NoError(t, err) return obj } @@ -191,20 +184,20 @@ func TestResourceIdNormalizer_Normalize(t *testing.T) { rt := NewResourceTracking() // live object is a resource that has old style tracking label - liveObj := sampleResource() + liveObj := sampleResource(t) err := rt.SetAppInstance(liveObj, common.LabelKeyAppInstance, "my-app", "", TrackingMethodLabel) - assert.NoError(t, err) + require.NoError(t, err) // config object is a resource that has new style tracking annotation - configObj := sampleResource() + configObj := sampleResource(t) err = rt.SetAppInstance(configObj, common.AnnotationKeyAppInstance, "my-app2", "", TrackingMethodAnnotation) - assert.NoError(t, err) + require.NoError(t, err) _ = rt.Normalize(configObj, liveObj, common.LabelKeyAppInstance, string(TrackingMethodAnnotation)) // the normalization should affect add the new style annotation and drop old tracking label from live object annotation, err := kube.GetAppInstanceAnnotation(configObj, common.AnnotationKeyAppInstance) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, liveObj.GetAnnotations()[common.AnnotationKeyAppInstance], annotation) _, hasOldLabel := liveObj.GetLabels()[common.LabelKeyAppInstance] assert.False(t, hasOldLabel) @@ -214,22 +207,22 @@ func TestResourceIdNormalizer_Normalize_ConfigHasOldLabel(t *testing.T) { rt := NewResourceTracking() // live object is a resource that has old style tracking label - liveObj := sampleResource() + liveObj := sampleResource(t) err := rt.SetAppInstance(liveObj, common.LabelKeyAppInstance, "my-app", "", TrackingMethodLabel) - assert.NoError(t, err) + require.NoError(t, err) // config object is a resource that has new style tracking annotation - configObj := sampleResource() + configObj := sampleResource(t) err = rt.SetAppInstance(configObj, common.AnnotationKeyAppInstance, "my-app2", "", TrackingMethodAnnotation) - assert.NoError(t, err) + require.NoError(t, err) err = rt.SetAppInstance(configObj, common.LabelKeyAppInstance, "my-app", "", TrackingMethodLabel) - assert.NoError(t, err) + require.NoError(t, err) _ = rt.Normalize(configObj, liveObj, common.LabelKeyAppInstance, string(TrackingMethodAnnotation)) // the normalization should affect add the new style annotation and drop old tracking label from live object annotation, err := kube.GetAppInstanceAnnotation(configObj, common.AnnotationKeyAppInstance) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, liveObj.GetAnnotations()[common.AnnotationKeyAppInstance], annotation) _, hasOldLabel := liveObj.GetLabels()[common.LabelKeyAppInstance] assert.True(t, hasOldLabel) diff --git a/util/cache/appstate/cache_test.go b/util/cache/appstate/cache_test.go index 59b125fca3bea..f10e982d933b5 100644 --- a/util/cache/appstate/cache_test.go +++ b/util/cache/appstate/cache_test.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" cacheutil "github.com/argoproj/argo-cd/v2/util/cache" @@ -30,13 +31,13 @@ func TestCache_GetAppManagedResources(t *testing.T) { assert.Equal(t, ErrCacheMiss, err) // populate cache err = cache.SetAppManagedResources("my-appname", []*ResourceDiff{{Name: "my-name"}}) - assert.NoError(t, err) + require.NoError(t, err) // cache miss err = cache.GetAppManagedResources("other-appname", value) assert.Equal(t, ErrCacheMiss, err) // cache hit err = cache.GetAppManagedResources("my-appname", value) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &[]*ResourceDiff{{Name: "my-name"}}, value) } @@ -48,18 +49,18 @@ func TestCache_GetAppResourcesTree(t *testing.T) { assert.Equal(t, ErrCacheMiss, err) // populate cache err = cache.SetAppResourcesTree("my-appname", &ApplicationTree{Nodes: []ResourceNode{{}}}) - assert.NoError(t, err) + require.NoError(t, err) // cache miss err = cache.GetAppResourcesTree("other-appname", value) assert.Equal(t, ErrCacheMiss, err) // cache hit err = cache.GetAppResourcesTree("my-appname", value) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &ApplicationTree{Nodes: []ResourceNode{{}}}, value) } func TestAddCacheFlagsToCmd(t *testing.T) { cache, err := AddCacheFlagsToCmd(&cobra.Command{})() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, 1*time.Hour, cache.appStateCacheExpiration) } diff --git a/util/cache/cache_test.go b/util/cache/cache_test.go index 7c40a480c1d09..0a156cedeeb0d 100644 --- a/util/cache/cache_test.go +++ b/util/cache/cache_test.go @@ -9,13 +9,14 @@ import ( "github.com/redis/go-redis/v9" "github.com/spf13/cobra" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/common" ) func TestAddCacheFlagsToCmd(t *testing.T) { cache, err := AddCacheFlagsToCmd(&cobra.Command{})() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, 24*time.Hour, cache.client.(*redisCache).expiration) } @@ -38,45 +39,45 @@ func TestCacheClient(t *testing.T) { cache := NewCache(client) t.Run("SetItem", func(t *testing.T) { err := cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 60 * time.Second, DisableOverwrite: true, Delete: false}) - assert.NoError(t, err) + require.NoError(t, err) var output string err = cache.GetItem("foo", &output) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "bar", output) }) t.Run("SetCacheItem W/Disable Overwrite", func(t *testing.T) { err := cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 60 * time.Second, DisableOverwrite: true, Delete: false}) - assert.NoError(t, err) + require.NoError(t, err) var output string err = cache.GetItem("foo", &output) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "bar", output) err = cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 60 * time.Second, DisableOverwrite: true, Delete: false}) - assert.NoError(t, err) + require.NoError(t, err) err = cache.GetItem("foo", &output) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "bar", output, "output should not have changed with DisableOverwrite set to true") }) t.Run("GetItem", func(t *testing.T) { var val string err := cache.GetItem("foo", &val) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "bar", val) }) t.Run("DeleteItem", func(t *testing.T) { err := cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 0, Delete: true}) - assert.NoError(t, err) + require.NoError(t, err) var val string err = cache.GetItem("foo", &val) - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, val) }) t.Run("Check for nil items", func(t *testing.T) { err := cache.SetItem("foo", nil, &CacheActionOpts{Expiration: 0, Delete: true}) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "cannot set nil item") err = cache.GetItem("foo", nil) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "cannot get item") }) } diff --git a/util/cache/client_test.go b/util/cache/client_test.go index dca7420f1fa36..2b16245b814a2 100644 --- a/util/cache/client_test.go +++ b/util/cache/client_test.go @@ -5,6 +5,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) type testStruct struct { @@ -27,12 +28,12 @@ func TestCache(t *testing.T) { }) cacheObj.Foo = "baz" err = c.Get("key", &obj) - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, "foo", obj.Foo) assert.EqualValues(t, "bar", string(obj.Bar)) err = c.Delete("key") - assert.NoError(t, err) + require.NoError(t, err) err = c.Get("key", &obj) assert.Equal(t, err, ErrCacheMiss) } diff --git a/util/cache/inmemory_test.go b/util/cache/inmemory_test.go index 4e0d1e48a5a89..ce863075898e8 100644 --- a/util/cache/inmemory_test.go +++ b/util/cache/inmemory_test.go @@ -5,6 +5,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) type foo struct { @@ -20,8 +21,8 @@ func TestInMemoryCache(t *testing.T) { assert.Equal(t, ErrCacheMiss, err) // cache hit err = cache.Set(&Item{Key: "my-key", Object: &foo{Bar: "bar"}}) - assert.NoError(t, err) + require.NoError(t, err) err = cache.Get("my-key", obj) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &foo{Bar: "bar"}, obj) } diff --git a/util/cache/redis_test.go b/util/cache/redis_test.go index 3ed445a1ce3b0..baf40c88811f8 100644 --- a/util/cache/redis_test.go +++ b/util/cache/redis_test.go @@ -12,6 +12,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/redis/go-redis/v9" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) var ( @@ -66,28 +67,28 @@ func TestRedisSetCache(t *testing.T) { t.Run("Successful set", func(t *testing.T) { client := NewRedisCache(redis.NewClient(&redis.Options{Addr: mr.Addr()}), 60*time.Second, RedisCompressionNone) err = client.Set(&Item{Key: "foo", Object: "bar"}) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Successful get", func(t *testing.T) { var res string client := NewRedisCache(redis.NewClient(&redis.Options{Addr: mr.Addr()}), 10*time.Second, RedisCompressionNone) err = client.Get("foo", &res) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "bar", res) }) t.Run("Successful delete", func(t *testing.T) { client := NewRedisCache(redis.NewClient(&redis.Options{Addr: mr.Addr()}), 10*time.Second, RedisCompressionNone) err = client.Delete("foo") - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Cache miss", func(t *testing.T) { var res string client := NewRedisCache(redis.NewClient(&redis.Options{Addr: mr.Addr()}), 10*time.Second, RedisCompressionNone) err = client.Get("foo", &res) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "cache: key is missing") }) } @@ -104,14 +105,14 @@ func TestRedisSetCacheCompressed(t *testing.T) { client := NewRedisCache(redisClient, 10*time.Second, RedisCompressionGZip) testValue := "my-value" - assert.NoError(t, client.Set(&Item{Key: "my-key", Object: testValue})) + require.NoError(t, client.Set(&Item{Key: "my-key", Object: testValue})) compressedData, err := redisClient.Get(context.Background(), "my-key.gz").Bytes() - assert.NoError(t, err) + require.NoError(t, err) assert.Greater(t, len(compressedData), len([]byte(testValue)), "compressed data is bigger than uncompressed") var result string - assert.NoError(t, client.Get("my-key", &result)) + require.NoError(t, client.Get("my-key", &result)) assert.Equal(t, testValue, result) } @@ -136,29 +137,29 @@ func TestRedisMetrics(t *testing.T) { // client successful request err = client.Set(&Item{Key: "foo", Object: "bar"}) - assert.NoError(t, err) + require.NoError(t, err) err = client.Get("foo", &res) - assert.NoError(t, err) + require.NoError(t, err) c, err := ms.redisRequestCounter.GetMetricWithLabelValues("mock", "false") - assert.NoError(t, err) + require.NoError(t, err) err = c.Write(metric) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, float64(2), metric.Counter.GetValue()) // faulty client failed request err = faultyClient.Get("foo", &res) - assert.Error(t, err) + require.Error(t, err) c, err = ms.redisRequestCounter.GetMetricWithLabelValues("mock", "true") - assert.NoError(t, err) + require.NoError(t, err) err = c.Write(metric) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, float64(1), metric.Counter.GetValue()) // both clients histogram count o, err := ms.redisRequestHistogram.GetMetricWithLabelValues("mock") - assert.NoError(t, err) + require.NoError(t, err) err = o.(prometheus.Metric).Write(metric) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, 3, int(metric.Histogram.GetSampleCount())) } diff --git a/util/cert/cert_test.go b/util/cert/cert_test.go index e0d15a771b3df..a9fb4c4810eb2 100644 --- a/util/cert/cert_test.go +++ b/util/cert/cert_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/common" ) @@ -206,59 +207,59 @@ vs-ssh.visualstudio.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOf func Test_TLSCertificate_ValidPEM_ValidCert(t *testing.T) { // Valid PEM data, single certificate, expect array of length 1 certificates, err := ParseTLSCertificatesFromData(Test_TLSValidSingleCert) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, certificates, 1) // Expect good decode x509Cert, err := DecodePEMCertificateToX509(certificates[0]) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, Test_Cert1CN, x509Cert.Subject.String()) } func Test_TLSCertificate_ValidPEM_InvalidCert(t *testing.T) { // Valid PEM data, but invalid certificate certificates, err := ParseTLSCertificatesFromData(Test_TLSInvalidSingleCert) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, certificates, 1) // Expect bad decode _, err = DecodePEMCertificateToX509(certificates[0]) - assert.Error(t, err) + require.Error(t, err) } func Test_TLSCertificate_InvalidPEM(t *testing.T) { // Invalid PEM data, expect array of length 0 certificates, err := ParseTLSCertificatesFromData(Test_TLSInvalidPEMData) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, certificates) } func Test_TLSCertificate_ValidPEM_ValidCert_Multi(t *testing.T) { // Valid PEM data, two certificates, expect array of length 2 certificates, err := ParseTLSCertificatesFromData(Test_TLSValidMultiCert) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, certificates, 2) // Expect good decode x509Cert, err := DecodePEMCertificateToX509(certificates[0]) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, Test_Cert1CN, x509Cert.Subject.String()) x509Cert, err = DecodePEMCertificateToX509(certificates[1]) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, Test_Cert2CN, x509Cert.Subject.String()) } func Test_TLSCertificate_ValidPEM_ValidCert_FromFile(t *testing.T) { // Valid PEM data, single certificate from file, expect array of length 1 certificates, err := ParseTLSCertificatesFromPath("../../test/certificates/cert1.pem") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, certificates, 1) // Expect good decode x509Cert, err := DecodePEMCertificateToX509(certificates[0]) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, Test_Cert1CN, x509Cert.Subject.String()) } func Test_TLSCertPool(t *testing.T) { certificates, err := ParseTLSCertificatesFromData(Test_TLSValidMultiCert) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, certificates, 2) certPool := GetCertPoolFromPEMData(certificates) assert.NotNil(t, certPool) @@ -267,27 +268,27 @@ func Test_TLSCertPool(t *testing.T) { func Test_TLSCertificate_CertFromNonExistingFile(t *testing.T) { // Non-existing file, expect err _, err := ParseTLSCertificatesFromPath("../../test/certificates/cert_nonexisting.pem") - assert.Error(t, err) + require.Error(t, err) } func Test_SSHKnownHostsData_ParseData(t *testing.T) { // Expect valid data with 7 known host entries entries, err := ParseSSHKnownHostsFromData(Test_ValidSSHKnownHostsData) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, entries, 7) } func Test_SSHKnownHostsData_ParseFile(t *testing.T) { // Expect valid data with 7 known host entries entries, err := ParseSSHKnownHostsFromPath("../../test/certificates/ssh_known_hosts") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, entries, 7) } func Test_SSHKnownHostsData_ParseNonExistingFile(t *testing.T) { // Expect valid data with 7 known host entries entries, err := ParseSSHKnownHostsFromPath("../../test/certificates/ssh_known_hosts_invalid") - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, entries) } @@ -295,15 +296,15 @@ func Test_SSHKnownHostsData_Tokenize(t *testing.T) { // All entries should parse to valid SSH public keys // All entries should be tokenizable, and tokens should be feedable to decoder entries, err := ParseSSHKnownHostsFromData(Test_ValidSSHKnownHostsData) - assert.NoError(t, err) + require.NoError(t, err) for _, entry := range entries { hosts, _, err := KnownHostsLineToPublicKey(entry) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, hosts, 1) hoststring, subtype, certdata, err := TokenizeSSHKnownHostsEntry(entry) - assert.NoError(t, err) + require.NoError(t, err) hosts, _, err = TokenizedDataToPublicKey(hoststring, subtype, string(certdata)) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, hosts, 1) } } @@ -333,11 +334,11 @@ func Test_SSHFingerprintSHA256(t *testing.T) { "ohD8VZEXGWo6Ez8GSEJQ9WpafgLFsOfLOtGGQCQo6Og", } entries, err := ParseSSHKnownHostsFromData(Test_ValidSSHKnownHostsData) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, entries, 7) for idx, entry := range entries { _, pubKey, err := KnownHostsLineToPublicKey(entry) - assert.NoError(t, err) + require.NoError(t, err) fp := SSHFingerprintSHA256(pubKey) assert.Equal(t, fp, fingerprints[idx]) } @@ -355,7 +356,7 @@ func Test_SSHFingerPrintSHA256FromString(t *testing.T) { "ohD8VZEXGWo6Ez8GSEJQ9WpafgLFsOfLOtGGQCQo6Og", } entries, err := ParseSSHKnownHostsFromData(Test_ValidSSHKnownHostsData) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, entries, 7) for idx, entry := range entries { fp := SSHFingerprintSHA256FromString(entry) @@ -482,7 +483,7 @@ func TestGetCertificateForConnect(t *testing.T) { } t.Setenv(common.EnvVarTLSDataPath, temppath) certs, err := GetCertificateForConnect("127.0.0.1") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, certs, 1) }) @@ -490,7 +491,7 @@ func TestGetCertificateForConnect(t *testing.T) { temppath := t.TempDir() t.Setenv(common.EnvVarTLSDataPath, temppath) certs, err := GetCertificateForConnect("127.0.0.1") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, certs) }) @@ -502,7 +503,7 @@ func TestGetCertificateForConnect(t *testing.T) { } t.Setenv(common.EnvVarTLSDataPath, temppath) certs, err := GetCertificateForConnect("127.0.0.1") - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, certs) assert.Contains(t, err.Error(), "no certificates found") }) @@ -521,7 +522,7 @@ func TestGetCertBundlePathForRepository(t *testing.T) { } t.Setenv(common.EnvVarTLSDataPath, temppath) certpath, err := GetCertBundlePathForRepository("127.0.0.1") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, certpath, path.Join(temppath, "127.0.0.1")) }) @@ -529,7 +530,7 @@ func TestGetCertBundlePathForRepository(t *testing.T) { temppath := t.TempDir() t.Setenv(common.EnvVarTLSDataPath, temppath) certpath, err := GetCertBundlePathForRepository("127.0.0.1") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, certpath) }) @@ -541,7 +542,7 @@ func TestGetCertBundlePathForRepository(t *testing.T) { } t.Setenv(common.EnvVarTLSDataPath, temppath) certpath, err := GetCertBundlePathForRepository("127.0.0.1") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, certpath) }) } diff --git a/util/clusterauth/clusterauth_test.go b/util/clusterauth/clusterauth_test.go index 3cf2bb15de75c..bb7ea7fbee927 100644 --- a/util/clusterauth/clusterauth_test.go +++ b/util/clusterauth/clusterauth_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" apierr "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -54,7 +55,7 @@ func newServiceAccountSecret() *corev1.Secret { func TestParseServiceAccountToken(t *testing.T) { claims, err := ParseServiceAccountToken(testToken) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testClaims, *claims) } @@ -78,36 +79,36 @@ func TestCreateServiceAccount(t *testing.T) { t.Run("New SA", func(t *testing.T) { cs := fake.NewSimpleClientset(ns) err := CreateServiceAccount(cs, "argocd-manager", "kube-system") - assert.NoError(t, err) + require.NoError(t, err) rsa, err := cs.CoreV1().ServiceAccounts("kube-system").Get(context.Background(), "argocd-manager", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, rsa) }) t.Run("SA exists already", func(t *testing.T) { cs := fake.NewSimpleClientset(ns, sa) err := CreateServiceAccount(cs, "argocd-manager", "kube-system") - assert.NoError(t, err) + require.NoError(t, err) rsa, err := cs.CoreV1().ServiceAccounts("kube-system").Get(context.Background(), "argocd-manager", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, rsa) }) t.Run("Invalid name", func(t *testing.T) { cs := fake.NewSimpleClientset(ns) err := CreateServiceAccount(cs, "", "kube-system") - assert.NoError(t, err) + require.NoError(t, err) rsa, err := cs.CoreV1().ServiceAccounts("kube-system").Get(context.Background(), "argocd-manager", metav1.GetOptions{}) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, rsa) }) t.Run("Invalid namespace", func(t *testing.T) { cs := fake.NewSimpleClientset() err := CreateServiceAccount(cs, "argocd-manager", "invalid") - assert.NoError(t, err) + require.NoError(t, err) rsa, err := cs.CoreV1().ServiceAccounts("invalid").Get(context.Background(), "argocd-manager", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, rsa) }) } @@ -148,7 +149,7 @@ func TestInstallClusterManagerRBAC(t *testing.T) { t.Run("Cluster Scope - Success", func(t *testing.T) { cs := fake.NewSimpleClientset(ns, secret, sa) token, err := InstallClusterManagerRBAC(cs, "test", nil, testBearerTokenTimeout) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "foobar", token) }) @@ -157,14 +158,14 @@ func TestInstallClusterManagerRBAC(t *testing.T) { nsecret.Data = make(map[string][]byte) cs := fake.NewSimpleClientset(ns, nsecret, sa) token, err := InstallClusterManagerRBAC(cs, "test", nil, testBearerTokenTimeout) - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, token) }) t.Run("Namespace Scope - Success", func(t *testing.T) { cs := fake.NewSimpleClientset(ns, secret, sa) token, err := InstallClusterManagerRBAC(cs, "test", []string{"nsa"}, testBearerTokenTimeout) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "foobar", token) }) @@ -173,7 +174,7 @@ func TestInstallClusterManagerRBAC(t *testing.T) { nsecret.Data = make(map[string][]byte) cs := fake.NewSimpleClientset(ns, nsecret, sa) token, err := InstallClusterManagerRBAC(cs, "test", []string{"nsa"}, testBearerTokenTimeout) - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, token) }) } @@ -182,7 +183,7 @@ func TestUninstallClusterManagerRBAC(t *testing.T) { t.Run("Success", func(t *testing.T) { cs := fake.NewSimpleClientset(newServiceAccountSecret()) err := UninstallClusterManagerRBAC(cs) - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -201,7 +202,7 @@ func TestGenerateNewClusterManagerSecret(t *testing.T) { }) created, err := GenerateNewClusterManagerSecret(kubeclientset, &testClaims) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "argocd-manager-token-abc123", created.Name) assert.Equal(t, "fake-token", string(created.Data["token"])) } @@ -216,12 +217,12 @@ func TestRotateServiceAccountSecrets(t *testing.T) { kubeclientset := fake.NewSimpleClientset(newServiceAccount(), newServiceAccountSecret(), generatedSecret) err := RotateServiceAccountSecrets(kubeclientset, &testClaims, generatedSecret) - assert.NoError(t, err) + require.NoError(t, err) // Verify service account references new secret and old secret is deleted saClient := kubeclientset.CoreV1().ServiceAccounts(testClaims.Namespace) sa, err := saClient.Get(context.Background(), testClaims.ServiceAccountName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []corev1.ObjectReference{ { Name: "argocd-manager-token-abc123", @@ -256,7 +257,7 @@ func TestGetServiceAccountBearerToken(t *testing.T) { kubeclientset := fake.NewSimpleClientset(sa, dockercfgSecret, tokenSecret) token, err := GetServiceAccountBearerToken(kubeclientset, "kube-system", sa.Name, testBearerTokenTimeout) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testToken, token) } @@ -291,7 +292,7 @@ func Test_getOrCreateServiceAccountTokenSecret_NoSecretForSA(t *testing.T) { }) got, err := getOrCreateServiceAccountTokenSecret(cs, ArgoCDManagerServiceAccount, ns.Name) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, got, "argocd-manager-token-") obj, err := cs.Tracker().Get(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, @@ -342,7 +343,7 @@ func Test_getOrCreateServiceAccountTokenSecret_SAHasSecret(t *testing.T) { cs := fake.NewSimpleClientset(ns, saWithSecret, secret) got, err := getOrCreateServiceAccountTokenSecret(cs, ArgoCDManagerServiceAccount, ns.Name) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "sa-secret", got) obj, err := cs.Tracker().Get(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, diff --git a/util/config/reader_test.go b/util/config/reader_test.go index f24eed9e4f622..7265aefb68d97 100644 --- a/util/config/reader_test.go +++ b/util/config/reader_test.go @@ -11,6 +11,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestUnmarshalLocalFile(t *testing.T) { @@ -125,9 +126,9 @@ func TestUnmarshalReader(t *testing.T) { value := "test-reader" instance := testStruct{value} data, err := json.Marshal(instance) - assert.NoError(t, err) + require.NoError(t, err) var reader io.Reader = bytes.NewReader(data) err = UnmarshalReader(reader, &instance) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, value, instance.Value) } diff --git a/util/db/certificate_test.go b/util/db/certificate_test.go index 4605ea2a3a805..df4ba7aba621d 100644 --- a/util/db/certificate_test.go +++ b/util/db/certificate_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -296,7 +297,7 @@ func Test_ListCertificate(t *testing.T) { HostNamePattern: "*", CertType: "ssh", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, Test_NumSSHKnownHostsExpected) for idx, entry := range certList.Items { @@ -310,7 +311,7 @@ func Test_ListCertificate(t *testing.T) { HostNamePattern: "*", CertType: "https", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, Test_NumTLSCertificatesExpected) @@ -320,14 +321,14 @@ func Test_ListCertificate(t *testing.T) { HostNamePattern: "*", CertType: "*", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, Test_NumTLSCertificatesExpected+Test_NumSSHKnownHostsExpected) // List all certificates using nil selector // Expected: List of 10 entries certList, err = db.ListRepoCertificates(context.Background(), nil) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, Test_NumTLSCertificatesExpected+Test_NumSSHKnownHostsExpected) @@ -337,7 +338,7 @@ func Test_ListCertificate(t *testing.T) { HostNamePattern: "gitlab.com", CertType: "*", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 4) for _, entry := range certList.Items { @@ -349,7 +350,7 @@ func Test_ListCertificate(t *testing.T) { HostNamePattern: "gitlab.com", CertType: "https", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 1) assert.Equal(t, "gitlab.com", certList.Items[0].ServerName) @@ -371,7 +372,7 @@ func Test_CreateSSHKnownHostEntries(t *testing.T) { }, }, }, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 1) @@ -385,7 +386,7 @@ func Test_CreateSSHKnownHostEntries(t *testing.T) { }, }, }, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 1) @@ -400,7 +401,7 @@ func Test_CreateSSHKnownHostEntries(t *testing.T) { }, }, }, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, certList) // Check if it really was added @@ -409,7 +410,7 @@ func Test_CreateSSHKnownHostEntries(t *testing.T) { HostNamePattern: "foo.example.com", CertType: "ssh", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 1) @@ -424,7 +425,7 @@ func Test_CreateSSHKnownHostEntries(t *testing.T) { }, }, }, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Empty(t, certList.Items) @@ -439,7 +440,7 @@ func Test_CreateSSHKnownHostEntries(t *testing.T) { }, }, }, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, certList) // Existing cert, different data, upsert @@ -452,7 +453,7 @@ func Test_CreateSSHKnownHostEntries(t *testing.T) { }, }, }, true) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 1) @@ -467,7 +468,7 @@ func Test_CreateSSHKnownHostEntries(t *testing.T) { }, }, }, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, certList) // Invalid known hosts entry, case 2: invalid base64 data @@ -481,7 +482,7 @@ func Test_CreateSSHKnownHostEntries(t *testing.T) { }, }, }, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, certList) } @@ -501,7 +502,7 @@ func Test_CreateTLSCertificates(t *testing.T) { }, }, }, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 1) @@ -516,7 +517,7 @@ func Test_CreateTLSCertificates(t *testing.T) { }, }, }, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, certList) // Check if it really was added @@ -525,7 +526,7 @@ func Test_CreateTLSCertificates(t *testing.T) { HostNamePattern: "foo.example.com", CertType: "https", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 1) @@ -540,7 +541,7 @@ func Test_CreateTLSCertificates(t *testing.T) { }, }, }, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 2) @@ -550,7 +551,7 @@ func Test_CreateTLSCertificates(t *testing.T) { HostNamePattern: "bar.example.com", CertType: "https", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 2) @@ -565,7 +566,7 @@ func Test_CreateTLSCertificates(t *testing.T) { }, }, }, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Empty(t, certList.Items) @@ -580,7 +581,7 @@ func Test_CreateTLSCertificates(t *testing.T) { }, }, }, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, certList) // Valid TLS certificate, existing cert, different data, upsert @@ -594,7 +595,7 @@ func Test_CreateTLSCertificates(t *testing.T) { }, }, }, true) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 2) @@ -604,7 +605,7 @@ func Test_CreateTLSCertificates(t *testing.T) { HostNamePattern: "foo.example.com", CertType: "https", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 2) for _, entry := range certList.Items { @@ -623,7 +624,7 @@ func Test_CreateTLSCertificates(t *testing.T) { }, }, }, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, certList) // Valid PEM data, new cert, but invalid certificate @@ -637,7 +638,7 @@ func Test_CreateTLSCertificates(t *testing.T) { }, }, }, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, certList) // Invalid PEM data, existing cert, upsert @@ -651,7 +652,7 @@ func Test_CreateTLSCertificates(t *testing.T) { }, }, }, true) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, certList) // Valid PEM data, existing cert, but invalid certificate, upsert @@ -665,7 +666,7 @@ func Test_CreateTLSCertificates(t *testing.T) { }, }, }, true) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, certList) } @@ -680,7 +681,7 @@ func Test_RemoveSSHKnownHosts(t *testing.T) { HostNamePattern: "github.com", CertType: "ssh", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 1) @@ -690,7 +691,7 @@ func Test_RemoveSSHKnownHosts(t *testing.T) { HostNamePattern: "github.com", CertType: "ssh", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Empty(t, certList.Items) @@ -700,7 +701,7 @@ func Test_RemoveSSHKnownHosts(t *testing.T) { CertType: "ssh", CertSubType: "ssh-ed25519", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 1) @@ -710,7 +711,7 @@ func Test_RemoveSSHKnownHosts(t *testing.T) { CertType: "ssh", CertSubType: "ssh-ed25519", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Empty(t, certList.Items) @@ -719,7 +720,7 @@ func Test_RemoveSSHKnownHosts(t *testing.T) { certList, err = db.RemoveRepoCertificates(context.Background(), &CertificateListSelector{ CertType: "ssh", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 5) @@ -728,7 +729,7 @@ func Test_RemoveSSHKnownHosts(t *testing.T) { certList, err = db.ListRepoCertificates(context.Background(), &CertificateListSelector{ CertType: "ssh", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Empty(t, certList.Items) } @@ -744,7 +745,7 @@ func Test_RemoveTLSCertificates(t *testing.T) { HostNamePattern: "gitlab.com", CertType: "https", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 1) @@ -754,7 +755,7 @@ func Test_RemoveTLSCertificates(t *testing.T) { HostNamePattern: "gitlab.com", CertType: "https", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Empty(t, certList.Items) @@ -764,7 +765,7 @@ func Test_RemoveTLSCertificates(t *testing.T) { HostNamePattern: "test.example.com", CertType: "https", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Len(t, certList.Items, 2) @@ -774,7 +775,7 @@ func Test_RemoveTLSCertificates(t *testing.T) { HostNamePattern: "test.example.com", CertType: "https", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, certList) assert.Empty(t, certList.Items) } diff --git a/util/db/cluster_test.go b/util/db/cluster_test.go index c8c1cb1001b6b..fc25131b75970 100644 --- a/util/db/cluster_test.go +++ b/util/db/cluster_test.go @@ -25,27 +25,27 @@ const ( func Test_URIToSecretName(t *testing.T) { name, err := URIToSecretName("cluster", "http://foo") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "cluster-foo-752281925", name) name, err = URIToSecretName("cluster", "http://thelongestdomainnameintheworld.argocd-project.com:3000") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "cluster-thelongestdomainnameintheworld.argocd-project.com-2721640553", name) name, err = URIToSecretName("cluster", "http://[fe80::1ff:fe23:4567:890a]") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "cluster-fe80--1ff-fe23-4567-890a-3877258831", name) name, err = URIToSecretName("cluster", "http://[fe80::1ff:fe23:4567:890a]:8000") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "cluster-fe80--1ff-fe23-4567-890a-664858999", name) name, err = URIToSecretName("cluster", "http://[FE80::1FF:FE23:4567:890A]:8000") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "cluster-fe80--1ff-fe23-4567-890a-682802007", name) name, err = URIToSecretName("cluster", "http://:/abc") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "cluster--1969338796", name) } @@ -108,7 +108,7 @@ func TestClusterToSecret(t *testing.T) { } s := &v1.Secret{} err := clusterToSecret(cluster, s) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []byte(cluster.Server), s.Data["server"]) assert.Equal(t, []byte(cluster.Name), s.Data["name"]) @@ -145,7 +145,7 @@ func Test_secretToCluster_NoConfig(t *testing.T) { }, } cluster, err := SecretToCluster(secret) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, v1alpha1.Cluster{ Name: "test", Server: "http://mycluster", @@ -193,14 +193,10 @@ func TestUpdateCluster(t *testing.T) { Server: "http://mycluster", RefreshRequestedAt: &requestedAt, }) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) secret, err := kubeclientset.CoreV1().Secrets(fakeNamespace).Get(context.Background(), "mycluster", metav1.GetOptions{}) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) assert.Equal(t, secret.Annotations[v1alpha1.AnnotationKeyRefresh], requestedAt.Format(time.RFC3339)) } @@ -255,7 +251,7 @@ func TestRejectCreationForInClusterWhenDisabled(t *testing.T) { Server: appv1.KubernetesInternalAPIServerAddr, Name: "incluster-name", }) - assert.Error(t, err) + require.Error(t, err) } func runWatchTest(t *testing.T, db ArgoDB, actions []func(old *v1alpha1.Cluster, new *v1alpha1.Cluster)) { @@ -283,7 +279,7 @@ func runWatchTest(t *testing.T, db ArgoDB, actions []func(old *v1alpha1.Cluster, } go func() { - assert.NoError(t, db.WatchClusters(ctx, func(cluster *v1alpha1.Cluster) { + require.NoError(t, db.WatchClusters(ctx, func(cluster *v1alpha1.Cluster) { doNext(nil, cluster) }, func(oldCluster *v1alpha1.Cluster, newCluster *v1alpha1.Cluster) { doNext(oldCluster, newCluster) diff --git a/util/db/db_test.go b/util/db/db_test.go index 6383aa33b5d38..38d56a4bceac1 100644 --- a/util/db/db_test.go +++ b/util/db/db_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" appv1 "k8s.io/api/apps/v1" @@ -58,11 +59,11 @@ func TestCreateRepository(t *testing.T) { Username: "test-username", Password: "test-password", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "https://github.com/argoproj/argocd-example-apps", repo.Repo) secret, err := clientset.CoreV1().Secrets(testNamespace).Get(context.Background(), RepoURLToSecretName(repoSecretPrefix, repo.Repo, ""), metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, common.AnnotationValueManagedByArgoCD, secret.Annotations[common.AnnotationKeyManagedBy]) assert.Equal(t, "test-username", string(secret.Data[username])) @@ -80,7 +81,7 @@ func TestCreateProjectScopedRepository(t *testing.T) { Password: "test-password", Project: "test-project", }) - assert.NoError(t, err) + require.NoError(t, err) otherRepo, err := db.CreateRepository(context.Background(), &v1alpha1.Repository{ Repo: "https://github.com/argoproj/argocd-example-apps", @@ -88,19 +89,19 @@ func TestCreateProjectScopedRepository(t *testing.T) { Password: "other-password", Project: "other-project", }) - assert.NoError(t, err) + require.NoError(t, err) _, err = db.CreateRepository(context.Background(), &v1alpha1.Repository{ Repo: "https://github.com/argoproj/argocd-example-apps", Username: "wrong-username", Password: "wrong-password", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "https://github.com/argoproj/argocd-example-apps", repo.Repo) secret, err := clientset.CoreV1().Secrets(testNamespace).Get(context.Background(), RepoURLToSecretName(repoSecretPrefix, repo.Repo, "test-project"), metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, common.AnnotationValueManagedByArgoCD, secret.Annotations[common.AnnotationKeyManagedBy]) assert.Equal(t, "test-username", string(secret.Data[username])) @@ -109,7 +110,7 @@ func TestCreateProjectScopedRepository(t *testing.T) { assert.Empty(t, secret.Data[sshPrivateKey]) secret, err = clientset.CoreV1().Secrets(testNamespace).Get(context.Background(), RepoURLToSecretName(repoSecretPrefix, otherRepo.Repo, "other-project"), metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, common.AnnotationValueManagedByArgoCD, secret.Annotations[common.AnnotationKeyManagedBy]) assert.Equal(t, "other-username", string(secret.Data[username])) assert.Equal(t, "other-password", string(secret.Data[password])) @@ -126,11 +127,11 @@ func TestCreateRepoCredentials(t *testing.T) { Username: "test-username", Password: "test-password", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "https://github.com/argoproj/", creds.URL) secret, err := clientset.CoreV1().Secrets(testNamespace).Get(context.Background(), RepoURLToSecretName(credSecretPrefix, creds.URL, ""), metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, common.AnnotationValueManagedByArgoCD, secret.Annotations[common.AnnotationKeyManagedBy]) assert.Equal(t, "test-username", string(secret.Data[username])) @@ -140,7 +141,7 @@ func TestCreateRepoCredentials(t *testing.T) { created, err := db.CreateRepository(context.Background(), &v1alpha1.Repository{ Repo: "https://github.com/argoproj/argo-cd", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "https://github.com/argoproj/argo-cd", created.Repo) // There seems to be a race or some other hiccup in the fake K8s clientset used for this test. @@ -148,7 +149,7 @@ func TestCreateRepoCredentials(t *testing.T) { time.Sleep(1 * time.Second) repo, err := db.GetRepository(context.Background(), created.Repo, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test-username", repo.Username) assert.Equal(t, "test-password", repo.Password) } @@ -216,10 +217,10 @@ func TestGetRepositoryCredentials(t *testing.T) { got, err := db.GetRepositoryCredentials(context.TODO(), tt.repoURL) if tt.wantErr { - assert.Error(t, err) + require.Error(t, err) assert.True(t, errors.IsNotFound(err)) } else { - assert.NoError(t, err) + require.NoError(t, err) } assert.Equal(t, tt.want, got) @@ -238,7 +239,7 @@ func TestCreateExistingRepository(t *testing.T) { Username: "test-username", Password: "test-password", }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, codes.AlreadyExists, status.Convert(err).Code()) } @@ -285,7 +286,7 @@ func TestGetRepository(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := db.GetRepository(context.TODO(), tt.repoURL, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, tt.want, got) }) } @@ -323,14 +324,14 @@ func TestDeleteRepositoryManagedSecrets(t *testing.T) { db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) err := db.DeleteRepository(context.Background(), "https://github.com/argoproj/argocd-example-apps", "") - assert.NoError(t, err) + require.NoError(t, err) _, err = clientset.CoreV1().Secrets(testNamespace).Get(context.Background(), "managed-secret", metav1.GetOptions{}) - assert.Error(t, err) + require.Error(t, err) assert.True(t, errors.IsNotFound(err)) cm, err := clientset.CoreV1().ConfigMaps(testNamespace).Get(context.Background(), "argocd-cm", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "", cm.Data["repositories"]) } @@ -359,15 +360,15 @@ func TestDeleteRepositoryUnmanagedSecrets(t *testing.T) { db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) err := db.DeleteRepository(context.Background(), "https://github.com/argoproj/argocd-example-apps", "") - assert.NoError(t, err) + require.NoError(t, err) s, err := clientset.CoreV1().Secrets(testNamespace).Get(context.Background(), "unmanaged-secret", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test-username", string(s.Data[username])) assert.Equal(t, "test-password", string(s.Data[password])) cm, err := clientset.CoreV1().ConfigMaps(testNamespace).Get(context.Background(), "argocd-cm", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "", cm.Data["repositories"]) } @@ -403,7 +404,7 @@ func TestUpdateRepositoryWithManagedSecrets(t *testing.T) { db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) repo, err := db.GetRepository(context.Background(), "https://github.com/argoproj/argocd-example-apps", "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test-username", repo.Username) assert.Equal(t, "test-password", repo.Password) assert.Equal(t, "test-ssh-private-key", repo.SSHPrivateKey) @@ -411,14 +412,14 @@ func TestUpdateRepositoryWithManagedSecrets(t *testing.T) { _, err = db.UpdateRepository(context.Background(), &v1alpha1.Repository{ Repo: "https://github.com/argoproj/argocd-example-apps", Password: "", Username: "", SSHPrivateKey: "", }) - assert.NoError(t, err) + require.NoError(t, err) _, err = clientset.CoreV1().Secrets(testNamespace).Get(context.Background(), "managed-secret", metav1.GetOptions{}) - assert.Error(t, err) + require.Error(t, err) assert.True(t, errors.IsNotFound(err)) cm, err := clientset.CoreV1().ConfigMaps(testNamespace).Get(context.Background(), "argocd-cm", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "- url: https://github.com/argoproj/argocd-example-apps", strings.Trim(cm.Data["repositories"], "\n")) } @@ -466,7 +467,7 @@ func TestRepositorySecretsTrim(t *testing.T) { db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) repo, err := db.GetRepository(context.Background(), "https://github.com/argoproj/argocd-example-apps", "") - assert.NoError(t, err) + require.NoError(t, err) teststruct := []struct { expectedSecret string retrievedSecret string @@ -520,7 +521,7 @@ func TestGetClusterSuccessful(t *testing.T) { db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) cluster, err := db.GetCluster(context.Background(), server) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, server, cluster.Server) assert.Equal(t, name, cluster.Name) } @@ -531,7 +532,7 @@ func TestGetNonExistingCluster(t *testing.T) { db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) _, err := db.GetCluster(context.Background(), server) - assert.Error(t, err) + require.Error(t, err) status, ok := status.FromError(err) assert.True(t, ok) assert.Equal(t, codes.NotFound, status.Code()) @@ -545,10 +546,10 @@ func TestCreateClusterSuccessful(t *testing.T) { _, err := db.CreateCluster(context.Background(), &v1alpha1.Cluster{ Server: server, }) - assert.NoError(t, err) + require.NoError(t, err) secret, err := clientset.CoreV1().Secrets(testNamespace).Get(context.Background(), "cluster-mycluster-3274446258", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, server, string(secret.Data["server"])) assert.Equal(t, common.AnnotationValueManagedByArgoCD, secret.Annotations[common.AnnotationKeyManagedBy]) @@ -577,10 +578,10 @@ func TestDeleteClusterWithManagedSecret(t *testing.T) { db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) err := db.DeleteCluster(context.Background(), clusterURL) - assert.NoError(t, err) + require.NoError(t, err) _, err = clientset.CoreV1().Secrets(testNamespace).Get(context.Background(), clusterName, metav1.GetOptions{}) - assert.Error(t, err) + require.Error(t, err) assert.True(t, errors.IsNotFound(err)) } @@ -605,10 +606,10 @@ func TestDeleteClusterWithUnmanagedSecret(t *testing.T) { db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) err := db.DeleteCluster(context.Background(), clusterURL) - assert.NoError(t, err) + require.NoError(t, err) secret, err := clientset.CoreV1().Secrets(testNamespace).Get(context.Background(), clusterName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, secret.Labels) } @@ -621,7 +622,7 @@ func TestFuzzyEquivalence(t *testing.T) { repo, err := db.CreateRepository(ctx, &v1alpha1.Repository{ Repo: "https://github.com/argoproj/argocd-example-apps", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "https://github.com/argoproj/argocd-example-apps", repo.Repo) repo, err = db.CreateRepository(ctx, &v1alpha1.Repository{ @@ -637,7 +638,7 @@ func TestFuzzyEquivalence(t *testing.T) { assert.Nil(t, repo) repo, err = db.GetRepository(ctx, "https://github.com/argoproj/argocd-example-APPS", "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "https://github.com/argoproj/argocd-example-apps", repo.Repo) } @@ -677,7 +678,7 @@ func TestListHelmRepositories(t *testing.T) { db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) repos, err := db.ListRepositories(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 1) repo := repos[0] assert.Equal(t, "https://argoproj.github.io/argo-helm", repo.Repo) @@ -724,7 +725,7 @@ func TestHelmRepositorySecretsTrim(t *testing.T) { db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) repo, err := db.GetRepository(context.Background(), "https://argoproj.github.io/argo-helm", "") - assert.NoError(t, err) + require.NoError(t, err) teststruct := []struct { expectedSecret string retrievedSecret string @@ -771,7 +772,7 @@ func TestGetClusterServersByName(t *testing.T) { }) db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) servers, err := db.GetClusterServersByName(context.Background(), "my-cluster-name") - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, []string{"https://my-cluster-server"}, servers) } @@ -779,7 +780,7 @@ func TestGetClusterServersByName_InClusterNotConfigured(t *testing.T) { clientset := getClientset(nil) db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) servers, err := db.GetClusterServersByName(context.Background(), "in-cluster") - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, []string{v1alpha1.KubernetesInternalAPIServerAddr}, servers) } @@ -803,7 +804,7 @@ func TestGetClusterServersByName_InClusterConfigured(t *testing.T) { }) db := NewDB(testNamespace, settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) servers, err := db.GetClusterServersByName(context.Background(), "in-cluster-renamed") - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, []string{v1alpha1.KubernetesInternalAPIServerAddr}, servers) } diff --git a/util/db/gpgkeys_test.go b/util/db/gpgkeys_test.go index b8ff22e03dcf7..dfc0d8fdaf99b 100644 --- a/util/db/gpgkeys_test.go +++ b/util/db/gpgkeys_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -118,7 +119,7 @@ func Test_ValidatePGPKey(t *testing.T) { // Good case - single PGP key { key, err := validatePGPKey(testdata.Github_asc) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, key) assert.Equal(t, "4AEE18F83AFDEB23", key.KeyID) assert.NotEmpty(t, key.Owner) @@ -128,13 +129,13 @@ func Test_ValidatePGPKey(t *testing.T) { // Bad case - Garbage { key, err := validatePGPKey(testdata.Garbage_asc) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, key) } // Bad case - more than one key { key, err := validatePGPKey(testdata.Multi_asc) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, key) } } @@ -149,7 +150,7 @@ func Test_ListConfiguredGPGPublicKeys(t *testing.T) { panic("could not get database") } keys, err := db.ListConfiguredGPGPublicKeys(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) } // Good case. No certificates in ConfigMap @@ -161,7 +162,7 @@ func Test_ListConfiguredGPGPublicKeys(t *testing.T) { panic("could not get database") } keys, err := db.ListConfiguredGPGPublicKeys(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, keys) } // Bad case. Single key in input, wrong mapping to Key ID in CM @@ -173,7 +174,7 @@ func Test_ListConfiguredGPGPublicKeys(t *testing.T) { panic("could not get database") } keys, err := db.ListConfiguredGPGPublicKeys(context.Background()) - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, keys) } // Bad case. Garbage public key @@ -185,7 +186,7 @@ func Test_ListConfiguredGPGPublicKeys(t *testing.T) { panic("could not get database") } keys, err := db.ListConfiguredGPGPublicKeys(context.Background()) - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, keys) } // Bad case. Garbage ConfigMap key in data @@ -197,7 +198,7 @@ func Test_ListConfiguredGPGPublicKeys(t *testing.T) { panic("could not get database") } keys, err := db.ListConfiguredGPGPublicKeys(context.Background()) - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, keys) } } @@ -211,47 +212,47 @@ func Test_AddGPGPublicKey(t *testing.T) { // Key should be added new, skipped, err := db.AddGPGPublicKey(context.Background(), testdata.Github_asc) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, new, 1) assert.Empty(t, skipped) cm, err := settings.GetConfigMapByName(common.ArgoCDGPGKeysConfigMapName) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, cm.Data, 1) // Same key should not be added, but skipped new, skipped, err = db.AddGPGPublicKey(context.Background(), testdata.Github_asc) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, new) assert.Len(t, skipped, 1) cm, err = settings.GetConfigMapByName(common.ArgoCDGPGKeysConfigMapName) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, cm.Data, 1) // New keys should be added new, skipped, err = db.AddGPGPublicKey(context.Background(), testdata.Multi_asc) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, new, 2) assert.Empty(t, skipped) cm, err = settings.GetConfigMapByName(common.ArgoCDGPGKeysConfigMapName) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, cm.Data, 3) // Same new keys should be skipped new, skipped, err = db.AddGPGPublicKey(context.Background(), testdata.Multi_asc) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, new) assert.Len(t, skipped, 2) cm, err = settings.GetConfigMapByName(common.ArgoCDGPGKeysConfigMapName) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, cm.Data, 3) // Garbage input should result in error new, skipped, err = db.AddGPGPublicKey(context.Background(), testdata.Garbage_asc) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, new) assert.Nil(t, skipped) cm, err = settings.GetConfigMapByName(common.ArgoCDGPGKeysConfigMapName) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, cm.Data, 3) } } @@ -266,28 +267,28 @@ func Test_DeleteGPGPublicKey(t *testing.T) { // Key should be removed err := db.DeleteGPGPublicKey(context.Background(), "FDC79815400D88A9") - assert.NoError(t, err) + require.NoError(t, err) // Key should not exist anymore, therefore can't be deleted again err = db.DeleteGPGPublicKey(context.Background(), "FDC79815400D88A9") - assert.Error(t, err) + require.Error(t, err) // One key left in configuration n, err := db.ListConfiguredGPGPublicKeys(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, n, 1) // Key should be removed err = db.DeleteGPGPublicKey(context.Background(), "F7842A5CEAA9C0B1") - assert.NoError(t, err) + require.NoError(t, err) // Key should not exist anymore, therefore can't be deleted again err = db.DeleteGPGPublicKey(context.Background(), "F7842A5CEAA9C0B1") - assert.Error(t, err) + require.Error(t, err) // No key left in configuration n, err = db.ListConfiguredGPGPublicKeys(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, n) }) @@ -298,6 +299,6 @@ func Test_DeleteGPGPublicKey(t *testing.T) { // Key should be removed err := db.DeleteGPGPublicKey(context.Background(), "F7842A5CEAA9C0B1") - assert.Error(t, err) + require.Error(t, err) }) } diff --git a/util/db/repository_secrets_test.go b/util/db/repository_secrets_test.go index 250e1adf98a57..770004fa35a97 100644 --- a/util/db/repository_secrets_test.go +++ b/util/db/repository_secrets_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" corev1 "k8s.io/api/core/v1" @@ -57,7 +58,7 @@ func TestSecretsRepositoryBackend_CreateRepository(t *testing.T) { output, err := f.repoBackend.CreateRepository(context.Background(), repo) // then - assert.NoError(t, err) + require.NoError(t, err) assert.Same(t, repo, output) secret, err := f.clientSet.CoreV1().Secrets(testNamespace).Get( @@ -66,7 +67,7 @@ func TestSecretsRepositoryBackend_CreateRepository(t *testing.T) { metav1.GetOptions{}, ) assert.NotNil(t, secret) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, common.AnnotationValueManagedByArgoCD, secret.Annotations[common.AnnotationKeyManagedBy]) assert.Equal(t, common.LabelValueSecretTypeRepository, secret.Labels[common.LabelKeySecretType]) @@ -98,7 +99,7 @@ func TestSecretsRepositoryBackend_CreateRepository(t *testing.T) { output, err := f.repoBackend.CreateRepository(context.Background(), repo) // then - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, output) status, ok := status.FromError(err) assert.True(t, ok) @@ -139,7 +140,7 @@ func TestSecretsRepositoryBackend_CreateRepository(t *testing.T) { output, err := f.repoBackend.CreateRepository(context.Background(), repo) // then - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, output) status, ok := status.FromError(err) assert.True(t, ok) @@ -215,7 +216,7 @@ func TestSecretsRepositoryBackend_GetRepository(t *testing.T) { }} repository, err := testee.GetRepository(context.TODO(), "git@github.com:argoproj/argo-cd.git", "") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repository) assert.Equal(t, "ArgoCD", repository.Name) assert.Equal(t, "git@github.com:argoproj/argo-cd.git", repository.Repo) @@ -223,7 +224,7 @@ func TestSecretsRepositoryBackend_GetRepository(t *testing.T) { assert.Equal(t, "somePassword", repository.Password) repository, err = testee.GetRepository(context.TODO(), "git@github.com:argoproj/argoproj.git", "") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repository) assert.Equal(t, "UserManagedRepo", repository.Name) assert.Equal(t, "git@github.com:argoproj/argoproj.git", repository.Repo) @@ -231,7 +232,7 @@ func TestSecretsRepositoryBackend_GetRepository(t *testing.T) { assert.Equal(t, "someOtherPassword", repository.Password) repository, err = testee.GetRepository(context.TODO(), "git@github.com:argoproj/argo-cd.git", "testProject") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repository) assert.Equal(t, "Scoped ArgoCD", repository.Name) assert.Equal(t, "git@github.com:argoproj/argo-cd.git", repository.Repo) @@ -240,7 +241,7 @@ func TestSecretsRepositoryBackend_GetRepository(t *testing.T) { assert.Equal(t, "testProject", repository.Project) repository, err = testee.GetRepository(context.TODO(), "git@github.com:argoproj/argoproj.git", "testProject") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repository) assert.Equal(t, "Scoped UserManagedRepo", repository.Name) assert.Equal(t, "git@github.com:argoproj/argoproj.git", repository.Repo) @@ -288,7 +289,7 @@ func TestSecretsRepositoryBackend_ListRepositories(t *testing.T) { }} repositories, err := testee.ListRepositories(context.TODO(), nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repositories, 2) for _, repository := range repositories { @@ -411,54 +412,54 @@ func TestSecretsRepositoryBackend_UpdateRepository(t *testing.T) { managedRepository.Username = "newUsername" updateRepository, err := testee.UpdateRepository(context.TODO(), managedRepository) - assert.NoError(t, err) + require.NoError(t, err) assert.Same(t, managedRepository, updateRepository) assert.Equal(t, managedRepository.Username, updateRepository.Username) secret, err := clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), managedSecretName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Equal(t, "newUsername", string(secret.Data["username"])) userProvidedRepository.Username = "newOtherUsername" updateRepository, err = testee.UpdateRepository(context.TODO(), userProvidedRepository) - assert.NoError(t, err) + require.NoError(t, err) assert.Same(t, userProvidedRepository, updateRepository) assert.Equal(t, userProvidedRepository.Username, updateRepository.Username) secret, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), "user-managed", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Equal(t, "newOtherUsername", string(secret.Data["username"])) updateRepository, err = testee.UpdateRepository(context.TODO(), newRepository) - assert.NoError(t, err) + require.NoError(t, err) assert.Same(t, newRepository, updateRepository) secret, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), newSecretName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Equal(t, "foo", string(secret.Data["username"])) managedProjectRepository.Username = "newUsername" updateRepository, err = testee.UpdateRepository(context.TODO(), managedProjectRepository) - assert.NoError(t, err) + require.NoError(t, err) assert.Same(t, managedProjectRepository, updateRepository) assert.Equal(t, managedProjectRepository.Username, updateRepository.Username) secret, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), managedProjectSecretName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Equal(t, "newUsername", string(secret.Data["username"])) userProvidedProjectRepository.Username = "newUsernameScoped" updateRepository, err = testee.UpdateRepository(context.TODO(), userProvidedProjectRepository) - assert.NoError(t, err) + require.NoError(t, err) assert.Same(t, userProvidedProjectRepository, updateRepository) assert.Equal(t, userProvidedProjectRepository.Username, updateRepository.Username) secret, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), "user-managed-scoped", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Equal(t, "newUsernameScoped", string(secret.Data["username"])) } @@ -519,25 +520,25 @@ func TestSecretsRepositoryBackend_DeleteRepository(t *testing.T) { }} err := testee.DeleteRepository(context.TODO(), "git@github.com:argoproj/argo-cd.git", "") - assert.NoError(t, err) + require.NoError(t, err) _, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), managedSecretName, metav1.GetOptions{}) - assert.Error(t, err) + require.Error(t, err) _, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), managedScopedSecretName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) err = testee.DeleteRepository(context.TODO(), "git@github.com:argoproj/argo-cd.git", "someProject") - assert.NoError(t, err) + require.NoError(t, err) _, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), managedScopedSecretName, metav1.GetOptions{}) - assert.Error(t, err) + require.Error(t, err) err = testee.DeleteRepository(context.TODO(), "git@github.com:argoproj/argoproj.git", "") - assert.NoError(t, err) + require.NoError(t, err) secret, err := clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), "user-managed", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Empty(t, secret.Labels[common.LabelValueSecretTypeRepository]) } @@ -580,7 +581,7 @@ func TestSecretsRepositoryBackend_CreateRepoCreds(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { output, err := testee.CreateRepoCreds(context.TODO(), &testCase.repoCreds) - assert.NoError(t, err) + require.NoError(t, err) assert.Same(t, &testCase.repoCreds, output) secret, err := clientset.CoreV1().Secrets(testNamespace).Get( @@ -589,7 +590,7 @@ func TestSecretsRepositoryBackend_CreateRepoCreds(t *testing.T) { metav1.GetOptions{}, ) assert.NotNil(t, secret) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, common.AnnotationValueManagedByArgoCD, secret.Annotations[common.AnnotationKeyManagedBy]) assert.Equal(t, common.LabelValueSecretTypeRepoCreds, secret.Labels[common.LabelKeySecretType]) @@ -656,14 +657,14 @@ func TestSecretsRepositoryBackend_GetRepoCreds(t *testing.T) { }} repoCred, err := testee.GetRepoCreds(context.TODO(), "git@github.com:argoproj") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repoCred) assert.Equal(t, "git@github.com:argoproj", repoCred.URL) assert.Equal(t, "someUsername", repoCred.Username) assert.Equal(t, "somePassword", repoCred.Password) repoCred, err = testee.GetRepoCreds(context.TODO(), "git@gitlab.com") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repoCred) assert.Equal(t, "git@gitlab.com", repoCred.URL) assert.Equal(t, "someOtherUsername", repoCred.Username) @@ -707,7 +708,7 @@ func TestSecretsRepositoryBackend_ListRepoCreds(t *testing.T) { }} repoCreds, err := testee.ListRepoCreds(context.TODO()) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repoCreds, 2) assert.Contains(t, repoCreds, "git@github.com:argoproj") assert.Contains(t, repoCreds, "git@gitlab.com") @@ -769,32 +770,32 @@ func TestSecretsRepositoryBackend_UpdateRepoCreds(t *testing.T) { managedCreds.Username = "newUsername" updateRepoCreds, err := testee.UpdateRepoCreds(context.TODO(), managedCreds) - assert.NoError(t, err) + require.NoError(t, err) assert.NotSame(t, managedCreds, updateRepoCreds) assert.Equal(t, managedCreds.Username, updateRepoCreds.Username) secret, err := clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), managedCredsName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Equal(t, "newUsername", string(secret.Data["username"])) userProvidedCreds.Username = "newOtherUsername" updateRepoCreds, err = testee.UpdateRepoCreds(context.TODO(), userProvidedCreds) - assert.NoError(t, err) + require.NoError(t, err) assert.NotSame(t, userProvidedCreds, updateRepoCreds) assert.Equal(t, userProvidedCreds.Username, updateRepoCreds.Username) secret, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), "user-managed", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Equal(t, "newOtherUsername", string(secret.Data["username"])) updateRepoCreds, err = testee.UpdateRepoCreds(context.TODO(), newCreds) - assert.NoError(t, err) + require.NoError(t, err) assert.Same(t, newCreds, updateRepoCreds) secret, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), newCredsName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Equal(t, "foo", string(secret.Data["username"])) } @@ -837,16 +838,16 @@ func TestSecretsRepositoryBackend_DeleteRepoCreds(t *testing.T) { }} err := testee.DeleteRepoCreds(context.TODO(), "git@github.com:argoproj") - assert.NoError(t, err) + require.NoError(t, err) _, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), managedSecretName, metav1.GetOptions{}) - assert.Error(t, err) + require.Error(t, err) err = testee.DeleteRepoCreds(context.TODO(), "git@gitlab.com") - assert.NoError(t, err) + require.NoError(t, err) secret, err := clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), "user-managed", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Empty(t, secret.Labels[common.LabelValueSecretTypeRepoCreds]) } @@ -891,7 +892,7 @@ func TestSecretsRepositoryBackend_GetAllHelmRepoCreds(t *testing.T) { }} repoCreds, err := testee.GetAllHelmRepoCreds(context.TODO()) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repoCreds, 1) } diff --git a/util/db/repository_test.go b/util/db/repository_test.go index 11804619c20b8..a0601815e901f 100644 --- a/util/db/repository_test.go +++ b/util/db/repository_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -64,12 +65,12 @@ func TestDb_CreateRepository(t *testing.T) { // The repository was indeed created successfully output, err := testee.CreateRepository(context.TODO(), input) - assert.NoError(t, err) + require.NoError(t, err) assert.Same(t, input, output) // New repositories should not be stored in the settings anymore settingRepositories, err := settingsManager.GetRepositories() - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, settingRepositories) // New repositories should be now stored as secrets @@ -79,7 +80,7 @@ func TestDb_CreateRepository(t *testing.T) { metav1.GetOptions{}, ) assert.NotNil(t, secret) - assert.NoError(t, err) + require.NoError(t, err) } func TestDb_GetRepository(t *testing.T) { @@ -92,17 +93,17 @@ func TestDb_GetRepository(t *testing.T) { } repository, err := testee.GetRepository(context.TODO(), "git@github.com:argoproj/argoproj.git", "") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repository) assert.Equal(t, "OtherRepo", repository.Name) repository, err = testee.GetRepository(context.TODO(), "git@github.com:argoproj/argo-cd.git", "") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repository) assert.Equal(t, "SomeRepo", repository.Name) repository, err = testee.GetRepository(context.TODO(), "git@github.com:argoproj/not-existing.git", "") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repository) assert.Equal(t, "git@github.com:argoproj/not-existing.git", repository.Repo) } @@ -117,7 +118,7 @@ func TestDb_ListRepositories(t *testing.T) { } repositories, err := testee.ListRepositories(context.TODO()) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repositories, 2) } @@ -148,7 +149,7 @@ func TestDb_UpdateRepository(t *testing.T) { // Verify that legacy repository can still be updated settingRepository.Username = "OtherUpdatedUsername" repository, err := testee.UpdateRepository(context.TODO(), settingRepository) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repository) assert.Same(t, settingRepository, repository) @@ -157,14 +158,14 @@ func TestDb_UpdateRepository(t *testing.T) { "managed-secret", metav1.GetOptions{}, ) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Equal(t, "OtherUpdatedUsername", string(secret.Data["username"])) // Verify that secret-based repository can be updated secretRepository.Username = "UpdatedUsername" repository, err = testee.UpdateRepository(context.TODO(), secretRepository) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repository) assert.Same(t, secretRepository, repository) @@ -173,7 +174,7 @@ func TestDb_UpdateRepository(t *testing.T) { "some-repo-secret", metav1.GetOptions{}, ) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, secret) assert.Equal(t, "UpdatedUsername", string(secret.Data["username"])) } @@ -188,17 +189,17 @@ func TestDb_DeleteRepository(t *testing.T) { } err := testee.DeleteRepository(context.TODO(), "git@github.com:argoproj/argoproj.git", "") - assert.NoError(t, err) + require.NoError(t, err) repositories, err := settingsManager.GetRepositories() - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, repositories) err = testee.DeleteRepository(context.TODO(), "git@github.com:argoproj/argo-cd.git", "") - assert.NoError(t, err) + require.NoError(t, err) _, err = clientset.CoreV1().Secrets(testNamespace).Get(context.TODO(), "some-repo-secret", metav1.GetOptions{}) - assert.Error(t, err) + require.Error(t, err) } func TestDb_GetRepositoryCredentials(t *testing.T) { @@ -232,17 +233,17 @@ func TestDb_GetRepositoryCredentials(t *testing.T) { testee := NewDB(testNamespace, settings.NewSettingsManager(context.TODO(), clientset, testNamespace), clientset) repoCreds, err := testee.GetRepositoryCredentials(context.TODO(), "git@github.com:argoproj/argoproj.git") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repoCreds) assert.Equal(t, "git@github.com:argoproj", repoCreds.URL) repoCreds, err = testee.GetRepositoryCredentials(context.TODO(), "git@gitlab.com:someorg/foobar.git") - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, repoCreds) assert.Equal(t, "git@gitlab.com", repoCreds.URL) repoCreds, err = testee.GetRepositoryCredentials(context.TODO(), "git@github.com:example/not-existing.git") - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, repoCreds) } @@ -357,7 +358,7 @@ func Test_GetProjectRepositories(t *testing.T) { argoDB := NewDB(testNamespace, settings.NewSettingsManager(context.TODO(), clientset, testNamespace), clientset) repos, err := argoDB.GetProjectRepositories(context.TODO(), "some-project") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 1) assert.Equal(t, "git@github.com:argoproj/argo-cd", repos[0].Repo) } diff --git a/util/dex/dex_test.go b/util/dex/dex_test.go index bd81c48fdd525..8d54dc2a6120e 100644 --- a/util/dex/dex_test.go +++ b/util/dex/dex_test.go @@ -10,6 +10,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "sigs.k8s.io/yaml" // "github.com/argoproj/argo-cd/common" @@ -155,7 +156,7 @@ func Test_GenerateDexConfig(t *testing.T) { t.Run("Empty settings", func(t *testing.T) { s := settings.ArgoCDSettings{} config, err := GenerateDexConfigYAML(&s, false) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, config) }) @@ -165,7 +166,7 @@ func Test_GenerateDexConfig(t *testing.T) { DexConfig: goodDexConfig, } config, err := GenerateDexConfigYAML(&s, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, config) }) @@ -175,7 +176,7 @@ func Test_GenerateDexConfig(t *testing.T) { DexConfig: "invalidyaml", } config, err := GenerateDexConfigYAML(&s, false) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, config) }) @@ -185,7 +186,7 @@ func Test_GenerateDexConfig(t *testing.T) { DexConfig: "invalidyaml", } config, err := GenerateDexConfigYAML(&s, false) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, config) }) @@ -195,7 +196,7 @@ func Test_GenerateDexConfig(t *testing.T) { DexConfig: malformedDexConfig, } config, err := GenerateDexConfigYAML(&s, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, config) }) @@ -205,7 +206,7 @@ func Test_GenerateDexConfig(t *testing.T) { DexConfig: badDexConfig, } config, err := GenerateDexConfigYAML(&s, false) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, config) }) @@ -215,7 +216,7 @@ func Test_GenerateDexConfig(t *testing.T) { DexConfig: goodDexConfig, } config, err := GenerateDexConfigYAML(&s, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, config) }) @@ -226,7 +227,7 @@ func Test_GenerateDexConfig(t *testing.T) { Secrets: goodSecrets, } config, err := GenerateDexConfigYAML(&s, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, config) var dexCfg map[string]interface{} err = yaml.Unmarshal(config, &dexCfg) @@ -252,7 +253,7 @@ func Test_GenerateDexConfig(t *testing.T) { Secrets: goodSecretswithCRLF, } config, err := GenerateDexConfigYAML(&s, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, config) var dexCfg map[string]interface{} err = yaml.Unmarshal(config, &dexCfg) @@ -286,7 +287,7 @@ func Test_GenerateDexConfig(t *testing.T) { Secrets: goodSecretswithCRLF, } config, err := GenerateDexConfigYAML(&s, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, config) var dexCfg map[string]interface{} err = yaml.Unmarshal(config, &dexCfg) @@ -308,7 +309,7 @@ func Test_GenerateDexConfig(t *testing.T) { Secrets: goodSecretswithCRLF, } config, err := GenerateDexConfigYAML(&s, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, config) var dexCfg map[string]interface{} err = yaml.Unmarshal(config, &dexCfg) @@ -328,7 +329,7 @@ func Test_GenerateDexConfig(t *testing.T) { DexConfig: goodDexConfigWithOauthOverrides, } config, err := GenerateDexConfigYAML(&s, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, config) var dexCfg map[string]interface{} err = yaml.Unmarshal(config, &dexCfg) @@ -351,7 +352,7 @@ func Test_GenerateDexConfig(t *testing.T) { DexConfig: goodDexConfigWithEnabledApprovalScreen, } config, err := GenerateDexConfigYAML(&s, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, config) var dexCfg map[string]interface{} err = yaml.Unmarshal(config, &dexCfg) @@ -385,7 +386,7 @@ func Test_DexReverseProxy(t *testing.T) { target, _ := url.Parse(fakeDex.URL) resp, err := http.Get(server.URL) assert.NotNil(t, resp) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, host, target.Host) fmt.Printf("%s\n", resp.Status) @@ -407,7 +408,7 @@ func Test_DexReverseProxy(t *testing.T) { } resp, err := client.Get(server.URL) assert.NotNil(t, resp) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, http.StatusSeeOther, resp.StatusCode) location, _ := resp.Location() fmt.Printf("%s %s\n", resp.Status, location.RequestURI()) @@ -429,9 +430,9 @@ func Test_DexReverseProxy(t *testing.T) { rt := NewDexRewriteURLRoundTripper(server.URL, http.DefaultTransport) assert.NotNil(t, rt) req, err := http.NewRequest(http.MethodGet, "/", bytes.NewBuffer([]byte(""))) - assert.NoError(t, err) + require.NoError(t, err) _, err = rt.RoundTrip(req) - assert.NoError(t, err) + require.NoError(t, err) target, _ := url.Parse(server.URL) assert.Equal(t, req.Host, target.Host) }) diff --git a/util/git/client_test.go b/util/git/client_test.go index d291047dbef9e..8ca760dd6c26c 100644 --- a/util/git/client_test.go +++ b/util/git/client_test.go @@ -46,7 +46,7 @@ func Test_nativeGitClient_Fetch(t *testing.T) { require.NoError(t, err) err = client.Fetch("") - assert.NoError(t, err) + require.NoError(t, err) } func Test_nativeGitClient_Fetch_Prune(t *testing.T) { @@ -63,7 +63,7 @@ func Test_nativeGitClient_Fetch_Prune(t *testing.T) { require.NoError(t, err) err = client.Fetch("") - assert.NoError(t, err) + require.NoError(t, err) err = runCmd(tempDir, "git", "branch", "-d", "test/foo") require.NoError(t, err) @@ -71,7 +71,7 @@ func Test_nativeGitClient_Fetch_Prune(t *testing.T) { require.NoError(t, err) err = client.Fetch("") - assert.NoError(t, err) + require.NoError(t, err) } func Test_IsAnnotatedTag(t *testing.T) { @@ -109,9 +109,9 @@ func Test_IsAnnotatedTag(t *testing.T) { assert.True(t, atag) err = runCmd(client.Root(), "git", "rm", "README") - assert.NoError(t, err) + require.NoError(t, err) err = runCmd(client.Root(), "git", "commit", "-m", "remove README", "-a") - assert.NoError(t, err) + require.NoError(t, err) // We moved on, so tag doesn't point to HEAD anymore atag = client.IsAnnotatedTag("HEAD") @@ -216,28 +216,28 @@ func Test_nativeGitClient_Submodule(t *testing.T) { require.NoError(t, err) err = client.Fetch("") - assert.NoError(t, err) + require.NoError(t, err) commitSHA, err := client.LsRemote("HEAD") - assert.NoError(t, err) + require.NoError(t, err) // Call Checkout() with submoduleEnabled=false. err = client.Checkout(commitSHA, false) - assert.NoError(t, err) + require.NoError(t, err) // Check if submodule url does not exist in .git/config err = runCmd(client.Root(), "git", "config", "submodule.bar.url") - assert.Error(t, err) + require.Error(t, err) // Call Submodule() via Checkout() with submoduleEnabled=true. err = client.Checkout(commitSHA, true) - assert.NoError(t, err) + require.NoError(t, err) // Check if the .gitmodule URL is reflected in .git/config cmd := exec.Command("git", "config", "submodule.bar.url") cmd.Dir = client.Root() result, err := cmd.Output() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, bar+"\n", string(result)) // Change URL of submodule bar @@ -246,13 +246,13 @@ func Test_nativeGitClient_Submodule(t *testing.T) { // Call Submodule() err = client.Submodule() - assert.NoError(t, err) + require.NoError(t, err) // Check if the URL change in .gitmodule is reflected in .git/config cmd = exec.Command("git", "config", "submodule.bar.url") cmd.Dir = client.Root() result, err = cmd.Output() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, bar+"baz\n", string(result)) } diff --git a/util/git/creds_test.go b/util/git/creds_test.go index a820e632551bd..c4b0b29fd1e5a 100644 --- a/util/git/creds_test.go +++ b/util/git/creds_test.go @@ -187,18 +187,18 @@ func TestHTTPSCreds_Environ_clientCert(t *testing.T) { assert.NotEmpty(t, key) certBytes, err := os.ReadFile(cert) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "clientCertData", string(certBytes)) keyBytes, err := os.ReadFile(key) assert.Equal(t, "clientCertKey", string(keyBytes)) - assert.NoError(t, err) + require.NoError(t, err) io.Close(closer) _, err = os.Stat(cert) - assert.ErrorIs(t, err, os.ErrNotExist) + require.ErrorIs(t, err, os.ErrNotExist) _, err = os.Stat(key) - assert.ErrorIs(t, err, os.ErrNotExist) + require.ErrorIs(t, err, os.ErrNotExist) } func Test_SSHCreds_Environ(t *testing.T) { @@ -364,16 +364,16 @@ func TestNewGoogleCloudCreds_invalidJSON(t *testing.T) { token, err := googleCloudCreds.getAccessToken() assert.Equal(t, "", token) - assert.Error(t, err) + require.Error(t, err) username, err := googleCloudCreds.getUsername() assert.Equal(t, "", username) - assert.Error(t, err) + require.Error(t, err) closer, envStringSlice, err := googleCloudCreds.Environ() assert.Equal(t, NopCloser{}, closer) assert.Equal(t, []string(nil), envStringSlice) - assert.Error(t, err) + require.Error(t, err) } func TestGoogleCloudCreds_Environ_cleanup(t *testing.T) { @@ -386,7 +386,7 @@ func TestGoogleCloudCreds_Environ_cleanup(t *testing.T) { }, store} closer, env, err := googleCloudCreds.Environ() - assert.NoError(t, err) + require.NoError(t, err) var nonce string for _, envVar := range env { if strings.HasPrefix(envVar, ASKPASS_NONCE_ENV) { diff --git a/util/git/git_test.go b/util/git/git_test.go index 2d936b18acaa0..b471b4888b1ef 100644 --- a/util/git/git_test.go +++ b/util/git/git_test.go @@ -9,6 +9,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/test/fixture/log" @@ -118,19 +119,19 @@ func TestSameURL(t *testing.T) { func TestCustomHTTPClient(t *testing.T) { certFile, err := filepath.Abs("../../test/fixture/certs/argocd-test-client.crt") - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, "", certFile) keyFile, err := filepath.Abs("../../test/fixture/certs/argocd-test-client.key") - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, "", keyFile) certData, err := os.ReadFile(certFile) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, "", string(certData)) keyData, err := os.ReadFile(keyFile) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, "", string(keyData)) // Get HTTPSCreds with client cert creds specified, and insecure connection @@ -147,7 +148,7 @@ func TestCustomHTTPClient(t *testing.T) { assert.Nil(t, transport.TLSClientConfig.RootCAs) if transport.TLSClientConfig.GetClientCertificate != nil { cert, err := transport.TLSClientConfig.GetClientCertificate(nil) - assert.NoError(t, err) + require.NoError(t, err) if err == nil { assert.NotNil(t, cert) assert.NotEmpty(t, cert.Certificate) @@ -155,7 +156,7 @@ func TestCustomHTTPClient(t *testing.T) { } } proxy, err := transport.Proxy(nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "http://proxy:5000", proxy.String()) } @@ -175,7 +176,7 @@ func TestCustomHTTPClient(t *testing.T) { assert.Nil(t, transport.TLSClientConfig.RootCAs) if transport.TLSClientConfig.GetClientCertificate != nil { cert, err := transport.TLSClientConfig.GetClientCertificate(nil) - assert.NoError(t, err) + require.NoError(t, err) if err == nil { assert.NotNil(t, cert) assert.Empty(t, cert.Certificate) @@ -183,18 +184,18 @@ func TestCustomHTTPClient(t *testing.T) { } } req, err := http.NewRequest(http.MethodGet, "http://proxy-from-env:7878", nil) - assert.NoError(t, err) + require.NoError(t, err) proxy, err := transport.Proxy(req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "http://proxy-from-env:7878", proxy.String()) } // GetRepoHTTPClient with root ca cert, err := os.ReadFile("../../test/fixture/certs/argocd-test-server.crt") - assert.NoError(t, err) + require.NoError(t, err) temppath := t.TempDir() defer os.RemoveAll(temppath) err = os.WriteFile(filepath.Join(temppath, "127.0.0.1"), cert, 0o666) - assert.NoError(t, err) + require.NoError(t, err) t.Setenv(common.EnvVarTLSDataPath, temppath) client = GetRepoHTTPClient("https://127.0.0.1", false, creds, "") assert.NotNil(t, client) @@ -210,7 +211,7 @@ func TestCustomHTTPClient(t *testing.T) { func TestLsRemote(t *testing.T) { clnt, err := NewClientExt("https://github.com/argoproj/argo-cd.git", "/tmp", NopCreds{}, false, false, "") - assert.NoError(t, err) + require.NoError(t, err) testCases := []struct { name string @@ -273,7 +274,7 @@ func TestLsRemote(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { commitSHA, err := clnt.LsRemote(tc.revision) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, IsCommitSHA(commitSHA)) if tc.expectedCommit != "" { assert.Equal(t, tc.expectedCommit, commitSHA) @@ -284,7 +285,7 @@ func TestLsRemote(t *testing.T) { // We do not resolve truncated git hashes and return the commit as-is if it appears to be a commit t.Run("truncated commit", func(t *testing.T) { commitSHA, err := clnt.LsRemote("4e22a3c") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, IsCommitSHA(commitSHA)) assert.True(t, IsTruncatedCommitSHA(commitSHA)) }) @@ -311,35 +312,35 @@ func TestLFSClient(t *testing.T) { tempDir := t.TempDir() client, err := NewClientExt("https://github.com/argoproj-labs/argocd-testrepo-lfs", tempDir, NopCreds{}, false, true, "") - assert.NoError(t, err) + require.NoError(t, err) commitSHA, err := client.LsRemote("HEAD") - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, "", commitSHA) err = client.Init() - assert.NoError(t, err) + require.NoError(t, err) err = client.Fetch("") - assert.NoError(t, err) + require.NoError(t, err) err = client.Checkout(commitSHA, true) - assert.NoError(t, err) + require.NoError(t, err) largeFiles, err := client.LsLargeFiles() - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, largeFiles, 3) fileHandle, err := os.Open(fmt.Sprintf("%s/test3.yaml", tempDir)) - assert.NoError(t, err) + require.NoError(t, err) if err == nil { defer func() { if err = fileHandle.Close(); err != nil { - assert.NoError(t, err) + require.NoError(t, err) } }() text, err := io.ReadAll(fileHandle) - assert.NoError(t, err) + require.NoError(t, err) if err == nil { assert.Equal(t, "This is not a YAML, sorry.\n", string(text)) } @@ -350,25 +351,25 @@ func TestVerifyCommitSignature(t *testing.T) { p := t.TempDir() client, err := NewClientExt("https://github.com/argoproj/argo-cd.git", p, NopCreds{}, false, false, "") - assert.NoError(t, err) + require.NoError(t, err) err = client.Init() - assert.NoError(t, err) + require.NoError(t, err) err = client.Fetch("") - assert.NoError(t, err) + require.NoError(t, err) commitSHA, err := client.LsRemote("HEAD") - assert.NoError(t, err) + require.NoError(t, err) err = client.Checkout(commitSHA, true) - assert.NoError(t, err) + require.NoError(t, err) // 28027897aad1262662096745f2ce2d4c74d02b7f is a commit that is signed in the repo // It doesn't matter whether we know the key or not at this stage { out, err := client.VerifyCommitSignature("28027897aad1262662096745f2ce2d4c74d02b7f") - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, out) assert.Contains(t, out, "gpg: Signature made") } @@ -376,7 +377,7 @@ func TestVerifyCommitSignature(t *testing.T) { // 85d660f0b967960becce3d49bd51c678ba2a5d24 is a commit that is not signed { out, err := client.VerifyCommitSignature("85d660f0b967960becce3d49bd51c678ba2a5d24") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, out) } } @@ -404,25 +405,25 @@ func TestNewFactory(t *testing.T) { dirName := t.TempDir() client, err := NewClientExt(tt.args.url, dirName, NopCreds{}, tt.args.insecureIgnoreHostKey, false, "") - assert.NoError(t, err) + require.NoError(t, err) commitSHA, err := client.LsRemote("HEAD") - assert.NoError(t, err) + require.NoError(t, err) err = client.Init() - assert.NoError(t, err) + require.NoError(t, err) err = client.Fetch("") - assert.NoError(t, err) + require.NoError(t, err) // Do a second fetch to make sure we can treat `already up-to-date` error as not an error err = client.Fetch("") - assert.NoError(t, err) + require.NoError(t, err) err = client.Checkout(commitSHA, true) - assert.NoError(t, err) + require.NoError(t, err) revisionMetadata, err := client.RevisionMetadata(commitSHA) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, revisionMetadata) assert.Regexp(t, "^.*<.*>$", revisionMetadata.Author) assert.Empty(t, revisionMetadata.Tags) @@ -430,7 +431,7 @@ func TestNewFactory(t *testing.T) { assert.NotEmpty(t, revisionMetadata.Message) commitSHA2, err := client.CommitSHA() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, commitSHA, commitSHA2) } @@ -441,10 +442,10 @@ func TestListRevisions(t *testing.T) { repoURL := "https://github.com/argoproj/argo-cd.git" client, err := NewClientExt(repoURL, dir, NopCreds{}, false, false, "") - assert.NoError(t, err) + require.NoError(t, err) lsResult, err := client.LsRefs() - assert.NoError(t, err) + require.NoError(t, err) testBranch := "master" testTag := "v1.0.0" @@ -460,48 +461,48 @@ func TestLsFiles(t *testing.T) { tmpDir2 := t.TempDir() client, err := NewClientExt("", tmpDir1, NopCreds{}, false, false, "") - assert.NoError(t, err) + require.NoError(t, err) err = runCmd(tmpDir1, "git", "init") - assert.NoError(t, err) + require.NoError(t, err) // Prepare files a, err := os.Create(filepath.Join(tmpDir1, "a.yaml")) - assert.NoError(t, err) + require.NoError(t, err) a.Close() err = os.MkdirAll(filepath.Join(tmpDir1, "subdir"), 0o755) - assert.NoError(t, err) + require.NoError(t, err) b, err := os.Create(filepath.Join(tmpDir1, "subdir", "b.yaml")) - assert.NoError(t, err) + require.NoError(t, err) b.Close() err = os.MkdirAll(filepath.Join(tmpDir2, "subdir"), 0o755) - assert.NoError(t, err) + require.NoError(t, err) c, err := os.Create(filepath.Join(tmpDir2, "c.yaml")) - assert.NoError(t, err) + require.NoError(t, err) c.Close() err = os.Symlink(filepath.Join(tmpDir2, "c.yaml"), filepath.Join(tmpDir1, "link.yaml")) - assert.NoError(t, err) + require.NoError(t, err) err = runCmd(tmpDir1, "git", "add", ".") - assert.NoError(t, err) + require.NoError(t, err) err = runCmd(tmpDir1, "git", "commit", "-m", "Initial commit") - assert.NoError(t, err) + require.NoError(t, err) // Old and default globbing expectedResult := []string{"a.yaml", "link.yaml", "subdir/b.yaml"} lsResult, err := client.LsFiles("*.yaml", false) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResult, lsResult) // New and safer globbing, do not return symlinks resolving outside of the repo expectedResult = []string{"a.yaml"} lsResult, err = client.LsFiles("*.yaml", true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResult, lsResult) // New globbing, do not return files outside of the repo var nilResult []string lsResult, err = client.LsFiles(filepath.Join(tmpDir2, "*.yaml"), true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, nilResult, lsResult) } diff --git a/util/gpg/gpg_test.go b/util/gpg/gpg_test.go index 30e101faad80b..377de31f0260b 100644 --- a/util/gpg/gpg_test.go +++ b/util/gpg/gpg_test.go @@ -67,11 +67,11 @@ func Test_GPG_InitializeGnuPG(t *testing.T) { // First run should initialize fine err := InitializeGnuPG() - assert.NoError(t, err) + require.NoError(t, err) // We should have exactly one public key with ultimate trust (our own) in the keyring keys, err := GetInstalledPGPKeys(nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) assert.Equal(t, "ultimate", keys[0].Trust) @@ -86,19 +86,19 @@ func Test_GPG_InitializeGnuPG(t *testing.T) { err = InitializeGnuPG() require.NoError(t, err) keys, err = GetInstalledPGPKeys(nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) assert.Equal(t, "ultimate", keys[0].Trust) t.Run("GNUPGHOME is a file", func(t *testing.T) { f, err := os.CreateTemp("", "gpg-test") - assert.NoError(t, err) + require.NoError(t, err) defer os.Remove(f.Name()) // we need to error out t.Setenv(common.EnvGnuPGHome, f.Name()) err = InitializeGnuPG() - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "does not point to a directory") }) @@ -114,7 +114,7 @@ func Test_GPG_InitializeGnuPG(t *testing.T) { } t.Setenv(common.EnvGnuPGHome, fp) err := InitializeGnuPG() - assert.Error(t, err) + require.Error(t, err) // Restore permissions so path can be deleted err = os.Chmod(fp, 0o700) if err != nil { @@ -132,7 +132,7 @@ func Test_GPG_InitializeGnuPG(t *testing.T) { } t.Setenv(common.EnvGnuPGHome, p) err = InitializeGnuPG() - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -140,11 +140,11 @@ func Test_GPG_KeyManagement(t *testing.T) { initTempDir(t) err := InitializeGnuPG() - assert.NoError(t, err) + require.NoError(t, err) // Import a single good key keys, err := ImportPGPKeys("testdata/github.asc") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) assert.Equal(t, "4AEE18F83AFDEB23", keys[0].KeyID) assert.Contains(t, keys[0].Owner, "noreply@github.com") @@ -157,14 +157,14 @@ func Test_GPG_KeyManagement(t *testing.T) { // We should have a total of 2 keys in the keyring now { keys, err := GetInstalledPGPKeys(nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 2) } // We should now have that key in our keyring with unknown trust (trustdb not updated) { keys, err := GetInstalledPGPKeys([]string{importedKeyId}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) assert.Equal(t, "4AEE18F83AFDEB23", keys[0].KeyID) assert.Contains(t, keys[0].Owner, "noreply@github.com") @@ -178,9 +178,9 @@ func Test_GPG_KeyManagement(t *testing.T) { // Set trust level for our key and check the result { err := SetPGPTrustLevelById(kids, "ultimate") - assert.NoError(t, err) + require.NoError(t, err) keys, err := GetInstalledPGPKeys(kids) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) assert.Equal(t, kids[0], keys[0].Fingerprint) assert.Equal(t, "ultimate", keys[0].Trust) @@ -188,35 +188,35 @@ func Test_GPG_KeyManagement(t *testing.T) { // Import garbage - error expected keys, err = ImportPGPKeys("testdata/garbage.asc") - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, keys) // We should still have a total of 2 keys in the keyring now { keys, err := GetInstalledPGPKeys(nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 2) } // Delete previously imported public key { err := DeletePGPKey(importedKeyId) - assert.NoError(t, err) + require.NoError(t, err) keys, err := GetInstalledPGPKeys(nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) } // Delete non-existing key { err := DeletePGPKey(importedKeyId) - assert.Error(t, err) + require.Error(t, err) } // Import multiple keys { keys, err := ImportPGPKeys("testdata/multi.asc") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 2) assert.Contains(t, keys[0].Owner, "john.doe@example.com") assert.Contains(t, keys[1].Owner, "jane.doe@example.com") @@ -225,7 +225,7 @@ func Test_GPG_KeyManagement(t *testing.T) { // Check if they were really imported { keys, err := GetInstalledPGPKeys(nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 3) } } @@ -234,11 +234,11 @@ func Test_ImportPGPKeysFromString(t *testing.T) { initTempDir(t) err := InitializeGnuPG() - assert.NoError(t, err) + require.NoError(t, err) // Import a single good key keys, err := ImportPGPKeysFromString(test.MustLoadFileToString("testdata/github.asc")) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) assert.Equal(t, "4AEE18F83AFDEB23", keys[0].KeyID) assert.Contains(t, keys[0].Owner, "noreply@github.com") @@ -250,19 +250,19 @@ func Test_ValidateGPGKeysFromString(t *testing.T) { initTempDir(t) err := InitializeGnuPG() - assert.NoError(t, err) + require.NoError(t, err) { keyData := test.MustLoadFileToString("testdata/github.asc") keys, err := ValidatePGPKeysFromString(keyData) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) } { keyData := test.MustLoadFileToString("testdata/multi.asc") keys, err := ValidatePGPKeysFromString(keyData) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 2) } } @@ -271,12 +271,12 @@ func Test_ValidateGPGKeys(t *testing.T) { initTempDir(t) err := InitializeGnuPG() - assert.NoError(t, err) + require.NoError(t, err) // Validation good case - 1 key { keys, err := ValidatePGPKeys("testdata/github.asc") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) assert.Contains(t, keys, "4AEE18F83AFDEB23") } @@ -284,14 +284,14 @@ func Test_ValidateGPGKeys(t *testing.T) { // Validation bad case { keys, err := ValidatePGPKeys("testdata/garbage.asc") - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, keys) } // We should still have a total of 1 keys in the keyring now { keys, err := GetInstalledPGPKeys(nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) } } @@ -300,10 +300,10 @@ func Test_GPG_ParseGitCommitVerification(t *testing.T) { initTempDir(t) err := InitializeGnuPG() - assert.NoError(t, err) + require.NoError(t, err) keys, err := ImportPGPKeys("testdata/github.asc") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) // Good case @@ -519,23 +519,23 @@ func Test_IsSecretKey(t *testing.T) { // First run should initialize fine err := InitializeGnuPG() - assert.NoError(t, err) + require.NoError(t, err) // We should have exactly one public key with ultimate trust (our own) in the keyring keys, err := GetInstalledPGPKeys(nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, keys, 1) assert.Equal(t, "ultimate", keys[0].Trust) { secret, err := IsSecretKey(keys[0].KeyID) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, secret) } { secret, err := IsSecretKey("invalid") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, secret) } } @@ -545,13 +545,13 @@ func Test_SyncKeyRingFromDirectory(t *testing.T) { // First run should initialize fine err := InitializeGnuPG() - assert.NoError(t, err) + require.NoError(t, err) tempDir := t.TempDir() { new, removed, err := SyncKeyRingFromDirectory(tempDir) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, new) assert.Empty(t, removed) } @@ -576,12 +576,12 @@ func Test_SyncKeyRingFromDirectory(t *testing.T) { } new, removed, err := SyncKeyRingFromDirectory(tempDir) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, new, 3) assert.Empty(t, removed) installed, err := GetInstalledPGPKeys(new) - assert.NoError(t, err) + require.NoError(t, err) for _, k := range installed { assert.Contains(t, new, k.KeyID) } @@ -593,12 +593,12 @@ func Test_SyncKeyRingFromDirectory(t *testing.T) { panic(err.Error()) } new, removed, err := SyncKeyRingFromDirectory(tempDir) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, new) assert.Len(t, removed, 1) installed, err := GetInstalledPGPKeys(new) - assert.NoError(t, err) + require.NoError(t, err) for _, k := range installed { assert.NotEqual(t, k.KeyID, removed[0]) } From 38d6db6e69536632798168a25bc151ca806e70e8 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Sat, 15 Jun 2024 19:52:21 +0200 Subject: [PATCH 33/74] chore: enable require-error rule from errorlint linter on cmd folder (#18683) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 2 +- cmd/argocd-k8s-auth/commands/aws_test.go | 7 +- cmd/argocd/commands/admin/app_test.go | 17 ++-- .../commands/admin/generatespec_utils_test.go | 4 +- .../commands/admin/project_allowlist_test.go | 3 +- cmd/argocd/commands/admin/project_test.go | 19 ++--- cmd/argocd/commands/admin/settings_test.go | 80 ++++++++----------- cmd/argocd/commands/app_test.go | 9 ++- cmd/argocd/commands/applicationset_test.go | 5 +- cmd/argocd/commands/common_test.go | 17 ++-- cmd/argocd/commands/context_test.go | 12 +-- cmd/argocd/commands/logout_test.go | 6 +- cmd/argocd/commands/relogin_test.go | 5 +- cmd/util/app_test.go | 51 ++++++------ 14 files changed, 114 insertions(+), 123 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index de8611c08c4f4..4fe31d9fd0c2b 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -3,7 +3,7 @@ issues: - SA1019 - SA5011 exclude-rules: - - path: "(applicationset|cmd|cmpserver|controller|pkg|reposerver|server|test)/" + - path: "(applicationset|cmpserver|controller|pkg|reposerver|server|test)/" text: "require-error:" linters: - testifylint diff --git a/cmd/argocd-k8s-auth/commands/aws_test.go b/cmd/argocd-k8s-auth/commands/aws_test.go index 578aae71a2c29..7e31e50efbba8 100644 --- a/cmd/argocd-k8s-auth/commands/aws_test.go +++ b/cmd/argocd-k8s-auth/commands/aws_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestGetSignedRequestWithRetry(t *testing.T) { @@ -25,7 +26,7 @@ func TestGetSignedRequestWithRetry(t *testing.T) { signed, err := getSignedRequestWithRetry(ctx, time.Second, time.Millisecond, "cluster-name", "", "", mock.getSignedRequestMock) // then - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "token", signed) }) t.Run("will return signed request on third attempt", func(t *testing.T) { @@ -44,7 +45,7 @@ func TestGetSignedRequestWithRetry(t *testing.T) { signed, err := getSignedRequestWithRetry(ctx, time.Second, time.Millisecond, "cluster-name", "", "", mock.getSignedRequestMock) // then - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "token", signed) }) t.Run("will return error on timeout", func(t *testing.T) { @@ -60,7 +61,7 @@ func TestGetSignedRequestWithRetry(t *testing.T) { signed, err := getSignedRequestWithRetry(ctx, time.Second, time.Millisecond, "cluster-name", "", "", mock.getSignedRequestMock) // then - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "", signed) }) } diff --git a/cmd/argocd/commands/admin/app_test.go b/cmd/argocd/commands/admin/app_test.go index 80528a6bf6839..cadce3e857009 100644 --- a/cmd/argocd/commands/admin/app_test.go +++ b/cmd/argocd/commands/admin/app_test.go @@ -9,6 +9,7 @@ import ( "github.com/argoproj/gitops-engine/pkg/utils/kube" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -43,9 +44,7 @@ func TestGetReconcileResults(t *testing.T) { }) result, err := getReconcileResults(ctx, appClientset, "default", "") - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) expectedResults := []appReconcileResult{{ Name: "test", @@ -118,9 +117,7 @@ func TestGetReconcileResults_Refresh(t *testing.T) { normalizers.IgnoreNormalizerOpts{}, ) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) assert.Equal(t, health.HealthStatusMissing, result[0].Health.Status) assert.Equal(t, v1alpha1.SyncStatusCodeOutOfSync, result[0].Sync.Status) @@ -128,7 +125,7 @@ func TestGetReconcileResults_Refresh(t *testing.T) { func TestDiffReconcileResults_NoDifferences(t *testing.T) { logs, err := captureStdout(func() { - assert.NoError(t, diffReconcileResults( + require.NoError(t, diffReconcileResults( reconcileResults{Applications: []appReconcileResult{{ Name: "app1", Sync: &v1alpha1.SyncStatus{Status: v1alpha1.SyncStatusCodeOutOfSync}, @@ -139,13 +136,13 @@ func TestDiffReconcileResults_NoDifferences(t *testing.T) { }}}, )) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "app1\n", logs) } func TestDiffReconcileResults_DifferentApps(t *testing.T) { logs, err := captureStdout(func() { - assert.NoError(t, diffReconcileResults( + require.NoError(t, diffReconcileResults( reconcileResults{Applications: []appReconcileResult{{ Name: "app1", Sync: &v1alpha1.SyncStatus{Status: v1alpha1.SyncStatusCodeOutOfSync}, @@ -162,7 +159,7 @@ func TestDiffReconcileResults_DifferentApps(t *testing.T) { }}}, )) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, `app1 app2 1,9d0 diff --git a/cmd/argocd/commands/admin/generatespec_utils_test.go b/cmd/argocd/commands/admin/generatespec_utils_test.go index ea71b1ffa76ae..9c5735df5838d 100644 --- a/cmd/argocd/commands/admin/generatespec_utils_test.go +++ b/cmd/argocd/commands/admin/generatespec_utils_test.go @@ -34,7 +34,7 @@ func TestGetOutWriter_InlineOn(t *testing.T) { assert.Equal(t, tmpFile, out.(*os.File).Name()) _, err = os.Stat(fmt.Sprintf("%s.back", tmpFile)) - assert.NoError(t, err, "Back file must be created") + require.NoError(t, err, "Back file must be created") } func TestPrintResources_Secret_YAML(t *testing.T) { @@ -43,7 +43,7 @@ func TestPrintResources_Secret_YAML(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "my-secret"}, Data: map[string][]byte{"my-secret-key": []byte("my-secret-data")}, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, `apiVersion: v1 kind: Secret diff --git a/cmd/argocd/commands/admin/project_allowlist_test.go b/cmd/argocd/commands/admin/project_allowlist_test.go index 18994481bf99d..eeec46b9be231 100644 --- a/cmd/argocd/commands/admin/project_allowlist_test.go +++ b/cmd/argocd/commands/admin/project_allowlist_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -15,6 +16,6 @@ func TestProjectAllowListGen(t *testing.T) { resourceList := []*metav1.APIResourceList{{APIResources: []metav1.APIResource{res}}} globalProj, err := generateProjectAllowList(resourceList, "testdata/test_clusterrole.yaml", "testproj") - assert.NoError(t, err) + require.NoError(t, err) assert.Positive(t, len(globalProj.Spec.NamespaceResourceWhitelist)) } diff --git a/cmd/argocd/commands/admin/project_test.go b/cmd/argocd/commands/admin/project_test.go index a4798e1280394..341cd48f5c92a 100644 --- a/cmd/argocd/commands/admin/project_test.go +++ b/cmd/argocd/commands/admin/project_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" @@ -34,16 +35,16 @@ func TestUpdateProjects_FindMatchingProject(t *testing.T) { clientset := fake.NewSimpleClientset(newProj("foo", "test"), newProj("bar", "test")) modification, err := getModification("set", "*", "*", "allow") - assert.NoError(t, err) + require.NoError(t, err) err = updateProjects(ctx, clientset.ArgoprojV1alpha1().AppProjects(namespace), "ba*", "*", "set", modification, false) - assert.NoError(t, err) + require.NoError(t, err) fooProj, err := clientset.ArgoprojV1alpha1().AppProjects(namespace).Get(ctx, "foo", v1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, fooProj.Spec.Roles[0].Policies) barProj, err := clientset.ArgoprojV1alpha1().AppProjects(namespace).Get(ctx, "bar", v1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, []string{"p, proj:bar:test, *, set, bar/*, allow"}, barProj.Spec.Roles[0].Policies) } @@ -53,26 +54,26 @@ func TestUpdateProjects_FindMatchingRole(t *testing.T) { clientset := fake.NewSimpleClientset(newProj("proj", "foo", "bar")) modification, err := getModification("set", "*", "*", "allow") - assert.NoError(t, err) + require.NoError(t, err) err = updateProjects(ctx, clientset.ArgoprojV1alpha1().AppProjects(namespace), "*", "fo*", "set", modification, false) - assert.NoError(t, err) + require.NoError(t, err) proj, err := clientset.ArgoprojV1alpha1().AppProjects(namespace).Get(ctx, "proj", v1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, []string{"p, proj:proj:foo, *, set, proj/*, allow"}, proj.Spec.Roles[0].Policies) assert.Empty(t, proj.Spec.Roles[1].Policies) } func TestGetModification_SetPolicy(t *testing.T) { modification, err := getModification("set", "*", "*", "allow") - assert.NoError(t, err) + require.NoError(t, err) policy := modification("proj", "myaction") assert.Equal(t, "*, myaction, proj/*, allow", policy) } func TestGetModification_RemovePolicy(t *testing.T) { modification, err := getModification("remove", "*", "*", "allow") - assert.NoError(t, err) + require.NoError(t, err) policy := modification("proj", "myaction") assert.Equal(t, "", policy) } diff --git a/cmd/argocd/commands/admin/settings_test.go b/cmd/argocd/commands/admin/settings_test.go index dc7d4b2997abc..4db8ae7ba5eeb 100644 --- a/cmd/argocd/commands/admin/settings_test.go +++ b/cmd/argocd/commands/admin/settings_test.go @@ -13,6 +13,7 @@ import ( "github.com/argoproj/argo-cd/v2/util/settings" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" @@ -96,22 +97,16 @@ metadata: name: argocd-cm data: url: https://myargocd.com`) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) defer utils.Close(closer) opts := settingsOpts{argocdCMPath: f} settingsManager, err := opts.createSettingsManager(ctx) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) argoCDSettings, err := settingsManager.GetSettings() - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) assert.Equal(t, "https://myargocd.com", argoCDSettings.URL) } @@ -202,12 +197,11 @@ admissionregistration.k8s.io/MutatingWebhookConfiguration: } summary, err := validator(newSettingsManager(tc.data)) if tc.containsSummary != "" { - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, summary, tc.containsSummary) } else if tc.containsError != "" { - if assert.Error(t, err) { - assert.Contains(t, err.Error(), tc.containsError) - } + require.Error(t, err) + assert.Contains(t, err.Error(), tc.containsError) } }) } @@ -272,10 +266,10 @@ func TestValidateSettingsCommand_NoErrors(t *testing.T) { cmd := NewValidateSettingsCommand(newCmdContext(map[string]string{})) out, err := captureStdout(func() { err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) for k := range validatorsByGroup { assert.Contains(t, out, fmt.Sprintf("✅ %s", k)) } @@ -283,9 +277,7 @@ func TestValidateSettingsCommand_NoErrors(t *testing.T) { func TestResourceOverrideIgnoreDifferences(t *testing.T) { f, closer, err := tempFile(testDeploymentYAML) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) defer utils.Close(closer) t.Run("NoOverridesConfigured", func(t *testing.T) { @@ -293,9 +285,9 @@ func TestResourceOverrideIgnoreDifferences(t *testing.T) { out, err := captureStdout(func() { cmd.SetArgs([]string{"ignore-differences", f}) err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Ignore differences are not configured for 'apps/Deployment'\n") }) @@ -309,18 +301,16 @@ func TestResourceOverrideIgnoreDifferences(t *testing.T) { out, err := captureStdout(func() { cmd.SetArgs([]string{"ignore-differences", f}) err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "< spec:") }) } func TestResourceOverrideHealth(t *testing.T) { f, closer, err := tempFile(testCustomResourceYAML) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) defer utils.Close(closer) t.Run("NoHealthAssessment", func(t *testing.T) { @@ -330,9 +320,9 @@ func TestResourceOverrideHealth(t *testing.T) { out, err := captureStdout(func() { cmd.SetArgs([]string{"health", f}) err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Health script is not configured for 'example.com/ExampleResource'\n") }) @@ -346,9 +336,9 @@ func TestResourceOverrideHealth(t *testing.T) { out, err := captureStdout(func() { cmd.SetArgs([]string{"health", f}) err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Progressing") }) @@ -362,24 +352,20 @@ func TestResourceOverrideHealth(t *testing.T) { out, err := captureStdout(func() { cmd.SetArgs([]string{"health", f}) err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Progressing") }) } func TestResourceOverrideAction(t *testing.T) { f, closer, err := tempFile(testDeploymentYAML) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) defer utils.Close(closer) cronJobFile, closer, err := tempFile(testCronJobYAML) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) defer utils.Close(closer) t.Run("NoActions", func(t *testing.T) { @@ -389,9 +375,9 @@ func TestResourceOverrideAction(t *testing.T) { out, err := captureStdout(func() { cmd.SetArgs([]string{"run-action", f, "test"}) err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Actions are not configured") }) @@ -414,17 +400,17 @@ func TestResourceOverrideAction(t *testing.T) { out, err := captureStdout(func() { cmd.SetArgs([]string{"run-action", f, "test"}) err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "test: updated") out, err = captureStdout(func() { cmd.SetArgs([]string{"list-actions", f}) err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, `NAME DISABLED restart false resume false @@ -459,19 +445,19 @@ resume false out, err := captureStdout(func() { cmd.SetArgs([]string{"run-action", cronJobFile, "test"}) err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "resource was created:") assert.Contains(t, out, "hello-1") out, err = captureStdout(func() { cmd.SetArgs([]string{"list-actions", cronJobFile}) err := cmd.Execute() - assert.NoError(t, err) + require.NoError(t, err) }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "NAME") assert.Contains(t, out, "DISABLED") assert.Contains(t, out, "create-a-job") diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go index b643388a4ffe9..73eace8bd250a 100644 --- a/cmd/argocd/commands/app_test.go +++ b/cmd/argocd/commands/app_test.go @@ -32,6 +32,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "golang.org/x/oauth2" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -1467,7 +1468,7 @@ func TestParseSelectedResources(t *testing.T) { "!*:*:*", } operationResources, err := parseSelectedResources(resources) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, operationResources, 5) assert.Equal(t, v1alpha1.SyncOperationResource{ Namespace: "", @@ -1519,7 +1520,7 @@ func TestParseSelectedResourcesIncorrectNamespace(t *testing.T) { func TestParseSelectedResourcesEmptyList(t *testing.T) { var resources []string operationResources, err := parseSelectedResources(resources) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, operationResources) } @@ -1549,7 +1550,7 @@ func TestPrintApplicationTableNotWide(t *testing.T) { printApplicationTable([]v1alpha1.Application{*app, *app}, &output) return nil }) - assert.NoError(t, err) + require.NoError(t, err) expectation := "NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS\napp-name http://localhost:8080 default prj OutOfSync Healthy Manual \napp-name http://localhost:8080 default prj OutOfSync Healthy Manual \n" assert.Equal(t, output, expectation) } @@ -1585,7 +1586,7 @@ func TestPrintApplicationTableWide(t *testing.T) { printApplicationTable([]v1alpha1.Application{*app, *app}, &output) return nil }) - assert.NoError(t, err) + require.NoError(t, err) expectation := "NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET\napp-name http://localhost:8080 default prj OutOfSync Healthy Manual https://github.com/argoproj/argocd-example-apps guestbook 123\napp-name http://localhost:8080 default prj OutOfSync Healthy Manual https://github.com/argoproj/argocd-example-apps guestbook 123\n" assert.Equal(t, output, expectation) } diff --git a/cmd/argocd/commands/applicationset_test.go b/cmd/argocd/commands/applicationset_test.go index 3304a1d5868a0..e5034e05f9f9b 100644 --- a/cmd/argocd/commands/applicationset_test.go +++ b/cmd/argocd/commands/applicationset_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" @@ -107,7 +108,7 @@ func TestPrintApplicationSetTable(t *testing.T) { printApplicationSetTable([]v1alpha1.ApplicationSet{*app, *app2}, &output) return nil }) - assert.NoError(t, err) + require.NoError(t, err) expectation := "NAME PROJECT SYNCPOLICY CONDITIONS\napp-name default nil [{ResourcesUpToDate True }]\nteam-two/app-name default nil [{ResourcesUpToDate True }]\n" assert.Equal(t, expectation, output) } @@ -227,7 +228,7 @@ SyncPolicy: Automated w.Close() out, err := io.ReadAll(r) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, tt.expectedOutput, string(out)) }) } diff --git a/cmd/argocd/commands/common_test.go b/cmd/argocd/commands/common_test.go index 8763b420d3a08..24ab6ebcf7fd9 100644 --- a/cmd/argocd/commands/common_test.go +++ b/cmd/argocd/commands/common_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) // Be careful with tabs vs. spaces in the following expected formats. Indents @@ -79,18 +80,18 @@ func Test_PrintResource(t *testing.T) { err := PrintResource(testResource, "yaml") return err }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectYamlSingle, str) str, err = captureOutput(func() error { err := PrintResource(testResource, "json") return err }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectJsonSingle, str) err = PrintResource(testResource, "unknown") - assert.Error(t, err) + require.Error(t, err) } func Test_PrintResourceList(t *testing.T) { @@ -114,30 +115,30 @@ func Test_PrintResourceList(t *testing.T) { err := PrintResourceList(testResource, "yaml", false) return err }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectYamlList, str) str, err = captureOutput(func() error { err := PrintResourceList(testResource, "json", false) return err }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectJsonList, str) str, err = captureOutput(func() error { err := PrintResourceList(testResource2, "yaml", true) return err }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectYamlSingle, str) str, err = captureOutput(func() error { err := PrintResourceList(testResource2, "json", true) return err }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectJsonSingle, str) err = PrintResourceList(testResource, "unknown", false) - assert.Error(t, err) + require.Error(t, err) } diff --git a/cmd/argocd/commands/context_test.go b/cmd/argocd/commands/context_test.go index 8231fa232f15b..e9f953a22cd0f 100644 --- a/cmd/argocd/commands/context_test.go +++ b/cmd/argocd/commands/context_test.go @@ -41,22 +41,22 @@ const testConfigFilePath = "./testdata/local.config" func TestContextDelete(t *testing.T) { // Write the test config file err := os.WriteFile(testConfigFilePath, []byte(testConfig), os.ModePerm) - assert.NoError(t, err) + require.NoError(t, err) defer os.Remove(testConfigFilePath) err = os.Chmod(testConfigFilePath, 0o600) require.NoError(t, err, "Could not change the file permission to 0600 %v", err) localConfig, err := localconfig.ReadLocalConfig(testConfigFilePath) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "localhost:8080", localConfig.CurrentContext) assert.Contains(t, localConfig.Contexts, localconfig.ContextRef{Name: "localhost:8080", Server: "localhost:8080", User: "localhost:8080"}) // Delete a non-current context err = deleteContext("argocd1.example.com:443", testConfigFilePath) - assert.NoError(t, err) + require.NoError(t, err) localConfig, err = localconfig.ReadLocalConfig(testConfigFilePath) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "localhost:8080", localConfig.CurrentContext) assert.NotContains(t, localConfig.Contexts, localconfig.ContextRef{Name: "argocd1.example.com:443", Server: "argocd1.example.com:443", User: "argocd1.example.com:443"}) assert.NotContains(t, localConfig.Servers, localconfig.Server{Server: "argocd1.example.com:443"}) @@ -66,10 +66,10 @@ func TestContextDelete(t *testing.T) { // Delete the current context err = deleteContext("localhost:8080", testConfigFilePath) - assert.NoError(t, err) + require.NoError(t, err) localConfig, err = localconfig.ReadLocalConfig(testConfigFilePath) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "", localConfig.CurrentContext) assert.NotContains(t, localConfig.Contexts, localconfig.ContextRef{Name: "localhost:8080", Server: "localhost:8080", User: "localhost:8080"}) assert.NotContains(t, localConfig.Servers, localconfig.Server{PlainText: true, Server: "localhost:8080"}) diff --git a/cmd/argocd/commands/logout_test.go b/cmd/argocd/commands/logout_test.go index 0379f2eecb446..2a5c2da7b88f8 100644 --- a/cmd/argocd/commands/logout_test.go +++ b/cmd/argocd/commands/logout_test.go @@ -14,14 +14,14 @@ import ( func TestLogout(t *testing.T) { // Write the test config file err := os.WriteFile(testConfigFilePath, []byte(testConfig), os.ModePerm) - assert.NoError(t, err) + require.NoError(t, err) defer os.Remove(testConfigFilePath) err = os.Chmod(testConfigFilePath, 0o600) require.NoError(t, err) localConfig, err := localconfig.ReadLocalConfig(testConfigFilePath) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "localhost:8080", localConfig.CurrentContext) assert.Contains(t, localConfig.Contexts, localconfig.ContextRef{Name: "localhost:8080", Server: "localhost:8080", User: "localhost:8080"}) @@ -29,7 +29,7 @@ func TestLogout(t *testing.T) { command.Run(nil, []string{"localhost:8080"}) localConfig, err = localconfig.ReadLocalConfig(testConfigFilePath) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "localhost:8080", localConfig.CurrentContext) assert.NotContains(t, localConfig.Users, localconfig.User{AuthToken: "vErrYS3c3tReFRe$hToken", Name: "localhost:8080"}) assert.Contains(t, localConfig.Contexts, localconfig.ContextRef{Name: "argocd1.example.com:443", Server: "argocd1.example.com:443", User: "argocd1.example.com:443"}) diff --git a/cmd/argocd/commands/relogin_test.go b/cmd/argocd/commands/relogin_test.go index eb6c4cd2d2f2d..9b6e1e7d83b47 100644 --- a/cmd/argocd/commands/relogin_test.go +++ b/cmd/argocd/commands/relogin_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient" ) @@ -28,7 +29,7 @@ func TestNewReloginCommand(t *testing.T) { ssoPortFlag := cmd.Flags().Lookup("sso-port") port, err := strconv.Atoi(ssoPortFlag.Value.String()) assert.NotNil(t, ssoPortFlag, "Expected flag --sso-port to be defined") - assert.NoError(t, err, "Failed to convert sso-port flag value to integer") + require.NoError(t, err, "Failed to convert sso-port flag value to integer") assert.Equal(t, 8085, port, "Unexpected default value for --sso-port flag") } @@ -59,6 +60,6 @@ func TestNewReloginCommandWithGlobalClientOptions(t *testing.T) { ssoPortFlag := cmd.Flags().Lookup("sso-port") port, err := strconv.Atoi(ssoPortFlag.Value.String()) assert.NotNil(t, ssoPortFlag, "Expected flag --sso-port to be defined") - assert.NoError(t, err, "Failed to convert sso-port flag value to integer") + require.NoError(t, err, "Failed to convert sso-port flag value to integer") assert.Equal(t, 8085, port, "Unexpected default value for --sso-port flag") } diff --git a/cmd/util/app_test.go b/cmd/util/app_test.go index 690c041781111..dcaae6ea8031e 100644 --- a/cmd/util/app_test.go +++ b/cmd/util/app_test.go @@ -7,6 +7,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" @@ -198,38 +199,38 @@ func newAppOptionsFixture() *appOptionsFixture { func Test_setAppSpecOptions(t *testing.T) { f := newAppOptionsFixture() t.Run("SyncPolicy", func(t *testing.T) { - assert.NoError(t, f.SetFlag("sync-policy", "automated")) + require.NoError(t, f.SetFlag("sync-policy", "automated")) assert.NotNil(t, f.spec.SyncPolicy.Automated) f.spec.SyncPolicy = nil - assert.NoError(t, f.SetFlag("sync-policy", "automatic")) + require.NoError(t, f.SetFlag("sync-policy", "automatic")) assert.NotNil(t, f.spec.SyncPolicy.Automated) f.spec.SyncPolicy = nil - assert.NoError(t, f.SetFlag("sync-policy", "auto")) + require.NoError(t, f.SetFlag("sync-policy", "auto")) assert.NotNil(t, f.spec.SyncPolicy.Automated) - assert.NoError(t, f.SetFlag("sync-policy", "none")) + require.NoError(t, f.SetFlag("sync-policy", "none")) assert.Nil(t, f.spec.SyncPolicy) }) t.Run("SyncOptions", func(t *testing.T) { - assert.NoError(t, f.SetFlag("sync-option", "a=1")) + require.NoError(t, f.SetFlag("sync-option", "a=1")) assert.True(t, f.spec.SyncPolicy.SyncOptions.HasOption("a=1")) // remove the options using ! - assert.NoError(t, f.SetFlag("sync-option", "!a=1")) + require.NoError(t, f.SetFlag("sync-option", "!a=1")) assert.Nil(t, f.spec.SyncPolicy) }) t.Run("RetryLimit", func(t *testing.T) { - assert.NoError(t, f.SetFlag("sync-retry-limit", "5")) + require.NoError(t, f.SetFlag("sync-retry-limit", "5")) assert.Equal(t, int64(5), f.spec.SyncPolicy.Retry.Limit) - assert.NoError(t, f.SetFlag("sync-retry-limit", "0")) + require.NoError(t, f.SetFlag("sync-retry-limit", "0")) assert.Nil(t, f.spec.SyncPolicy.Retry) }) t.Run("Kustomize", func(t *testing.T) { - assert.NoError(t, f.SetFlag("kustomize-replica", "my-deployment=2")) - assert.NoError(t, f.SetFlag("kustomize-replica", "my-statefulset=4")) + require.NoError(t, f.SetFlag("kustomize-replica", "my-deployment=2")) + require.NoError(t, f.SetFlag("kustomize-replica", "my-statefulset=4")) assert.Equal(t, v1alpha1.KustomizeReplicas{{Name: "my-deployment", Count: intstr.FromInt(2)}, {Name: "my-statefulset", Count: intstr.FromInt(4)}}, f.spec.Source.Kustomize.Replicas) }) } @@ -255,27 +256,27 @@ func Test_setAppSpecOptionsMultiSourceApp(t *testing.T) { sourcePosition1 := 1 sourcePosition2 := 2 t.Run("SyncPolicy", func(t *testing.T) { - assert.NoError(t, f.SetFlagWithSourcePosition("sync-policy", "automated", sourcePosition1)) + require.NoError(t, f.SetFlagWithSourcePosition("sync-policy", "automated", sourcePosition1)) assert.NotNil(t, f.spec.SyncPolicy.Automated) f.spec.SyncPolicy = nil - assert.NoError(t, f.SetFlagWithSourcePosition("sync-policy", "automatic", sourcePosition1)) + require.NoError(t, f.SetFlagWithSourcePosition("sync-policy", "automatic", sourcePosition1)) assert.NotNil(t, f.spec.SyncPolicy.Automated) }) t.Run("Helm - SourcePosition 0", func(t *testing.T) { - assert.NoError(t, f.SetFlagWithSourcePosition("helm-version", "v2", sourcePosition)) + require.NoError(t, f.SetFlagWithSourcePosition("helm-version", "v2", sourcePosition)) assert.Len(t, f.spec.GetSources(), 2) assert.Equal(t, "v2", f.spec.GetSources()[sourcePosition].Helm.Version) }) t.Run("Kustomize", func(t *testing.T) { - assert.NoError(t, f.SetFlagWithSourcePosition("kustomize-replica", "my-deployment=2", sourcePosition1)) + require.NoError(t, f.SetFlagWithSourcePosition("kustomize-replica", "my-deployment=2", sourcePosition1)) assert.Equal(t, v1alpha1.KustomizeReplicas{{Name: "my-deployment", Count: intstr.FromInt(2)}}, f.spec.Sources[sourcePosition1-1].Kustomize.Replicas) - assert.NoError(t, f.SetFlagWithSourcePosition("kustomize-replica", "my-deployment=4", sourcePosition2)) + require.NoError(t, f.SetFlagWithSourcePosition("kustomize-replica", "my-deployment=4", sourcePosition2)) assert.Equal(t, v1alpha1.KustomizeReplicas{{Name: "my-deployment", Count: intstr.FromInt(4)}}, f.spec.Sources[sourcePosition2-1].Kustomize.Replicas) }) t.Run("Helm", func(t *testing.T) { - assert.NoError(t, f.SetFlagWithSourcePosition("helm-version", "v2", sourcePosition1)) - assert.NoError(t, f.SetFlagWithSourcePosition("helm-version", "v3", sourcePosition2)) + require.NoError(t, f.SetFlagWithSourcePosition("helm-version", "v2", sourcePosition1)) + require.NoError(t, f.SetFlagWithSourcePosition("helm-version", "v3", sourcePosition2)) assert.Len(t, f.spec.GetSources(), 2) assert.Equal(t, "v2", f.spec.GetSources()[sourcePosition1-1].Helm.Version) assert.Equal(t, "v3", f.spec.GetSources()[sourcePosition2-1].Helm.Version) @@ -357,7 +358,7 @@ func TestReadAppsFromURI(t *testing.T) { apps := make([]*v1alpha1.Application, 0) err = readAppsFromURI(file.Name(), &apps) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, apps, 2) assert.Equal(t, "sth1", apps[0].Name) @@ -387,7 +388,7 @@ func TestConstructAppFromStdin(t *testing.T) { if err := file.Close(); err != nil { log.Fatal(err) } - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, apps, 2) assert.Equal(t, "sth1", apps[0].Name) assert.Equal(t, "sth2", apps[1].Name) @@ -396,7 +397,7 @@ func TestConstructAppFromStdin(t *testing.T) { func TestConstructBasedOnName(t *testing.T) { apps, err := ConstructApps("", "test", []string{}, []string{}, []string{}, AppOptions{}, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, apps, 1) assert.Equal(t, "test", apps[0].Name) } @@ -413,7 +414,7 @@ func TestFilterResources(t *testing.T) { } filteredResources, err := FilterResources(false, resources, "g", "Service", "ns", "test-helm-guestbook", true) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, filteredResources, 1) }) @@ -428,7 +429,7 @@ func TestFilterResources(t *testing.T) { } filteredResources, err := FilterResources(false, resources, "g", "Deployment", "argocd", "test-helm-guestbook", true) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, filteredResources, 1) }) @@ -443,7 +444,7 @@ func TestFilterResources(t *testing.T) { } filteredResources, err := FilterResources(false, resources, "g", "Service", "argocd", "test-helm", true) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, filteredResources, 1) }) @@ -458,7 +459,7 @@ func TestFilterResources(t *testing.T) { } filteredResources, err := FilterResources(false, resources, "g", "Service", "argocd-unknown", "test-helm", true) - assert.ErrorContains(t, err, "No matching resource found") + require.ErrorContains(t, err, "No matching resource found") assert.Nil(t, filteredResources) }) @@ -473,7 +474,7 @@ func TestFilterResources(t *testing.T) { } filteredResources, err := FilterResources(false, resources, "g", "Service", "argocd", "test-helm", false) - assert.ErrorContains(t, err, "Use the --all flag") + require.ErrorContains(t, err, "Use the --all flag") assert.Nil(t, filteredResources) }) } From ad461c2fe196e421ae208b04119d4200ec7b5ff7 Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Sat, 15 Jun 2024 14:47:19 -0400 Subject: [PATCH 34/74] chore(deps): bump Kustomize from 3.14.4 to 3.15.2 (#18680) Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- docs/operator-manual/upgrading/2.11-2.12.md | 4 ++++ .../checksums/helm-v3.15.2-darwin-amd64.tar.gz.sha256 | 1 + .../checksums/helm-v3.15.2-darwin-arm64.tar.gz.sha256 | 1 + .../checksums/helm-v3.15.2-linux-amd64.tar.gz.sha256 | 1 + .../checksums/helm-v3.15.2-linux-arm64.tar.gz.sha256 | 1 + .../checksums/helm-v3.15.2-linux-ppc64le.tar.gz.sha256 | 1 + .../checksums/helm-v3.15.2-linux-s390x.tar.gz.sha256 | 1 + hack/tool-versions.sh | 2 +- 8 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 hack/installers/checksums/helm-v3.15.2-darwin-amd64.tar.gz.sha256 create mode 100644 hack/installers/checksums/helm-v3.15.2-darwin-arm64.tar.gz.sha256 create mode 100644 hack/installers/checksums/helm-v3.15.2-linux-amd64.tar.gz.sha256 create mode 100644 hack/installers/checksums/helm-v3.15.2-linux-arm64.tar.gz.sha256 create mode 100644 hack/installers/checksums/helm-v3.15.2-linux-ppc64le.tar.gz.sha256 create mode 100644 hack/installers/checksums/helm-v3.15.2-linux-s390x.tar.gz.sha256 diff --git a/docs/operator-manual/upgrading/2.11-2.12.md b/docs/operator-manual/upgrading/2.11-2.12.md index a2f10b61bb60f..4ce87578d1c1b 100644 --- a/docs/operator-manual/upgrading/2.11-2.12.md +++ b/docs/operator-manual/upgrading/2.11-2.12.md @@ -1,5 +1,9 @@ # v2.11 to 2.12 +## Upgraded Helm Version + +Note that bundled Helm version has been upgraded from 3.14.4 to 3.15.2. + ## Image Registry Change for `redis` and `haproxy` Argo CD 2.12 upgraded its [upstream redis-ha Helm chart](https://artifacthub.io/packages/helm/dandydev-charts/redis-ha/) diff --git a/hack/installers/checksums/helm-v3.15.2-darwin-amd64.tar.gz.sha256 b/hack/installers/checksums/helm-v3.15.2-darwin-amd64.tar.gz.sha256 new file mode 100644 index 0000000000000..29fbec1a8217e --- /dev/null +++ b/hack/installers/checksums/helm-v3.15.2-darwin-amd64.tar.gz.sha256 @@ -0,0 +1 @@ +e99a9266a5328cb575d81ef10247911f42d9e90c76ef6eef154c5c535565658b helm-v3.15.2-darwin-amd64.tar.gz diff --git a/hack/installers/checksums/helm-v3.15.2-darwin-arm64.tar.gz.sha256 b/hack/installers/checksums/helm-v3.15.2-darwin-arm64.tar.gz.sha256 new file mode 100644 index 0000000000000..fa28023088fd1 --- /dev/null +++ b/hack/installers/checksums/helm-v3.15.2-darwin-arm64.tar.gz.sha256 @@ -0,0 +1 @@ +30143dabc1da9d32c7d6c589fad04b1f1ecc73841393d5823fa21c5d7f5bf8f6 helm-v3.15.2-darwin-arm64.tar.gz diff --git a/hack/installers/checksums/helm-v3.15.2-linux-amd64.tar.gz.sha256 b/hack/installers/checksums/helm-v3.15.2-linux-amd64.tar.gz.sha256 new file mode 100644 index 0000000000000..6112735da391e --- /dev/null +++ b/hack/installers/checksums/helm-v3.15.2-linux-amd64.tar.gz.sha256 @@ -0,0 +1 @@ +2694b91c3e501cff57caf650e639604a274645f61af2ea4d601677b746b44fe2 helm-v3.15.2-linux-amd64.tar.gz diff --git a/hack/installers/checksums/helm-v3.15.2-linux-arm64.tar.gz.sha256 b/hack/installers/checksums/helm-v3.15.2-linux-arm64.tar.gz.sha256 new file mode 100644 index 0000000000000..397aa7df1ce58 --- /dev/null +++ b/hack/installers/checksums/helm-v3.15.2-linux-arm64.tar.gz.sha256 @@ -0,0 +1 @@ +adcf07b08484b52508e5cbc8b5f4b0b0db50342f7bc487ecd88b8948b680e6a7 helm-v3.15.2-linux-arm64.tar.gz diff --git a/hack/installers/checksums/helm-v3.15.2-linux-ppc64le.tar.gz.sha256 b/hack/installers/checksums/helm-v3.15.2-linux-ppc64le.tar.gz.sha256 new file mode 100644 index 0000000000000..8cd9a695b81c8 --- /dev/null +++ b/hack/installers/checksums/helm-v3.15.2-linux-ppc64le.tar.gz.sha256 @@ -0,0 +1 @@ +9d95528fb797f6429f7f9b6dee0cf87bf8c71f6470e1db4a51e844c169c285a3 helm-v3.15.2-linux-ppc64le.tar.gz diff --git a/hack/installers/checksums/helm-v3.15.2-linux-s390x.tar.gz.sha256 b/hack/installers/checksums/helm-v3.15.2-linux-s390x.tar.gz.sha256 new file mode 100644 index 0000000000000..354d5237efd70 --- /dev/null +++ b/hack/installers/checksums/helm-v3.15.2-linux-s390x.tar.gz.sha256 @@ -0,0 +1 @@ +5b42bc3d08fd0ffaf4f9ed810f28464f52ec4ea431b809c7179071d76f3d6f16 helm-v3.15.2-linux-s390x.tar.gz diff --git a/hack/tool-versions.sh b/hack/tool-versions.sh index de8fc4c176cf5..d37fad005f803 100644 --- a/hack/tool-versions.sh +++ b/hack/tool-versions.sh @@ -11,7 +11,7 @@ # Use ./hack/installers/checksums/add-helm-checksums.sh and # add-kustomize-checksums.sh to help download checksums. ############################################################################### -helm3_version=3.14.4 +helm3_version=3.15.2 kubectl_version=1.17.8 kubectx_version=0.6.3 kustomize5_version=5.4.2 From f770a2a73a0b6919f8ce6a91f065fee0ddcaa986 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Sat, 15 Jun 2024 20:54:09 +0200 Subject: [PATCH 35/74] chore: enable require-error rule from errorlint linter on test folder (#18684) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 2 +- test/e2e/accounts_test.go | 7 +- test/e2e/app_management_ns_test.go | 125 +++++++++++----------- test/e2e/app_management_test.go | 145 +++++++++++++------------- test/e2e/app_multiple_sources_test.go | 9 +- test/e2e/app_namespaces_test.go | 3 +- test/e2e/applicationset_test.go | 5 +- test/e2e/cli_test.go | 5 +- test/e2e/cluster_objects_test.go | 5 +- test/e2e/custom_tool_test.go | 20 ++-- test/e2e/deployment_test.go | 27 ++--- test/e2e/hook_test.go | 3 +- test/e2e/jsonnet_test.go | 9 +- test/e2e/kustomize_test.go | 5 +- test/e2e/notification_test.go | 7 +- test/e2e/project_management_test.go | 103 +++++++++--------- test/e2e/repo_management_test.go | 47 ++++----- test/e2e/user_info_test.go | 3 +- test/manifests_test.go | 5 +- 19 files changed, 272 insertions(+), 263 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 4fe31d9fd0c2b..021320637bc46 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -3,7 +3,7 @@ issues: - SA1019 - SA5011 exclude-rules: - - path: "(applicationset|cmpserver|controller|pkg|reposerver|server|test)/" + - path: "(applicationset|cmpserver|controller|pkg|reposerver|server)/" text: "require-error:" linters: - testifylint diff --git a/test/e2e/accounts_test.go b/test/e2e/accounts_test.go index cf203312fedec..c238aacb728b5 100644 --- a/test/e2e/accounts_test.go +++ b/test/e2e/accounts_test.go @@ -8,6 +8,7 @@ import ( "github.com/argoproj/pkg/errors" "github.com/spf13/cobra" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -142,7 +143,7 @@ test true login, apiKey`, output) defer io.Close(closer) info, err := client.GetUserInfo(context.Background(), &session.GetUserInfoRequest{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test", info.Username) } @@ -161,9 +162,7 @@ func TestLoginBadCredentials(t *testing.T) { for _, r := range requests { _, err := sessionClient.Create(context.Background(), &r) - if !assert.Error(t, err) { - return - } + require.Error(t, err) errStatus, ok := status.FromError(err) if !assert.True(t, ok) { return diff --git a/test/e2e/app_management_ns_test.go b/test/e2e/app_management_ns_test.go index f84b43b3db7f4..4257e59bf9a62 100644 --- a/test/e2e/app_management_ns_test.go +++ b/test/e2e/app_management_ns_test.go @@ -91,7 +91,7 @@ func TestNamespacedGetLogsDenySwitchOn(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(app *Application) { _, err := RunCliWithRetry(5, "app", "logs", ctx.AppQualifiedName(), "--kind", "Deployment", "--group", "", "--name", "guestbook-ui") - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "permission denied") }) } @@ -145,17 +145,17 @@ func TestNamespacedGetLogsAllowSwitchOnNS(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(app *Application) { out, err := RunCliWithRetry(5, "app", "logs", ctx.AppQualifiedName(), "--kind", "Deployment", "--group", "", "--name", "guestbook-ui") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(5, "app", "logs", ctx.AppQualifiedName(), "--kind", "Pod") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(5, "app", "logs", ctx.AppQualifiedName(), "--kind", "Service") - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, out, "Hi") }) } @@ -203,17 +203,17 @@ func TestNamespacedGetLogsAllowSwitchOff(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(app *Application) { out, err := RunCliWithRetry(5, "app", "logs", ctx.AppQualifiedName(), "--kind", "Deployment", "--group", "", "--name", "guestbook-ui") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(5, "app", "logs", ctx.AppQualifiedName(), "--kind", "Pod") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(5, "app", "logs", ctx.AppQualifiedName(), "--kind", "Service") - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, out, "Hi") }) } @@ -294,7 +294,7 @@ func TestNamespacedAppCreation(t *testing.T) { And(func(app *Application) { // app should be listed output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, ctx.AppQualifiedName()) }). When(). @@ -342,7 +342,7 @@ func TestNamespacedAppCreationWithoutForceUpdate(t *testing.T) { And(func(_ *Application) { // app should be listed output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, ctx.AppQualifiedName()) }). When(). @@ -367,7 +367,7 @@ func TestNamespacedDeleteAppResource(t *testing.T) { And(func(_ *Application) { // app should be listed if _, err := RunCli("app", "delete-resource", ctx.AppQualifiedName(), "--kind", "Service", "--resource-name", "guestbook-ui"); err != nil { - assert.NoError(t, err) + require.NoError(t, err) } }). Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). @@ -451,7 +451,7 @@ func TestNamespacedAppDeletion(t *testing.T) { Expect(NamespacedEvent(AppNamespace(), EventReasonResourceDeleted, "delete")) output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, output, ctx.AppQualifiedName()) } @@ -590,9 +590,9 @@ func TestNamespacedManipulateApplicationResources(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { manifests, err := RunCli("app", "manifests", ctx.AppQualifiedName(), "--source", "live") - assert.NoError(t, err) + require.NoError(t, err) resources, err := kube.SplitYAML([]byte(manifests)) - assert.NoError(t, err) + require.NoError(t, err) index := -1 for i := range resources { @@ -606,7 +606,7 @@ func TestNamespacedManipulateApplicationResources(t *testing.T) { deployment := resources[index] closer, client, err := ArgoCDClientset.NewApplicationClient() - assert.NoError(t, err) + require.NoError(t, err) defer io.Close(closer) _, err = client.DeleteResource(context.Background(), &applicationpkg.ApplicationResourceDeleteRequest{ @@ -618,14 +618,14 @@ func TestNamespacedManipulateApplicationResources(t *testing.T) { Namespace: ptr.To(deployment.GetNamespace()), ResourceName: ptr.To(deployment.GetName()), }) - assert.NoError(t, err) + require.NoError(t, err) }). Expect(SyncStatusIs(SyncStatusCodeOutOfSync)) } func TestNamespacedAppWithSecrets(t *testing.T) { closer, client, err := ArgoCDClientset.NewApplicationClient() - assert.NoError(t, err) + require.NoError(t, err) defer io.Close(closer) ctx := Given(t) @@ -685,7 +685,7 @@ func TestNamespacedAppWithSecrets(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). And(func(app *Application) { diffOutput, err := RunCli("app", "diff", ctx.AppQualifiedName()) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, diffOutput, "username: ++++++++") assert.Contains(t, diffOutput, "password: ++++++++++++") @@ -739,7 +739,7 @@ func TestNamespacedResourceDiffing(t *testing.T) { // Patch deployment _, err := KubeClientset.AppsV1().Deployments(DeploymentNamespace()).Patch(context.Background(), "guestbook-ui", types.JSONPatchType, []byte(`[{ "op": "replace", "path": "/spec/template/spec/containers/0/image", "value": "test" }]`), metav1.PatchOptions{}) - assert.NoError(t, err) + require.NoError(t, err) }). When(). Refresh(RefreshTypeNormal). @@ -747,7 +747,7 @@ func TestNamespacedResourceDiffing(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). And(func(app *Application) { diffOutput, err := RunCli("app", "diff", ctx.AppQualifiedName(), "--local-repo-root", ".", "--local", "testdata/guestbook") - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, diffOutput, fmt.Sprintf("===== apps/Deployment %s/guestbook-ui ======", DeploymentNamespace())) }). Given(). @@ -760,7 +760,7 @@ func TestNamespacedResourceDiffing(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { diffOutput, err := RunCli("app", "diff", ctx.AppQualifiedName(), "--local-repo-root", ".", "--local", "testdata/guestbook") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, diffOutput) }). Given(). @@ -778,7 +778,7 @@ func TestNamespacedResourceDiffing(t *testing.T) { Sync(). And(func() { output, err := RunWithStdin(testdata.SSARevisionHistoryDeployment, "", "kubectl", "apply", "-n", DeploymentNamespace(), "--server-side=true", "--field-manager=revision-history-manager", "--validate=false", "--force-conflicts", "-f", "-") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "serverside-applied") }). Refresh(RefreshTypeNormal). @@ -805,12 +805,12 @@ func TestNamespacedResourceDiffing(t *testing.T) { }]`). And(func() { deployment, err := KubeClientset.AppsV1().Deployments(DeploymentNamespace()).Get(context.Background(), "guestbook-ui", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int32(3), *deployment.Spec.RevisionHistoryLimit) }). And(func() { output, err := RunWithStdin(testdata.SSARevisionHistoryDeployment, "", "kubectl", "apply", "-n", DeploymentNamespace(), "--server-side=true", "--field-manager=revision-history-manager", "--validate=false", "--force-conflicts", "-f", "-") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "serverside-applied") }). Then(). @@ -819,13 +819,13 @@ func TestNamespacedResourceDiffing(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { deployment, err := KubeClientset.AppsV1().Deployments(DeploymentNamespace()).Get(context.Background(), "guestbook-ui", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int32(1), *deployment.Spec.RevisionHistoryLimit) }). When().Sync().Then().Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { deployment, err := KubeClientset.AppsV1().Deployments(DeploymentNamespace()).Get(context.Background(), "guestbook-ui", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int32(1), *deployment.Spec.RevisionHistoryLimit) }) } @@ -897,7 +897,7 @@ func testNSEdgeCasesApplicationResources(t *testing.T, appPath string, statusCod And(func(app *Application) { diffOutput, err := RunCli("app", "diff", ctx.AppQualifiedName(), "--local-repo-root", ".", "--local", path.Join("testdata", appPath)) assert.Empty(t, diffOutput) - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -923,7 +923,7 @@ func TestNamespacedResourceAction(t *testing.T) { Then(). And(func(app *Application) { closer, client, err := ArgoCDClientset.NewApplicationClient() - assert.NoError(t, err) + require.NoError(t, err) defer io.Close(closer) actions, err := client.ListResourceActions(context.Background(), &applicationpkg.ApplicationResourceRequest{ @@ -935,7 +935,7 @@ func TestNamespacedResourceAction(t *testing.T) { Namespace: ptr.To(DeploymentNamespace()), ResourceName: ptr.To("guestbook-ui"), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*ResourceAction{{Name: "sample", Disabled: false}}, actions.Actions) _, err = client.RunResourceAction(context.Background(), &applicationpkg.ResourceActionRunRequest{ @@ -948,10 +948,10 @@ func TestNamespacedResourceAction(t *testing.T) { Action: ptr.To("sample"), AppNamespace: ptr.To(AppNamespace()), }) - assert.NoError(t, err) + require.NoError(t, err) deployment, err := KubeClientset.AppsV1().Deployments(DeploymentNamespace()).Get(context.Background(), "guestbook-ui", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test", deployment.Labels["sample"]) }) @@ -973,7 +973,7 @@ func TestNamespacedSyncResourceByLabel(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { _, err := RunCli("app", "sync", ctx.AppQualifiedName(), "--label", "this-label=does-not-exist") - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "level=fatal") }) } @@ -1042,10 +1042,10 @@ func TestNamespacedNoLocalSyncWithAutosyncEnabled(t *testing.T) { Then(). And(func(app *Application) { _, err := RunCli("app", "set", app.QualifiedName(), "--sync-policy", "automated") - assert.NoError(t, err) + require.NoError(t, err) _, err = RunCli("app", "sync", app.QualifiedName(), "--local", guestbookPathLocal) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "Cannot use local sync") }) } @@ -1061,11 +1061,11 @@ func TestNamespacedLocalSyncDryRunWithASEnabled(t *testing.T) { Then(). And(func(app *Application) { _, err := RunCli("app", "set", app.QualifiedName(), "--sync-policy", "automated") - assert.NoError(t, err) + require.NoError(t, err) appBefore := app.DeepCopy() _, err = RunCli("app", "sync", app.QualifiedName(), "--dry-run", "--local-repo-root", ".", "--local", guestbookPathLocal) - assert.NoError(t, err) + require.NoError(t, err) appAfter := app.DeepCopy() assert.True(t, reflect.DeepEqual(appBefore, appAfter)) @@ -1091,8 +1091,9 @@ func TestNamespacedSyncAsync(t *testing.T) { func assertNSResourceActions(t *testing.T, appName string, successful bool) { assertError := func(err error, message string) { if successful { - assert.NoError(t, err) - } else if assert.Error(t, err) { + require.NoError(t, err) + } else { + require.Error(t, err) assert.Contains(t, err.Error(), message) } } @@ -1501,7 +1502,7 @@ func TestNamespacedOrphanedResource(t *testing.T) { Expect(Condition(ApplicationConditionOrphanedResourceWarning, "Application has 1 orphaned resources")). And(func(app *Application) { output, err := RunCli("app", "resources", app.QualifiedName()) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "orphaned-configmap") }). Given(). @@ -1517,7 +1518,7 @@ func TestNamespacedOrphanedResource(t *testing.T) { Expect(Condition(ApplicationConditionOrphanedResourceWarning, "Application has 1 orphaned resources")). And(func(app *Application) { output, err := RunCli("app", "resources", app.QualifiedName()) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "orphaned-configmap") }). Given(). @@ -1534,7 +1535,7 @@ func TestNamespacedOrphanedResource(t *testing.T) { Expect(NoConditions()). And(func(app *Application) { output, err := RunCli("app", "resources", app.QualifiedName()) - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, output, "orphaned-configmap") }). Given(). @@ -1551,7 +1552,7 @@ func TestNamespacedOrphanedResource(t *testing.T) { Expect(NoConditions()). And(func(app *Application) { output, err := RunCli("app", "resources", app.QualifiedName()) - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, output, "orphaned-configmap") }). Given(). @@ -1676,7 +1677,7 @@ func TestNamespacedSyncWithInfos(t *testing.T) { _, err := RunCli("app", "sync", app.QualifiedName(), "--info", fmt.Sprintf("%s=%s", expectedInfo[0].Name, expectedInfo[0].Value), "--info", fmt.Sprintf("%s=%s", expectedInfo[1].Name, expectedInfo[1].Value)) - assert.NoError(t, err) + require.NoError(t, err) }). Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { @@ -1700,7 +1701,7 @@ func TestNamespacedCreateAppWithNoNameSpaceForGlobalResource(t *testing.T) { And(func(app *Application) { time.Sleep(500 * time.Millisecond) app, err := AppClientset.ArgoprojV1alpha1().Applications(AppNamespace()).Get(context.Background(), app.Name, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, app.Status.Conditions) }) } @@ -1787,19 +1788,19 @@ func TestNamespacedListResource(t *testing.T) { Expect(Condition(ApplicationConditionOrphanedResourceWarning, "Application has 1 orphaned resources")). And(func(app *Application) { output, err := RunCli("app", "resources", app.QualifiedName()) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "orphaned-configmap") assert.Contains(t, output, "guestbook-ui") }). And(func(app *Application) { output, err := RunCli("app", "resources", app.QualifiedName(), "--orphaned=true") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "orphaned-configmap") assert.NotContains(t, output, "guestbook-ui") }). And(func(app *Application) { output, err := RunCli("app", "resources", app.QualifiedName(), "--orphaned=false") - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, output, "orphaned-configmap") assert.Contains(t, output, "guestbook-ui") }). @@ -1831,7 +1832,7 @@ func TestNamespacedNamespaceAutoCreation(t *testing.T) { defer func() { if !t.Skipped() { _, err := Run("", "kubectl", "delete", "namespace", updatedNamespace) - assert.NoError(t, err) + require.NoError(t, err) } }() Given(t). @@ -1859,7 +1860,7 @@ func TestNamespacedNamespaceAutoCreation(t *testing.T) { And(func(app *Application) { // Verify delete app does not delete the namespace auto created output, err := Run("", "kubectl", "get", "namespace", updatedNamespace) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, updatedNamespace) }) } @@ -1875,7 +1876,7 @@ func TestNamespacedNamespaceAutoCreationWithMetadata(t *testing.T) { defer func() { if !t.Skipped() { _, err := Run("", "kubectl", "delete", "namespace", updatedNamespace) - assert.NoError(t, err) + require.NoError(t, err) } }() ctx := Given(t) @@ -1968,7 +1969,7 @@ func TestNamespacedNamespaceAutoCreationWithMetadataAndNsManifest(t *testing.T) defer func() { if !t.Skipped() { _, err := Run("", "kubectl", "delete", "namespace", namespace) - assert.NoError(t, err) + require.NoError(t, err) } }() @@ -2022,7 +2023,7 @@ func TestNamespacedNamespaceAutoCreationWithPreexistingNs(t *testing.T) { defer func() { if !t.Skipped() { _, err := Run("", "kubectl", "delete", "namespace", updatedNamespace) - assert.NoError(t, err) + require.NoError(t, err) } }() @@ -2044,7 +2045,7 @@ metadata: errors.CheckError(err) _, err = Run("", "kubectl", "apply", "-f", tmpFile.Name()) - assert.NoError(t, err) + require.NoError(t, err) ctx := Given(t) ctx. @@ -2161,7 +2162,7 @@ func TestNamespacedCreateDisableValidation(t *testing.T) { And(func(app *Application) { _, err := RunCli("app", "create", app.QualifiedName(), "--upsert", "--validate=false", "--repo", RepoURL(RepoURLTypeFile), "--path", "baddir2", "--project", app.Spec.Project, "--dest-server", KubernetesInternalAPIServerAddr, "--dest-namespace", DeploymentNamespace()) - assert.NoError(t, err) + require.NoError(t, err) }). When(). AppSet("--path", "baddir3", "--validate=false") @@ -2252,38 +2253,38 @@ definitions: // tests resource actions on a CRD using status subresource And(func(app *Application) { _, err := RunCli("app", "actions", "run", app.QualifiedName(), "--kind", "StatusSubResource", "update-both") - assert.NoError(t, err) + require.NoError(t, err) text := FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "statussubresources", "status-subresource", "-o", "jsonpath={.spec.foo}")).(string) assert.Equal(t, "update-both", text) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "statussubresources", "status-subresource", "-o", "jsonpath={.status.bar}")).(string) assert.Equal(t, "update-both", text) _, err = RunCli("app", "actions", "run", app.QualifiedName(), "--kind", "StatusSubResource", "update-spec") - assert.NoError(t, err) + require.NoError(t, err) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "statussubresources", "status-subresource", "-o", "jsonpath={.spec.foo}")).(string) assert.Equal(t, "update-spec", text) _, err = RunCli("app", "actions", "run", app.QualifiedName(), "--kind", "StatusSubResource", "update-status") - assert.NoError(t, err) + require.NoError(t, err) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "statussubresources", "status-subresource", "-o", "jsonpath={.status.bar}")).(string) assert.Equal(t, "update-status", text) }). // tests resource actions on a CRD *not* using status subresource And(func(app *Application) { _, err := RunCli("app", "actions", "run", app.QualifiedName(), "--kind", "NonStatusSubResource", "update-both") - assert.NoError(t, err) + require.NoError(t, err) text := FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "nonstatussubresources", "non-status-subresource", "-o", "jsonpath={.spec.foo}")).(string) assert.Equal(t, "update-both", text) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "nonstatussubresources", "non-status-subresource", "-o", "jsonpath={.status.bar}")).(string) assert.Equal(t, "update-both", text) _, err = RunCli("app", "actions", "run", app.QualifiedName(), "--kind", "NonStatusSubResource", "update-spec") - assert.NoError(t, err) + require.NoError(t, err) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "nonstatussubresources", "non-status-subresource", "-o", "jsonpath={.spec.foo}")).(string) assert.Equal(t, "update-spec", text) _, err = RunCli("app", "actions", "run", app.QualifiedName(), "--kind", "NonStatusSubResource", "update-status") - assert.NoError(t, err) + require.NoError(t, err) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "nonstatussubresources", "non-status-subresource", "-o", "jsonpath={.status.bar}")).(string) assert.Equal(t, "update-status", text) }) @@ -2302,17 +2303,17 @@ func TestNamespacedAppLogs(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(app *Application) { out, err := RunCliWithRetry(5, "app", "logs", app.QualifiedName(), "--kind", "Deployment", "--group", "", "--name", "guestbook-ui") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(5, "app", "logs", app.QualifiedName(), "--kind", "Pod") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(5, "app", "logs", app.QualifiedName(), "--kind", "Service") - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, out, "Hi") }) } diff --git a/test/e2e/app_management_test.go b/test/e2e/app_management_test.go index 5c28cf28992cf..c34ed635e71bd 100644 --- a/test/e2e/app_management_test.go +++ b/test/e2e/app_management_test.go @@ -100,7 +100,7 @@ func TestGetLogsDenySwitchOn(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(app *Application) { _, err := RunCliWithRetry(appLogsRetryCount, "app", "logs", app.Name, "--kind", "Deployment", "--group", "", "--name", "guestbook-ui") - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "permission denied") }) } @@ -151,17 +151,17 @@ func TestGetLogsAllowSwitchOn(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(app *Application) { out, err := RunCliWithRetry(appLogsRetryCount, "app", "logs", app.Name, "--kind", "Deployment", "--group", "", "--name", "guestbook-ui") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(appLogsRetryCount, "app", "logs", app.Name, "--kind", "Pod") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(appLogsRetryCount, "app", "logs", app.Name, "--kind", "Service") - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, out, "Hi") }) } @@ -207,17 +207,17 @@ func TestGetLogsAllowSwitchOff(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(app *Application) { out, err := RunCliWithRetry(appLogsRetryCount, "app", "logs", app.Name, "--kind", "Deployment", "--group", "", "--name", "guestbook-ui") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(appLogsRetryCount, "app", "logs", app.Name, "--kind", "Pod") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(appLogsRetryCount, "app", "logs", app.Name, "--kind", "Service") - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, out, "Hi") }) } @@ -401,7 +401,7 @@ func TestAppCreation(t *testing.T) { And(func(_ *Application) { // app should be listed output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, Name()) }). When(). @@ -446,7 +446,7 @@ func TestAppCreationWithoutForceUpdate(t *testing.T) { And(func(_ *Application) { // app should be listed output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, Name()) }). When(). @@ -508,7 +508,7 @@ func TestDeleteAppResource(t *testing.T) { And(func(_ *Application) { // app should be listed if _, err := RunCli("app", "delete-resource", Name(), "--kind", "Service", "--resource-name", "guestbook-ui"); err != nil { - assert.NoError(t, err) + require.NoError(t, err) } }). Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). @@ -602,7 +602,7 @@ func TestAppDeletion(t *testing.T) { Expect(Event(EventReasonResourceDeleted, "delete")) output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, output, Name()) } @@ -726,9 +726,9 @@ func TestManipulateApplicationResources(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { manifests, err := RunCli("app", "manifests", app.Name, "--source", "live") - assert.NoError(t, err) + require.NoError(t, err) resources, err := kube.SplitYAML([]byte(manifests)) - assert.NoError(t, err) + require.NoError(t, err) index := -1 for i := range resources { @@ -742,7 +742,7 @@ func TestManipulateApplicationResources(t *testing.T) { deployment := resources[index] closer, client, err := ArgoCDClientset.NewApplicationClient() - assert.NoError(t, err) + require.NoError(t, err) defer io.Close(closer) _, err = client.DeleteResource(context.Background(), &applicationpkg.ApplicationResourceDeleteRequest{ @@ -753,21 +753,21 @@ func TestManipulateApplicationResources(t *testing.T) { Namespace: ptr.To(deployment.GetNamespace()), ResourceName: ptr.To(deployment.GetName()), }) - assert.NoError(t, err) + require.NoError(t, err) }). Expect(SyncStatusIs(SyncStatusCodeOutOfSync)) } func assetSecretDataHidden(t *testing.T, manifest string) { secret, err := UnmarshalToUnstructured(manifest) - assert.NoError(t, err) + require.NoError(t, err) _, hasStringData, err := unstructured.NestedMap(secret.Object, "stringData") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, hasStringData) secretData, hasData, err := unstructured.NestedMap(secret.Object, "data") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, hasData) for _, v := range secretData { assert.Regexp(t, regexp.MustCompile(`[*]*`), v) @@ -784,7 +784,7 @@ func assetSecretDataHidden(t *testing.T, manifest string) { func TestAppWithSecrets(t *testing.T) { closer, client, err := ArgoCDClientset.NewApplicationClient() - assert.NoError(t, err) + require.NoError(t, err) defer io.Close(closer) Given(t). @@ -837,7 +837,7 @@ func TestAppWithSecrets(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). And(func(app *Application) { diffOutput, err := RunCli("app", "diff", app.Name) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, diffOutput, "username: ++++++++") assert.Contains(t, diffOutput, "password: ++++++++++++") @@ -888,7 +888,7 @@ func TestResourceDiffing(t *testing.T) { // Patch deployment _, err := KubeClientset.AppsV1().Deployments(DeploymentNamespace()).Patch(context.Background(), "guestbook-ui", types.JSONPatchType, []byte(`[{ "op": "replace", "path": "/spec/template/spec/containers/0/image", "value": "test" }]`), metav1.PatchOptions{}) - assert.NoError(t, err) + require.NoError(t, err) }). When(). Refresh(RefreshTypeNormal). @@ -896,7 +896,7 @@ func TestResourceDiffing(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). And(func(app *Application) { diffOutput, err := RunCli("app", "diff", app.Name, "--local", "testdata", "--server-side-generate") - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, diffOutput, fmt.Sprintf("===== apps/Deployment %s/guestbook-ui ======", DeploymentNamespace())) }). Given(). @@ -909,7 +909,7 @@ func TestResourceDiffing(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { diffOutput, err := RunCli("app", "diff", app.Name, "--local", "testdata", "--server-side-generate") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, diffOutput) }). Given(). @@ -927,7 +927,7 @@ func TestResourceDiffing(t *testing.T) { Sync(). And(func() { output, err := RunWithStdin(testdata.SSARevisionHistoryDeployment, "", "kubectl", "apply", "-n", DeploymentNamespace(), "--server-side=true", "--field-manager=revision-history-manager", "--validate=false", "--force-conflicts", "-f", "-") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "serverside-applied") }). Refresh(RefreshTypeNormal). @@ -954,12 +954,12 @@ func TestResourceDiffing(t *testing.T) { }]`). And(func() { deployment, err := KubeClientset.AppsV1().Deployments(DeploymentNamespace()).Get(context.Background(), "guestbook-ui", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int32(3), *deployment.Spec.RevisionHistoryLimit) }). And(func() { output, err := RunWithStdin(testdata.SSARevisionHistoryDeployment, "", "kubectl", "apply", "-n", DeploymentNamespace(), "--server-side=true", "--field-manager=revision-history-manager", "--validate=false", "--force-conflicts", "-f", "-") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "serverside-applied") }). Then(). @@ -968,13 +968,13 @@ func TestResourceDiffing(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { deployment, err := KubeClientset.AppsV1().Deployments(DeploymentNamespace()).Get(context.Background(), "guestbook-ui", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int32(1), *deployment.Spec.RevisionHistoryLimit) }). When().Sync().Then().Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { deployment, err := KubeClientset.AppsV1().Deployments(DeploymentNamespace()).Get(context.Background(), "guestbook-ui", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int32(1), *deployment.Spec.RevisionHistoryLimit) }) } @@ -1039,7 +1039,7 @@ func testEdgeCasesApplicationResources(t *testing.T, appPath string, statusCode And(func(app *Application) { diffOutput, err := RunCli("app", "diff", app.Name, "--local", "testdata", "--server-side-generate") assert.Empty(t, diffOutput) - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -1060,7 +1060,7 @@ func TestOldStyleResourceAction(t *testing.T) { Then(). And(func(app *Application) { closer, client, err := ArgoCDClientset.NewApplicationClient() - assert.NoError(t, err) + require.NoError(t, err) defer io.Close(closer) actions, err := client.ListResourceActions(context.Background(), &applicationpkg.ApplicationResourceRequest{ @@ -1071,7 +1071,7 @@ func TestOldStyleResourceAction(t *testing.T) { Namespace: ptr.To(DeploymentNamespace()), ResourceName: ptr.To("guestbook-ui"), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*ResourceAction{{Name: "sample", Disabled: false}}, actions.Actions) _, err = client.RunResourceAction(context.Background(), &applicationpkg.ResourceActionRunRequest{ @@ -1083,10 +1083,10 @@ func TestOldStyleResourceAction(t *testing.T) { ResourceName: ptr.To("guestbook-ui"), Action: ptr.To("sample"), }) - assert.NoError(t, err) + require.NoError(t, err) deployment, err := KubeClientset.AppsV1().Deployments(DeploymentNamespace()).Get(context.Background(), "guestbook-ui", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test", deployment.Labels["sample"]) }) @@ -1166,7 +1166,7 @@ func TestNewStyleResourceActionPermitted(t *testing.T) { Then(). And(func(app *Application) { closer, client, err := ArgoCDClientset.NewApplicationClient() - assert.NoError(t, err) + require.NoError(t, err) defer io.Close(closer) actions, err := client.ListResourceActions(context.Background(), &applicationpkg.ApplicationResourceRequest{ @@ -1177,7 +1177,7 @@ func TestNewStyleResourceActionPermitted(t *testing.T) { Namespace: ptr.To(DeploymentNamespace()), ResourceName: ptr.To("hello"), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*ResourceAction{{Name: "sample", Disabled: false}}, actions.Actions) _, err = client.RunResourceAction(context.Background(), &applicationpkg.ResourceActionRunRequest{ @@ -1189,10 +1189,10 @@ func TestNewStyleResourceActionPermitted(t *testing.T) { ResourceName: ptr.To("hello"), Action: ptr.To("sample"), }) - assert.NoError(t, err) + require.NoError(t, err) _, err = KubeClientset.BatchV1().Jobs(DeploymentNamespace()).Get(context.Background(), "hello-123", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -1277,7 +1277,7 @@ func TestNewStyleResourceActionMixedOk(t *testing.T) { Then(). And(func(app *Application) { closer, client, err := ArgoCDClientset.NewApplicationClient() - assert.NoError(t, err) + require.NoError(t, err) defer io.Close(closer) actions, err := client.ListResourceActions(context.Background(), &applicationpkg.ApplicationResourceRequest{ @@ -1288,7 +1288,7 @@ func TestNewStyleResourceActionMixedOk(t *testing.T) { Namespace: ptr.To(DeploymentNamespace()), ResourceName: ptr.To("hello"), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*ResourceAction{{Name: "sample", Disabled: false}}, actions.Actions) _, err = client.RunResourceAction(context.Background(), &applicationpkg.ResourceActionRunRequest{ @@ -1300,15 +1300,15 @@ func TestNewStyleResourceActionMixedOk(t *testing.T) { ResourceName: ptr.To("hello"), Action: ptr.To("sample"), }) - assert.NoError(t, err) + require.NoError(t, err) // Assert new Job was created _, err = KubeClientset.BatchV1().Jobs(DeploymentNamespace()).Get(context.Background(), "hello-123", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) // Assert the original CronJob was patched cronJob, err := KubeClientset.BatchV1().CronJobs(DeploymentNamespace()).Get(context.Background(), "hello", metav1.GetOptions{}) assert.Equal(t, "aValue", cronJob.Labels["aKey"]) - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -1325,7 +1325,7 @@ func TestSyncResourceByLabel(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { _, err := RunCli("app", "sync", app.Name, "--label", "this-label=does-not-exist") - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "level=fatal") }) } @@ -1343,7 +1343,7 @@ func TestSyncResourceByProject(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { _, err := RunCli("app", "sync", app.Name, "--project", "this-project-does-not-exist") - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "level=fatal") }) } @@ -1405,10 +1405,10 @@ func TestNoLocalSyncWithAutosyncEnabled(t *testing.T) { Then(). And(func(app *Application) { _, err := RunCli("app", "set", app.Name, "--sync-policy", "automated") - assert.NoError(t, err) + require.NoError(t, err) _, err = RunCli("app", "sync", app.Name, "--local", guestbookPathLocal) - assert.Error(t, err) + require.Error(t, err) }) } @@ -1421,11 +1421,11 @@ func TestLocalSyncDryRunWithAutosyncEnabled(t *testing.T) { Then(). And(func(app *Application) { _, err := RunCli("app", "set", app.Name, "--sync-policy", "automated") - assert.NoError(t, err) + require.NoError(t, err) appBefore := app.DeepCopy() _, err = RunCli("app", "sync", app.Name, "--dry-run", "--local-repo-root", ".", "--local", guestbookPathLocal) - assert.NoError(t, err) + require.NoError(t, err) appAfter := app.DeepCopy() assert.True(t, reflect.DeepEqual(appBefore, appAfter)) @@ -1449,8 +1449,9 @@ func TestSyncAsync(t *testing.T) { func assertResourceActions(t *testing.T, appName string, successful bool) { assertError := func(err error, message string) { if successful { - assert.NoError(t, err) - } else if assert.Error(t, err) { + require.NoError(t, err) + } else { + require.Error(t, err) assert.Contains(t, err.Error(), message) } } @@ -1921,7 +1922,7 @@ func TestOrphanedResource(t *testing.T) { Expect(Condition(ApplicationConditionOrphanedResourceWarning, "Application has 1 orphaned resources")). And(func(app *Application) { output, err := RunCli("app", "resources", app.Name) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "orphaned-configmap") }). Given(). @@ -1936,7 +1937,7 @@ func TestOrphanedResource(t *testing.T) { Expect(Condition(ApplicationConditionOrphanedResourceWarning, "Application has 1 orphaned resources")). And(func(app *Application) { output, err := RunCli("app", "resources", app.Name) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "orphaned-configmap") }). Given(). @@ -1952,7 +1953,7 @@ func TestOrphanedResource(t *testing.T) { Expect(NoConditions()). And(func(app *Application) { output, err := RunCli("app", "resources", app.Name) - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, output, "orphaned-configmap") }). Given(). @@ -1968,7 +1969,7 @@ func TestOrphanedResource(t *testing.T) { Expect(NoConditions()). And(func(app *Application) { output, err := RunCli("app", "resources", app.Name) - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, output, "orphaned-configmap") }). Given(). @@ -2089,7 +2090,7 @@ func TestSyncWithInfos(t *testing.T) { _, err := RunCli("app", "sync", app.Name, "--info", fmt.Sprintf("%s=%s", expectedInfo[0].Name, expectedInfo[0].Value), "--info", fmt.Sprintf("%s=%s", expectedInfo[1].Name, expectedInfo[1].Value)) - assert.NoError(t, err) + require.NoError(t, err) }). Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { @@ -2111,7 +2112,7 @@ func TestCreateAppWithNoNameSpaceForGlobalResource(t *testing.T) { And(func(app *Application) { time.Sleep(500 * time.Millisecond) app, err := AppClientset.ArgoprojV1alpha1().Applications(TestNamespace()).Get(context.Background(), app.Name, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, app.Status.Conditions) }) } @@ -2191,19 +2192,19 @@ func TestListResource(t *testing.T) { Expect(Condition(ApplicationConditionOrphanedResourceWarning, "Application has 1 orphaned resources")). And(func(app *Application) { output, err := RunCli("app", "resources", app.Name) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "orphaned-configmap") assert.Contains(t, output, "guestbook-ui") }). And(func(app *Application) { output, err := RunCli("app", "resources", app.Name, "--orphaned=true") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "orphaned-configmap") assert.NotContains(t, output, "guestbook-ui") }). And(func(app *Application) { output, err := RunCli("app", "resources", app.Name, "--orphaned=false") - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, output, "orphaned-configmap") assert.Contains(t, output, "guestbook-ui") }). @@ -2234,7 +2235,7 @@ func TestNamespaceAutoCreation(t *testing.T) { defer func() { if !t.Skipped() { _, err := Run("", "kubectl", "delete", "namespace", updatedNamespace) - assert.NoError(t, err) + require.NoError(t, err) } }() Given(t). @@ -2246,7 +2247,7 @@ func TestNamespaceAutoCreation(t *testing.T) { And(func(app *Application) { // Make sure the namespace we are about to update to does not exist _, err := Run("", "kubectl", "get", "namespace", updatedNamespace) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "not found") }). When(). @@ -2265,7 +2266,7 @@ func TestNamespaceAutoCreation(t *testing.T) { And(func(app *Application) { // Verify delete app does not delete the namespace auto created output, err := Run("", "kubectl", "get", "namespace", updatedNamespace) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, updatedNamespace) }) } @@ -2294,7 +2295,7 @@ func TestCreateDisableValidation(t *testing.T) { And(func(app *Application) { _, err := RunCli("app", "create", app.Name, "--upsert", "--validate=false", "--repo", RepoURL(RepoURLTypeFile), "--path", "baddir2", "--project", app.Spec.Project, "--dest-server", KubernetesInternalAPIServerAddr, "--dest-namespace", DeploymentNamespace()) - assert.NoError(t, err) + require.NoError(t, err) }). When(). AppSet("--path", "baddir3", "--validate=false") @@ -2381,38 +2382,38 @@ definitions: // tests resource actions on a CRD using status subresource And(func(app *Application) { _, err := RunCli("app", "actions", "run", app.Name, "--kind", "StatusSubResource", "update-both") - assert.NoError(t, err) + require.NoError(t, err) text := FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "statussubresources", "status-subresource", "-o", "jsonpath={.spec.foo}")).(string) assert.Equal(t, "update-both", text) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "statussubresources", "status-subresource", "-o", "jsonpath={.status.bar}")).(string) assert.Equal(t, "update-both", text) _, err = RunCli("app", "actions", "run", app.Name, "--kind", "StatusSubResource", "update-spec") - assert.NoError(t, err) + require.NoError(t, err) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "statussubresources", "status-subresource", "-o", "jsonpath={.spec.foo}")).(string) assert.Equal(t, "update-spec", text) _, err = RunCli("app", "actions", "run", app.Name, "--kind", "StatusSubResource", "update-status") - assert.NoError(t, err) + require.NoError(t, err) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "statussubresources", "status-subresource", "-o", "jsonpath={.status.bar}")).(string) assert.Equal(t, "update-status", text) }). // tests resource actions on a CRD *not* using status subresource And(func(app *Application) { _, err := RunCli("app", "actions", "run", app.Name, "--kind", "NonStatusSubResource", "update-both") - assert.NoError(t, err) + require.NoError(t, err) text := FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "nonstatussubresources", "non-status-subresource", "-o", "jsonpath={.spec.foo}")).(string) assert.Equal(t, "update-both", text) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "nonstatussubresources", "non-status-subresource", "-o", "jsonpath={.status.bar}")).(string) assert.Equal(t, "update-both", text) _, err = RunCli("app", "actions", "run", app.Name, "--kind", "NonStatusSubResource", "update-spec") - assert.NoError(t, err) + require.NoError(t, err) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "nonstatussubresources", "non-status-subresource", "-o", "jsonpath={.spec.foo}")).(string) assert.Equal(t, "update-spec", text) _, err = RunCli("app", "actions", "run", app.Name, "--kind", "NonStatusSubResource", "update-status") - assert.NoError(t, err) + require.NoError(t, err) text = FailOnErr(Run(".", "kubectl", "-n", app.Spec.Destination.Namespace, "get", "nonstatussubresources", "non-status-subresource", "-o", "jsonpath={.status.bar}")).(string) assert.Equal(t, "update-status", text) }) @@ -2429,17 +2430,17 @@ func TestAppLogs(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(app *Application) { out, err := RunCliWithRetry(appLogsRetryCount, "app", "logs", app.Name, "--kind", "Deployment", "--group", "", "--name", "guestbook-ui") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(appLogsRetryCount, "app", "logs", app.Name, "--kind", "Pod") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "Hi") }). And(func(app *Application) { out, err := RunCliWithRetry(appLogsRetryCount, "app", "logs", app.Name, "--kind", "Service") - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, out, "Hi") }) } diff --git a/test/e2e/app_multiple_sources_test.go b/test/e2e/app_multiple_sources_test.go index 4ae4607a66b4a..fd5f2d8d5fb69 100644 --- a/test/e2e/app_multiple_sources_test.go +++ b/test/e2e/app_multiple_sources_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" . "github.com/argoproj/argo-cd/v2/test/e2e/fixture" @@ -39,7 +40,7 @@ func TestMultiSourceAppCreation(t *testing.T) { And(func(_ *Application) { // app should be listed output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, Name()) }). Expect(Success("")). @@ -94,7 +95,7 @@ func TestMultiSourceAppWithHelmExternalValueFiles(t *testing.T) { And(func(_ *Application) { // app should be listed output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, Name()) }). Expect(Success("")). @@ -142,7 +143,7 @@ func TestMultiSourceAppWithSourceOverride(t *testing.T) { And(func(_ *Application) { // app should be listed output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, Name()) }). Expect(Success("")). @@ -162,7 +163,7 @@ func TestMultiSourceAppWithSourceOverride(t *testing.T) { // check if label was added to the pod to make sure resource was taken from the later source output, err := Run("", "kubectl", "describe", "pods", "pod-1", "-n", DeploymentNamespace()) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "foo=bar") }) } diff --git a/test/e2e/app_namespaces_test.go b/test/e2e/app_namespaces_test.go index 033c34e9a70d3..20e878a4685f1 100644 --- a/test/e2e/app_namespaces_test.go +++ b/test/e2e/app_namespaces_test.go @@ -6,6 +6,7 @@ import ( . "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -37,7 +38,7 @@ func TestAppCreationInOtherNamespace(t *testing.T) { And(func(_ *Application) { // app should be listed output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, ctx.AppName()) }). When(). diff --git a/test/e2e/applicationset_test.go b/test/e2e/applicationset_test.go index 08bcb83c7c577..0b32f528023a6 100644 --- a/test/e2e/applicationset_test.go +++ b/test/e2e/applicationset_test.go @@ -22,6 +22,7 @@ import ( "github.com/argoproj/argo-cd/v2/test/e2e/fixture" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" . "github.com/argoproj/argo-cd/v2/test/e2e/fixture/applicationsets" "github.com/argoproj/argo-cd/v2/test/e2e/fixture/applicationsets/utils" @@ -2612,7 +2613,7 @@ func TestSCMProviderGeneratorSCMProviderNotAllowed(t *testing.T) { And(func() { // app should be listed output, err := fixture.RunCli("appset", "get", "scm-provider-generator-scm-provider-not-allowed") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "scm provider not allowed") }) } @@ -3024,7 +3025,7 @@ func TestPullRequestGeneratorNotAllowedSCMProvider(t *testing.T) { And(func() { // app should be listed output, err := fixture.RunCli("appset", "get", "pull-request-generator-not-allowed-scm") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, output, "scm provider not allowed") }) } diff --git a/test/e2e/cli_test.go b/test/e2e/cli_test.go index 8e87ea16f4469..1472116be7e93 100644 --- a/test/e2e/cli_test.go +++ b/test/e2e/cli_test.go @@ -6,6 +6,7 @@ import ( "github.com/argoproj/gitops-engine/pkg/health" . "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" . "github.com/argoproj/argo-cd/v2/test/e2e/fixture" @@ -19,7 +20,7 @@ func TestCliAppCommand(t *testing.T) { CreateApp(). And(func() { output, err := RunCli("app", "sync", Name(), "--timeout", "90") - assert.NoError(t, err) + require.NoError(t, err) vars := map[string]interface{}{"Name": Name(), "Namespace": DeploymentNamespace()} assert.Contains(t, NormalizeOutput(output), Tmpl(`Pod {{.Namespace}} pod Synced Progressing pod/pod created`, vars)) assert.Contains(t, NormalizeOutput(output), Tmpl(`Pod {{.Namespace}} hook Succeeded Sync pod/hook created`, vars)) @@ -29,7 +30,7 @@ func TestCliAppCommand(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(_ *Application) { output, err := RunCli("app", "list") - assert.NoError(t, err) + require.NoError(t, err) expected := Tmpl( `{{.Name}} https://kubernetes.default.svc {{.Namespace}} default Synced Healthy Manual `, map[string]interface{}{"Name": Name(), "Namespace": DeploymentNamespace()}) diff --git a/test/e2e/cluster_objects_test.go b/test/e2e/cluster_objects_test.go index 4299a35c55c00..59ee43d3974b6 100644 --- a/test/e2e/cluster_objects_test.go +++ b/test/e2e/cluster_objects_test.go @@ -6,6 +6,7 @@ import ( "github.com/argoproj/gitops-engine/pkg/health" . "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" . "github.com/argoproj/argo-cd/v2/test/e2e/fixture" @@ -25,7 +26,7 @@ func TestClusterRoleBinding(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { diffOutput, err := RunCli("app", "diff", app.Name, "--revision=HEAD") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, diffOutput) }). When(). @@ -37,7 +38,7 @@ func TestClusterRoleBinding(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(app *Application) { diffOutput, err := RunCli("app", "diff", app.Name, "--revision=HEAD") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, diffOutput) }) } diff --git a/test/e2e/custom_tool_test.go b/test/e2e/custom_tool_test.go index 52b04ace3437d..d5433977afa3f 100644 --- a/test/e2e/custom_tool_test.go +++ b/test/e2e/custom_tool_test.go @@ -67,12 +67,12 @@ func TestCustomToolWithGitCredsTemplate(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)). And(func(app *Application) { output, err := Run("", "kubectl", "-n", DeploymentNamespace(), "get", "cm", ctx.AppName(), "-o", "jsonpath={.metadata.annotations.GitUsername}") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, output) }). And(func(app *Application) { output, err := Run("", "kubectl", "-n", DeploymentNamespace(), "get", "cm", ctx.AppName(), "-o", "jsonpath={.metadata.annotations.GitPassword}") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, output) }) } @@ -107,18 +107,18 @@ func TestCustomToolWithEnv(t *testing.T) { }). And(func(app *Application) { output, err := Run("", "kubectl", "-n", DeploymentNamespace(), "get", "cm", ctx.AppName(), "-o", "jsonpath={.metadata.annotations.Bar}") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "baz", output) }). And(func(app *Application) { output, err := Run("", "kubectl", "-n", DeploymentNamespace(), "get", "cm", ctx.AppName(), "-o", "jsonpath={.metadata.annotations.Foo}") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "bar", output) }). And(func(app *Application) { expectedKubeVersion := GetVersions().ServerVersion.Format("%s.%s") output, err := Run("", "kubectl", "-n", DeploymentNamespace(), "get", "cm", ctx.AppName(), "-o", "jsonpath={.metadata.annotations.KubeVersion}") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedKubeVersion, output) }). And(func(app *Application) { @@ -127,7 +127,7 @@ func TestCustomToolWithEnv(t *testing.T) { sort.Strings(expectedApiVersionSlice) output, err := Run("", "kubectl", "-n", DeploymentNamespace(), "get", "cm", ctx.AppName(), "-o", "jsonpath={.metadata.annotations.KubeApiVersion}") - assert.NoError(t, err) + require.NoError(t, err) outputSlice := strings.Split(output, ",") sort.Strings(outputSlice) @@ -261,13 +261,13 @@ func TestCMPDiscoverWithFindCommandWithEnv(t *testing.T) { }). And(func(app *Application) { output, err := Run("", "kubectl", "-n", DeploymentNamespace(), "get", "cm", ctx.AppName(), "-o", "jsonpath={.metadata.annotations.Bar}") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "baz", output) }). And(func(app *Application) { expectedKubeVersion := GetVersions().ServerVersion.Format("%s.%s") output, err := Run("", "kubectl", "-n", DeploymentNamespace(), "get", "cm", ctx.AppName(), "-o", "jsonpath={.metadata.annotations.KubeVersion}") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedKubeVersion, output) }). And(func(app *Application) { @@ -276,7 +276,7 @@ func TestCMPDiscoverWithFindCommandWithEnv(t *testing.T) { sort.Strings(expectedApiVersionSlice) output, err := Run("", "kubectl", "-n", DeploymentNamespace(), "get", "cm", ctx.AppName(), "-o", "jsonpath={.metadata.annotations.KubeApiVersion}") - assert.NoError(t, err) + require.NoError(t, err) outputSlice := strings.Split(output, ",") sort.Strings(outputSlice) @@ -303,7 +303,7 @@ func TestPruneResourceFromCMP(t *testing.T) { Expect(DoesNotExist()). AndAction(func() { _, err := Run("", "kubectl", "-n", DeploymentNamespace(), "get", "deployment", "guestbook-ui") - assert.Error(t, err) + require.Error(t, err) }) } diff --git a/test/e2e/deployment_test.go b/test/e2e/deployment_test.go index 5d36f00755fe9..083a2a60d9b3d 100644 --- a/test/e2e/deployment_test.go +++ b/test/e2e/deployment_test.go @@ -9,6 +9,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -65,7 +66,7 @@ func TestDeploymentWithAnnotationTrackingMode(t *testing.T) { Then(). And(func(app *Application) { out, err := RunCli("app", "manifests", ctx.AppName()) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, fmt.Sprintf(`annotations: argocd.argoproj.io/tracking-id: %s:apps/Deployment:%s/nginx-deployment `, ctx.AppName(), DeploymentNamespace())) @@ -88,7 +89,7 @@ func TestDeploymentWithLabelTrackingMode(t *testing.T) { Then(). And(func(app *Application) { out, err := RunCli("app", "manifests", ctx.AppName()) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, fmt.Sprintf(`labels: app: nginx app.kubernetes.io/instance: %s @@ -111,7 +112,7 @@ func TestDeploymentWithoutTrackingMode(t *testing.T) { Then(). And(func(app *Application) { out, err := RunCli("app", "manifests", ctx.AppName()) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, fmt.Sprintf(`labels: app: nginx app.kubernetes.io/instance: %s @@ -265,12 +266,12 @@ func createNamespaceScopedUser(t *testing.T, username string, clusterScopedSecre }, } _, err := KubeClientset.CoreV1().Namespaces().Create(context.Background(), &ns, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) // Create a ServiceAccount in that Namespace, which will be used for the Argo CD Cluster SEcret serviceAccountName := username + "-serviceaccount" err = clusterauth.CreateServiceAccount(KubeClientset, serviceAccountName, ns.Name) - assert.NoError(t, err) + require.NoError(t, err) // Create a Role that allows the ServiceAccount to read/write all within the Namespace role := rbacv1.Role{ @@ -285,7 +286,7 @@ func createNamespaceScopedUser(t *testing.T, username string, clusterScopedSecre }}, } _, err = KubeClientset.RbacV1().Roles(role.Namespace).Create(context.Background(), &role, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) // Bind the Role with the ServiceAccount in the Namespace roleBinding := rbacv1.RoleBinding{ @@ -305,11 +306,11 @@ func createNamespaceScopedUser(t *testing.T, username string, clusterScopedSecre }, } _, err = KubeClientset.RbacV1().RoleBindings(roleBinding.Namespace).Create(context.Background(), &roleBinding, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) // Retrieve the bearer token from the ServiceAccount token, err := clusterauth.GetServiceAccountBearerToken(KubeClientset, ns.Name, serviceAccountName, time.Second*60) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, token) // In order to test a cluster-scoped Argo CD Cluster Secret, we may optionally grant the ServiceAccount read-all permissions at cluster scope. @@ -317,10 +318,10 @@ func createNamespaceScopedUser(t *testing.T, username string, clusterScopedSecre clusterRole, clusterRoleBinding := generateReadOnlyClusterRoleandBindingForServiceAccount(username, username) _, err := KubeClientset.RbacV1().ClusterRoles().Create(context.Background(), &clusterRole, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) _, err = KubeClientset.RbacV1().ClusterRoleBindings().Create(context.Background(), &clusterRoleBinding, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) } // Build the Argo CD Cluster Secret by using the service account token, and extracting needed values from kube config @@ -332,10 +333,10 @@ func createNamespaceScopedUser(t *testing.T, username string, clusterScopedSecre } jsonStringBytes, err := json.Marshal(clusterSecretConfigJSON) - assert.NoError(t, err) + require.NoError(t, err) _, apiURL, err := extractKubeConfigValues() - assert.NoError(t, err) + require.NoError(t, err) clusterResourcesField := "" namespacesField := "" @@ -353,7 +354,7 @@ func createNamespaceScopedUser(t *testing.T, username string, clusterScopedSecre // Finally, create the Cluster secret in the Argo CD E2E namespace _, err = KubeClientset.CoreV1().Secrets(secret.Namespace).Create(context.Background(), &secret, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) } // extractKubeConfigValues returns contents of the local environment's kubeconfig, using standard path resolution mechanism. diff --git a/test/e2e/hook_test.go b/test/e2e/hook_test.go index 8c66151371405..7c3860b47c8f2 100644 --- a/test/e2e/hook_test.go +++ b/test/e2e/hook_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -76,7 +77,7 @@ func TestHookDiff(t *testing.T) { Then(). And(func(_ *Application) { output, err := RunCli("app", "diff", Name()) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, output, "name: pod") assert.NotContains(t, output, "name: hook") }) diff --git a/test/e2e/jsonnet_test.go b/test/e2e/jsonnet_test.go index f8b55188344f5..3f1113b4207a5 100644 --- a/test/e2e/jsonnet_test.go +++ b/test/e2e/jsonnet_test.go @@ -6,6 +6,7 @@ import ( . "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/argoproj/gitops-engine/pkg/utils/kube" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" . "github.com/argoproj/argo-cd/v2/test/e2e/fixture" @@ -23,9 +24,9 @@ func TestJsonnetAppliedCorrectly(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { manifests, err := RunCli("app", "manifests", app.Name, "--source", "live") - assert.NoError(t, err) + require.NoError(t, err) resources, err := kube.SplitYAML([]byte(manifests)) - assert.NoError(t, err) + require.NoError(t, err) index := -1 for i := range resources { @@ -53,9 +54,9 @@ func TestJsonnetTlaParameterAppliedCorrectly(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeSynced)). And(func(app *Application) { manifests, err := RunCli("app", "manifests", app.Name, "--source", "live") - assert.NoError(t, err) + require.NoError(t, err) resources, err := kube.SplitYAML([]byte(manifests)) - assert.NoError(t, err) + require.NoError(t, err) index := -1 for i := range resources { diff --git a/test/e2e/kustomize_test.go b/test/e2e/kustomize_test.go index 70d6ee914cb3d..8936d591cfb65 100644 --- a/test/e2e/kustomize_test.go +++ b/test/e2e/kustomize_test.go @@ -7,6 +7,7 @@ import ( "github.com/argoproj/gitops-engine/pkg/health" . "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" "github.com/argoproj/argo-cd/v2/test/e2e/fixture" @@ -22,7 +23,7 @@ func TestKustomize2AppSource(t *testing.T) { "", "kubectl", "-n="+fixture.DeploymentNamespace(), "get", kind, name, "-ojsonpath={.metadata.labels.patched-by}") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "argo-cd", labelValue, "wrong value of 'patched-by' label of %s %s", kind, name) } } @@ -189,7 +190,7 @@ func TestKustomizeReplicas2AppSource(t *testing.T) { "", "kubectl", "-n="+fixture.DeploymentNamespace(), "get", kind, name, "-ojsonpath={.spec.replicas}") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, strconv.Itoa(deploymentReplicas), replicas, "wrong value of replicas %s %s", kind, name) } } diff --git a/test/e2e/notification_test.go b/test/e2e/notification_test.go index 319937916fe41..e4dd855a107e3 100644 --- a/test/e2e/notification_test.go +++ b/test/e2e/notification_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "k8s.io/utils/ptr" "github.com/argoproj/argo-cd/v2/pkg/apiclient/notification" @@ -15,7 +16,7 @@ func TestNotificationsListServices(t *testing.T) { ctx.When(). SetParamInNotificationConfigMap("service.webhook.test", "url: https://test.example.com"). Then().Services(func(services *notification.ServiceList, err error) { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*notification.Service{{Name: ptr.To("test")}}, services.Items) }) } @@ -25,7 +26,7 @@ func TestNotificationsListTemplates(t *testing.T) { ctx.When(). SetParamInNotificationConfigMap("template.app-created", "email:\n subject: Application {{.app.metadata.name}} has been created.\nmessage: Application {{.app.metadata.name}} has been created.\nteams:\n title: Application {{.app.metadata.name}} has been created.\n"). Then().Templates(func(templates *notification.TemplateList, err error) { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*notification.Template{{Name: ptr.To("app-created")}}, templates.Items) }) } @@ -35,7 +36,7 @@ func TestNotificationsListTriggers(t *testing.T) { ctx.When(). SetParamInNotificationConfigMap("trigger.on-created", "- description: Application is created.\n oncePer: app.metadata.name\n send:\n - app-created\n when: \"true\"\n"). Then().Triggers(func(triggers *notification.TriggerList, err error) { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*notification.Trigger{{Name: ptr.To("on-created")}}, triggers.Items) }) } diff --git a/test/e2e/project_management_test.go b/test/e2e/project_management_test.go index 54b8fddeee27f..5e8b42a94442d 100644 --- a/test/e2e/project_management_test.go +++ b/test/e2e/project_management_test.go @@ -10,6 +10,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" @@ -28,7 +29,7 @@ func assertProjHasEvent(t *testing.T, a *v1alpha1.AppProject, message string, re "involvedObject.namespace": fixture.TestNamespace(), }).String(), }) - assert.NoError(t, err) + require.NoError(t, err) for i := range list.Items { event := list.Items[i] @@ -49,10 +50,10 @@ func TestProjectCreation(t *testing.T) { "-d", "https://192.168.99.100:8443,service", "-s", "https://github.com/argoproj/argo-cd.git", "--orphaned-resources") - assert.NoError(t, err) + require.NoError(t, err) proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, projectName, proj.Name) assert.Len(t, proj.Spec.Destinations, 2) @@ -76,19 +77,19 @@ func TestProjectCreation(t *testing.T) { proj.ResourceVersion = "" data, err := json.Marshal(proj) stdinString := string(data) - assert.NoError(t, err) + require.NoError(t, err) // fail without upsert flag _, err = fixture.RunCliWithStdin(stdinString, "proj", "create", "-f", "-") - assert.Error(t, err) + require.Error(t, err) // succeed with the upsert flag _, err = fixture.RunCliWithStdin(stdinString, "proj", "create", "-f", "-", "--upsert") - assert.NoError(t, err) + require.NoError(t, err) proj, err = fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, newDescription, proj.Spec.Description) } @@ -98,10 +99,10 @@ func TestProjectDeletion(t *testing.T) { projectName := "proj-" + strconv.FormatInt(time.Now().Unix(), 10) proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Create( context.Background(), &v1alpha1.AppProject{ObjectMeta: metav1.ObjectMeta{Name: projectName}}, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) _, err = fixture.RunCli("proj", "delete", projectName) - assert.NoError(t, err) + require.NoError(t, err) _, err = fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) assert.True(t, errors.IsNotFound(err)) @@ -114,17 +115,17 @@ func TestSetProject(t *testing.T) { projectName := "proj-" + strconv.FormatInt(time.Now().Unix(), 10) _, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Create( context.Background(), &v1alpha1.AppProject{ObjectMeta: metav1.ObjectMeta{Name: projectName}}, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) _, err = fixture.RunCli("proj", "set", projectName, "--description", "updated description", "-d", "https://192.168.99.100:8443,default", "-d", "https://192.168.99.100:8443,service", "--orphaned-resources-warn=false") - assert.NoError(t, err) + require.NoError(t, err) proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, projectName, proj.Name) assert.Len(t, proj.Spec.Destinations, 2) @@ -162,25 +163,25 @@ func TestAddProjectDestination(t *testing.T) { "https://192.168.99.100:8443", "test1", ) - assert.Error(t, err) + require.Error(t, err) assert.True(t, strings.Contains(err.Error(), "already defined")) _, err = fixture.RunCli("proj", "add-destination", projectName, "!*", "test1", ) - assert.Error(t, err) + require.Error(t, err) assert.True(t, strings.Contains(err.Error(), "server has an invalid format, '!*'")) _, err = fixture.RunCli("proj", "add-destination", projectName, "https://192.168.99.100:8443", "!*", ) - assert.Error(t, err) + require.Error(t, err) assert.True(t, strings.Contains(err.Error(), "namespace has an invalid format, '!*'")) proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, projectName, proj.Name) assert.Len(t, proj.Spec.Destinations, 1) @@ -209,7 +210,7 @@ func TestAddProjectDestinationWithName(t *testing.T) { } proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, projectName, proj.Name) assert.Len(t, proj.Spec.Destinations, 1) @@ -248,7 +249,7 @@ func TestRemoveProjectDestination(t *testing.T) { "https://192.168.99.100:8443", "test1", ) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "does not exist") proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) @@ -276,10 +277,10 @@ func TestAddProjectSource(t *testing.T) { } _, err = fixture.RunCli("proj", "add-source", projectName, "https://github.com/argoproj/argo-cd.git") - assert.NoError(t, err) + require.NoError(t, err) proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, projectName, proj.Name) assert.Len(t, proj.Spec.SourceRepos, 1) @@ -297,17 +298,17 @@ func TestRemoveProjectSource(t *testing.T) { }, }, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) _, err = fixture.RunCli("proj", "remove-source", projectName, "https://github.com/argoproj/argo-cd.git") - assert.NoError(t, err) + require.NoError(t, err) _, err = fixture.RunCli("proj", "remove-source", projectName, "https://github.com/argoproj/argo-cd.git") - assert.NoError(t, err) + require.NoError(t, err) proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, projectName, proj.Name) assert.Empty(t, proj.Spec.SourceRepos) assertProjHasEvent(t, proj, "update", argo.EventReasonResourceUpdated) @@ -346,48 +347,48 @@ func TestUseJWTToken(t *testing.T) { SourceRepos: []string{"*"}, }, }, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) _, err = fixture.AppClientset.ArgoprojV1alpha1().Applications(fixture.TestNamespace()).Create(context.Background(), testApp, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) _, err = fixture.RunCli("proj", "role", "create", projectName, roleName) - assert.NoError(t, err) + require.NoError(t, err) roleGetResult, err := fixture.RunCli("proj", "role", "get", projectName, roleName) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, strings.HasSuffix(roleGetResult, "ID ISSUED-AT EXPIRES-AT")) _, err = fixture.RunCli("proj", "role", "create-token", projectName, roleName) - assert.NoError(t, err) + require.NoError(t, err) // Create second role with kubectl, to test that it will not affect 1st role _, err = fixture.Run("", "kubectl", "patch", "appproject", projectName, "--type", "merge", "-n", fixture.TestNamespace(), "-p", fmt.Sprintf(`{"spec":{"roles":[{"name":"%s"},{"name":"%s"}]}}`, roleName, roleName2)) - assert.NoError(t, err) + require.NoError(t, err) _, err = fixture.RunCli("proj", "role", "create-token", projectName, roleName2) - assert.NoError(t, err) + require.NoError(t, err) for _, action := range []string{"get", "update", "sync", "create", "override", "*"} { _, err = fixture.RunCli("proj", "role", "add-policy", projectName, roleName, "-a", action, "-o", "*", "-p", "allow") - assert.NoError(t, err) + require.NoError(t, err) } newProj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, newProj.Status.JWTTokensByRole[roleName].Items, 1) assert.ElementsMatch(t, newProj.Status.JWTTokensByRole[roleName].Items, newProj.Spec.Roles[0].JWTTokens) roleGetResult, err = fixture.RunCli("proj", "role", "get", projectName, roleName) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, strings.Contains(roleGetResult, strconv.FormatInt(newProj.Status.JWTTokensByRole[roleName].Items[0].IssuedAt, 10))) _, err = fixture.RunCli("proj", "role", "delete-token", projectName, roleName, strconv.FormatInt(newProj.Status.JWTTokensByRole[roleName].Items[0].IssuedAt, 10)) - assert.NoError(t, err) + require.NoError(t, err) newProj, err = fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, newProj.Status.JWTTokensByRole[roleName].Items) assert.Nil(t, newProj.Spec.Roles[0].JWTTokens) } @@ -418,11 +419,11 @@ func TestAddOrphanedIgnore(t *testing.T) { "--name", "name", ) - assert.Error(t, err) + require.Error(t, err) assert.True(t, strings.Contains(err.Error(), "already defined")) proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, projectName, proj.Name) assert.Len(t, proj.Spec.OrphanedResources.Ignore, 1) @@ -465,7 +466,7 @@ func TestRemoveOrphanedIgnore(t *testing.T) { "--name", "name", ) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "does not exist") proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) @@ -546,7 +547,7 @@ func createAndConfigGlobalProject() error { func TestGetVirtualProjectNoMatch(t *testing.T) { fixture.EnsureCleanState(t) err := createAndConfigGlobalProject() - assert.NoError(t, err) + require.NoError(t, err) // Create project which does not match global project settings projectName := "proj-" + fixture.Name() @@ -555,15 +556,15 @@ func TestGetVirtualProjectNoMatch(t *testing.T) { "-d", fmt.Sprintf("%s,*", v1alpha1.KubernetesInternalAPIServerAddr), "-s", "*", "--orphaned-resources") - assert.NoError(t, err) + require.NoError(t, err) proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) // Create an app belongs to proj project _, err = fixture.RunCli("app", "create", fixture.Name(), "--repo", fixture.RepoURL(fixture.RepoURLTypeFile), "--path", guestbookPath, "--project", proj.Name, "--dest-server", v1alpha1.KubernetesInternalAPIServerAddr, "--dest-namespace", fixture.DeploymentNamespace()) - assert.NoError(t, err) + require.NoError(t, err) // Waiting for the app to be successfully created. // Else the sync would fail to retrieve the app resources. @@ -571,17 +572,17 @@ func TestGetVirtualProjectNoMatch(t *testing.T) { // App trying to sync a resource which is not blacked listed anywhere _, err = fixture.RunCli("app", "sync", fixture.Name(), "--resource", "apps:Deployment:guestbook-ui", "--timeout", fmt.Sprintf("%v", 10)) - assert.NoError(t, err) + require.NoError(t, err) // app trying to sync a resource which is black listed by global project _, err = fixture.RunCli("app", "sync", fixture.Name(), "--resource", ":Service:guestbook-ui", "--timeout", fmt.Sprintf("%v", 10)) - assert.NoError(t, err) + require.NoError(t, err) } func TestGetVirtualProjectMatch(t *testing.T) { fixture.EnsureCleanState(t) err := createAndConfigGlobalProject() - assert.NoError(t, err) + require.NoError(t, err) // Create project which matches global project settings projectName := "proj-" + fixture.Name() @@ -590,20 +591,20 @@ func TestGetVirtualProjectMatch(t *testing.T) { "-d", fmt.Sprintf("%s,*", v1alpha1.KubernetesInternalAPIServerAddr), "-s", "*", "--orphaned-resources") - assert.NoError(t, err) + require.NoError(t, err) proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Get(context.Background(), projectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) // Add a label to this project so that this project match global project selector proj.Labels = map[string]string{"opt": "me"} _, err = fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.TestNamespace()).Update(context.Background(), proj, metav1.UpdateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) // Create an app belongs to proj project _, err = fixture.RunCli("app", "create", fixture.Name(), "--repo", fixture.RepoURL(fixture.RepoURLTypeFile), "--path", guestbookPath, "--project", proj.Name, "--dest-server", v1alpha1.KubernetesInternalAPIServerAddr, "--dest-namespace", fixture.DeploymentNamespace()) - assert.NoError(t, err) + require.NoError(t, err) // Waiting for the app to be successfully created. // Else the sync would fail to retrieve the app resources. @@ -611,7 +612,7 @@ func TestGetVirtualProjectMatch(t *testing.T) { // App trying to sync a resource which is not blacked listed anywhere _, err = fixture.RunCli("app", "sync", fixture.Name(), "--resource", "apps:Deployment:guestbook-ui", "--timeout", fmt.Sprintf("%v", 10)) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "blocked by sync window") // app trying to sync a resource which is black listed by global project diff --git a/test/e2e/repo_management_test.go b/test/e2e/repo_management_test.go index b7f9e74c44589..c49eb2eeba794 100644 --- a/test/e2e/repo_management_test.go +++ b/test/e2e/repo_management_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" repositorypkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/repository" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" @@ -20,15 +21,15 @@ func TestAddRemovePublicRepo(t *testing.T) { app.Given(t).And(func() { repoUrl := fixture.RepoURL(fixture.RepoURLTypeFile) _, err := fixture.RunCli("repo", "add", repoUrl) - assert.NoError(t, err) + require.NoError(t, err) conn, repoClient, err := fixture.ArgoCDClientset.NewRepoClient() - assert.NoError(t, err) + require.NoError(t, err) defer argoio.Close(conn) repo, err := repoClient.ListRepositories(context.Background(), &repositorypkg.RepoQuery{}) - assert.NoError(t, err) + require.NoError(t, err) exists := false for i := range repo.Items { if repo.Items[i].Repo == repoUrl { @@ -39,10 +40,10 @@ func TestAddRemovePublicRepo(t *testing.T) { assert.True(t, exists) _, err = fixture.RunCli("repo", "rm", repoUrl) - assert.NoError(t, err) + require.NoError(t, err) repo, err = repoClient.ListRepositories(context.Background(), &repositorypkg.RepoQuery{}) - assert.NoError(t, err) + require.NoError(t, err) exists = false for i := range repo.Items { if repo.Items[i].Repo == repoUrl { @@ -66,7 +67,7 @@ func TestGetRepoWithInheritedCreds(t *testing.T) { // Then, we remove username/password so that the repo inherits the credentials from our repocreds conn, repoClient, err := fixture.ArgoCDClientset.NewRepoClient() - assert.NoError(t, err) + require.NoError(t, err) defer argoio.Close(conn) _, err = repoClient.UpdateRepository(context.Background(), &repositorypkg.RepoUpdateRequest{ @@ -74,15 +75,15 @@ func TestGetRepoWithInheritedCreds(t *testing.T) { Repo: repoUrl, }, }) - assert.NoError(t, err) + require.NoError(t, err) // CLI output should indicate that repo has inherited credentials out, err := fixture.RunCli("repo", "get", repoUrl) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "inherited") _, err = fixture.RunCli("repo", "rm", repoUrl) - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -91,13 +92,13 @@ func TestUpsertExistingRepo(t *testing.T) { fixture.SetRepos(settings.RepositoryCredentials{URL: fixture.RepoURL(fixture.RepoURLTypeFile)}) repoUrl := fixture.RepoURL(fixture.RepoURLTypeFile) _, err := fixture.RunCli("repo", "add", repoUrl) - assert.NoError(t, err) + require.NoError(t, err) _, err = fixture.RunCli("repo", "add", repoUrl, "--username", fixture.GitUsername, "--password", fixture.GitPassword) - assert.Error(t, err) + require.Error(t, err) _, err = fixture.RunCli("repo", "add", repoUrl, "--upsert", "--username", fixture.GitUsername, "--password", fixture.GitPassword) - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -110,15 +111,15 @@ func TestAddRemoveHelmRepo(t *testing.T) { "--password", fixture.GitPassword, "--tls-client-cert-path", repos.CertPath, "--tls-client-cert-key-path", repos.CertKeyPath) - assert.NoError(t, err) + require.NoError(t, err) conn, repoClient, err := fixture.ArgoCDClientset.NewRepoClient() - assert.NoError(t, err) + require.NoError(t, err) defer argoio.Close(conn) repo, err := repoClient.ListRepositories(context.Background(), &repositorypkg.RepoQuery{}) - assert.NoError(t, err) + require.NoError(t, err) exists := false for i := range repo.Items { if repo.Items[i].Repo == fixture.RepoURL(fixture.RepoURLTypeHelm) { @@ -129,10 +130,10 @@ func TestAddRemoveHelmRepo(t *testing.T) { assert.True(t, exists) _, err = fixture.RunCli("repo", "rm", fixture.RepoURL(fixture.RepoURLTypeHelm)) - assert.NoError(t, err) + require.NoError(t, err) repo, err = repoClient.ListRepositories(context.Background(), &repositorypkg.RepoQuery{}) - assert.NoError(t, err) + require.NoError(t, err) exists = false for i := range repo.Items { if repo.Items[i].Repo == fixture.RepoURL(fixture.RepoURLTypeHelm) { @@ -155,22 +156,16 @@ func TestAddHelmRepoInsecureSkipVerify(t *testing.T) { "--tls-client-cert-path", repos.CertPath, "--tls-client-cert-key-path", repos.CertKeyPath) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) conn, repoClient, err := fixture.ArgoCDClientset.NewRepoClient() - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) defer argoio.Close(conn) repo, err := repoClient.ListRepositories(context.Background(), &repositorypkg.RepoQuery{}) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) exists := false for i := range repo.Items { diff --git a/test/e2e/user_info_test.go b/test/e2e/user_info_test.go index db352b816e82a..3e852c030f221 100644 --- a/test/e2e/user_info_test.go +++ b/test/e2e/user_info_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" . "github.com/argoproj/argo-cd/v2/test/e2e/fixture" ) @@ -13,7 +14,7 @@ func TestUserInfo(t *testing.T) { output, err := RunCli("account", "get-user-info") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, `Logged In: true Username: admin Issuer: argocd diff --git a/test/manifests_test.go b/test/manifests_test.go index ce62b175d79b3..9c30714041bcb 100644 --- a/test/manifests_test.go +++ b/test/manifests_test.go @@ -8,6 +8,7 @@ import ( argoexec "github.com/argoproj/pkg/exec" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/test/fixture/test" ) @@ -15,7 +16,7 @@ import ( func TestKustomizeVersion(t *testing.T) { test.CIOnly(t) out, err := argoexec.RunCommand("kustomize", argoexec.CmdOpts{}, "version") - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, out, "v5.", "kustomize should be version 5") } @@ -41,5 +42,5 @@ func TestBuildManifests(t *testing.T) { _, err = argoexec.RunCommand("kustomize", argoexec.CmdOpts{}, "build", dirName) return err }) - assert.NoError(t, err) + require.NoError(t, err) } From 1ecd39741fb37ca179c875ac39a87eb8e5b87782 Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Sat, 15 Jun 2024 14:54:26 -0400 Subject: [PATCH 36/74] chore: ignore mocks in codecov (#18685) Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- .codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.codecov.yml b/.codecov.yml index 6700ed0f05e74..0d91db029a28b 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -8,6 +8,7 @@ ignore: - "pkg/client/.*" - "vendor/.*" - "test/.*" +- "**/mocks/*" coverage: status: # we've found this not to be useful From dbb9bc8f92bb7fd7ab8c853bc389d902e1563dc0 Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Sat, 15 Jun 2024 14:57:39 -0400 Subject: [PATCH 37/74] chore: add codecov config to CI approvers (#18686) Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/CODEOWNERS b/CODEOWNERS index 1c06973b36ddf..20ff6cd449af7 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -8,6 +8,7 @@ /mkdocs.yml @argoproj/argocd-approvers @argoproj/argocd-approvers-docs # CI +/.codecov.yml @argoproj/argocd-approvers @argoproj/argocd-approvers-ci /.github/** @argoproj/argocd-approvers @argoproj/argocd-approvers-ci /.goreleaser.yaml @argoproj/argocd-approvers @argoproj/argocd-approvers-ci /sonar-project.properties @argoproj/argocd-approvers @argoproj/argocd-approvers-ci From 336cc29f14d0be5eeb2148ca540f8a7258a8f492 Mon Sep 17 00:00:00 2001 From: Shady Rafehi Date: Sun, 16 Jun 2024 05:10:13 +1000 Subject: [PATCH 38/74] feat(reposerver): Skip calling git fetch if commit to checkout exists locally (#18657) * Skip fetch if revision to check out exists locally Signed-off-by: Shady Rafehi * Test reposerver/repository.checkoutRevision Signed-off-by: Shady Rafehi * Test client.IsRevisionPresent Signed-off-by: Shady Rafehi * Signoff Signed-off-by: Shady Rafehi * Update reposerver/repository/repository.go Co-authored-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Signed-off-by: Shady Rafehi --------- Signed-off-by: Shady Rafehi Co-authored-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- reposerver/repository/repository.go | 17 +++++++++--- reposerver/repository/repository_test.go | 33 ++++++++++++++++++++++ util/git/client.go | 16 +++++++++++ util/git/client_test.go | 35 ++++++++++++++++++++++++ util/git/mocks/Client.go | 18 ++++++++++++ 5 files changed, 115 insertions(+), 4 deletions(-) diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go index 2e97812dfc118..99f6ac64323b2 100644 --- a/reposerver/repository/repository.go +++ b/reposerver/repository/repository.go @@ -2428,10 +2428,19 @@ func checkoutRevision(gitClient git.Client, revision string, submoduleEnabled bo return status.Errorf(codes.Internal, "Failed to initialize git repo: %v", err) } - // Fetching with no revision first. Fetching with an explicit version can cause repo bloat. https://github.com/argoproj/argo-cd/issues/8845 - err = gitClient.Fetch("") - if err != nil { - return status.Errorf(codes.Internal, "Failed to fetch default: %v", err) + revisionPresent := gitClient.IsRevisionPresent(revision) + + log.WithFields(map[string]interface{}{ + "skipFetch": revisionPresent, + }).Debugf("Checking out revision %v", revision) + + // Fetching can be skipped if the revision is already present locally. + if !revisionPresent { + // Fetching with no revision first. Fetching with an explicit version can cause repo bloat. https://github.com/argoproj/argo-cd/issues/8845 + err = gitClient.Fetch("") + if err != nil { + return status.Errorf(codes.Internal, "Failed to fetch default: %v", err) + } } err = gitClient.Checkout(revision, submoduleEnabled) diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go index e7ae829e14bff..38006085fe4d0 100644 --- a/reposerver/repository/repository_test.go +++ b/reposerver/repository/repository_test.go @@ -104,6 +104,7 @@ func newServiceWithMocks(t *testing.T, root string, signed bool) (*Service, *git } return newServiceWithOpt(t, func(gitClient *gitmocks.Client, helmClient *helmmocks.Client, paths *iomocks.TempPaths) { gitClient.On("Init").Return(nil) + gitClient.On("IsRevisionPresent", mock.Anything).Return(false) gitClient.On("Fetch", mock.Anything).Return(nil) gitClient.On("Checkout", mock.Anything, mock.Anything).Return(nil) gitClient.On("LsRemote", mock.Anything).Return(mock.Anything, nil) @@ -177,6 +178,7 @@ func newServiceWithCommitSHA(t *testing.T, root, revision string) *Service { service, gitClient, _ := newServiceWithOpt(t, func(gitClient *gitmocks.Client, helmClient *helmmocks.Client, paths *iomocks.TempPaths) { gitClient.On("Init").Return(nil) + gitClient.On("IsRevisionPresent", mock.Anything).Return(false) gitClient.On("Fetch", mock.Anything).Return(nil) gitClient.On("Checkout", mock.Anything, mock.Anything).Return(nil) gitClient.On("LsRemote", revision).Return(revision, revisionErr) @@ -2984,6 +2986,31 @@ func TestCheckoutRevisionCanGetNonstandardRefs(t *testing.T) { assert.NoError(t, err) } +func TestCheckoutRevisionPresentSkipFetch(t *testing.T) { + revision := "0123456789012345678901234567890123456789" + + gitClient := &gitmocks.Client{} + gitClient.On("Init").Return(nil) + gitClient.On("IsRevisionPresent", revision).Return(true) + gitClient.On("Checkout", revision, mock.Anything).Return(nil) + + err := checkoutRevision(gitClient, revision, false) + assert.NoError(t, err) +} + +func TestCheckoutRevisionNotPresentCallFetch(t *testing.T) { + revision := "0123456789012345678901234567890123456789" + + gitClient := &gitmocks.Client{} + gitClient.On("Init").Return(nil) + gitClient.On("IsRevisionPresent", revision).Return(false) + gitClient.On("Fetch", "").Return(nil) + gitClient.On("Checkout", revision, mock.Anything).Return(nil) + + err := checkoutRevision(gitClient, revision, false) + assert.NoError(t, err) +} + // runGit runs a git command in the given working directory. If the command succeeds, it returns the combined standard // and error output. If it fails, it stops the test with a failure message. func runGit(t *testing.T, workDir string, args ...string) string { @@ -3355,6 +3382,7 @@ func TestGetGitDirectories(t *testing.T) { root := "./testdata/git-files-dirs" s, _, cacheMocks := newServiceWithOpt(t, func(gitClient *gitmocks.Client, helmClient *helmmocks.Client, paths *iomocks.TempPaths) { gitClient.On("Init").Return(nil) + gitClient.On("IsRevisionPresent", mock.Anything).Return(false) gitClient.On("Fetch", mock.Anything).Return(nil) gitClient.On("Checkout", mock.Anything, mock.Anything).Once().Return(nil) gitClient.On("LsRemote", "HEAD").Return("632039659e542ed7de0c170a4fcc1c571b288fc0", nil) @@ -3387,6 +3415,7 @@ func TestGetGitDirectoriesWithHiddenDirSupported(t *testing.T) { root := "./testdata/git-files-dirs" s, _, cacheMocks := newServiceWithOpt(t, func(gitClient *gitmocks.Client, helmClient *helmmocks.Client, paths *iomocks.TempPaths) { gitClient.On("Init").Return(nil) + gitClient.On("IsRevisionPresent", mock.Anything).Return(false) gitClient.On("Fetch", mock.Anything).Return(nil) gitClient.On("Checkout", mock.Anything, mock.Anything).Once().Return(nil) gitClient.On("LsRemote", "HEAD").Return("632039659e542ed7de0c170a4fcc1c571b288fc0", nil) @@ -3480,6 +3509,7 @@ func TestGetGitFiles(t *testing.T) { root := "" s, _, cacheMocks := newServiceWithOpt(t, func(gitClient *gitmocks.Client, helmClient *helmmocks.Client, paths *iomocks.TempPaths) { gitClient.On("Init").Return(nil) + gitClient.On("IsRevisionPresent", mock.Anything).Return(false) gitClient.On("Fetch", mock.Anything).Return(nil) gitClient.On("Checkout", mock.Anything, mock.Anything).Once().Return(nil) gitClient.On("LsRemote", "HEAD").Return("632039659e542ed7de0c170a4fcc1c571b288fc0", nil) @@ -3653,6 +3683,7 @@ func TestUpdateRevisionForPaths(t *testing.T) { {name: "ChangedFilesDoNothing", fields: func() fields { s, _, c := newServiceWithOpt(t, func(gitClient *gitmocks.Client, helmClient *helmmocks.Client, paths *iomocks.TempPaths) { gitClient.On("Init").Return(nil) + gitClient.On("IsRevisionPresent", mock.Anything).Return(false) gitClient.On("Fetch", mock.Anything).Return(nil) gitClient.On("Checkout", mock.Anything, mock.Anything).Return(nil) gitClient.On("LsRemote", "HEAD").Once().Return("632039659e542ed7de0c170a4fcc1c571b288fc0", nil) @@ -3678,6 +3709,7 @@ func TestUpdateRevisionForPaths(t *testing.T) { {name: "NoChangesUpdateCache", fields: func() fields { s, _, c := newServiceWithOpt(t, func(gitClient *gitmocks.Client, helmClient *helmmocks.Client, paths *iomocks.TempPaths) { gitClient.On("Init").Return(nil) + gitClient.On("IsRevisionPresent", mock.Anything).Return(false) gitClient.On("Fetch", mock.Anything).Return(nil) gitClient.On("Checkout", mock.Anything, mock.Anything).Return(nil) gitClient.On("LsRemote", "HEAD").Once().Return("632039659e542ed7de0c170a4fcc1c571b288fc0", nil) @@ -3713,6 +3745,7 @@ func TestUpdateRevisionForPaths(t *testing.T) { {name: "NoChangesHelmMultiSourceUpdateCache", fields: func() fields { s, _, c := newServiceWithOpt(t, func(gitClient *gitmocks.Client, helmClient *helmmocks.Client, paths *iomocks.TempPaths) { gitClient.On("Init").Return(nil) + gitClient.On("IsRevisionPresent", mock.Anything).Return(false) gitClient.On("Fetch", mock.Anything).Return(nil) gitClient.On("Checkout", mock.Anything, mock.Anything).Return(nil) gitClient.On("LsRemote", "HEAD").Once().Return("632039659e542ed7de0c170a4fcc1c571b288fc0", nil) diff --git a/util/git/client.go b/util/git/client.go index 232ebfb5cc22b..3a2ea666fed7b 100644 --- a/util/git/client.go +++ b/util/git/client.go @@ -81,6 +81,7 @@ type Client interface { VerifyCommitSignature(string) (string, error) IsAnnotatedTag(string) bool ChangedFiles(revision string, targetRevision string) ([]string, error) + IsRevisionPresent(revision string) bool } type EventHandlers struct { @@ -357,6 +358,21 @@ func (m *nativeGitClient) fetch(revision string) error { return err } +// IsRevisionPresent checks to see if the given revision already exists locally. +func (m *nativeGitClient) IsRevisionPresent(revision string) bool { + if revision == "" { + return false + } + + cmd := exec.Command("git", "cat-file", "-t", revision) + out, err := m.runCmdOutput(cmd, runOpts{SkipErrorLogging: true}) + if out == "commit" && err == nil { + return true + } else { + return false + } +} + // Fetch fetches latest updates from origin func (m *nativeGitClient) Fetch(revision string) error { if m.OnFetch != nil { diff --git a/util/git/client_test.go b/util/git/client_test.go index 8ca760dd6c26c..c5817fae34081 100644 --- a/util/git/client_test.go +++ b/util/git/client_test.go @@ -261,3 +261,38 @@ func TestNewClient_invalidSSHURL(t *testing.T) { assert.Nil(t, client) assert.ErrorIs(t, err, ErrInvalidRepoURL) } + +func Test_IsRevisionPresent(t *testing.T) { + tempDir := t.TempDir() + + client, err := NewClientExt(fmt.Sprintf("file://%s", tempDir), tempDir, NopCreds{}, true, false, "") + require.NoError(t, err) + + err = client.Init() + require.NoError(t, err) + + p := path.Join(client.Root(), "README") + f, err := os.Create(p) + require.NoError(t, err) + _, err = f.WriteString("Hello.") + require.NoError(t, err) + err = f.Close() + require.NoError(t, err) + + err = runCmd(client.Root(), "git", "add", "README") + require.NoError(t, err) + + err = runCmd(client.Root(), "git", "commit", "-m", "Initial Commit", "-a") + require.NoError(t, err) + + commitSHA, err := client.LsRemote("HEAD") + require.NoError(t, err) + + // Ensure revision for HEAD is present locally. + revisionPresent := client.IsRevisionPresent(commitSHA) + assert.True(t, revisionPresent) + + // Ensure invalid revision is not returned. + revisionPresent = client.IsRevisionPresent("invalid-revision") + assert.False(t, revisionPresent) +} diff --git a/util/git/mocks/Client.go b/util/git/mocks/Client.go index 9701ec987eb19..798c07465431a 100644 --- a/util/git/mocks/Client.go +++ b/util/git/mocks/Client.go @@ -142,6 +142,24 @@ func (_m *Client) IsAnnotatedTag(_a0 string) bool { return r0 } +// IsRevisionPresent provides a mock function with given fields: revision +func (_m *Client) IsRevisionPresent(revision string) bool { + ret := _m.Called(revision) + + if len(ret) == 0 { + panic("no return value specified for IsRevisionPresent") + } + + var r0 bool + if rf, ok := ret.Get(0).(func(string) bool); ok { + r0 = rf(revision) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + // LsFiles provides a mock function with given fields: path, enableNewGitFileGlobbing func (_m *Client) LsFiles(path string, enableNewGitFileGlobbing bool) ([]string, error) { ret := _m.Called(path, enableNewGitFileGlobbing) From 2aefa9c4b2ee4c97783153afe50e20042fbe94d0 Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Sat, 15 Jun 2024 15:54:55 -0400 Subject: [PATCH 39/74] chore(deps): bump gitops engine (#18679) * chore(deps): bump gitops engine Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * switch back to upstream Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --------- Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- go.mod | 87 +++++++++++++++++++++++++++++----------------------------- go.sum | 57 ++++++++++++++++++++------------------ 2 files changed, 74 insertions(+), 70 deletions(-) diff --git a/go.mod b/go.mod index facded3d767d2..667d476eabd9f 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/TomOnTime/utfutil v0.0.0-20180511104225-09c41003ee1d github.com/alicebob/miniredis/v2 v2.30.4 github.com/antonmedv/expr v1.15.2 - github.com/argoproj/gitops-engine v0.7.1-0.20240514190100-8a3ce6d85caa + github.com/argoproj/gitops-engine v0.7.1-0.20240615185936-83ce6ca8cedc github.com/argoproj/notifications-engine v0.4.1-0.20240606074338-0802cd427621 github.com/argoproj/pkg v0.13.7-0.20230626144333-d56162821bd1 github.com/aws/aws-sdk-go v1.50.8 @@ -94,15 +94,15 @@ require ( google.golang.org/protobuf v1.33.0 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.29.2 - k8s.io/apiextensions-apiserver v0.29.2 - k8s.io/apimachinery v0.29.2 - k8s.io/apiserver v0.29.2 - k8s.io/client-go v0.29.2 - k8s.io/code-generator v0.29.2 + k8s.io/api v0.29.6 + k8s.io/apiextensions-apiserver v0.29.6 + k8s.io/apimachinery v0.29.6 + k8s.io/apiserver v0.29.6 + k8s.io/client-go v0.29.6 + k8s.io/code-generator v0.29.6 k8s.io/klog/v2 v2.110.1 k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 - k8s.io/kubectl v0.29.2 + k8s.io/kubectl v0.29.6 k8s.io/utils v0.0.0-20230726121419-3b25d923346b layeh.com/gopher-json v0.0.0-20190114024228-97fed8db8427 oras.land/oras-go/v2 v2.3.0 @@ -282,12 +282,12 @@ require ( gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - k8s.io/cli-runtime v0.29.2 // indirect - k8s.io/component-base v0.29.2 // indirect - k8s.io/component-helpers v0.29.2 // indirect + k8s.io/cli-runtime v0.29.6 // indirect + k8s.io/component-base v0.29.6 // indirect + k8s.io/component-helpers v0.29.6 // indirect k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect - k8s.io/kube-aggregator v0.29.2 // indirect - k8s.io/kubernetes v1.29.2 // indirect + k8s.io/kube-aggregator v0.29.6 // indirect + k8s.io/kubernetes v1.29.6 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect @@ -308,35 +308,34 @@ replace ( // Avoid CVE-2022-28948 gopkg.in/yaml.v3 => gopkg.in/yaml.v3 v3.0.1 - k8s.io/api => k8s.io/api v0.29.2 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.29.2 - k8s.io/apimachinery => k8s.io/apimachinery v0.29.2 - k8s.io/apiserver => k8s.io/apiserver v0.29.2 - k8s.io/cli-runtime => k8s.io/cli-runtime v0.29.2 - k8s.io/client-go => k8s.io/client-go v0.29.2 - k8s.io/cloud-provider => k8s.io/cloud-provider v0.29.2 - k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.29.2 - k8s.io/code-generator => k8s.io/code-generator v0.29.2 - k8s.io/component-base => k8s.io/component-base v0.29.2 - k8s.io/component-helpers => k8s.io/component-helpers v0.29.2 - k8s.io/controller-manager => k8s.io/controller-manager v0.29.2 - k8s.io/cri-api => k8s.io/cri-api v0.29.2 - k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.29.2 - k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.29.2 - k8s.io/endpointslice => k8s.io/endpointslice v0.29.2 - k8s.io/kms => k8s.io/kms v0.29.2 - k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.29.2 - k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.29.2 - k8s.io/kube-proxy => k8s.io/kube-proxy v0.29.2 - k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.29.2 - k8s.io/kubectl => k8s.io/kubectl v0.29.2 - k8s.io/kubelet => k8s.io/kubelet v0.29.2 - k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.29.2 - k8s.io/metrics => k8s.io/metrics v0.29.2 - k8s.io/mount-utils => k8s.io/mount-utils v0.29.2 - k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.29.2 - k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.29.2 - k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.29.2 - k8s.io/sample-controller => k8s.io/sample-controller v0.29.2 - + k8s.io/api => k8s.io/api v0.29.6 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.29.6 + k8s.io/apimachinery => k8s.io/apimachinery v0.29.6 + k8s.io/apiserver => k8s.io/apiserver v0.29.6 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.29.6 + k8s.io/client-go => k8s.io/client-go v0.29.6 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.29.6 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.29.6 + k8s.io/code-generator => k8s.io/code-generator v0.29.6 + k8s.io/component-base => k8s.io/component-base v0.29.6 + k8s.io/component-helpers => k8s.io/component-helpers v0.29.6 + k8s.io/controller-manager => k8s.io/controller-manager v0.29.6 + k8s.io/cri-api => k8s.io/cri-api v0.29.6 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.29.6 + k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.29.6 + k8s.io/endpointslice => k8s.io/endpointslice v0.29.6 + k8s.io/kms => k8s.io/kms v0.29.6 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.29.6 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.29.6 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.29.6 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.29.6 + k8s.io/kubectl => k8s.io/kubectl v0.29.6 + k8s.io/kubelet => k8s.io/kubelet v0.29.6 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.29.6 + k8s.io/metrics => k8s.io/metrics v0.29.6 + k8s.io/mount-utils => k8s.io/mount-utils v0.29.6 + k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.29.6 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.29.6 + k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.29.6 + k8s.io/sample-controller => k8s.io/sample-controller v0.29.6 ) diff --git a/go.sum b/go.sum index 7af93eca1a17e..58bf8a9315598 100644 --- a/go.sum +++ b/go.sum @@ -695,8 +695,8 @@ github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= -github.com/argoproj/gitops-engine v0.7.1-0.20240514190100-8a3ce6d85caa h1:RcIYoAbkaGA7yzpY1YItaTLgKYABDfkITyQ4jUl3Y6c= -github.com/argoproj/gitops-engine v0.7.1-0.20240514190100-8a3ce6d85caa/go.mod h1:Vet2xN0akQpggQJZGmThA8Lozpn26RLagZFmLXw/oSI= +github.com/argoproj/gitops-engine v0.7.1-0.20240615185936-83ce6ca8cedc h1:J7LJp2Gh9A9/eQN7Lg74JW+YOVO5NEjq5/cudGAiOwk= +github.com/argoproj/gitops-engine v0.7.1-0.20240615185936-83ce6ca8cedc/go.mod h1:ByLmH5B1Gs361tgI5x5f8oSFuBEXDYENYpG3zFDWtHU= github.com/argoproj/notifications-engine v0.4.1-0.20240606074338-0802cd427621 h1:Yg1nt+D2uDK1SL2jSlfukA4yc7db184TTN7iWy3voRE= github.com/argoproj/notifications-engine v0.4.1-0.20240606074338-0802cd427621/go.mod h1:N0A4sEws2soZjEpY4hgZpQS8mRIEw6otzwfkgc3g9uQ= github.com/argoproj/pkg v0.13.7-0.20230626144333-d56162821bd1 h1:qsHwwOJ21K2Ao0xPju1sNuqphyMnMYkyB3ZLoLtxWpo= @@ -1842,6 +1842,7 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1992,6 +1993,8 @@ golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2170,6 +2173,7 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2190,6 +2194,7 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2659,24 +2664,24 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A= -k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= -k8s.io/apiextensions-apiserver v0.29.2 h1:UK3xB5lOWSnhaCk0RFZ0LUacPZz9RY4wi/yt2Iu+btg= -k8s.io/apiextensions-apiserver v0.29.2/go.mod h1:aLfYjpA5p3OwtqNXQFkhJ56TB+spV8Gc4wfMhUA3/b8= -k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8= -k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= -k8s.io/apiserver v0.29.2 h1:+Z9S0dSNr+CjnVXQePG8TcBWHr3Q7BmAr7NraHvsMiQ= -k8s.io/apiserver v0.29.2/go.mod h1:B0LieKVoyU7ykQvPFm7XSdIHaCHSzCzQWPFa5bqbeMQ= -k8s.io/cli-runtime v0.29.2 h1:smfsOcT4QujeghsNjECKN3lwyX9AwcFU0nvJ7sFN3ro= -k8s.io/cli-runtime v0.29.2/go.mod h1:KLisYYfoqeNfO+MkTWvpqIyb1wpJmmFJhioA0xd4MW8= -k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= -k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= -k8s.io/code-generator v0.29.2 h1:c9/iw2KnNpw2IRV+wwuG/Wns2TjPSgjWzbbjTevyiHI= -k8s.io/code-generator v0.29.2/go.mod h1:FwFi3C9jCrmbPjekhaCYcYG1n07CYiW1+PAPCockaos= -k8s.io/component-base v0.29.2 h1:lpiLyuvPA9yV1aQwGLENYyK7n/8t6l3nn3zAtFTJYe8= -k8s.io/component-base v0.29.2/go.mod h1:BfB3SLrefbZXiBfbM+2H1dlat21Uewg/5qtKOl8degM= -k8s.io/component-helpers v0.29.2 h1:1kTIanIdqUVG2nW3e2ENVEaYbZKphqPgEdCmJvk71aw= -k8s.io/component-helpers v0.29.2/go.mod h1:gFc/p60rYtpD8UCcNfPCmbokHT2uy0yDpmr/KKUMNAw= +k8s.io/api v0.29.6 h1:eDxIl8+PeEpwbe2YyS5RXJ9vdn4hnKWMBf4WUJP9DQM= +k8s.io/api v0.29.6/go.mod h1:ZuUPMhJV74DJXapldbg6upaHfiOjrBb+0ffUbBi1jaw= +k8s.io/apiextensions-apiserver v0.29.6 h1:tUu1N6Zt9GT8KVcPF5aGDqfISz1mveM4yFh7eL5bxmE= +k8s.io/apiextensions-apiserver v0.29.6/go.mod h1:iw1EbwZat08I219qrQKoFMHGo7J9KxPqMpVKxCbNbCs= +k8s.io/apimachinery v0.29.6 h1:CLjJ5b0hWW7531n/njRE3rnusw3rhVGCFftPfnG54CI= +k8s.io/apimachinery v0.29.6/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y= +k8s.io/apiserver v0.29.6 h1:JxgDbpgahOgqoDOf+zVl2mI+rQcHcLQnK6YhhtsjbNs= +k8s.io/apiserver v0.29.6/go.mod h1:HrQwfPWxhwEa+n8/+5YwSF5yT2WXbeyFjqq6KEXHTX8= +k8s.io/cli-runtime v0.29.6 h1:nPbmS6ICW223S0BWTV+sK5xClWe89QB/n16/c5cJwT8= +k8s.io/cli-runtime v0.29.6/go.mod h1:5BzzwnVhtqVJvatDZmSZ6OtiSGqbdn0hKzpRbV3uf5o= +k8s.io/client-go v0.29.6 h1:5E2ebuB/p0F0THuQatyvhDvPL2SIeqwTPrtnrwKob/8= +k8s.io/client-go v0.29.6/go.mod h1:jHZcrQqDplyv20v7eu+iFM4gTpglZSZoMVcKrh8sRGg= +k8s.io/code-generator v0.29.6 h1:Z8T9VMR0mr7V5GG66c6GVAZrIiEy2uFoQwbeVeWLqPA= +k8s.io/code-generator v0.29.6/go.mod h1:7TYnI0dYItL2cKuhhgPSuF3WED9uMdELgbVXFfn/joE= +k8s.io/component-base v0.29.6 h1:XkVJI67FvBgNb/3kKqvaGKokxUrIR0RrksCPNI+JYCs= +k8s.io/component-base v0.29.6/go.mod h1:kIahZm8aw9lV8Vw17LF89REmeBrv5+QEl3v7HsrmITY= +k8s.io/component-helpers v0.29.6 h1:kG/tK0gXPXj6n3Oxn5Eul8nYzer3SejZI3ClwiWkreQ= +k8s.io/component-helpers v0.29.6/go.mod h1:Ltb44cbXci9fy9rytWwYsu8vHfi4fjyQdSwk6UlCR4E= k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= @@ -2687,14 +2692,14 @@ k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= -k8s.io/kube-aggregator v0.29.2 h1:z9qJn5wlGmGaX6EfM7OEhr6fq6SBjDKR6tPRZ/qgxeY= -k8s.io/kube-aggregator v0.29.2/go.mod h1:QEuwzmMJJsg0eg1Gv+u4cWcYeJG2+8vN8/nTXBzopUo= +k8s.io/kube-aggregator v0.29.6 h1:jZJjYF58F6kVuGC/kqLfuu7qGHqc2hoVKsDnRj26QRs= +k8s.io/kube-aggregator v0.29.6/go.mod h1:a6z0yORlXVXtGfsVB5PCjh2Soq1S7Wc6fApU6/T2eCE= k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= -k8s.io/kubectl v0.29.2 h1:uaDYaBhumvkwz0S2XHt36fK0v5IdNgL7HyUniwb2IUo= -k8s.io/kubectl v0.29.2/go.mod h1:BhizuYBGcKaHWyq+G7txGw2fXg576QbPrrnQdQDZgqI= -k8s.io/kubernetes v1.29.2 h1:8hh1cntqdulanjQt7wSSSsJfBgOyx6fUdFWslvGL5m0= -k8s.io/kubernetes v1.29.2/go.mod h1:xZPKU0yO0CBbLTnbd+XGyRmmtmaVuJykDb8gNCkeeUE= +k8s.io/kubectl v0.29.6 h1:hmkOMyH2uSUV16gIB3Qp2dv09fM2+PGEXz5SH1gwp7Y= +k8s.io/kubectl v0.29.6/go.mod h1:IUpyXy2OCbIMuBMAisDHM9shh5/Nseij4w+HIt0aq6A= +k8s.io/kubernetes v1.29.6 h1:jn8kA/oVOAWZOeoorx6xZ4d+KgGp+Evgi90x9bEI/DE= +k8s.io/kubernetes v1.29.6/go.mod h1:28sDhcb87LX5z3GWAKYmLrhrifxi4W9bEWua4DRTIvk= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= From c556cf7ea5021007f14521b9ff783e407ff08b03 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Sun, 16 Jun 2024 01:13:40 +0200 Subject: [PATCH 40/74] chore: enable require-error rule from errorlint linter on server folder (#18687) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 2 +- server/account/account_test.go | 73 +++++----- server/application/application_test.go | 162 +++++++++++------------ server/application/websocket_test.go | 5 +- server/badge/badge_test.go | 28 ++-- server/cache/cache_test.go | 11 +- server/cluster/cluster_test.go | 22 +-- server/deeplinks/deeplinks_test.go | 9 +- server/extension/extension_test.go | 14 +- server/logout/logout_test.go | 11 +- server/notification/notification_test.go | 6 +- server/project/project_test.go | 63 ++++----- server/repository/repository_test.go | 41 +++--- server/server_norace_test.go | 31 ++--- server/server_test.go | 56 ++++---- server/session/ratelimiter_test.go | 7 +- 16 files changed, 270 insertions(+), 271 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 021320637bc46..7226203cf2fd1 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -3,7 +3,7 @@ issues: - SA1019 - SA5011 exclude-rules: - - path: "(applicationset|cmpserver|controller|pkg|reposerver|server)/" + - path: "(applicationset|cmpserver|controller|pkg|reposerver)/" text: "require-error:" linters: - testifylint diff --git a/server/account/account_test.go b/server/account/account_test.go index 8b775a23f09d4..ca5571f117048 100644 --- a/server/account/account_test.go +++ b/server/account/account_test.go @@ -7,6 +7,7 @@ import ( "github.com/golang-jwt/jwt/v4" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" v1 "k8s.io/api/core/v1" @@ -109,33 +110,33 @@ func TestUpdatePassword(t *testing.T) { // ensure password is not allowed to be updated if given bad password _, err = accountServer.UpdatePassword(ctx, &account.UpdatePasswordRequest{CurrentPassword: "badpassword", NewPassword: "newpassword"}) - assert.Error(t, err) - assert.NoError(t, accountServer.sessionMgr.VerifyUsernamePassword("admin", "oldpassword")) - assert.Error(t, accountServer.sessionMgr.VerifyUsernamePassword("admin", "newpassword")) + require.Error(t, err) + require.NoError(t, accountServer.sessionMgr.VerifyUsernamePassword("admin", "oldpassword")) + require.Error(t, accountServer.sessionMgr.VerifyUsernamePassword("admin", "newpassword")) // verify old password works _, err = sessionServer.Create(ctx, &sessionpkg.SessionCreateRequest{Username: "admin", Password: "oldpassword"}) - assert.NoError(t, err) + require.NoError(t, err) // verify new password doesn't _, err = sessionServer.Create(ctx, &sessionpkg.SessionCreateRequest{Username: "admin", Password: "newpassword"}) - assert.Error(t, err) + require.Error(t, err) // ensure password can be updated with valid password and immediately be used adminAccount, err := getAdminAccount(accountServer.settingsMgr) - assert.NoError(t, err) + require.NoError(t, err) prevHash := adminAccount.PasswordHash _, err = accountServer.UpdatePassword(ctx, &account.UpdatePasswordRequest{CurrentPassword: "oldpassword", NewPassword: "newpassword"}) - assert.NoError(t, err) + require.NoError(t, err) adminAccount, err = getAdminAccount(accountServer.settingsMgr) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, prevHash, adminAccount.PasswordHash) - assert.NoError(t, accountServer.sessionMgr.VerifyUsernamePassword("admin", "newpassword")) - assert.Error(t, accountServer.sessionMgr.VerifyUsernamePassword("admin", "oldpassword")) + require.NoError(t, accountServer.sessionMgr.VerifyUsernamePassword("admin", "newpassword")) + require.Error(t, accountServer.sessionMgr.VerifyUsernamePassword("admin", "oldpassword")) // verify old password is invalid _, err = sessionServer.Create(ctx, &sessionpkg.SessionCreateRequest{Username: "admin", Password: "oldpassword"}) - assert.Error(t, err) + require.Error(t, err) // verify new password works _, err = sessionServer.Create(ctx, &sessionpkg.SessionCreateRequest{Username: "admin", Password: "newpassword"}) - assert.NoError(t, err) + require.NoError(t, err) } func TestUpdatePassword_AdminUpdatesAnotherUser(t *testing.T) { @@ -145,10 +146,10 @@ func TestUpdatePassword_AdminUpdatesAnotherUser(t *testing.T) { ctx := adminContext(context.Background()) _, err := accountServer.UpdatePassword(ctx, &account.UpdatePasswordRequest{CurrentPassword: "oldpassword", NewPassword: "newpassword", Name: "anotherUser"}) - assert.NoError(t, err) + require.NoError(t, err) _, err = sessionServer.Create(ctx, &sessionpkg.SessionCreateRequest{Username: "anotherUser", Password: "newpassword"}) - assert.NoError(t, err) + require.NoError(t, err) } func TestUpdatePassword_DoesNotHavePermissions(t *testing.T) { @@ -162,7 +163,7 @@ func TestUpdatePassword_DoesNotHavePermissions(t *testing.T) { }) ctx := adminContext(context.Background()) _, err := accountServer.UpdatePassword(ctx, &account.UpdatePasswordRequest{CurrentPassword: "oldpassword", NewPassword: "newpassword", Name: "anotherUser"}) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "permission denied") }) @@ -170,7 +171,7 @@ func TestUpdatePassword_DoesNotHavePermissions(t *testing.T) { accountServer, _ := newTestAccountServerExt(context.Background(), enforcer) ctx := ssoAdminContext(context.Background(), time.Now()) _, err := accountServer.UpdatePassword(ctx, &account.UpdatePasswordRequest{CurrentPassword: "oldpassword", NewPassword: "newpassword", Name: "admin"}) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "permission denied") }) } @@ -181,7 +182,7 @@ func TestUpdatePassword_ProjectToken(t *testing.T) { }) ctx := projTokenContext(context.Background()) _, err := accountServer.UpdatePassword(ctx, &account.UpdatePasswordRequest{CurrentPassword: "oldpassword", NewPassword: "newpassword"}) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "password can only be changed for local users") } @@ -192,7 +193,7 @@ func TestUpdatePassword_OldSSOToken(t *testing.T) { ctx := ssoAdminContext(context.Background(), time.Now().Add(-2*common.ChangePasswordSSOTokenMaxAge)) _, err := accountServer.UpdatePassword(ctx, &account.UpdatePasswordRequest{CurrentPassword: "oldpassword", NewPassword: "newpassword", Name: "anotherUser"}) - assert.Error(t, err) + require.Error(t, err) } func TestUpdatePassword_SSOUserUpdatesAnotherUser(t *testing.T) { @@ -202,10 +203,10 @@ func TestUpdatePassword_SSOUserUpdatesAnotherUser(t *testing.T) { ctx := ssoAdminContext(context.Background(), time.Now()) _, err := accountServer.UpdatePassword(ctx, &account.UpdatePasswordRequest{CurrentPassword: "oldpassword", NewPassword: "newpassword", Name: "anotherUser"}) - assert.NoError(t, err) + require.NoError(t, err) _, err = sessionServer.Create(ctx, &sessionpkg.SessionCreateRequest{Username: "anotherUser", Password: "newpassword"}) - assert.NoError(t, err) + require.NoError(t, err) } func TestListAccounts_NoAccountsConfigured(t *testing.T) { @@ -213,7 +214,7 @@ func TestListAccounts_NoAccountsConfigured(t *testing.T) { accountServer, _ := newTestAccountServer(ctx) resp, err := accountServer.ListAccounts(ctx, &account.ListAccountRequest{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, resp.Items, 1) } @@ -226,7 +227,7 @@ func TestListAccounts_AccountsAreConfigured(t *testing.T) { }) resp, err := accountServer.ListAccounts(ctx, &account.ListAccountRequest{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, resp.Items, 3) assert.ElementsMatch(t, []*account.Account{ {Name: "admin", Capabilities: []string{"login"}, Enabled: true}, @@ -243,14 +244,14 @@ func TestGetAccount(t *testing.T) { t.Run("ExistingAccount", func(t *testing.T) { acc, err := accountServer.GetAccount(ctx, &account.GetAccountRequest{Name: "account1"}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "account1", acc.Name) }) t.Run("NonExistingAccount", func(t *testing.T) { _, err := accountServer.GetAccount(ctx, &account.GetAccountRequest{Name: "bad-name"}) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, codes.NotFound, status.Code(err)) }) } @@ -262,10 +263,10 @@ func TestCreateToken_SuccessfullyCreated(t *testing.T) { }) _, err := accountServer.CreateToken(ctx, &account.CreateTokenRequest{Name: "account1"}) - assert.NoError(t, err) + require.NoError(t, err) acc, err := accountServer.GetAccount(ctx, &account.GetAccountRequest{Name: "account1"}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, acc.Tokens, 1) } @@ -277,7 +278,7 @@ func TestCreateToken_DoesNotHaveCapability(t *testing.T) { }) _, err := accountServer.CreateToken(ctx, &account.CreateTokenRequest{Name: "account1"}) - assert.Error(t, err) + require.Error(t, err) } func TestCreateToken_UserSpecifiedID(t *testing.T) { @@ -287,12 +288,10 @@ func TestCreateToken_UserSpecifiedID(t *testing.T) { }) _, err := accountServer.CreateToken(ctx, &account.CreateTokenRequest{Name: "account1", Id: "test"}) - assert.NoError(t, err) + require.NoError(t, err) _, err = accountServer.CreateToken(ctx, &account.CreateTokenRequest{Name: "account1", Id: "test"}) - if !assert.Error(t, err) { - return - } + require.Error(t, err) assert.Contains(t, "account already has token with id 'test'", err.Error()) } @@ -304,10 +303,10 @@ func TestDeleteToken_SuccessfullyRemoved(t *testing.T) { }) _, err := accountServer.DeleteToken(ctx, &account.DeleteTokenRequest{Name: "account1", Id: "123"}) - assert.NoError(t, err) + require.NoError(t, err) acc, err := accountServer.GetAccount(ctx, &account.GetAccountRequest{Name: "account1"}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, acc.Tokens) } @@ -318,7 +317,7 @@ func TestCanI_GetLogsAllowNoSwitch(t *testing.T) { ctx := projTokenContext(context.Background()) resp, err := accountServer.CanI(ctx, &account.CanIRequest{Resource: "logs", Action: "get", Subresource: ""}) - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, "yes", resp.Value) } @@ -333,7 +332,7 @@ func TestCanI_GetLogsDenySwitchOn(t *testing.T) { ctx := projTokenContext(context.Background()) resp, err := accountServer.CanI(ctx, &account.CanIRequest{Resource: "logs", Action: "get", Subresource: "*/*"}) - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, "no", resp.Value) } @@ -344,7 +343,7 @@ func TestCanI_GetLogsAllowSwitchOn(t *testing.T) { ctx := projTokenContext(context.Background()) resp, err := accountServer.CanI(ctx, &account.CanIRequest{Resource: "logs", Action: "get", Subresource: ""}) - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, "yes", resp.Value) } @@ -355,6 +354,6 @@ func TestCanI_GetLogsAllowSwitchOff(t *testing.T) { ctx := projTokenContext(context.Background()) resp, err := accountServer.CanI(ctx, &account.CanIRequest{Resource: "logs", Action: "get", Subresource: ""}) - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, "yes", resp.Value) } diff --git a/server/application/application_test.go b/server/application/application_test.go index 361a7f3b05512..ca81e7a6151a2 100644 --- a/server/application/application_test.go +++ b/server/application/application_test.go @@ -797,7 +797,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("Get", func(t *testing.T) { // nolint:staticcheck _, err := appServer.Get(adminCtx, &application.ApplicationQuery{Name: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) // nolint:staticcheck _, err = appServer.Get(noRoleCtx, &application.ApplicationQuery{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") @@ -811,7 +811,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("GetManifests", func(t *testing.T) { _, err := appServer.GetManifests(adminCtx, &application.ApplicationManifestQuery{Name: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.GetManifests(noRoleCtx, &application.ApplicationManifestQuery{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.GetManifests(adminCtx, &application.ApplicationManifestQuery{Name: ptr.To("doest-not-exist")}) @@ -822,7 +822,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("ListResourceEvents", func(t *testing.T) { _, err := appServer.ListResourceEvents(adminCtx, &application.ApplicationResourceEventsQuery{Name: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.ListResourceEvents(noRoleCtx, &application.ApplicationResourceEventsQuery{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.ListResourceEvents(adminCtx, &application.ApplicationResourceEventsQuery{Name: ptr.To("doest-not-exist")}) @@ -836,7 +836,7 @@ func TestNoAppEnumeration(t *testing.T) { Destination: appsv1.ApplicationDestination{Namespace: "default", Server: "https://cluster-api.example.com"}, Source: &appsv1.ApplicationSource{RepoURL: "https://some-fake-source", Path: "."}, }}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.UpdateSpec(noRoleCtx, &application.ApplicationUpdateSpecRequest{Name: ptr.To("test"), Spec: &appsv1.ApplicationSpec{ Destination: appsv1.ApplicationDestination{Namespace: "default", Server: "https://cluster-api.example.com"}, Source: &appsv1.ApplicationSource{RepoURL: "https://some-fake-source", Path: "."}, @@ -856,7 +856,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("Patch", func(t *testing.T) { _, err := appServer.Patch(adminCtx, &application.ApplicationPatchRequest{Name: ptr.To("test"), Patch: ptr.To(`[{"op": "replace", "path": "/spec/source/path", "value": "foo"}]`)}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.Patch(noRoleCtx, &application.ApplicationPatchRequest{Name: ptr.To("test"), Patch: ptr.To(`[{"op": "replace", "path": "/spec/source/path", "value": "foo"}]`)}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.Patch(adminCtx, &application.ApplicationPatchRequest{Name: ptr.To("doest-not-exist")}) @@ -867,7 +867,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("GetResource", func(t *testing.T) { _, err := appServer.GetResource(adminCtx, &application.ApplicationResourceRequest{Name: ptr.To("test"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.GetResource(noRoleCtx, &application.ApplicationResourceRequest{Name: ptr.To("test"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.GetResource(adminCtx, &application.ApplicationResourceRequest{Name: ptr.To("doest-not-exist"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test")}) @@ -891,7 +891,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("DeleteResource", func(t *testing.T) { _, err := appServer.DeleteResource(adminCtx, &application.ApplicationResourceDeleteRequest{Name: ptr.To("test"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.DeleteResource(noRoleCtx, &application.ApplicationResourceDeleteRequest{Name: ptr.To("test"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.DeleteResource(adminCtx, &application.ApplicationResourceDeleteRequest{Name: ptr.To("doest-not-exist"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test")}) @@ -902,7 +902,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("ResourceTree", func(t *testing.T) { _, err := appServer.ResourceTree(adminCtx, &application.ResourcesQuery{ApplicationName: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.ResourceTree(noRoleCtx, &application.ResourcesQuery{ApplicationName: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.ResourceTree(adminCtx, &application.ResourcesQuery{ApplicationName: ptr.To("doest-not-exist")}) @@ -913,9 +913,9 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("RevisionMetadata", func(t *testing.T) { _, err := appServer.RevisionMetadata(adminCtx, &application.RevisionMetadataQuery{Name: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.RevisionMetadata(adminCtx, &application.RevisionMetadataQuery{Name: ptr.To("test-multi"), SourceIndex: ptr.To(int32(0)), VersionId: ptr.To(int32(1))}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.RevisionMetadata(noRoleCtx, &application.RevisionMetadataQuery{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.RevisionMetadata(adminCtx, &application.RevisionMetadataQuery{Name: ptr.To("doest-not-exist")}) @@ -926,7 +926,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("RevisionChartDetails", func(t *testing.T) { _, err := appServer.RevisionChartDetails(adminCtx, &application.RevisionMetadataQuery{Name: ptr.To("test-helm")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.RevisionChartDetails(noRoleCtx, &application.RevisionMetadataQuery{Name: ptr.To("test-helm")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.RevisionChartDetails(adminCtx, &application.RevisionMetadataQuery{Name: ptr.To("doest-not-exist")}) @@ -937,7 +937,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("ManagedResources", func(t *testing.T) { _, err := appServer.ManagedResources(adminCtx, &application.ResourcesQuery{ApplicationName: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.ManagedResources(noRoleCtx, &application.ResourcesQuery{ApplicationName: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.ManagedResources(adminCtx, &application.ResourcesQuery{ApplicationName: ptr.To("doest-not-exist")}) @@ -948,7 +948,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("Sync", func(t *testing.T) { _, err := appServer.Sync(adminCtx, &application.ApplicationSyncRequest{Name: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.Sync(noRoleCtx, &application.ApplicationSyncRequest{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.Sync(adminCtx, &application.ApplicationSyncRequest{Name: ptr.To("doest-not-exist")}) @@ -962,7 +962,7 @@ func TestNoAppEnumeration(t *testing.T) { // controller would set if this were an actual Argo CD environment. setSyncRunningOperationState(t, appServer) _, err := appServer.TerminateOperation(adminCtx, &application.OperationTerminateRequest{Name: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.TerminateOperation(noRoleCtx, &application.OperationTerminateRequest{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.TerminateOperation(adminCtx, &application.OperationTerminateRequest{Name: ptr.To("doest-not-exist")}) @@ -974,9 +974,9 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("Rollback", func(t *testing.T) { unsetSyncRunningOperationState(t, appServer) _, err := appServer.Rollback(adminCtx, &application.ApplicationRollbackRequest{Name: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.Rollback(adminCtx, &application.ApplicationRollbackRequest{Name: ptr.To("test-multi"), Id: ptr.To(int64(1))}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.Rollback(noRoleCtx, &application.ApplicationRollbackRequest{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.Rollback(adminCtx, &application.ApplicationRollbackRequest{Name: ptr.To("doest-not-exist")}) @@ -987,7 +987,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("ListResourceActions", func(t *testing.T) { _, err := appServer.ListResourceActions(adminCtx, &application.ApplicationResourceRequest{Name: ptr.To("test"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.ListResourceActions(noRoleCtx, &application.ApplicationResourceRequest{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.ListResourceActions(noRoleCtx, &application.ApplicationResourceRequest{Group: ptr.To("argoproj.io"), Kind: ptr.To("Application"), Name: ptr.To("test")}) @@ -1000,7 +1000,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("RunResourceAction", func(t *testing.T) { _, err := appServer.RunResourceAction(adminCtx, &application.ResourceActionRunRequest{Name: ptr.To("test"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test"), Action: ptr.To("restart")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.RunResourceAction(noRoleCtx, &application.ResourceActionRunRequest{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.RunResourceAction(noRoleCtx, &application.ResourceActionRunRequest{Group: ptr.To("argoproj.io"), Kind: ptr.To("Application"), Name: ptr.To("test")}) @@ -1013,7 +1013,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("GetApplicationSyncWindows", func(t *testing.T) { _, err := appServer.GetApplicationSyncWindows(adminCtx, &application.ApplicationSyncWindowsQuery{Name: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.GetApplicationSyncWindows(noRoleCtx, &application.ApplicationSyncWindowsQuery{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.GetApplicationSyncWindows(adminCtx, &application.ApplicationSyncWindowsQuery{Name: ptr.To("doest-not-exist")}) @@ -1024,7 +1024,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("GetManifestsWithFiles", func(t *testing.T) { err := appServer.GetManifestsWithFiles(&TestServerStream{ctx: adminCtx, appName: "test"}) - assert.NoError(t, err) + require.NoError(t, err) err = appServer.GetManifestsWithFiles(&TestServerStream{ctx: noRoleCtx, appName: "test"}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") err = appServer.GetManifestsWithFiles(&TestServerStream{ctx: adminCtx, appName: "does-not-exist"}) @@ -1035,7 +1035,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("WatchResourceTree", func(t *testing.T) { err := appServer.WatchResourceTree(&application.ResourcesQuery{ApplicationName: ptr.To("test")}, &TestResourceTreeServer{ctx: adminCtx}) - assert.NoError(t, err) + require.NoError(t, err) err = appServer.WatchResourceTree(&application.ResourcesQuery{ApplicationName: ptr.To("test")}, &TestResourceTreeServer{ctx: noRoleCtx}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") err = appServer.WatchResourceTree(&application.ResourcesQuery{ApplicationName: ptr.To("does-not-exist")}, &TestResourceTreeServer{ctx: adminCtx}) @@ -1046,7 +1046,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("PodLogs", func(t *testing.T) { err := appServer.PodLogs(&application.ApplicationPodLogsQuery{Name: ptr.To("test")}, &TestPodLogsServer{ctx: adminCtx}) - assert.NoError(t, err) + require.NoError(t, err) err = appServer.PodLogs(&application.ApplicationPodLogsQuery{Name: ptr.To("test")}, &TestPodLogsServer{ctx: noRoleCtx}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") err = appServer.PodLogs(&application.ApplicationPodLogsQuery{Name: ptr.To("does-not-exist")}, &TestPodLogsServer{ctx: adminCtx}) @@ -1057,7 +1057,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("ListLinks", func(t *testing.T) { _, err := appServer.ListLinks(adminCtx, &application.ListAppLinksRequest{Name: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.ListLinks(noRoleCtx, &application.ListAppLinksRequest{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.ListLinks(adminCtx, &application.ListAppLinksRequest{Name: ptr.To("does-not-exist")}) @@ -1068,7 +1068,7 @@ func TestNoAppEnumeration(t *testing.T) { t.Run("ListResourceLinks", func(t *testing.T) { _, err := appServer.ListResourceLinks(adminCtx, &application.ApplicationResourceRequest{Name: ptr.To("test"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.ListResourceLinks(noRoleCtx, &application.ApplicationResourceRequest{Name: ptr.To("test"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.ListResourceLinks(adminCtx, &application.ApplicationResourceRequest{Name: ptr.To("does-not-exist"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test")}) @@ -1080,7 +1080,7 @@ func TestNoAppEnumeration(t *testing.T) { // Do this last so other stuff doesn't fail. t.Run("Delete", func(t *testing.T) { _, err := appServer.Delete(adminCtx, &application.ApplicationDeleteRequest{Name: ptr.To("test")}) - assert.NoError(t, err) + require.NoError(t, err) _, err = appServer.Delete(noRoleCtx, &application.ApplicationDeleteRequest{Name: ptr.To("test")}) assert.Equal(t, permissionDeniedErr.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") _, err = appServer.Delete(adminCtx, &application.ApplicationDeleteRequest{Name: ptr.To("doest-not-exist")}) @@ -1195,7 +1195,7 @@ func testListAppsWithLabels(t *testing.T, appQuery application.ApplicationQuery, t.Run(validTest.testName, func(t *testing.T) { appQuery.Selector = &validTest.label res, err := appServer.List(context.Background(), &appQuery) - assert.NoError(t, err) + require.NoError(t, err) apps := []string{} for i := range res.Items { apps = append(apps, res.Items[i].Name) @@ -1245,14 +1245,14 @@ func TestListAppWithProjects(t *testing.T) { t.Run("List all apps", func(t *testing.T) { appQuery := application.ApplicationQuery{} appList, err := appServer.List(context.Background(), &appQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, appList.Items, 3) }) t.Run("List apps with projects filter set", func(t *testing.T) { appQuery := application.ApplicationQuery{Projects: []string{"test-project1"}} appList, err := appServer.List(context.Background(), &appQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, appList.Items, 1) for _, app := range appList.Items { assert.Equal(t, "test-project1", app.Spec.Project) @@ -1262,7 +1262,7 @@ func TestListAppWithProjects(t *testing.T) { t.Run("List apps with project filter set (legacy field)", func(t *testing.T) { appQuery := application.ApplicationQuery{Project: []string{"test-project1"}} appList, err := appServer.List(context.Background(), &appQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, appList.Items, 1) for _, app := range appList.Items { assert.Equal(t, "test-project1", app.Spec.Project) @@ -1273,7 +1273,7 @@ func TestListAppWithProjects(t *testing.T) { // If the older field is present, we should use it instead of the newer field. appQuery := application.ApplicationQuery{Project: []string{"test-project1"}, Projects: []string{"test-project2"}} appList, err := appServer.List(context.Background(), &appQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, appList.Items, 1) for _, app := range appList.Items { assert.Equal(t, "test-project1", app.Spec.Project) @@ -1291,7 +1291,7 @@ func TestListApps(t *testing.T) { })) res, err := appServer.List(context.Background(), &application.ApplicationQuery{}) - assert.NoError(t, err) + require.NoError(t, err) var names []string for i := range res.Items { names = append(names, res.Items[i].Name) @@ -1334,7 +1334,7 @@ g, group-49, role:test3 res, err := appServer.List(ctx, &application.ApplicationQuery{}) - assert.NoError(t, err) + require.NoError(t, err) var names []string for i := range res.Items { names = append(names, res.Items[i].Name) @@ -1479,7 +1479,7 @@ func TestCreateApp(t *testing.T) { Application: testApp, } app, err := appServer.Create(context.Background(), &createReq) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app) assert.NotNil(t, app.Spec) assert.Equal(t, "default", app.Spec.Project) @@ -1492,7 +1492,7 @@ func TestCreateAppWithDestName(t *testing.T) { Application: testApp, } app, err := appServer.Create(context.Background(), &createReq) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app) assert.Equal(t, "https://cluster-api.example.com", app.Spec.Destination.Server) } @@ -1525,7 +1525,7 @@ func TestUpdateApp(t *testing.T) { app, err := appServer.Update(context.Background(), &application.ApplicationUpdateRequest{ Application: testApp, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "default", app.Spec.Project) } @@ -1537,10 +1537,10 @@ func TestUpdateAppSpec(t *testing.T) { Name: &testApp.Name, Spec: &testApp.Spec, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "default", spec.Project) app, err := appServer.Get(context.Background(), &application.ApplicationQuery{Name: &testApp.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "default", app.Spec.Project) } @@ -1551,10 +1551,10 @@ func TestDeleteApp(t *testing.T) { Application: newTestApp(), } app, err := appServer.Create(ctx, &createReq) - assert.NoError(t, err) + require.NoError(t, err) app, err = appServer.Get(ctx, &application.ApplicationQuery{Name: &app.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app) fakeAppCs := appServer.appclientset.(*apps.Clientset) @@ -1577,7 +1577,7 @@ func TestDeleteApp(t *testing.T) { trueVar := true _, err = appServer.Delete(ctx, &application.ApplicationDeleteRequest{Name: &app.Name, Cascade: &trueVar}) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, patched) assert.True(t, deleted) @@ -1586,7 +1586,7 @@ func TestDeleteApp(t *testing.T) { patched = false deleted = false _, err = appServer.Delete(ctx, &application.ApplicationDeleteRequest{Name: &app.Name, Cascade: &falseVar}) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, patched) assert.True(t, deleted) @@ -1600,7 +1600,7 @@ func TestDeleteApp(t *testing.T) { t.Run("Delete with background propagation policy", func(t *testing.T) { policy := backgroundPropagationPolicy _, err = appServer.Delete(ctx, &application.ApplicationDeleteRequest{Name: &app.Name, PropagationPolicy: &policy}) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, patched) assert.True(t, deleted) t.Cleanup(revertValues) @@ -1609,7 +1609,7 @@ func TestDeleteApp(t *testing.T) { t.Run("Delete with cascade disabled and background propagation policy", func(t *testing.T) { policy := backgroundPropagationPolicy _, err = appServer.Delete(ctx, &application.ApplicationDeleteRequest{Name: &app.Name, Cascade: &falseVar, PropagationPolicy: &policy}) - assert.EqualError(t, err, "rpc error: code = InvalidArgument desc = cannot set propagation policy when cascading is disabled") + require.EqualError(t, err, "rpc error: code = InvalidArgument desc = cannot set propagation policy when cascading is disabled") assert.False(t, patched) assert.False(t, deleted) t.Cleanup(revertValues) @@ -1618,7 +1618,7 @@ func TestDeleteApp(t *testing.T) { t.Run("Delete with invalid propagation policy", func(t *testing.T) { invalidPolicy := "invalid" _, err = appServer.Delete(ctx, &application.ApplicationDeleteRequest{Name: &app.Name, Cascade: &trueVar, PropagationPolicy: &invalidPolicy}) - assert.EqualError(t, err, "rpc error: code = InvalidArgument desc = invalid propagation policy: invalid") + require.EqualError(t, err, "rpc error: code = InvalidArgument desc = invalid propagation policy: invalid") assert.False(t, patched) assert.False(t, deleted) t.Cleanup(revertValues) @@ -1627,7 +1627,7 @@ func TestDeleteApp(t *testing.T) { t.Run("Delete with foreground propagation policy", func(t *testing.T) { policy := foregroundPropagationPolicy _, err = appServer.Delete(ctx, &application.ApplicationDeleteRequest{Name: &app.Name, Cascade: &trueVar, PropagationPolicy: &policy}) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, patched) assert.True(t, deleted) t.Cleanup(revertValues) @@ -1769,14 +1769,14 @@ func TestSyncAndTerminate(t *testing.T) { Application: testApp, } app, err := appServer.Create(ctx, &createReq) - assert.NoError(t, err) + require.NoError(t, err) app, err = appServer.Sync(ctx, &application.ApplicationSyncRequest{Name: &app.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app) assert.NotNil(t, app.Operation) events, err := appServer.kubeclientset.CoreV1().Events(appServer.ns).List(context.Background(), metav1.ListOptions{}) - assert.NoError(t, err) + require.NoError(t, err) event := events.Items[1] assert.Regexp(t, ".*initiated sync to HEAD \\([0-9A-Fa-f]{40}\\).*", event.Message) @@ -1788,14 +1788,14 @@ func TestSyncAndTerminate(t *testing.T) { StartedAt: metav1.NewTime(time.Now()), } _, err = appServer.appclientset.ArgoprojV1alpha1().Applications(appServer.ns).Update(context.Background(), app, metav1.UpdateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) resp, err := appServer.TerminateOperation(ctx, &application.OperationTerminateRequest{Name: &app.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, resp) app, err = appServer.Get(ctx, &application.ApplicationQuery{Name: &app.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app) assert.Equal(t, synccommon.OperationTerminating, app.Status.OperationState.Phase) } @@ -1812,15 +1812,15 @@ func TestSyncHelm(t *testing.T) { appServer.repoClientset = &mocks.Clientset{RepoServerServiceClient: fakeRepoServerClient(true)} app, err := appServer.Create(ctx, &application.ApplicationCreateRequest{Application: testApp}) - assert.NoError(t, err) + require.NoError(t, err) app, err = appServer.Sync(ctx, &application.ApplicationSyncRequest{Name: &app.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app) assert.NotNil(t, app.Operation) events, err := appServer.kubeclientset.CoreV1().Events(appServer.ns).List(context.Background(), metav1.ListOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Unknown user initiated sync to 0.7.* (0.7.2)", events.Items[1].Message) } @@ -1832,7 +1832,7 @@ func TestSyncGit(t *testing.T) { testApp.Spec.Source.Path = "deploy" testApp.Spec.Source.TargetRevision = "0.7.*" app, err := appServer.Create(ctx, &application.ApplicationCreateRequest{Application: testApp}) - assert.NoError(t, err) + require.NoError(t, err) syncReq := &application.ApplicationSyncRequest{ Name: &app.Name, Manifests: []string{ @@ -1844,11 +1844,11 @@ func TestSyncGit(t *testing.T) { }, } app, err = appServer.Sync(ctx, syncReq) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app) assert.NotNil(t, app.Operation) events, err := appServer.kubeclientset.CoreV1().Events(appServer.ns).List(context.Background(), metav1.ListOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Unknown user initiated sync locally", events.Items[1].Message) } @@ -1866,7 +1866,7 @@ func TestRollbackApp(t *testing.T) { Id: ptr.To(int64(1)), }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, updatedApp.Operation) assert.NotNil(t, updatedApp.Operation.Sync) @@ -1885,7 +1885,7 @@ func TestUpdateAppProject(t *testing.T) { t.Run("update without changing project", func(t *testing.T) { _ = appServer.enf.SetBuiltinPolicy(`p, admin, applications, update, default/test-app, allow`) _, err := appServer.Update(ctx, &application.ApplicationUpdateRequest{Application: testApp}) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("cannot update to another project", func(t *testing.T) { @@ -1933,7 +1933,7 @@ p, admin, applications, create, my-proj/test-app, allow p, admin, applications, update, my-proj/test-app, allow `) updatedApp, err := appServer.Update(ctx, &application.ApplicationUpdateRequest{Application: testApp}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "my-proj", updatedApp.Spec.Project) }) } @@ -1947,19 +1947,19 @@ func TestAppJsonPatch(t *testing.T) { appServer.enf.SetDefaultRole("") app, err := appServer.Patch(ctx, &application.ApplicationPatchRequest{Name: &testApp.Name, Patch: ptr.To("garbage")}) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, app) app, err = appServer.Patch(ctx, &application.ApplicationPatchRequest{Name: &testApp.Name, Patch: ptr.To("[]")}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app) app, err = appServer.Patch(ctx, &application.ApplicationPatchRequest{Name: &testApp.Name, Patch: ptr.To(`[{"op": "replace", "path": "/spec/source/path", "value": "foo"}]`)}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "foo", app.Spec.Source.Path) app, err = appServer.Patch(ctx, &application.ApplicationPatchRequest{Name: &testApp.Name, Patch: ptr.To(`[{"op": "remove", "path": "/metadata/annotations/test.annotation"}]`)}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, app.Annotations, "test.annotation") } @@ -1974,7 +1974,7 @@ func TestAppMergePatch(t *testing.T) { app, err := appServer.Patch(ctx, &application.ApplicationPatchRequest{ Name: &testApp.Name, Patch: ptr.To(`{"spec": { "source": { "path": "foo" } }}`), PatchType: ptr.To("merge"), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "foo", app.Spec.Source.Path) } @@ -1985,7 +1985,7 @@ func TestServer_GetApplicationSyncWindowsState(t *testing.T) { appServer := newTestAppServer(t, testApp) active, err := appServer.GetApplicationSyncWindows(context.Background(), &application.ApplicationSyncWindowsQuery{Name: &testApp.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, active.ActiveWindows, 1) }) t.Run("Inactive", func(t *testing.T) { @@ -1994,7 +1994,7 @@ func TestServer_GetApplicationSyncWindowsState(t *testing.T) { appServer := newTestAppServer(t, testApp) active, err := appServer.GetApplicationSyncWindows(context.Background(), &application.ApplicationSyncWindowsQuery{Name: &testApp.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, active.ActiveWindows) }) t.Run("ProjectDoesNotExist", func(t *testing.T) { @@ -2027,7 +2027,7 @@ func TestGetCachedAppState(t *testing.T) { err := appServer.getCachedAppState(context.Background(), testApp, func() error { return nil }) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("CacheMissErrorTriggersRefresh", func(t *testing.T) { retryCount := 0 @@ -2063,7 +2063,7 @@ func TestGetCachedAppState(t *testing.T) { retryCount++ return res }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, 2, retryCount) assert.True(t, patched) }) @@ -2082,27 +2082,27 @@ func TestSplitStatusPatch(t *testing.T) { statusPatch := `{"status":{"ccc":"ddd"}}` { nonStatus, status, err := splitStatusPatch([]byte(specPatch)) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, specPatch, string(nonStatus)) assert.Nil(t, status) } { nonStatus, status, err := splitStatusPatch([]byte(statusPatch)) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, nonStatus) assert.Equal(t, statusPatch, string(status)) } { bothPatch := `{"spec":{"aaa":"bbb"},"status":{"ccc":"ddd"}}` nonStatus, status, err := splitStatusPatch([]byte(bothPatch)) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, specPatch, string(nonStatus)) assert.Equal(t, statusPatch, string(status)) } { otherFields := `{"operation":{"eee":"fff"},"spec":{"aaa":"bbb"},"status":{"ccc":"ddd"}}` nonStatus, status, err := splitStatusPatch([]byte(otherFields)) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, `{"operation":{"eee":"fff"},"spec":{"aaa":"bbb"}}`, string(nonStatus)) assert.Equal(t, statusPatch, string(status)) } @@ -2191,7 +2191,7 @@ func TestMaxPodLogsRender(t *testing.T) { t.Run("PodLogs", func(t *testing.T) { err := appServer.PodLogs(&application.ApplicationPodLogsQuery{Name: ptr.To("test")}, &TestPodLogsServer{ctx: adminCtx}) - assert.Error(t, err) + require.Error(t, err) statusCode, _ := status.FromError(err) assert.Equal(t, codes.InvalidArgument, statusCode.Code()) assert.Equal(t, "rpc error: code = InvalidArgument desc = max pods to view logs are reached. Please provide more granular query", err.Error()) @@ -2215,7 +2215,7 @@ func TestMaxPodLogsRender(t *testing.T) { t.Run("PodLogs", func(t *testing.T) { err := appServer.PodLogs(&application.ApplicationPodLogsQuery{Name: ptr.To("test")}, &TestPodLogsServer{ctx: adminCtx}) - assert.Error(t, err) + require.Error(t, err) statusCode, _ := status.FromError(err) assert.Equal(t, codes.InvalidArgument, statusCode.Code()) assert.Equal(t, "rpc error: code = InvalidArgument desc = max pods to view logs are reached. Please provide more granular query", err.Error()) @@ -2310,7 +2310,7 @@ func TestGetAppRefresh_NormalRefresh(t *testing.T) { Name: &testApp.Name, Refresh: ptr.To(string(appsv1.RefreshTypeNormal)), }) - assert.NoError(t, err) + require.NoError(t, err) select { case <-ch: @@ -2345,12 +2345,12 @@ func TestGetAppRefresh_HardRefresh(t *testing.T) { Name: &testApp.Name, Refresh: ptr.To(string(appsv1.RefreshTypeHard)), }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, getAppDetailsQuery) assert.True(t, getAppDetailsQuery.NoCache) assert.Equal(t, testApp.Spec.Source, getAppDetailsQuery.Source) - assert.NoError(t, err) + require.NoError(t, err) select { case <-ch: assert.Equal(t, int32(1), atomic.LoadInt32(&patched)) @@ -2836,7 +2836,7 @@ func TestAppNamespaceRestrictions(t *testing.T) { appServer := newTestAppServer(t, testApp, otherNsProj) appServer.enabledNamespaces = []string{"argocd-1"} active, err := appServer.GetApplicationSyncWindows(context.TODO(), &application.ApplicationSyncWindowsQuery{Name: &testApp.Name, AppNamespace: &testApp.Namespace}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, active.ActiveWindows) }) t.Run("Get application sync window in other namespace when project is not allowed", func(t *testing.T) { @@ -2994,7 +2994,7 @@ func TestServer_ResolveSourceRevisions_MultiSource(t *testing.T) { revision, displayRevision, sourceRevisions, displayRevisions, err := s.resolveSourceRevisions(ctx, a, syncReq) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "", revision) assert.Equal(t, "", displayRevision) assert.Equal(t, []string{fakeResolveRevisionResponse().Revision}, sourceRevisions) @@ -3019,7 +3019,7 @@ func TestServer_ResolveSourceRevisions_SingleSource(t *testing.T) { revision, displayRevision, sourceRevisions, displayRevisions, err := s.resolveSourceRevisions(ctx, a, syncReq) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, fakeResolveRevisionResponse().Revision, revision) assert.Equal(t, fakeResolveRevisionResponse().AmbiguousRevision, displayRevision) assert.Equal(t, ([]string)(nil), sourceRevisions) diff --git a/server/application/websocket_test.go b/server/application/websocket_test.go index f7f8e75a6b571..40b6e98bd68c8 100644 --- a/server/application/websocket_test.go +++ b/server/application/websocket_test.go @@ -9,6 +9,7 @@ import ( "github.com/gorilla/websocket" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func reconnect(w http.ResponseWriter, r *http.Request) { @@ -30,7 +31,7 @@ func TestReconnect(t *testing.T) { // Connect to the server ws, _, err := websocket.DefaultDialer.Dial(u, nil) - assert.NoError(t, err) + require.NoError(t, err) defer ws.Close() @@ -40,6 +41,6 @@ func TestReconnect(t *testing.T) { err = json.Unmarshal(p, &message) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, ReconnectMessage, message.Data) } diff --git a/server/badge/badge_test.go b/server/badge/badge_test.go index 4663d74e4dc47..8e1d8819165bf 100644 --- a/server/badge/badge_test.go +++ b/server/badge/badge_test.go @@ -103,7 +103,7 @@ func TestHandlerFeatureIsEnabled(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp()), settingsMgr, "default", []string{}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -206,7 +206,7 @@ func TestHandlerFeatureProjectIsEnabled(t *testing.T) { handler := NewHandler(appclientset.NewSimpleClientset(objects...), settingsMgr, tt.namespace, []string{}) rr := httptest.NewRecorder() req, err := http.NewRequest(http.MethodGet, tt.apiEndPoint, nil) - assert.NoError(t, err) + require.NoError(t, err) handler.ServeHTTP(rr, req) require.Equal(t, tt.response, rr.Result().StatusCode) if rr.Result().StatusCode != 400 { @@ -228,7 +228,7 @@ func TestHandlerNamespacesIsEnabled(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp2()), settingsMgr, "default", []string{"argocd-test"}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app&namespace=argocd-test", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -249,7 +249,7 @@ func TestHandlerNamespacesIsEnabled(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp2()), settingsMgr, "default", []string{"argocd-test"}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app&namespace=kube-system", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -266,7 +266,7 @@ func TestHandlerNamespacesIsEnabled(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp2()), settingsMgr, "default", []string{"argocd-test"}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app&namespace=kube()system", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -279,7 +279,7 @@ func TestHandlerFeatureIsEnabledKeepFullRevisionIsEnabled(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp3()), settingsMgr, "argocd-test", []string{""}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app&revision=true&keepFullRevision=true", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -300,7 +300,7 @@ func TestHandlerFeatureIsEnabledKeepFullRevisionIsDisabled(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp3()), settingsMgr, "argocd-test", []string{}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app&revision=true&keepFullRevision=false", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -321,7 +321,7 @@ func TestHandlerFeatureIsEnabledKeepFullRevisionAndWidthIsEnabled(t *testing.T) settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp3()), settingsMgr, "argocd-test", []string{""}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app&revision=true&keepFullRevision=true&width=500", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -395,7 +395,7 @@ func TestHandlerFeatureIsEnabledRevisionIsEnabled(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp()), settingsMgr, "default", []string{}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app&revision=true", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -419,7 +419,7 @@ func TestHandlerRevisionIsEnabledNoOperationState(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(app), settingsMgr, "default", []string{}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app&revision=true", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -443,7 +443,7 @@ func TestHandlerRevisionIsEnabledShortCommitSHA(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(app), settingsMgr, "default", []string{}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app&revision=true", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -459,7 +459,7 @@ func TestHandlerFeatureIsDisabled(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCmDisabled, argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp()), settingsMgr, "default", []string{}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -480,7 +480,7 @@ func TestHandlerApplicationNameInBadgeIsEnabled(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp()), settingsMgr, "default", []string{}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app&showAppName=true", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) @@ -507,7 +507,7 @@ func TestHandlerApplicationNameInBadgeIsDisabled(t *testing.T) { settingsMgr := settings.NewSettingsManager(context.Background(), fake.NewSimpleClientset(argoCDCm(), argoCDSecret()), "default") handler := NewHandler(appclientset.NewSimpleClientset(testApp()), settingsMgr, "default", []string{}) req, err := http.NewRequest(http.MethodGet, "/api/badge?name=test-app", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) diff --git a/server/cache/cache_test.go b/server/cache/cache_test.go index 9fe90a285ff6c..9104305a600a7 100644 --- a/server/cache/cache_test.go +++ b/server/cache/cache_test.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" cacheutil "github.com/argoproj/argo-cd/v2/util/cache" @@ -35,29 +36,29 @@ func TestCache_GetRepoConnectionState(t *testing.T) { assert.Equal(t, ErrCacheMiss, err) // populate cache err = cache.SetRepoConnectionState("my-repo", "", &ConnectionState{Status: "my-state"}) - assert.NoError(t, err) + require.NoError(t, err) // cache miss _, err = cache.GetRepoConnectionState("my-repo", "some-project") assert.Equal(t, ErrCacheMiss, err) // populate cache err = cache.SetRepoConnectionState("my-repo", "some-project", &ConnectionState{Status: "my-project-state"}) - assert.NoError(t, err) + require.NoError(t, err) // cache miss _, err = cache.GetRepoConnectionState("other-repo", "") assert.Equal(t, ErrCacheMiss, err) // cache hit value, err := cache.GetRepoConnectionState("my-repo", "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, ConnectionState{Status: "my-state"}, value) // cache hit value, err = cache.GetRepoConnectionState("my-repo", "some-project") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, ConnectionState{Status: "my-project-state"}, value) } func TestAddCacheFlagsToCmd(t *testing.T) { cache, err := AddCacheFlagsToCmd(&cobra.Command{})() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, 1*time.Hour, cache.connectionStatusCacheExpiration) assert.Equal(t, 3*time.Minute, cache.oidcCacheExpiration) } diff --git a/server/cluster/cluster_test.go b/server/cluster/cluster_test.go index 82d4f1212c133..567de3a661901 100644 --- a/server/cluster/cluster_test.go +++ b/server/cluster/cluster_test.go @@ -388,7 +388,7 @@ func TestDeleteClusterByName(t *testing.T) { _, err := server.Delete(context.Background(), &clusterapi.ClusterQuery{ Name: "my-cluster-name", }) - assert.NoError(t, err) + require.NoError(t, err) _, err = db.GetCluster(context.Background(), "https://my-cluster-server") assert.EqualError(t, err, `rpc error: code = NotFound desc = cluster "https://my-cluster-server" not found`) @@ -699,13 +699,13 @@ func TestNoClusterEnumeration(t *testing.T) { _, err := server.Get(context.Background(), &clusterapi.ClusterQuery{ Name: "cluster-not-exists", }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, common.PermissionDeniedAPIError.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about cluster existence") _, err = server.Get(context.Background(), &clusterapi.ClusterQuery{ Name: "test/ing", }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, common.PermissionDeniedAPIError.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about cluster existence") }) @@ -715,7 +715,7 @@ func TestNoClusterEnumeration(t *testing.T) { Name: "cluster-not-exists", }, }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, common.PermissionDeniedAPIError.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about cluster existence") _, err = server.Update(context.Background(), &clusterapi.ClusterUpdateRequest{ @@ -723,7 +723,7 @@ func TestNoClusterEnumeration(t *testing.T) { Name: "test/ing", }, }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, common.PermissionDeniedAPIError.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about cluster existence") }) @@ -731,13 +731,13 @@ func TestNoClusterEnumeration(t *testing.T) { _, err := server.Delete(context.Background(), &clusterapi.ClusterQuery{ Server: "https://127.0.0.2", }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, common.PermissionDeniedAPIError.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about cluster existence") _, err = server.Delete(context.Background(), &clusterapi.ClusterQuery{ Server: "https://127.0.0.1", }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, common.PermissionDeniedAPIError.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about cluster existence") }) @@ -745,13 +745,13 @@ func TestNoClusterEnumeration(t *testing.T) { _, err := server.RotateAuth(context.Background(), &clusterapi.ClusterQuery{ Server: "https://127.0.0.2", }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, common.PermissionDeniedAPIError.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about cluster existence") _, err = server.RotateAuth(context.Background(), &clusterapi.ClusterQuery{ Server: "https://127.0.0.1", }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, common.PermissionDeniedAPIError.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about cluster existence") }) @@ -759,13 +759,13 @@ func TestNoClusterEnumeration(t *testing.T) { _, err := server.InvalidateCache(context.Background(), &clusterapi.ClusterQuery{ Server: "https://127.0.0.2", }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, common.PermissionDeniedAPIError.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about cluster existence") _, err = server.InvalidateCache(context.Background(), &clusterapi.ClusterQuery{ Server: "https://127.0.0.1", }) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, common.PermissionDeniedAPIError.Error(), err.Error(), "error message must be _only_ the permission error, to avoid leaking information about cluster existence") }) } diff --git a/server/deeplinks/deeplinks_test.go b/server/deeplinks/deeplinks_test.go index fa6f5d1896e7e..8458a72770f50 100644 --- a/server/deeplinks/deeplinks_test.go +++ b/server/deeplinks/deeplinks_test.go @@ -7,6 +7,7 @@ import ( "github.com/argoproj/gitops-engine/pkg/utils/kube" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -40,7 +41,7 @@ func TestDeepLinks(t *testing.T) { }, }, }) - assert.NoError(t, err) + require.NoError(t, err) resourceObj, err := kube.ToUnstructured(&v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: "test-cm", @@ -51,12 +52,12 @@ func TestDeepLinks(t *testing.T) { "key": "value1", }, }) - assert.NoError(t, err) + require.NoError(t, err) clusterObj, err := kube.ToUnstructured(&ClusterLinksData{ Server: "test-svc.com", Name: "test-cluster", }) - assert.NoError(t, err) + require.NoError(t, err) projectObj, err := kube.ToUnstructured(&v1alpha1.AppProject{ ObjectMeta: metav1.ObjectMeta{ Name: "test-project", @@ -66,7 +67,7 @@ func TestDeepLinks(t *testing.T) { SourceRepos: []string{"test-repo.git"}, }, }) - assert.NoError(t, err) + require.NoError(t, err) testTable := []deepLinkTC{ { appObj: appObj, diff --git a/server/extension/extension_test.go b/server/extension/extension_test.go index eba034fdb92b5..7d6a8e5ffb02b 100644 --- a/server/extension/extension_test.go +++ b/server/extension/extension_test.go @@ -56,7 +56,7 @@ func TestValidateHeaders(t *testing.T) { rr, err := extension.ValidateHeaders(r) // then - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, rr) }) t.Run("will return error if application header is missing", func(t *testing.T) { @@ -71,7 +71,7 @@ func TestValidateHeaders(t *testing.T) { rr, err := extension.ValidateHeaders(r) // then - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, rr) }) t.Run("will return error if project header is missing", func(t *testing.T) { @@ -86,7 +86,7 @@ func TestValidateHeaders(t *testing.T) { rr, err := extension.ValidateHeaders(r) // then - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, rr) }) t.Run("will return error if invalid namespace", func(t *testing.T) { @@ -102,7 +102,7 @@ func TestValidateHeaders(t *testing.T) { rr, err := extension.ValidateHeaders(r) // then - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, rr) }) t.Run("will return error if invalid app name", func(t *testing.T) { @@ -118,7 +118,7 @@ func TestValidateHeaders(t *testing.T) { rr, err := extension.ValidateHeaders(r) // then - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, rr) }) t.Run("will return error if invalid project name", func(t *testing.T) { @@ -134,7 +134,7 @@ func TestValidateHeaders(t *testing.T) { rr, err := extension.ValidateHeaders(r) // then - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, rr) }) } @@ -231,7 +231,7 @@ func TestRegisterExtensions(t *testing.T) { err := f.manager.RegisterExtensions() // then - assert.Error(t, err, "expected error in test %s but got nil", tc.name) + require.Error(t, err, "expected error in test %s but got nil", tc.name) }) } }) diff --git a/server/logout/logout_test.go b/server/logout/logout_test.go index f97013f106758..78a735c528beb 100644 --- a/server/logout/logout_test.go +++ b/server/logout/logout_test.go @@ -17,6 +17,7 @@ import ( "github.com/golang-jwt/jwt/v4" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" @@ -252,17 +253,17 @@ func TestHandlerConstructLogoutURL(t *testing.T) { invalidHeader["Cookie"] = []string{"argocd.token=" + invalidToken} oidcRequest, err := http.NewRequest(http.MethodGet, "http://localhost:4000/api/logout", nil) - assert.NoError(t, err) + require.NoError(t, err) oidcRequest.Header = oidcTokenHeader nonoidcRequest, err := http.NewRequest(http.MethodGet, "http://localhost:4000/api/logout", nil) - assert.NoError(t, err) + require.NoError(t, err) nonoidcRequest.Header = nonOidcTokenHeader - assert.NoError(t, err) + require.NoError(t, err) requestWithInvalidToken, err := http.NewRequest(http.MethodGet, "http://localhost:4000/api/logout", nil) - assert.NoError(t, err) + require.NoError(t, err) requestWithInvalidToken.Header = invalidHeader invalidRequest, err := http.NewRequest(http.MethodGet, "http://localhost:4000/api/logout", nil) - assert.NoError(t, err) + require.NoError(t, err) tests := []struct { name string diff --git a/server/notification/notification_test.go b/server/notification/notification_test.go index 3d2c398d81ce4..41e0306c84bd0 100644 --- a/server/notification/notification_test.go +++ b/server/notification/notification_test.go @@ -75,7 +75,7 @@ func TestNotificationServer(t *testing.T) { t.Run("TestListServices", func(t *testing.T) { server := NewServer(apiFactory) services, err := server.ListServices(ctx, ¬ification.ServicesListRequest{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, services.Items, 1) assert.Equal(t, services.Items[0].Name, ptr.To("test")) assert.NotEmpty(t, services.Items[0]) @@ -83,7 +83,7 @@ func TestNotificationServer(t *testing.T) { t.Run("TestListTriggers", func(t *testing.T) { server := NewServer(apiFactory) triggers, err := server.ListTriggers(ctx, ¬ification.TriggersListRequest{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, triggers.Items, 1) assert.Equal(t, triggers.Items[0].Name, ptr.To("on-created")) assert.NotEmpty(t, triggers.Items[0]) @@ -91,7 +91,7 @@ func TestNotificationServer(t *testing.T) { t.Run("TestListTemplates", func(t *testing.T) { server := NewServer(apiFactory) templates, err := server.ListTemplates(ctx, ¬ification.TemplatesListRequest{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, templates.Items, 1) assert.Equal(t, templates.Items[0].Name, ptr.To("app-created")) assert.NotEmpty(t, templates.Items[0]) diff --git a/server/project/project_test.go b/server/project/project_test.go index 00354ae6ffebe..a03f472696f5a 100644 --- a/server/project/project_test.go +++ b/server/project/project_test.go @@ -12,6 +12,7 @@ import ( "github.com/golang-jwt/jwt/v4" "github.com/google/uuid" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" corev1 "k8s.io/api/core/v1" @@ -92,10 +93,10 @@ func TestProjectServer(t *testing.T) { argoDB := db.NewDB("default", settingsMgr, kubeclientset) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(projectWithRole), enforcer, sync.NewKeyLock(), sessionMgr, nil, projInformer, settingsMgr, argoDB) err := projectServer.NormalizeProjs() - assert.NoError(t, err) + require.NoError(t, err) appList, err := projectServer.appclientset.ArgoprojV1alpha1().AppProjects(projectWithRole.Namespace).List(context.Background(), v1.ListOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int64(1), appList.Items[0].Status.JWTTokensByRole[roleName].Items[0].IssuedAt) assert.ElementsMatch(t, appList.Items[0].Status.JWTTokensByRole[roleName].Items, appList.Items[0].Spec.Roles[0].JWTTokens) }) @@ -172,7 +173,7 @@ func TestProjectServer(t *testing.T) { _, err := projectServer.Update(context.Background(), &project.ProjectUpdateRequest{Project: updatedProj}) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("TestRemoveDestinationUsedByApp", func(t *testing.T) { @@ -189,7 +190,7 @@ func TestProjectServer(t *testing.T) { _, err := projectServer.Update(context.Background(), &project.ProjectUpdateRequest{Project: updatedProj}) - assert.Error(t, err) + require.Error(t, err) statusCode, _ := status.FromError(err) assert.Equal(t, codes.InvalidArgument, statusCode.Code()) }) @@ -208,7 +209,7 @@ func TestProjectServer(t *testing.T) { _, err := projectServer.Update(context.Background(), &project.ProjectUpdateRequest{Project: updatedProj}) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("TestRemoveSourceUsedByApp", func(t *testing.T) { @@ -225,7 +226,7 @@ func TestProjectServer(t *testing.T) { _, err := projectServer.Update(context.Background(), &project.ProjectUpdateRequest{Project: updatedProj}) - assert.Error(t, err) + require.Error(t, err) statusCode, _ := status.FromError(err) assert.Equal(t, codes.InvalidArgument, statusCode.Code()) }) @@ -245,7 +246,7 @@ func TestProjectServer(t *testing.T) { res, err := projectServer.Update(context.Background(), &project.ProjectUpdateRequest{Project: updatedProj}) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, res.Spec.SourceRepos, updatedProj.Spec.SourceRepos) }) @@ -274,7 +275,7 @@ func TestProjectServer(t *testing.T) { res, err := projectServer.Update(context.Background(), &project.ProjectUpdateRequest{Project: updatedProj}) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, res.Spec.Destinations, updatedProj.Spec.Destinations) }) @@ -284,7 +285,7 @@ func TestProjectServer(t *testing.T) { _, err := projectServer.Delete(context.Background(), &project.ProjectQuery{Name: "test"}) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("TestDeleteDefaultProjectFailure", func(t *testing.T) { @@ -311,7 +312,7 @@ func TestProjectServer(t *testing.T) { _, err := projectServer.Delete(context.Background(), &project.ProjectQuery{Name: "test"}) - assert.Error(t, err) + require.Error(t, err) statusCode, _ := status.FromError(err) assert.Equal(t, codes.InvalidArgument, statusCode.Code()) }) @@ -346,7 +347,7 @@ func TestProjectServer(t *testing.T) { argoDB := db.NewDB("default", settingsMgr, kubeclientset) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(projectWithRole), enforcer, sync.NewKeyLock(), sessionMgr, policyEnf, projInformer, settingsMgr, argoDB) _, err := projectServer.CreateToken(ctx, &project.ProjectTokenCreateRequest{Project: projectWithRole.Name, Role: tokenName, ExpiresIn: 1}) - assert.NoError(t, err) + require.NoError(t, err) }) _ = enforcer.SetBuiltinPolicy(`p, role:admin, projects, update, *, allow`) @@ -360,16 +361,16 @@ func TestProjectServer(t *testing.T) { argoDB := db.NewDB("default", settingsMgr, kubeclientset) projectServer := NewServer("default", fake.NewSimpleClientset(), clientset, enforcer, sync.NewKeyLock(), sessionMgr, policyEnf, projInformer, settingsMgr, argoDB) tokenResponse, err := projectServer.CreateToken(context.Background(), &project.ProjectTokenCreateRequest{Project: projectWithRole.Name, Role: tokenName, ExpiresIn: 100}) - assert.NoError(t, err) + require.NoError(t, err) claims, _, err := sessionMgr.Parse(tokenResponse.Token) - assert.NoError(t, err) + require.NoError(t, err) mapClaims, err := jwtutil.MapClaims(claims) subject, ok := mapClaims["sub"].(string) assert.True(t, ok) expectedSubject := fmt.Sprintf(JWTTokenSubFormat, projectWithRole.Name, tokenName) assert.Equal(t, expectedSubject, subject) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("TestCreateTokenWithIDSuccessfully", func(t *testing.T) { @@ -381,16 +382,16 @@ func TestProjectServer(t *testing.T) { argoDB := db.NewDB("default", settingsMgr, kubeclientset) projectServer := NewServer("default", fake.NewSimpleClientset(), clientset, enforcer, sync.NewKeyLock(), sessionMgr, policyEnf, projInformer, settingsMgr, argoDB) tokenResponse, err := projectServer.CreateToken(context.Background(), &project.ProjectTokenCreateRequest{Project: projectWithRole.Name, Role: tokenName, ExpiresIn: 1, Id: id}) - assert.NoError(t, err) + require.NoError(t, err) claims, _, err := sessionMgr.Parse(tokenResponse.Token) - assert.NoError(t, err) + require.NoError(t, err) mapClaims, err := jwtutil.MapClaims(claims) subject, ok := mapClaims["sub"].(string) assert.True(t, ok) expectedSubject := fmt.Sprintf(JWTTokenSubFormat, projectWithRole.Name, tokenName) assert.Equal(t, expectedSubject, subject) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("TestCreateTokenWithSameIdDeny", func(t *testing.T) { @@ -403,16 +404,16 @@ func TestProjectServer(t *testing.T) { projectServer := NewServer("default", fake.NewSimpleClientset(), clientset, enforcer, sync.NewKeyLock(), sessionMgr, policyEnf, projInformer, settingsMgr, argoDB) tokenResponse, err := projectServer.CreateToken(context.Background(), &project.ProjectTokenCreateRequest{Project: projectWithRole.Name, Role: tokenName, ExpiresIn: 1, Id: id}) - assert.NoError(t, err) + require.NoError(t, err) claims, _, err := sessionMgr.Parse(tokenResponse.Token) - assert.NoError(t, err) + require.NoError(t, err) mapClaims, err := jwtutil.MapClaims(claims) subject, ok := mapClaims["sub"].(string) assert.True(t, ok) expectedSubject := fmt.Sprintf(JWTTokenSubFormat, projectWithRole.Name, tokenName) assert.Equal(t, expectedSubject, subject) - assert.NoError(t, err) + require.NoError(t, err) _, err1 := projectServer.CreateToken(context.Background(), &project.ProjectTokenCreateRequest{Project: projectWithRole.Name, Role: tokenName, ExpiresIn: 1, Id: id}) expectedErr := fmt.Sprintf("rpc error: code = InvalidArgument desc = rpc error: code = InvalidArgument desc = Token id '%s' has been used. ", id) @@ -444,7 +445,7 @@ func TestProjectServer(t *testing.T) { argoDB := db.NewDB("default", settingsMgr, kubeclientset) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(projWithToken), enforcer, sync.NewKeyLock(), sessionMgr, policyEnf, projInformer, settingsMgr, argoDB) _, err := projectServer.DeleteToken(ctx, &project.ProjectTokenDeleteRequest{Project: projWithToken.Name, Role: tokenName, Iat: issuedAt}) - assert.NoError(t, err) + require.NoError(t, err) }) _ = enforcer.SetBuiltinPolicy(`p, role:admin, projects, get, *, allow @@ -460,9 +461,9 @@ p, role:admin, projects, update, *, allow`) argoDB := db.NewDB("default", settingsMgr, kubeclientset) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(projWithToken), enforcer, sync.NewKeyLock(), sessionMgr, policyEnf, projInformer, settingsMgr, argoDB) _, err := projectServer.DeleteToken(ctx, &project.ProjectTokenDeleteRequest{Project: projWithToken.Name, Role: tokenName, Iat: issuedAt}) - assert.NoError(t, err) + require.NoError(t, err) projWithoutToken, err := projectServer.Get(context.Background(), &project.ProjectQuery{Name: projWithToken.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, projWithoutToken.Spec.Roles, 1) assert.Len(t, projWithoutToken.Spec.Roles[0].JWTTokens, 1) assert.Equal(t, projWithoutToken.Spec.Roles[0].JWTTokens[0].IssuedAt, secondIssuedAt) @@ -484,9 +485,9 @@ p, role:admin, projects, update, *, allow`) argoDB := db.NewDB("default", settingsMgr, kubeclientset) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(projWithToken), enforcer, sync.NewKeyLock(), sessionMgr, policyEnf, projInformer, settingsMgr, argoDB) _, err := projectServer.DeleteToken(ctx, &project.ProjectTokenDeleteRequest{Project: projWithToken.Name, Role: tokenName, Iat: secondIssuedAt, Id: id}) - assert.NoError(t, err) + require.NoError(t, err) projWithoutToken, err := projectServer.Get(context.Background(), &project.ProjectQuery{Name: projWithToken.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, projWithoutToken.Spec.Roles, 1) assert.Len(t, projWithoutToken.Spec.Roles[0].JWTTokens, 1) assert.Equal(t, projWithoutToken.Spec.Roles[0].JWTTokens[0].IssuedAt, secondIssuedAt) @@ -503,9 +504,9 @@ p, role:admin, projects, update, *, allow`) argoDB := db.NewDB("default", settingsMgr, kubeclientset) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(projWithToken), enforcer, sync.NewKeyLock(), sessionMgr, policyEnf, projInformer, settingsMgr, argoDB) _, err := projectServer.CreateToken(context.Background(), &project.ProjectTokenCreateRequest{Project: projWithToken.Name, Role: tokenName}) - assert.NoError(t, err) + require.NoError(t, err) projWithTwoTokens, err := projectServer.Get(context.Background(), &project.ProjectQuery{Name: projWithToken.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, projWithTwoTokens.Spec.Roles, 1) assert.Len(t, projWithTwoTokens.Spec.Roles[0].JWTTokens, 2) }) @@ -518,7 +519,7 @@ p, role:admin, projects, update, *, allow`) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(proj), enforcer, sync.NewKeyLock(), nil, policyEnf, projInformer, settingsMgr, argoDB) request := &project.ProjectUpdateRequest{Project: proj} updatedProj, err := projectServer.Update(context.Background(), request) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, wildSourceRepo, updatedProj.Spec.SourceRepos[1]) }) @@ -537,7 +538,7 @@ p, role:admin, projects, update, *, allow`) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(projWithRole), enforcer, sync.NewKeyLock(), nil, policyEnf, projInformer, settingsMgr, argoDB) request := &project.ProjectUpdateRequest{Project: projWithRole} _, err := projectServer.Update(context.Background(), request) - assert.NoError(t, err) + require.NoError(t, err) t.Log(projWithRole.Spec.Roles[0].Policies[0]) expectedPolicy := fmt.Sprintf(policyTemplate, projWithRole.Name, role.Name, action, projWithRole.Name, object, effect) assert.Equal(t, expectedPolicy, projWithRole.Spec.Roles[0].Policies[0]) @@ -654,7 +655,7 @@ p, role:admin, projects, update, *, allow`) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(projWithRole), enforcer, sync.NewKeyLock(), nil, nil, projInformer, settingsMgr, argoDB) request := &project.ProjectUpdateRequest{Project: projWithRole} updateProj, err := projectServer.Update(context.Background(), request) - assert.NoError(t, err) + require.NoError(t, err) expectedPolicy := fmt.Sprintf(policyTemplate, projWithRole.Name, roleName, action, projWithRole.Name, object, effect) assert.Equal(t, expectedPolicy, updateProj.Spec.Roles[0].Policies[0]) }) @@ -668,7 +669,7 @@ p, role:admin, projects, update, *, allow`) argoDB := db.NewDB("default", settingsMgr, kubeclientset) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(projectWithSyncWindows), enforcer, sync.NewKeyLock(), sessionMgr, nil, projInformer, settingsMgr, argoDB) res, err := projectServer.GetSyncWindowsState(ctx, &project.SyncWindowsQuery{Name: projectWithSyncWindows.Name}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res.Windows, 1) }) diff --git a/server/repository/repository_test.go b/server/repository/repository_test.go index b79bdfc34c4df..72354633048dc 100644 --- a/server/repository/repository_test.go +++ b/server/repository/repository_test.go @@ -9,6 +9,7 @@ import ( "github.com/golang-jwt/jwt/v4" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" corev1 "k8s.io/api/core/v1" @@ -281,7 +282,7 @@ func TestRepositoryServer(t *testing.T) { _, err := s.ValidateAccess(context.TODO(), &repository.RepoAccessQuery{ Repo: url, }) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Test_Get", func(t *testing.T) { @@ -299,7 +300,7 @@ func TestRepositoryServer(t *testing.T) { repo, err := s.Get(context.TODO(), &repository.RepoQuery{ Repo: url, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, repo.Repo, url) }) @@ -324,7 +325,7 @@ func TestRepositoryServer(t *testing.T) { repo, err := s.Get(context.TODO(), &repository.RepoQuery{ Repo: url, }) - assert.NoError(t, err) + require.NoError(t, err) testRepo.ConnectionState = repo.ConnectionState // overwrite connection state on our test object to simplify comparison below @@ -387,7 +388,7 @@ func TestRepositoryServer(t *testing.T) { Username: "test", }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "repo", repo.Repo) }) @@ -413,7 +414,7 @@ func TestRepositoryServer(t *testing.T) { Upsert: true, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test", repo.Repo) }) @@ -431,7 +432,7 @@ func TestRepositoryServer(t *testing.T) { s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projInformer, testNamespace, settingsMgr) resp, err := s.ListRepositories(context.TODO(), &repository.RepoQuery{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, resp.Items, 2) }) } @@ -487,7 +488,7 @@ func TestRepositoryServerListApps(t *testing.T) { AppName: "foo", AppProject: "default", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, resp.Items, 1) assert.Equal(t, "path/to/dir", resp.Items[0].Path) assert.Equal(t, "Kustomize", resp.Items[0].Type) @@ -519,7 +520,7 @@ func TestRepositoryServerListApps(t *testing.T) { AppProject: "default", }) assert.Nil(t, resp) - assert.Error(t, err, "repository 'https://test' not permitted in project 'default'") + require.Error(t, err, "repository 'https://test' not permitted in project 'default'") }) } @@ -547,7 +548,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppProject: "default", }) assert.Nil(t, resp) - assert.Error(t, err, "rpc error: code = PermissionDenied desc = permission denied: repositories, get, https://test") + require.Error(t, err, "rpc error: code = PermissionDenied desc = permission denied: repositories, get, https://test") }) t.Run("Test_WithoutAppReadPrivileges", func(t *testing.T) { repoServerClient := mocks.RepoServerServiceClient{} @@ -570,7 +571,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppProject: "default", }) assert.Nil(t, resp) - assert.Error(t, err, "rpc error: code = PermissionDenied desc = permission denied: applications, get, default/newapp") + require.Error(t, err, "rpc error: code = PermissionDenied desc = permission denied: applications, get, default/newapp") }) t.Run("Test_WithoutCreatePrivileges", func(t *testing.T) { repoServerClient := mocks.RepoServerServiceClient{} @@ -592,7 +593,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppProject: "default", }) assert.Nil(t, resp) - assert.Error(t, err, "rpc error: code = PermissionDenied desc = permission denied: applications, create, default/newapp") + require.Error(t, err, "rpc error: code = PermissionDenied desc = permission denied: applications, create, default/newapp") }) t.Run("Test_WithCreatePrivileges", func(t *testing.T) { repoServerClient := mocks.RepoServerServiceClient{} @@ -617,7 +618,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppName: "newapp", AppProject: "default", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResp, *resp) }) t.Run("Test_RepoNotPermitted", func(t *testing.T) { @@ -642,7 +643,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppName: "newapp", AppProject: "default", }) - assert.Error(t, err, "repository 'https://test' not permitted in project 'default'") + require.Error(t, err, "repository 'https://test' not permitted in project 'default'") assert.Nil(t, resp) }) t.Run("Test_ExistingApp", func(t *testing.T) { @@ -666,7 +667,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppName: "guestbook", AppProject: "default", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResp, *resp) }) t.Run("Test_ExistingMultiSourceApp001", func(t *testing.T) { @@ -693,7 +694,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppName: multiSourceApp001AppName, AppProject: "default", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResp, *resp) assert.Equal(t, "Helm", resp.Type) // Next source @@ -702,7 +703,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppName: multiSourceApp001AppName, AppProject: "default", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResp, *resp) assert.Equal(t, "Helm", resp.Type) }) @@ -735,7 +736,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppName: multiSourceApp002AppName, AppProject: "default", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Plugin", resp.Type) assert.Equal(t, expectedResp0, *resp) // Next source @@ -744,7 +745,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppName: multiSourceApp002AppName, AppProject: "default", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResp1, *resp) assert.Equal(t, "Helm", resp.Type) }) @@ -811,7 +812,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { AppName: "guestbook", AppProject: "default", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResp, *resp) }) @@ -870,7 +871,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { SourceIndex: 0, VersionId: 1, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResp, *resp) }) } diff --git a/server/server_norace_test.go b/server/server_norace_test.go index 1ad1c920e8a54..cd73a54f12c41 100644 --- a/server/server_norace_test.go +++ b/server/server_norace_test.go @@ -13,6 +13,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/pkg/apiclient" @@ -29,7 +30,7 @@ func TestUserAgent(t *testing.T) { s, closer := fakeServer(t) defer closer() lns, err := s.Listen() - assert.NoError(t, err) + require.NoError(t, err) cancelInformer := test.StartInformer(s.projInformer) defer cancelInformer() @@ -44,7 +45,7 @@ func TestUserAgent(t *testing.T) { errorMsg string } currentVersionBytes, err := os.ReadFile("../VERSION") - assert.NoError(t, err) + require.NoError(t, err) currentVersion := strings.TrimSpace(string(currentVersionBytes)) tests := []testData{ { @@ -73,14 +74,14 @@ func TestUserAgent(t *testing.T) { UserAgent: test.userAgent, } clnt, err := apiclient.NewClient(&opts) - assert.NoError(t, err) + require.NoError(t, err) conn, appClnt := clnt.NewApplicationClientOrDie() _, err = appClnt.List(ctx, &applicationpkg.ApplicationQuery{}) if test.errorMsg != "" { - assert.Error(t, err) + require.Error(t, err) assert.Regexp(t, test.errorMsg, err.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) } _ = conn.Close() } @@ -95,7 +96,7 @@ func Test_StaticHeaders(t *testing.T) { s, closer := fakeServer(t) defer closer() lns, err := s.Listen() - assert.NoError(t, err) + require.NoError(t, err) cancelInformer := test.StartInformer(s.projInformer) defer cancelInformer() ctx, cancel := context.WithCancel(context.Background()) @@ -110,9 +111,9 @@ func Test_StaticHeaders(t *testing.T) { client := http.Client{} url := fmt.Sprintf("http://127.0.0.1:%d/test.html", s.ListenPort) req, err := http.NewRequest(http.MethodGet, url, nil) - assert.NoError(t, err) + require.NoError(t, err) resp, err := client.Do(req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "sameorigin", resp.Header.Get("X-Frame-Options")) assert.Equal(t, "frame-ancestors 'self';", resp.Header.Get("Content-Security-Policy")) } @@ -126,7 +127,7 @@ func Test_StaticHeaders(t *testing.T) { cancelInformer := test.StartInformer(s.projInformer) defer cancelInformer() lns, err := s.Listen() - assert.NoError(t, err) + require.NoError(t, err) ctx, cancel := context.WithCancel(context.Background()) defer cancel() s.Init(ctx) @@ -139,9 +140,9 @@ func Test_StaticHeaders(t *testing.T) { client := http.Client{} url := fmt.Sprintf("http://127.0.0.1:%d/test.html", s.ListenPort) req, err := http.NewRequest(http.MethodGet, url, nil) - assert.NoError(t, err) + require.NoError(t, err) resp, err := client.Do(req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "deny", resp.Header.Get("X-Frame-Options")) assert.Equal(t, "frame-ancestors 'none';", resp.Header.Get("Content-Security-Policy")) } @@ -155,7 +156,7 @@ func Test_StaticHeaders(t *testing.T) { cancelInformer := test.StartInformer(s.projInformer) defer cancelInformer() lns, err := s.Listen() - assert.NoError(t, err) + require.NoError(t, err) ctx, cancel := context.WithCancel(context.Background()) defer cancel() s.Init(ctx) @@ -163,7 +164,7 @@ func Test_StaticHeaders(t *testing.T) { defer func() { time.Sleep(3 * time.Second) }() err = test.WaitForPortListen(fmt.Sprintf("127.0.0.1:%d", s.ListenPort), 10*time.Second) - assert.NoError(t, err) + require.NoError(t, err) // Allow server startup time.Sleep(1 * time.Second) @@ -171,9 +172,9 @@ func Test_StaticHeaders(t *testing.T) { client := http.Client{} url := fmt.Sprintf("http://127.0.0.1:%d/test.html", s.ListenPort) req, err := http.NewRequest(http.MethodGet, url, nil) - assert.NoError(t, err) + require.NoError(t, err) resp, err := client.Do(req) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, resp.Header.Get("X-Frame-Options")) assert.Empty(t, resp.Header.Get("Content-Security-Policy")) } diff --git a/server/server_test.go b/server/server_test.go index e4ca06c27e85b..13bb3d6770753 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -272,7 +272,7 @@ func TestInitializingExistingDefaultProject(t *testing.T) { assert.NotNil(t, argocd) proj, err := appClientSet.ArgoprojV1alpha1().AppProjects(test.FakeArgoCDNamespace).Get(context.Background(), v1alpha1.DefaultAppProjectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, proj) assert.Equal(t, v1alpha1.DefaultAppProjectName, proj.Name) } @@ -295,7 +295,7 @@ func TestInitializingNotExistingDefaultProject(t *testing.T) { assert.NotNil(t, argocd) proj, err := appClientSet.ArgoprojV1alpha1().AppProjects(test.FakeArgoCDNamespace).Get(context.Background(), v1alpha1.DefaultAppProjectName, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, proj) assert.Equal(t, v1alpha1.DefaultAppProjectName, proj.Name) } @@ -454,7 +454,7 @@ func TestAuthenticate(t *testing.T) { ctx := context.Background() if testData.user != "" { token, err := argocd.sessionMgr.Create(testData.user, 0, "abc") - assert.NoError(t, err) + require.NoError(t, err) ctx = metadata.NewIncomingContext(context.Background(), metadata.Pairs(apiclient.MetaDataTokenKey, token)) } @@ -462,7 +462,7 @@ func TestAuthenticate(t *testing.T) { if testData.errorMsg != "" { assert.Errorf(t, err, testData.errorMsg) } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } @@ -684,7 +684,7 @@ func TestGetClaims(t *testing.T) { if testDataCopy.expectedErrorContains != "" { assert.ErrorContains(t, err, testDataCopy.expectedErrorContains, "getClaims should have thrown an error and return an error") } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } @@ -843,7 +843,7 @@ func TestAuthenticate_3rd_party_JWTs(t *testing.T) { if testDataCopy.expectedErrorContains != "" { assert.ErrorContains(t, err, testDataCopy.expectedErrorContains, "Authenticate should have thrown an error and blocked the request") } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } @@ -886,7 +886,7 @@ func TestAuthenticate_no_request_metadata(t *testing.T) { if testDataCopy.expectedErrorContains != "" { assert.ErrorContains(t, err, testDataCopy.expectedErrorContains, "Authenticate should have thrown an error and blocked the request") } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } @@ -935,7 +935,7 @@ func TestAuthenticate_no_SSO(t *testing.T) { if testDataCopy.expectedErrorMessage != "" { assert.ErrorContains(t, err, testDataCopy.expectedErrorMessage, "Authenticate should have thrown an error and blocked the request") } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } @@ -1040,7 +1040,7 @@ func TestAuthenticate_bad_request_metadata(t *testing.T) { if testDataCopy.expectedErrorMessage != "" { assert.ErrorContains(t, err, testDataCopy.expectedErrorMessage, "Authenticate should have thrown an error and blocked the request") } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } @@ -1078,7 +1078,7 @@ func TestTranslateGrpcCookieHeader(t *testing.T) { err := argocd.translateGrpcCookieHeader(context.Background(), recorder, &session.SessionResponse{ Token: "xyz", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "argocd.token=xyz; path=/; SameSite=lax; httpOnly; Secure", recorder.Result().Header.Get("Set-Cookie")) assert.Len(t, recorder.Result().Cookies(), 1) }) @@ -1088,7 +1088,7 @@ func TestTranslateGrpcCookieHeader(t *testing.T) { err := argocd.translateGrpcCookieHeader(context.Background(), recorder, &session.SessionResponse{ Token: "abc.xyz." + strings.Repeat("x", 4093), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Regexp(t, "argocd.token=.*; path=/; SameSite=lax; httpOnly; Secure", recorder.Result().Header.Get("Set-Cookie")) assert.Len(t, recorder.Result().Cookies(), 2) }) @@ -1098,7 +1098,7 @@ func TestTranslateGrpcCookieHeader(t *testing.T) { err := argocd.translateGrpcCookieHeader(context.Background(), recorder, &session.SessionResponse{ Token: "", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "", recorder.Result().Header.Get("Set-Cookie")) }) } @@ -1112,16 +1112,12 @@ func TestInitializeDefaultProject_ProjectDoesNotExist(t *testing.T) { } err := initializeDefaultProject(argoCDOpts) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) proj, err := argoCDOpts.AppClientset.ArgoprojV1alpha1(). AppProjects(test.FakeArgoCDNamespace).Get(context.Background(), v1alpha1.DefaultAppProjectName, metav1.GetOptions{}) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) assert.Equal(t, v1alpha1.AppProjectSpec{ SourceRepos: []string{"*"}, @@ -1150,16 +1146,12 @@ func TestInitializeDefaultProject_ProjectAlreadyInitialized(t *testing.T) { } err := initializeDefaultProject(argoCDOpts) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) proj, err := argoCDOpts.AppClientset.ArgoprojV1alpha1(). AppProjects(test.FakeArgoCDNamespace).Get(context.Background(), v1alpha1.DefaultAppProjectName, metav1.GetOptions{}) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) assert.Equal(t, proj.Spec, existingDefaultProject.Spec) } @@ -1170,7 +1162,7 @@ func TestOIDCConfigChangeDetection_SecretsChanged(t *testing.T) { ClientID: "$k8ssecret:clientid", ClientSecret: "$k8ssecret:clientsecret", }) - assert.NoError(t, err, "no error expected when marshalling OIDC config") + require.NoError(t, err, "no error expected when marshalling OIDC config") originalSecrets := map[string]string{"k8ssecret:clientid": "argocd", "k8ssecret:clientsecret": "sharedargooauthsecret"} @@ -1198,7 +1190,7 @@ func TestOIDCConfigChangeDetection_ConfigChanged(t *testing.T) { ClientSecret: "$k8ssecret:clientsecret", }) - assert.NoError(t, err, "no error expected when marshalling OIDC config") + require.NoError(t, err, "no error expected when marshalling OIDC config") originalSecrets := map[string]string{"k8ssecret:clientid": "argocd", "k8ssecret:clientsecret": "sharedargooauthsecret"} @@ -1216,7 +1208,7 @@ func TestOIDCConfigChangeDetection_ConfigChanged(t *testing.T) { ClientSecret: "$k8ssecret:clientsecret", }) - assert.NoError(t, err, "no error expected when marshalling OIDC config") + require.NoError(t, err, "no error expected when marshalling OIDC config") argoSettings.OIDCConfigRAW = string(newRawOICDConfig) result := checkOIDCConfigChange(originalOIDCConfig, &argoSettings) @@ -1235,7 +1227,7 @@ func TestOIDCConfigChangeDetection_ConfigCreated(t *testing.T) { ClientID: "$k8ssecret:clientid", ClientSecret: "$k8ssecret:clientsecret", }) - assert.NoError(t, err, "no error expected when marshalling OIDC config") + require.NoError(t, err, "no error expected when marshalling OIDC config") newSecrets := map[string]string{"k8ssecret:clientid": "argocd", "k8ssecret:clientsecret": "sharedargooauthsecret"} argoSettings.OIDCConfigRAW = string(newRawOICDConfig) argoSettings.Secrets = newSecrets @@ -1251,7 +1243,7 @@ func TestOIDCConfigChangeDetection_ConfigDeleted(t *testing.T) { ClientID: "$k8ssecret:clientid", ClientSecret: "$k8ssecret:clientsecret", }) - assert.NoError(t, err, "no error expected when marshalling OIDC config") + require.NoError(t, err, "no error expected when marshalling OIDC config") originalSecrets := map[string]string{"k8ssecret:clientid": "argocd", "k8ssecret:clientsecret": "sharedargooauthsecret"} @@ -1277,7 +1269,7 @@ func TestOIDCConfigChangeDetection_NoChange(t *testing.T) { ClientID: "$k8ssecret:clientid", ClientSecret: "$k8ssecret:clientsecret", }) - assert.NoError(t, err, "no error expected when marshalling OIDC config") + require.NoError(t, err, "no error expected when marshalling OIDC config") originalSecrets := map[string]string{"k8ssecret:clientid": "argocd", "k8ssecret:clientsecret": "sharedargooauthsecret"} @@ -1395,9 +1387,9 @@ func TestCacheControlHeaders(t *testing.T) { if testCase.createFile { tmpFile, err := os.Create(fp) - assert.NoError(t, err) + require.NoError(t, err) err = tmpFile.Close() - assert.NoError(t, err) + require.NoError(t, err) } handler(rr, req) diff --git a/server/session/ratelimiter_test.go b/server/session/ratelimiter_test.go index d33151bcbea9a..1642f1b8d400e 100644 --- a/server/session/ratelimiter_test.go +++ b/server/session/ratelimiter_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" util "github.com/argoproj/argo-cd/v2/util/io" "github.com/argoproj/argo-cd/v2/util/session" @@ -14,7 +15,7 @@ func TestRateLimiter(t *testing.T) { limiter := NewLoginRateLimiter(10) for i := 0; i < 10; i++ { closer, err := limiter() - assert.NoError(t, err) + require.NoError(t, err) closers = append(closers, closer) } // 11 request should fail @@ -25,7 +26,7 @@ func TestRateLimiter(t *testing.T) { return } // complete one request - assert.NoError(t, closers[0].Close()) + require.NoError(t, closers[0].Close()) _, err = limiter() - assert.NoError(t, err) + require.NoError(t, err) } From b3b090b086ffeae54be1d3f99760a37a0ed6626d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Jun 2024 00:31:59 +0000 Subject: [PATCH 41/74] [Bot] docs: Update Snyk reports (#18692) Signed-off-by: CI Co-authored-by: CI --- docs/snyk/index.md | 30 +- docs/snyk/master/argocd-iac-install.html | 2 +- .../master/argocd-iac-namespace-install.html | 2 +- docs/snyk/master/argocd-test.html | 165 +- .../master/ghcr.io_dexidp_dex_v2.38.0.html | 8 +- ..._docker_library_haproxy_2.6.14-alpine.html | 1873 ----------------- ..._docker_library_haproxy_2.6.17-alpine.html | 890 ++++++++ ...ws_docker_library_redis_7.0.15-alpine.html | 224 +- .../quay.io_argoproj_argocd_latest.html | 307 +-- docs/snyk/master/redis_7.0.15-alpine.html | 224 +- docs/snyk/v2.10.12/argocd-iac-install.html | 2 +- .../argocd-iac-namespace-install.html | 2 +- docs/snyk/v2.10.12/argocd-test.html | 99 +- .../v2.10.12/ghcr.io_dexidp_dex_v2.37.0.html | 335 ++- docs/snyk/v2.10.12/haproxy_2.6.14-alpine.html | 334 ++- .../quay.io_argoproj_argocd_v2.10.12.html | 3 +- docs/snyk/v2.10.12/redis_7.0.15-alpine.html | 224 +- docs/snyk/v2.11.3/argocd-iac-install.html | 2 +- .../v2.11.3/argocd-iac-namespace-install.html | 2 +- docs/snyk/v2.11.3/argocd-test.html | 99 +- .../v2.11.3/ghcr.io_dexidp_dex_v2.38.0.html | 8 +- docs/snyk/v2.11.3/haproxy_2.6.14-alpine.html | 334 ++- .../quay.io_argoproj_argocd_v2.11.3.html | 3 +- docs/snyk/v2.11.3/redis_7.0.14-alpine.html | 8 +- docs/snyk/v2.9.17/argocd-iac-install.html | 2 +- .../v2.9.17/argocd-iac-namespace-install.html | 2 +- docs/snyk/v2.9.17/argocd-test.html | 99 +- .../v2.9.17/ghcr.io_dexidp_dex_v2.37.0.html | 335 ++- docs/snyk/v2.9.17/haproxy_2.6.14-alpine.html | 334 ++- .../quay.io_argoproj_argocd_v2.9.17.html | 3 +- docs/snyk/v2.9.17/redis_7.0.15-alpine.html | 224 +- 31 files changed, 3885 insertions(+), 2294 deletions(-) delete mode 100644 docs/snyk/master/public.ecr.aws_docker_library_haproxy_2.6.14-alpine.html create mode 100644 docs/snyk/master/public.ecr.aws_docker_library_haproxy_2.6.17-alpine.html diff --git a/docs/snyk/index.md b/docs/snyk/index.md index cb6ab74e6574d..0b14ff28d76d5 100644 --- a/docs/snyk/index.md +++ b/docs/snyk/index.md @@ -13,13 +13,13 @@ recent minor releases. | | Critical | High | Medium | Low | |---:|:--------:|:----:|:------:|:---:| -| [go.mod](master/argocd-test.html) | 0 | 0 | 6 | 0 | +| [go.mod](master/argocd-test.html) | 0 | 0 | 7 | 0 | | [ui/yarn.lock](master/argocd-test.html) | 0 | 0 | 1 | 0 | | [dex:v2.38.0](master/ghcr.io_dexidp_dex_v2.38.0.html) | 0 | 0 | 6 | 3 | -| [haproxy:2.6.14-alpine](master/public.ecr.aws_docker_library_haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 | -| [redis:7.0.15-alpine](master/public.ecr.aws_docker_library_redis_7.0.15-alpine.html) | 0 | 0 | 0 | 1 | -| [argocd:latest](master/quay.io_argoproj_argocd_latest.html) | 0 | 0 | 3 | 12 | -| [redis:7.0.15-alpine](master/redis_7.0.15-alpine.html) | 0 | 0 | 0 | 1 | +| [haproxy:2.6.17-alpine](master/public.ecr.aws_docker_library_haproxy_2.6.17-alpine.html) | 0 | 0 | 2 | 1 | +| [redis:7.0.15-alpine](master/public.ecr.aws_docker_library_redis_7.0.15-alpine.html) | 0 | 0 | 2 | 1 | +| [argocd:latest](master/quay.io_argoproj_argocd_latest.html) | 0 | 0 | 3 | 11 | +| [redis:7.0.15-alpine](master/redis_7.0.15-alpine.html) | 0 | 0 | 2 | 1 | | [install.yaml](master/argocd-iac-install.html) | - | - | - | - | | [namespace-install.yaml](master/argocd-iac-namespace-install.html) | - | - | - | - | @@ -27,10 +27,10 @@ recent minor releases. | | Critical | High | Medium | Low | |---:|:--------:|:----:|:------:|:---:| -| [go.mod](v2.11.3/argocd-test.html) | 0 | 1 | 6 | 0 | +| [go.mod](v2.11.3/argocd-test.html) | 0 | 1 | 7 | 0 | | [ui/yarn.lock](v2.11.3/argocd-test.html) | 0 | 0 | 1 | 0 | | [dex:v2.38.0](v2.11.3/ghcr.io_dexidp_dex_v2.38.0.html) | 0 | 0 | 6 | 3 | -| [haproxy:2.6.14-alpine](v2.11.3/haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 | +| [haproxy:2.6.14-alpine](v2.11.3/haproxy_2.6.14-alpine.html) | 0 | 1 | 7 | 3 | | [argocd:v2.11.3](v2.11.3/quay.io_argoproj_argocd_v2.11.3.html) | 0 | 0 | 4 | 19 | | [redis:7.0.14-alpine](v2.11.3/redis_7.0.14-alpine.html) | 0 | 0 | 6 | 3 | | [install.yaml](v2.11.3/argocd-iac-install.html) | - | - | - | - | @@ -40,12 +40,12 @@ recent minor releases. | | Critical | High | Medium | Low | |---:|:--------:|:----:|:------:|:---:| -| [go.mod](v2.10.12/argocd-test.html) | 0 | 1 | 7 | 0 | +| [go.mod](v2.10.12/argocd-test.html) | 0 | 1 | 8 | 0 | | [ui/yarn.lock](v2.10.12/argocd-test.html) | 0 | 0 | 1 | 0 | -| [dex:v2.37.0](v2.10.12/ghcr.io_dexidp_dex_v2.37.0.html) | 1 | 1 | 7 | 3 | -| [haproxy:2.6.14-alpine](v2.10.12/haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 | +| [dex:v2.37.0](v2.10.12/ghcr.io_dexidp_dex_v2.37.0.html) | 1 | 1 | 10 | 3 | +| [haproxy:2.6.14-alpine](v2.10.12/haproxy_2.6.14-alpine.html) | 0 | 1 | 7 | 3 | | [argocd:v2.10.12](v2.10.12/quay.io_argoproj_argocd_v2.10.12.html) | 0 | 0 | 4 | 19 | -| [redis:7.0.15-alpine](v2.10.12/redis_7.0.15-alpine.html) | 0 | 0 | 0 | 1 | +| [redis:7.0.15-alpine](v2.10.12/redis_7.0.15-alpine.html) | 0 | 0 | 2 | 1 | | [install.yaml](v2.10.12/argocd-iac-install.html) | - | - | - | - | | [namespace-install.yaml](v2.10.12/argocd-iac-namespace-install.html) | - | - | - | - | @@ -53,11 +53,11 @@ recent minor releases. | | Critical | High | Medium | Low | |---:|:--------:|:----:|:------:|:---:| -| [go.mod](v2.9.17/argocd-test.html) | 0 | 2 | 7 | 0 | +| [go.mod](v2.9.17/argocd-test.html) | 0 | 2 | 8 | 0 | | [ui/yarn.lock](v2.9.17/argocd-test.html) | 0 | 0 | 1 | 0 | -| [dex:v2.37.0](v2.9.17/ghcr.io_dexidp_dex_v2.37.0.html) | 1 | 1 | 7 | 3 | -| [haproxy:2.6.14-alpine](v2.9.17/haproxy_2.6.14-alpine.html) | 0 | 1 | 4 | 3 | +| [dex:v2.37.0](v2.9.17/ghcr.io_dexidp_dex_v2.37.0.html) | 1 | 1 | 10 | 3 | +| [haproxy:2.6.14-alpine](v2.9.17/haproxy_2.6.14-alpine.html) | 0 | 1 | 7 | 3 | | [argocd:v2.9.17](v2.9.17/quay.io_argoproj_argocd_v2.9.17.html) | 0 | 0 | 4 | 19 | -| [redis:7.0.15-alpine](v2.9.17/redis_7.0.15-alpine.html) | 0 | 0 | 0 | 1 | +| [redis:7.0.15-alpine](v2.9.17/redis_7.0.15-alpine.html) | 0 | 0 | 2 | 1 | | [install.yaml](v2.9.17/argocd-iac-install.html) | - | - | - | - | | [namespace-install.yaml](v2.9.17/argocd-iac-namespace-install.html) | - | - | - | - | diff --git a/docs/snyk/master/argocd-iac-install.html b/docs/snyk/master/argocd-iac-install.html index f74c2f0e929c8..7c5eefc353e7c 100644 --- a/docs/snyk/master/argocd-iac-install.html +++ b/docs/snyk/master/argocd-iac-install.html @@ -456,7 +456,7 @@

Snyk test report

-

June 9th 2024, 12:19:14 am (UTC+00:00)

+

June 16th 2024, 12:18:10 am (UTC+00:00)

Scanned the following path: diff --git a/docs/snyk/master/argocd-iac-namespace-install.html b/docs/snyk/master/argocd-iac-namespace-install.html index d7b52a6c47fc4..2a7537570f30a 100644 --- a/docs/snyk/master/argocd-iac-namespace-install.html +++ b/docs/snyk/master/argocd-iac-namespace-install.html @@ -456,7 +456,7 @@

Snyk test report

-

June 9th 2024, 12:19:24 am (UTC+00:00)

+

June 16th 2024, 12:18:18 am (UTC+00:00)

Scanned the following path: diff --git a/docs/snyk/master/argocd-test.html b/docs/snyk/master/argocd-test.html index 8d38da379238d..052e1be87ae85 100644 --- a/docs/snyk/master/argocd-test.html +++ b/docs/snyk/master/argocd-test.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

Snyk test report

-

June 9th 2024, 12:17:05 am (UTC+00:00)

+

June 16th 2024, 12:16:13 am (UTC+00:00)

Scanned the following paths: @@ -467,8 +467,8 @@

Snyk test report

-
7 known vulnerabilities
-
25 vulnerable dependency paths
+
8 known vulnerabilities
+
26 vulnerable dependency paths
2059 dependencies
@@ -710,7 +710,7 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/hashicorp/go-retryablehttp@0.7.4 @@ -732,9 +732,9 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/subscriptions@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/subscriptions@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/hashicorp/go-retryablehttp@0.7.4 @@ -745,9 +745,9 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/cmd@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/cmd@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/hashicorp/go-retryablehttp@0.7.4 @@ -758,7 +758,7 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/opsgenie/opsgenie-go-sdk-v2/client@1.0.5 @@ -771,11 +771,11 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/api@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/api@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/subscriptions@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/subscriptions@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/hashicorp/go-retryablehttp@0.7.4 @@ -786,11 +786,11 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/controller@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/controller@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/subscriptions@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/subscriptions@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/hashicorp/go-retryablehttp@0.7.4 @@ -801,9 +801,9 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/subscriptions@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/subscriptions@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/opsgenie/opsgenie-go-sdk-v2/client@1.0.5 @@ -816,9 +816,9 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/cmd@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/cmd@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/opsgenie/opsgenie-go-sdk-v2/client@1.0.5 @@ -831,11 +831,11 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/api@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/api@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/subscriptions@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/subscriptions@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/opsgenie/opsgenie-go-sdk-v2/client@1.0.5 @@ -848,11 +848,11 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/controller@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/controller@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/subscriptions@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/subscriptions@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/opsgenie/opsgenie-go-sdk-v2/client@1.0.5 @@ -951,7 +951,7 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/opsgenie/opsgenie-go-sdk-v2/client@1.0.5 @@ -966,9 +966,9 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/subscriptions@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/subscriptions@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/opsgenie/opsgenie-go-sdk-v2/client@1.0.5 @@ -983,9 +983,9 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/cmd@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/cmd@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/opsgenie/opsgenie-go-sdk-v2/client@1.0.5 @@ -1000,11 +1000,11 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/api@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/api@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/subscriptions@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/subscriptions@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/opsgenie/opsgenie-go-sdk-v2/client@1.0.5 @@ -1019,11 +1019,11 @@

Detailed paths

Introduced through: github.com/argoproj/argo-cd/v2@0.0.0 - github.com/argoproj/notifications-engine/pkg/controller@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/controller@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/subscriptions@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/subscriptions@#0802cd427621 - github.com/argoproj/notifications-engine/pkg/services@#f48567108f01 + github.com/argoproj/notifications-engine/pkg/services@#0802cd427621 github.com/opsgenie/opsgenie-go-sdk-v2/client@1.0.5 @@ -1108,6 +1108,97 @@

Detailed paths

More about this vulnerability

+
+
+

Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')

+
+ +
+ medium severity +
+ +
+ +
    +
  • + Manifest file: /argo-cd/argoproj/argo-cd/v2 go.mod +
  • +
  • + Package Manager: golang +
  • +
  • + Vulnerable module: + + github.com/Azure/azure-sdk-for-go/sdk/azidentity +
  • + +
  • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, github.com/Azure/kubelogin/pkg/token@0.0.20 and others +
  • +
+ +
+ + +

Detailed paths

+ +
    +
  • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/Azure/kubelogin/pkg/token@0.0.20 + + github.com/Azure/azure-sdk-for-go/sdk/azidentity@1.1.0 + + + +
  • +
+ +
+ +
+ +

Overview

+

github.com/Azure/azure-sdk-for-go/sdk/azidentity is a module that provides Microsoft Entra ID (formerly Azure Active Directory) token authentication support across the Azure SDK. It includes a set of TokenCredential implementations, which can be used with Azure SDK clients supporting token authentication.

+

Affected versions of this package are vulnerable to Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition') in the authentication process. An attacker can elevate privileges by exploiting race conditions during the token validation steps. This is only exploitable if the application is configured to use multiple threads or processes for handling authentication requests.

+

Notes:

+
    +
  1. An attacker who successfully exploited the vulnerability could elevate privileges and read any file on the file system with SYSTEM access permissions;

    +
  2. +
  3. An attacker who successfully exploits this vulnerability can only obtain read access to the system files by exploiting this vulnerability. The attacker cannot perform write or delete operations on the files;

    +
  4. +
  5. The vulnerability exists in the following credential types: DefaultAzureCredential and ManagedIdentityCredential;

    +
  6. +
  7. The vulnerability exists in the following credential types:

    +
  8. +
+

ManagedIdentityApplication (.NET)

+

ManagedIdentityApplication (Java)

+

ManagedIdentityApplication (Node.js)

+

Remediation

+

Upgrade github.com/Azure/azure-sdk-for-go/sdk/azidentity to version 1.6.0 or higher.

+

References

+ + +
+ + +

Template Injection

diff --git a/docs/snyk/master/ghcr.io_dexidp_dex_v2.38.0.html b/docs/snyk/master/ghcr.io_dexidp_dex_v2.38.0.html index d40353a4bf54d..ab099a1d4273b 100644 --- a/docs/snyk/master/ghcr.io_dexidp_dex_v2.38.0.html +++ b/docs/snyk/master/ghcr.io_dexidp_dex_v2.38.0.html @@ -456,7 +456,7 @@

Snyk test report

-

June 9th 2024, 12:17:15 am (UTC+00:00)

+

June 16th 2024, 12:16:20 am (UTC+00:00)

Scanned the following paths: @@ -2715,7 +2715,7 @@

NVD Description

See How to fix? for Alpine:3.19 relevant fixed versions and status.

A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

Remediation

-

Upgrade Alpine:3.19 busybox to version 1.36.1-r17 or higher.

+

Upgrade Alpine:3.19 busybox to version 1.36.1-r19 or higher.

References


diff --git a/docs/snyk/master/public.ecr.aws_docker_library_haproxy_2.6.14-alpine.html b/docs/snyk/master/public.ecr.aws_docker_library_haproxy_2.6.14-alpine.html deleted file mode 100644 index 7d01aa66d0d18..0000000000000 --- a/docs/snyk/master/public.ecr.aws_docker_library_haproxy_2.6.14-alpine.html +++ /dev/null @@ -1,1873 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
-
-
-
- - - Snyk - Open Source Security - - - - - - - -
-

Snyk test report

- -

June 9th 2024, 12:17:22 am (UTC+00:00)

-
-
- Scanned the following path: -
    -
  • public.ecr.aws/docker/library/haproxy:2.6.14-alpine/docker/library/haproxy (apk)
  • -
-
- -
-
8 known vulnerabilities
-
68 vulnerable dependency paths
-
18 dependencies
-
-
-
-
-
- - - - - - - -
Project docker-image|public.ecr.aws/docker/library/haproxy
Path public.ecr.aws/docker/library/haproxy:2.6.14-alpine/docker/library/haproxy
Package Manager apk
-
-
-
-
-

CVE-2023-5363

-
- -
- high severity -
- -
- -
    -
  • - Package Manager: alpine:3.18 -
  • -
  • - Vulnerable module: - - openssl/libcrypto3 -
  • - -
  • Introduced through: - - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine and openssl/libcrypto3@3.1.2-r0 - -
  • -
- -
- - -

Detailed paths

- -
    -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
- -
- -
- -

NVD Description

-

Note: Versions mentioned in the description apply only to the upstream openssl package and not the openssl package as distributed by Alpine. - See How to fix? for Alpine:3.18 relevant fixed versions and status.

-

Issue summary: A bug has been identified in the processing of key and - initialisation vector (IV) lengths. This can lead to potential truncation - or overruns during the initialisation of some symmetric ciphers.

-

Impact summary: A truncation in the IV can result in non-uniqueness, - which could result in loss of confidentiality for some cipher modes.

-

When calling EVP_EncryptInit_ex2(), EVP_DecryptInit_ex2() or - EVP_CipherInit_ex2() the provided OSSL_PARAM array is processed after - the key and IV have been established. Any alterations to the key length, - via the "keylen" parameter or the IV length, via the "ivlen" parameter, - within the OSSL_PARAM array will not take effect as intended, potentially - causing truncation or overreading of these values. The following ciphers - and cipher modes are impacted: RC2, RC4, RC5, CCM, GCM and OCB.

-

For the CCM, GCM and OCB cipher modes, truncation of the IV can result in - loss of confidentiality. For example, when following NIST's SP 800-38D - section 8.2.1 guidance for constructing a deterministic IV for AES in - GCM mode, truncation of the counter portion could lead to IV reuse.

-

Both truncations and overruns of the key and overruns of the IV will - produce incorrect results and could, in some cases, trigger a memory - exception. However, these issues are not currently assessed as security - critical.

-

Changing the key and/or IV lengths is not considered to be a common operation - and the vulnerable API was recently introduced. Furthermore it is likely that - application developers will have spotted this problem during testing since - decryption would fail unless both peers in the communication were similarly - vulnerable. For these reasons we expect the probability of an application being - vulnerable to this to be quite low. However if an application is vulnerable then - this issue is considered very serious. For these reasons we have assessed this - issue as Moderate severity overall.

-

The OpenSSL SSL/TLS implementation is not affected by this issue.

-

The OpenSSL 3.0 and 3.1 FIPS providers are not affected by this because - the issue lies outside of the FIPS provider boundary.

-

OpenSSL 3.1 and 3.0 are vulnerable to this issue.

-

Remediation

-

Upgrade Alpine:3.18 openssl to version 3.1.4-r0 or higher.

-

References

- - -
- - - -
-
-

Improper Check for Unusual or Exceptional Conditions

-
- -
- medium severity -
- -
- -
    -
  • - Package Manager: alpine:3.18 -
  • -
  • - Vulnerable module: - - openssl/libcrypto3 -
  • - -
  • Introduced through: - - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine and openssl/libcrypto3@3.1.2-r0 - -
  • -
- -
- - -

Detailed paths

- -
    -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
- -
- -
- -

NVD Description

-

Note: Versions mentioned in the description apply only to the upstream openssl package and not the openssl package as distributed by Alpine. - See How to fix? for Alpine:3.18 relevant fixed versions and status.

-

Issue summary: Generating excessively long X9.42 DH keys or checking - excessively long X9.42 DH keys or parameters may be very slow.

-

Impact summary: Applications that use the functions DH_generate_key() to - generate an X9.42 DH key may experience long delays. Likewise, applications - that use DH_check_pub_key(), DH_check_pub_key_ex() or EVP_PKEY_public_check() - to check an X9.42 DH key or X9.42 DH parameters may experience long delays. - Where the key or parameters that are being checked have been obtained from - an untrusted source this may lead to a Denial of Service.

-

While DH_check() performs all the necessary checks (as of CVE-2023-3817), - DH_check_pub_key() doesn't make any of these checks, and is therefore - vulnerable for excessively large P and Q parameters.

-

Likewise, while DH_generate_key() performs a check for an excessively large - P, it doesn't check for an excessively large Q.

-

An application that calls DH_generate_key() or DH_check_pub_key() and - supplies a key or parameters obtained from an untrusted source could be - vulnerable to a Denial of Service attack.

-

DH_generate_key() and DH_check_pub_key() are also called by a number of - other OpenSSL functions. An application calling any of those other - functions may similarly be affected. The other functions affected by this - are DH_check_pub_key_ex(), EVP_PKEY_public_check(), and EVP_PKEY_generate().

-

Also vulnerable are the OpenSSL pkey command line application when using the - "-pubcheck" option, as well as the OpenSSL genpkey command line application.

-

The OpenSSL SSL/TLS implementation is not affected by this issue.

-

The OpenSSL 3.0 and 3.1 FIPS providers are not affected by this issue.

-

Remediation

-

Upgrade Alpine:3.18 openssl to version 3.1.4-r1 or higher.

-

References

- - -
- - - -
-
-

Out-of-bounds Write

-
- -
- medium severity -
- -
- -
    -
  • - Package Manager: alpine:3.18 -
  • -
  • - Vulnerable module: - - openssl/libcrypto3 -
  • - -
  • Introduced through: - - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine and openssl/libcrypto3@3.1.2-r0 - -
  • -
- -
- - -

Detailed paths

- -
    -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
- -
- -
- -

NVD Description

-

Note: Versions mentioned in the description apply only to the upstream openssl package and not the openssl package as distributed by Alpine. - See How to fix? for Alpine:3.18 relevant fixed versions and status.

-

Issue summary: The POLY1305 MAC (message authentication code) implementation - contains a bug that might corrupt the internal state of applications running - on PowerPC CPU based platforms if the CPU provides vector instructions.

-

Impact summary: If an attacker can influence whether the POLY1305 MAC - algorithm is used, the application state might be corrupted with various - application dependent consequences.

-

The POLY1305 MAC (message authentication code) implementation in OpenSSL for - PowerPC CPUs restores the contents of vector registers in a different order - than they are saved. Thus the contents of some of these vector registers - are corrupted when returning to the caller. The vulnerable code is used only - on newer PowerPC processors supporting the PowerISA 2.07 instructions.

-

The consequences of this kind of internal application state corruption can - be various - from no consequences, if the calling application does not - depend on the contents of non-volatile XMM registers at all, to the worst - consequences, where the attacker could get complete control of the application - process. However unless the compiler uses the vector registers for storing - pointers, the most likely consequence, if any, would be an incorrect result - of some application dependent calculations or a crash leading to a denial of - service.

-

The POLY1305 MAC algorithm is most frequently used as part of the - CHACHA20-POLY1305 AEAD (authenticated encryption with associated data) - algorithm. The most common usage of this AEAD cipher is with TLS protocol - versions 1.2 and 1.3. If this cipher is enabled on the server a malicious - client can influence whether this AEAD cipher is used. This implies that - TLS server applications using OpenSSL can be potentially impacted. However - we are currently not aware of any concrete application that would be affected - by this issue therefore we consider this a Low severity security issue.

-

Remediation

-

Upgrade Alpine:3.18 openssl to version 3.1.4-r3 or higher.

-

References

- - -
- - - -
-
-

CVE-2024-0727

-
- -
- medium severity -
- -
- -
    -
  • - Package Manager: alpine:3.18 -
  • -
  • - Vulnerable module: - - openssl/libcrypto3 -
  • - -
  • Introduced through: - - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine and openssl/libcrypto3@3.1.2-r0 - -
  • -
- -
- - -

Detailed paths

- -
    -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
- -
- -
- -

NVD Description

-

Note: Versions mentioned in the description apply only to the upstream openssl package and not the openssl package as distributed by Alpine. - See How to fix? for Alpine:3.18 relevant fixed versions and status.

-

Issue summary: Processing a maliciously formatted PKCS12 file may lead OpenSSL - to crash leading to a potential Denial of Service attack

-

Impact summary: Applications loading files in the PKCS12 format from untrusted - sources might terminate abruptly.

-

A file in PKCS12 format can contain certificates and keys and may come from an - untrusted source. The PKCS12 specification allows certain fields to be NULL, but - OpenSSL does not correctly check for this case. This can lead to a NULL pointer - dereference that results in OpenSSL crashing. If an application processes PKCS12 - files from an untrusted source using the OpenSSL APIs then that application will - be vulnerable to this issue.

-

OpenSSL APIs that are vulnerable to this are: PKCS12_parse(), - PKCS12_unpack_p7data(), PKCS12_unpack_p7encdata(), PKCS12_unpack_authsafes() - and PKCS12_newpass().

-

We have also fixed a similar issue in SMIME_write_PKCS7(). However since this - function is related to writing data we do not consider it security significant.

-

The FIPS modules in 3.2, 3.1 and 3.0 are not affected by this issue.

-

Remediation

-

Upgrade Alpine:3.18 openssl to version 3.1.4-r5 or higher.

-

References

- - -
- - - -
-
-

Out-of-bounds Write

-
- -
- medium severity -
- -
- -
    -
  • - Package Manager: alpine:3.18 -
  • -
  • - Vulnerable module: - - busybox/busybox -
  • - -
  • Introduced through: - - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine and busybox/busybox@1.36.1-r2 - -
  • -
- -
- - -

Detailed paths

- -
    -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/busybox@1.36.1-r2 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - alpine-baselayout/alpine-baselayout@3.4.3-r1 - - busybox/busybox-binsh@1.36.1-r2 - - busybox/busybox@1.36.1-r2 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/busybox-binsh@1.36.1-r2 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - alpine-baselayout/alpine-baselayout@3.4.3-r1 - - busybox/busybox-binsh@1.36.1-r2 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - - -
  • -
- -
- -
- -

NVD Description

-

Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. - See How to fix? for Alpine:3.18 relevant fixed versions and status.

-

A heap-buffer-overflow was discovered in BusyBox v.1.36.1 in the next_token function at awk.c:1159.

-

Remediation

-

Upgrade Alpine:3.18 busybox to version 1.36.1-r6 or higher.

-

References

- - -
- - - -
-
-

CVE-2023-6237

-
- -
- low severity -
- -
- -
    -
  • - Package Manager: alpine:3.18 -
  • -
  • - Vulnerable module: - - openssl/libcrypto3 -
  • - -
  • Introduced through: - - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine and openssl/libcrypto3@3.1.2-r0 - -
  • -
- -
- - -

Detailed paths

- -
    -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
- -
- -
- -

NVD Description

-

Note: Versions mentioned in the description apply only to the upstream openssl package and not the openssl package as distributed by Alpine. - See How to fix? for Alpine:3.18 relevant fixed versions and status.

-

Issue summary: Checking excessively long invalid RSA public keys may take - a long time.

-

Impact summary: Applications that use the function EVP_PKEY_public_check() - to check RSA public keys may experience long delays. Where the key that - is being checked has been obtained from an untrusted source this may lead - to a Denial of Service.

-

When function EVP_PKEY_public_check() is called on RSA public keys, - a computation is done to confirm that the RSA modulus, n, is composite. - For valid RSA keys, n is a product of two or more large primes and this - computation completes quickly. However, if n is an overly large prime, - then this computation would take a long time.

-

An application that calls EVP_PKEY_public_check() and supplies an RSA key - obtained from an untrusted source could be vulnerable to a Denial of Service - attack.

-

The function EVP_PKEY_public_check() is not called from other OpenSSL - functions however it is called from the OpenSSL pkey command line - application. For that reason that application is also vulnerable if used - with the '-pubin' and '-check' options on untrusted data.

-

The OpenSSL SSL/TLS implementation is not affected by this issue.

-

The OpenSSL 3.0 and 3.1 FIPS providers are affected by this issue.

-

Remediation

-

Upgrade Alpine:3.18 openssl to version 3.1.4-r4 or higher.

-

References

- - -
- - - -
-
-

CVE-2024-2511

-
- -
- low severity -
- -
- -
    -
  • - Package Manager: alpine:3.18 -
  • -
  • - Vulnerable module: - - openssl/libcrypto3 -
  • - -
  • Introduced through: - - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine and openssl/libcrypto3@3.1.2-r0 - -
  • -
- -
- - -

Detailed paths

- -
    -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
- -
- -
- -

NVD Description

-

Note: Versions mentioned in the description apply only to the upstream openssl package and not the openssl package as distributed by Alpine. - See How to fix? for Alpine:3.18 relevant fixed versions and status.

-

Issue summary: Some non-default TLS server configurations can cause unbounded - memory growth when processing TLSv1.3 sessions

-

Impact summary: An attacker may exploit certain server configurations to trigger - unbounded memory growth that would lead to a Denial of Service

-

This problem can occur in TLSv1.3 if the non-default SSL_OP_NO_TICKET option is - being used (but not if early_data support is also configured and the default - anti-replay protection is in use). In this case, under certain conditions, the - session cache can get into an incorrect state and it will fail to flush properly - as it fills. The session cache will continue to grow in an unbounded manner. A - malicious client could deliberately create the scenario for this failure to - force a Denial of Service. It may also happen by accident in normal operation.

-

This issue only affects TLS servers supporting TLSv1.3. It does not affect TLS - clients.

-

The FIPS modules in 3.2, 3.1 and 3.0 are not affected by this issue. OpenSSL - 1.0.2 is also not affected by this issue.

-

Remediation

-

Upgrade Alpine:3.18 openssl to version 3.1.4-r6 or higher.

-

References

- - -
- - - -
-
-

CVE-2024-4603

-
- -
- low severity -
- -
- -
    -
  • - Package Manager: alpine:3.18 -
  • -
  • - Vulnerable module: - - openssl/libcrypto3 -
  • - -
  • Introduced through: - - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine and openssl/libcrypto3@3.1.2-r0 - -
  • -
- -
- - -

Detailed paths

- -
    -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - openssl/libcrypto3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - .haproxy-rundeps@20230809.001942 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - apk-tools/apk-tools@2.14.0-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
  • - Introduced through: - docker-image|public.ecr.aws/docker/library/haproxy@2.6.14-alpine - - busybox/ssl_client@1.36.1-r2 - - openssl/libssl3@3.1.2-r0 - - - -
  • -
- -
- -
- -

NVD Description

-

Note: Versions mentioned in the description apply only to the upstream openssl package and not the openssl package as distributed by Alpine. - See How to fix? for Alpine:3.18 relevant fixed versions and status.

-

Issue summary: Checking excessively long DSA keys or parameters may be very - slow.

-

Impact summary: Applications that use the functions EVP_PKEY_param_check() - or EVP_PKEY_public_check() to check a DSA public key or DSA parameters may - experience long delays. Where the key or parameters that are being checked - have been obtained from an untrusted source this may lead to a Denial of - Service.

-

The functions EVP_PKEY_param_check() or EVP_PKEY_public_check() perform - various checks on DSA parameters. Some of those computations take a long time - if the modulus (p parameter) is too large.

-

Trying to use a very large modulus is slow and OpenSSL will not allow using - public keys with a modulus which is over 10,000 bits in length for signature - verification. However the key and parameter check functions do not limit - the modulus size when performing the checks.

-

An application that calls EVP_PKEY_param_check() or EVP_PKEY_public_check() - and supplies a key or parameters obtained from an untrusted source could be - vulnerable to a Denial of Service attack.

-

These functions are not called by OpenSSL itself on untrusted DSA keys so - only applications that directly call these functions may be vulnerable.

-

Also vulnerable are the OpenSSL pkey and pkeyparam command line applications - when using the -check option.

-

The OpenSSL SSL/TLS implementation is not affected by this issue.

-

The OpenSSL 3.0 and 3.1 FIPS providers are affected by this issue.

-

Remediation

-

Upgrade Alpine:3.18 openssl to version 3.1.5-r0 or higher.

-

References

- - -
- - - -
-
-
-
- - - diff --git a/docs/snyk/master/public.ecr.aws_docker_library_haproxy_2.6.17-alpine.html b/docs/snyk/master/public.ecr.aws_docker_library_haproxy_2.6.17-alpine.html new file mode 100644 index 0000000000000..c56a47dcd2455 --- /dev/null +++ b/docs/snyk/master/public.ecr.aws_docker_library_haproxy_2.6.17-alpine.html @@ -0,0 +1,890 @@ + + + + + + + + + Snyk test report + + + + + + + + + +
+
+
+
+ + + Snyk - Open Source Security + + + + + + + +
+

Snyk test report

+ +

June 16th 2024, 12:16:25 am (UTC+00:00)

+
+
+ Scanned the following path: +
    +
  • public.ecr.aws/docker/library/haproxy:2.6.17-alpine/docker/library/haproxy (apk)
  • +
+
+ +
+
3 known vulnerabilities
+
22 vulnerable dependency paths
+
18 dependencies
+
+
+
+
+
+ + + + + + + +
Project docker-image|public.ecr.aws/docker/library/haproxy
Path public.ecr.aws/docker/library/haproxy:2.6.17-alpine/docker/library/haproxy
Package Manager apk
+
+
+
+
+

Use After Free

+
+ +
+ medium severity +
+ +
+ +
    +
  • + Package Manager: alpine:3.20 +
  • +
  • + Vulnerable module: + + busybox/busybox +
  • + +
  • Introduced through: + + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine and busybox/busybox@1.36.1-r28 + +
  • +
+ +
+ + +

Detailed paths

+ +
    +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + busybox/busybox@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + busybox/busybox@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + busybox/busybox-binsh@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + ca-certificates/ca-certificates@20240226-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + busybox/ssl_client@1.36.1-r28 + + + +
  • +
+ +
+ +
+ +

NVD Description

+

Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.20 relevant fixed versions and status.

+

A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.

+

Remediation

+

Upgrade Alpine:3.20 busybox to version 1.36.1-r29 or higher.

+

References

+ + +
+ + + +
+
+

Use After Free

+
+ +
+ medium severity +
+ +
+ +
    +
  • + Package Manager: alpine:3.20 +
  • +
  • + Vulnerable module: + + busybox/busybox +
  • + +
  • Introduced through: + + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine and busybox/busybox@1.36.1-r28 + +
  • +
+ +
+ + +

Detailed paths

+ +
    +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + busybox/busybox@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + busybox/busybox@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + busybox/busybox-binsh@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + ca-certificates/ca-certificates@20240226-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + busybox/ssl_client@1.36.1-r28 + + + +
  • +
+ +
+ +
+ +

NVD Description

+

Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.20 relevant fixed versions and status.

+

A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

+

Remediation

+

Upgrade Alpine:3.20 busybox to version 1.36.1-r29 or higher.

+

References

+ + +
+ + + +
+
+

CVE-2024-4741

+
+ +
+ low severity +
+ +
+ +
    +
  • + Package Manager: alpine:3.20 +
  • +
  • + Vulnerable module: + + openssl/libcrypto3 +
  • + +
  • Introduced through: + + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine and openssl/libcrypto3@3.3.0-r2 + +
  • +
+ +
+ + +

Detailed paths

+ +
    +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + openssl/libcrypto3@3.3.0-r2 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + .haproxy-rundeps@20240524.005458 + + openssl/libcrypto3@3.3.0-r2 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + apk-tools/apk-tools@2.14.4-r0 + + openssl/libcrypto3@3.3.0-r2 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + busybox/ssl_client@1.36.1-r28 + + openssl/libcrypto3@3.3.0-r2 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + ca-certificates/ca-certificates@20240226-r0 + + openssl/libcrypto3@3.3.0-r2 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + .haproxy-rundeps@20240524.005458 + + openssl/libssl3@3.3.0-r2 + + openssl/libcrypto3@3.3.0-r2 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + openssl/libssl3@3.3.0-r2 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + .haproxy-rundeps@20240524.005458 + + openssl/libssl3@3.3.0-r2 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + apk-tools/apk-tools@2.14.4-r0 + + openssl/libssl3@3.3.0-r2 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/haproxy@2.6.17-alpine + + busybox/ssl_client@1.36.1-r28 + + openssl/libssl3@3.3.0-r2 + + + +
  • +
+ +
+ +
+ +

NVD Description

+

This vulnerability has not been analyzed by NVD yet.

+

Remediation

+

Upgrade Alpine:3.20 openssl to version 3.3.0-r3 or higher.

+ +
+ + + +
+
+
+
+ + + diff --git a/docs/snyk/master/public.ecr.aws_docker_library_redis_7.0.15-alpine.html b/docs/snyk/master/public.ecr.aws_docker_library_redis_7.0.15-alpine.html index 6e2b7402f155d..1d67bfcaf8fc3 100644 --- a/docs/snyk/master/public.ecr.aws_docker_library_redis_7.0.15-alpine.html +++ b/docs/snyk/master/public.ecr.aws_docker_library_redis_7.0.15-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

Snyk test report

-

June 9th 2024, 12:17:28 am (UTC+00:00)

+

June 16th 2024, 12:16:29 am (UTC+00:00)

Scanned the following paths: @@ -467,8 +467,8 @@

Snyk test report

-
1 known vulnerabilities
-
9 vulnerable dependency paths
+
3 known vulnerabilities
+
19 vulnerable dependency paths
18 dependencies
@@ -477,6 +477,222 @@

Snyk test report

+
+

Use After Free

+
+ +
+ medium severity +
+ +
+ +
    +
  • + Package Manager: alpine:3.20 +
  • +
  • + Vulnerable module: + + busybox/busybox +
  • + +
  • Introduced through: + + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine and busybox/busybox@1.36.1-r28 + +
  • +
+ +
+ + +

Detailed paths

+ +
    +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine + + busybox/busybox@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + busybox/busybox@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine + + busybox/busybox-binsh@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine + + busybox/ssl_client@1.36.1-r28 + + + +
  • +
+ +
+ +
+ +

NVD Description

+

Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.20 relevant fixed versions and status.

+

A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.

+

Remediation

+

Upgrade Alpine:3.20 busybox to version 1.36.1-r29 or higher.

+

References

+ + +
+ + + +
+
+

Use After Free

+
+ +
+ medium severity +
+ +
+ +
    +
  • + Package Manager: alpine:3.20 +
  • +
  • + Vulnerable module: + + busybox/busybox +
  • + +
  • Introduced through: + + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine and busybox/busybox@1.36.1-r28 + +
  • +
+ +
+ + +

Detailed paths

+ +
    +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine + + busybox/busybox@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + busybox/busybox@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine + + busybox/busybox-binsh@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
  • +
  • + Introduced through: + docker-image|public.ecr.aws/docker/library/redis@7.0.15-alpine + + busybox/ssl_client@1.36.1-r28 + + + +
  • +
+ +
+ +
+ +

NVD Description

+

Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.20 relevant fixed versions and status.

+

A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

+

Remediation

+

Upgrade Alpine:3.20 busybox to version 1.36.1-r29 or higher.

+

References

+ + +
+ + + +

CVE-2024-4741

diff --git a/docs/snyk/master/quay.io_argoproj_argocd_latest.html b/docs/snyk/master/quay.io_argoproj_argocd_latest.html index 7f7692e03e474..39c8c86bb5d2d 100644 --- a/docs/snyk/master/quay.io_argoproj_argocd_latest.html +++ b/docs/snyk/master/quay.io_argoproj_argocd_latest.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

Snyk test report

-

June 9th 2024, 12:17:46 am (UTC+00:00)

+

June 16th 2024, 12:16:46 am (UTC+00:00)

Scanned the following paths: @@ -470,9 +470,9 @@

Snyk test report

-
23 known vulnerabilities
-
112 vulnerable dependency paths
-
2288 dependencies
+
21 known vulnerabilities
+
98 vulnerable dependency paths
+
2290 dependencies
@@ -480,77 +480,6 @@

Snyk test report

-
-

Allocation of Resources Without Limits or Throttling

-
- -
- high severity -
- -
- -
    -
  • - Manifest file: quay.io/argoproj/argocd:latest/helm/v3 /usr/local/bin/helm -
  • -
  • - Package Manager: golang -
  • -
  • - Vulnerable module: - - golang.org/x/net/http2 -
  • - -
  • Introduced through: - - helm.sh/helm/v3@* and golang.org/x/net/http2@v0.17.0 - -
  • -
- -
- - -

Detailed paths

- -
    -
  • - Introduced through: - helm.sh/helm/v3@* - - golang.org/x/net/http2@v0.17.0 - - - -
  • -
- -
- -
- -

Overview

-

golang.org/x/net/http2 is a work-in-progress HTTP/2 implementation for Go.

-

Affected versions of this package are vulnerable to Allocation of Resources Without Limits or Throttling when reading header data from CONTINUATION frames. As part of the HPACK flow, all incoming HEADERS and CONTINUATION frames are read even if their payloads exceed MaxHeaderBytes and will be discarded. An attacker can send excessive data over a connection to render it unresponsive.

-

Remediation

-

Upgrade golang.org/x/net/http2 to version 0.23.0 or higher.

-

References

- - -
- - - -

CVE-2020-22916

@@ -1462,231 +1391,6 @@

Detailed paths

More about this vulnerability

-
-
-

CVE-2023-7008

-
- -
- low severity -
- -
- -
    -
  • - Manifest file: quay.io/argoproj/argocd:latest/argoproj/argocd Dockerfile -
  • -
  • - Package Manager: ubuntu:24.04 -
  • -
  • - Vulnerable module: - - systemd/libsystemd0 -
  • - -
  • Introduced through: - - docker-image|quay.io/argoproj/argocd@latest and systemd/libsystemd0@255.4-1ubuntu8.1 - -
  • -
- -
- - -

Detailed paths

- -
    -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - systemd/libsystemd0@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - apt@2.7.14build2 - - systemd/libsystemd0@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - procps/libproc2-0@2:4.0.4-4ubuntu3 - - systemd/libsystemd0@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - procps@2:4.0.4-4ubuntu3 - - systemd/libsystemd0@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - util-linux@2.39.3-9ubuntu6 - - systemd/libsystemd0@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - util-linux/bsdutils@1:2.39.3-9ubuntu6 - - systemd/libsystemd0@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - apt@2.7.14build2 - - apt/libapt-pkg6.0t64@2.7.14build2 - - systemd/libsystemd0@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - apt@2.7.14build2 - - adduser@3.137ubuntu1 - - shadow/passwd@1:4.13+dfsg1-4ubuntu3 - - pam/libpam-modules@1.5.3-5ubuntu5.1 - - systemd/libsystemd0@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - apt@2.7.14build2 - - adduser@3.137ubuntu1 - - shadow/passwd@1:4.13+dfsg1-4ubuntu3 - - pam/libpam-modules@1.5.3-5ubuntu5.1 - - pam/libpam-modules-bin@1.5.3-5ubuntu5.1 - - systemd/libsystemd0@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - systemd/libudev1@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - libfido2/libfido2-1@1.14.0-1build3 - - systemd/libudev1@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - util-linux@2.39.3-9ubuntu6 - - systemd/libudev1@255.4-1ubuntu8.1 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - apt@2.7.14build2 - - apt/libapt-pkg6.0t64@2.7.14build2 - - systemd/libudev1@255.4-1ubuntu8.1 - - - -
  • -
- -
- -
- -

NVD Description

-

Note: Versions mentioned in the description apply only to the upstream systemd package and not the systemd package as distributed by Ubuntu. - See How to fix? for Ubuntu:24.04 relevant fixed versions and status.

-

A vulnerability was found in systemd-resolved. This issue may allow systemd-resolved to accept records of DNSSEC-signed domains even when they have no signature, allowing man-in-the-middles (or the upstream DNS resolver) to manipulate records.

-

Remediation

-

There is no fixed version for Ubuntu:24.04 systemd.

-

References

- - -
- - -

Release of Invalid Pointer or Reference

@@ -2262,6 +1966,7 @@

References

  • https://github.com/openssl/openssl/commit/9c39b3858091c152f52513c066ff2c5a47969f0d
  • https://github.com/openssl/openssl/commit/da343d0605c826ef197aceedc67e8e04f065f740
  • https://www.openssl.org/news/secadv/20240516.txt
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/2

  • diff --git a/docs/snyk/master/redis_7.0.15-alpine.html b/docs/snyk/master/redis_7.0.15-alpine.html index 8fac3b9fc37a8..acd74bb326905 100644 --- a/docs/snyk/master/redis_7.0.15-alpine.html +++ b/docs/snyk/master/redis_7.0.15-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:17:51 am (UTC+00:00)

    +

    June 16th 2024, 12:16:50 am (UTC+00:00)

    Scanned the following paths: @@ -467,8 +467,8 @@

    Snyk test report

    -
    1 known vulnerabilities
    -
    9 vulnerable dependency paths
    +
    3 known vulnerabilities
    +
    19 vulnerable dependency paths
    18 dependencies
    @@ -477,6 +477,222 @@

    Snyk test report

    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.20 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|redis@7.0.15-alpine and busybox/busybox@1.36.1-r28 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/ssl_client@1.36.1-r28 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.20 relevant fixed versions and status.

    +

    A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.

    +

    Remediation

    +

    Upgrade Alpine:3.20 busybox to version 1.36.1-r29 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.20 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|redis@7.0.15-alpine and busybox/busybox@1.36.1-r28 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/ssl_client@1.36.1-r28 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.20 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.20 busybox to version 1.36.1-r29 or higher.

    +

    References

    + + +
    + + + +

    CVE-2024-4741

    diff --git a/docs/snyk/v2.10.12/argocd-iac-install.html b/docs/snyk/v2.10.12/argocd-iac-install.html index 1707b5f7186db..6a8ba1ca661f5 100644 --- a/docs/snyk/v2.10.12/argocd-iac-install.html +++ b/docs/snyk/v2.10.12/argocd-iac-install.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:24:02 am (UTC+00:00)

    +

    June 16th 2024, 12:22:32 am (UTC+00:00)

    Scanned the following path: diff --git a/docs/snyk/v2.10.12/argocd-iac-namespace-install.html b/docs/snyk/v2.10.12/argocd-iac-namespace-install.html index 15491aa01265b..3cd5485060f32 100644 --- a/docs/snyk/v2.10.12/argocd-iac-namespace-install.html +++ b/docs/snyk/v2.10.12/argocd-iac-namespace-install.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:24:12 am (UTC+00:00)

    +

    June 16th 2024, 12:22:41 am (UTC+00:00)

    Scanned the following path: diff --git a/docs/snyk/v2.10.12/argocd-test.html b/docs/snyk/v2.10.12/argocd-test.html index 1ce7c8d2e2775..ddb502a8683df 100644 --- a/docs/snyk/v2.10.12/argocd-test.html +++ b/docs/snyk/v2.10.12/argocd-test.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:22:02 am (UTC+00:00)

    +

    June 16th 2024, 12:20:42 am (UTC+00:00)

    Scanned the following paths: @@ -467,8 +467,8 @@

    Snyk test report

    -
    9 known vulnerabilities
    -
    170 vulnerable dependency paths
    +
    10 known vulnerabilities
    +
    171 vulnerable dependency paths
    2042 dependencies
    @@ -3986,6 +3986,97 @@

    Detailed paths

    More about this vulnerability

    +
    +
    +

    Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Manifest file: /argo-cd/argoproj/argo-cd/v2 go.mod +
    • +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + github.com/Azure/azure-sdk-for-go/sdk/azidentity +
    • + +
    • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, github.com/Azure/kubelogin/pkg/token@0.0.20 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/Azure/kubelogin/pkg/token@0.0.20 + + github.com/Azure/azure-sdk-for-go/sdk/azidentity@1.1.0 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    github.com/Azure/azure-sdk-for-go/sdk/azidentity is a module that provides Microsoft Entra ID (formerly Azure Active Directory) token authentication support across the Azure SDK. It includes a set of TokenCredential implementations, which can be used with Azure SDK clients supporting token authentication.

    +

    Affected versions of this package are vulnerable to Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition') in the authentication process. An attacker can elevate privileges by exploiting race conditions during the token validation steps. This is only exploitable if the application is configured to use multiple threads or processes for handling authentication requests.

    +

    Notes:

    +
      +
    1. An attacker who successfully exploited the vulnerability could elevate privileges and read any file on the file system with SYSTEM access permissions;

      +
    2. +
    3. An attacker who successfully exploits this vulnerability can only obtain read access to the system files by exploiting this vulnerability. The attacker cannot perform write or delete operations on the files;

      +
    4. +
    5. The vulnerability exists in the following credential types: DefaultAzureCredential and ManagedIdentityCredential;

      +
    6. +
    7. The vulnerability exists in the following credential types:

      +
    8. +
    +

    ManagedIdentityApplication (.NET)

    +

    ManagedIdentityApplication (Java)

    +

    ManagedIdentityApplication (Node.js)

    +

    Remediation

    +

    Upgrade github.com/Azure/azure-sdk-for-go/sdk/azidentity to version 1.6.0 or higher.

    +

    References

    + + +
    + + +

    Template Injection

    diff --git a/docs/snyk/v2.10.12/ghcr.io_dexidp_dex_v2.37.0.html b/docs/snyk/v2.10.12/ghcr.io_dexidp_dex_v2.37.0.html index be66432fc1338..61dda6fca436a 100644 --- a/docs/snyk/v2.10.12/ghcr.io_dexidp_dex_v2.37.0.html +++ b/docs/snyk/v2.10.12/ghcr.io_dexidp_dex_v2.37.0.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:22:10 am (UTC+00:00)

    +

    June 16th 2024, 12:20:48 am (UTC+00:00)

    Scanned the following paths: @@ -469,8 +469,8 @@

    Snyk test report

    -
    46 known vulnerabilities
    -
    142 vulnerable dependency paths
    +
    49 known vulnerabilities
    +
    157 vulnerable dependency paths
    786 dependencies
    @@ -1557,6 +1557,7 @@

    References

  • https://security.netapp.com/advisory/ntap-20230803-0011/
  • https://lists.debian.org/debian-lts-announce/2023/08/msg00019.html
  • https://security.gentoo.org/glsa/202402-08
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/1

  • @@ -4404,6 +4405,330 @@

    References

    More about this vulnerability

    +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.37.0 and busybox/busybox@1.36.1-r0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/ssl_client@1.36.1-r0 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in xasprintf function in xfuncs_printf.c:344 in BusyBox v.1.36.1.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.37.0 and busybox/busybox@1.36.1-r0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/ssl_client@1.36.1-r0 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.37.0 and busybox/busybox@1.36.1-r0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/ssl_client@1.36.1-r0 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + +

    CVE-2023-6237

    @@ -4551,6 +4876,7 @@

    References

  • https://github.com/openssl/openssl/commit/a830f551557d3d66a84bbb18a5b889c640c36294
  • https://www.openssl.org/news/secadv/20240115.txt
  • http://www.openwall.com/lists/oss-security/2024/03/11/1
  • +
  • https://security.netapp.com/advisory/ntap-20240531-0007/

  • @@ -4861,6 +5187,7 @@

    References

  • https://github.com/openssl/openssl/commit/9c39b3858091c152f52513c066ff2c5a47969f0d
  • https://github.com/openssl/openssl/commit/da343d0605c826ef197aceedc67e8e04f065f740
  • https://www.openssl.org/news/secadv/20240516.txt
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/2

  • diff --git a/docs/snyk/v2.10.12/haproxy_2.6.14-alpine.html b/docs/snyk/v2.10.12/haproxy_2.6.14-alpine.html index ef439f166f506..808120d96d9a7 100644 --- a/docs/snyk/v2.10.12/haproxy_2.6.14-alpine.html +++ b/docs/snyk/v2.10.12/haproxy_2.6.14-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:22:14 am (UTC+00:00)

    +

    June 16th 2024, 12:20:52 am (UTC+00:00)

    Scanned the following path: @@ -466,8 +466,8 @@

    Snyk test report

    -
    8 known vulnerabilities
    -
    68 vulnerable dependency paths
    +
    11 known vulnerabilities
    +
    83 vulnerable dependency paths
    18 dependencies
    @@ -1333,6 +1333,330 @@

    References

    More about this vulnerability

    +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|haproxy@2.6.14-alpine and busybox/busybox@1.36.1-r2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/ssl_client@1.36.1-r2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in xasprintf function in xfuncs_printf.c:344 in BusyBox v.1.36.1.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|haproxy@2.6.14-alpine and busybox/busybox@1.36.1-r2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/ssl_client@1.36.1-r2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|haproxy@2.6.14-alpine and busybox/busybox@1.36.1-r2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/ssl_client@1.36.1-r2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + +

    CVE-2023-6237

    @@ -1502,6 +1826,7 @@

    References

  • https://github.com/openssl/openssl/commit/a830f551557d3d66a84bbb18a5b889c640c36294
  • https://www.openssl.org/news/secadv/20240115.txt
  • http://www.openwall.com/lists/oss-security/2024/03/11/1
  • +
  • https://security.netapp.com/advisory/ntap-20240531-0007/

  • @@ -1856,6 +2181,7 @@

    References

  • https://github.com/openssl/openssl/commit/9c39b3858091c152f52513c066ff2c5a47969f0d
  • https://github.com/openssl/openssl/commit/da343d0605c826ef197aceedc67e8e04f065f740
  • https://www.openssl.org/news/secadv/20240516.txt
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/2

  • diff --git a/docs/snyk/v2.10.12/quay.io_argoproj_argocd_v2.10.12.html b/docs/snyk/v2.10.12/quay.io_argoproj_argocd_v2.10.12.html index 9ab570fc23ec3..ad04736403f86 100644 --- a/docs/snyk/v2.10.12/quay.io_argoproj_argocd_v2.10.12.html +++ b/docs/snyk/v2.10.12/quay.io_argoproj_argocd_v2.10.12.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:22:34 am (UTC+00:00)

    +

    June 16th 2024, 12:21:08 am (UTC+00:00)

    Scanned the following paths: @@ -2575,6 +2575,7 @@

    References

  • https://github.com/openssl/openssl/commit/9c39b3858091c152f52513c066ff2c5a47969f0d
  • https://github.com/openssl/openssl/commit/da343d0605c826ef197aceedc67e8e04f065f740
  • https://www.openssl.org/news/secadv/20240516.txt
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/2

  • diff --git a/docs/snyk/v2.10.12/redis_7.0.15-alpine.html b/docs/snyk/v2.10.12/redis_7.0.15-alpine.html index 7e254c445f269..b2c73a984eee9 100644 --- a/docs/snyk/v2.10.12/redis_7.0.15-alpine.html +++ b/docs/snyk/v2.10.12/redis_7.0.15-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:22:39 am (UTC+00:00)

    +

    June 16th 2024, 12:21:13 am (UTC+00:00)

    Scanned the following paths: @@ -467,8 +467,8 @@

    Snyk test report

    -
    1 known vulnerabilities
    -
    9 vulnerable dependency paths
    +
    3 known vulnerabilities
    +
    19 vulnerable dependency paths
    18 dependencies
    @@ -477,6 +477,222 @@

    Snyk test report

    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.20 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|redis@7.0.15-alpine and busybox/busybox@1.36.1-r28 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/ssl_client@1.36.1-r28 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.20 relevant fixed versions and status.

    +

    A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.

    +

    Remediation

    +

    Upgrade Alpine:3.20 busybox to version 1.36.1-r29 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.20 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|redis@7.0.15-alpine and busybox/busybox@1.36.1-r28 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/ssl_client@1.36.1-r28 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.20 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.20 busybox to version 1.36.1-r29 or higher.

    +

    References

    + + +
    + + + +

    CVE-2024-4741

    diff --git a/docs/snyk/v2.11.3/argocd-iac-install.html b/docs/snyk/v2.11.3/argocd-iac-install.html index 6735d0a9b1c1a..2dc45d9f164b0 100644 --- a/docs/snyk/v2.11.3/argocd-iac-install.html +++ b/docs/snyk/v2.11.3/argocd-iac-install.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:21:41 am (UTC+00:00)

    +

    June 16th 2024, 12:20:24 am (UTC+00:00)

    Scanned the following path: diff --git a/docs/snyk/v2.11.3/argocd-iac-namespace-install.html b/docs/snyk/v2.11.3/argocd-iac-namespace-install.html index 865ff198f52c7..cb97e86b53b51 100644 --- a/docs/snyk/v2.11.3/argocd-iac-namespace-install.html +++ b/docs/snyk/v2.11.3/argocd-iac-namespace-install.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:21:52 am (UTC+00:00)

    +

    June 16th 2024, 12:20:33 am (UTC+00:00)

    Scanned the following path: diff --git a/docs/snyk/v2.11.3/argocd-test.html b/docs/snyk/v2.11.3/argocd-test.html index 0417758adbe3d..3ee33ce5e4888 100644 --- a/docs/snyk/v2.11.3/argocd-test.html +++ b/docs/snyk/v2.11.3/argocd-test.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:19:42 am (UTC+00:00)

    +

    June 16th 2024, 12:18:30 am (UTC+00:00)

    Scanned the following paths: @@ -467,8 +467,8 @@

    Snyk test report

    -
    8 known vulnerabilities
    -
    164 vulnerable dependency paths
    +
    9 known vulnerabilities
    +
    165 vulnerable dependency paths
    2041 dependencies
    @@ -3771,6 +3771,97 @@

    Detailed paths

    More about this vulnerability

    +
    +
    +

    Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Manifest file: /argo-cd/argoproj/argo-cd/v2 go.mod +
    • +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + github.com/Azure/azure-sdk-for-go/sdk/azidentity +
    • + +
    • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, github.com/Azure/kubelogin/pkg/token@0.0.20 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/Azure/kubelogin/pkg/token@0.0.20 + + github.com/Azure/azure-sdk-for-go/sdk/azidentity@1.1.0 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    github.com/Azure/azure-sdk-for-go/sdk/azidentity is a module that provides Microsoft Entra ID (formerly Azure Active Directory) token authentication support across the Azure SDK. It includes a set of TokenCredential implementations, which can be used with Azure SDK clients supporting token authentication.

    +

    Affected versions of this package are vulnerable to Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition') in the authentication process. An attacker can elevate privileges by exploiting race conditions during the token validation steps. This is only exploitable if the application is configured to use multiple threads or processes for handling authentication requests.

    +

    Notes:

    +
      +
    1. An attacker who successfully exploited the vulnerability could elevate privileges and read any file on the file system with SYSTEM access permissions;

      +
    2. +
    3. An attacker who successfully exploits this vulnerability can only obtain read access to the system files by exploiting this vulnerability. The attacker cannot perform write or delete operations on the files;

      +
    4. +
    5. The vulnerability exists in the following credential types: DefaultAzureCredential and ManagedIdentityCredential;

      +
    6. +
    7. The vulnerability exists in the following credential types:

      +
    8. +
    +

    ManagedIdentityApplication (.NET)

    +

    ManagedIdentityApplication (Java)

    +

    ManagedIdentityApplication (Node.js)

    +

    Remediation

    +

    Upgrade github.com/Azure/azure-sdk-for-go/sdk/azidentity to version 1.6.0 or higher.

    +

    References

    + + +
    + + +

    Template Injection

    diff --git a/docs/snyk/v2.11.3/ghcr.io_dexidp_dex_v2.38.0.html b/docs/snyk/v2.11.3/ghcr.io_dexidp_dex_v2.38.0.html index ac00faf749208..ef7e16fc72a57 100644 --- a/docs/snyk/v2.11.3/ghcr.io_dexidp_dex_v2.38.0.html +++ b/docs/snyk/v2.11.3/ghcr.io_dexidp_dex_v2.38.0.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:19:48 am (UTC+00:00)

    +

    June 16th 2024, 12:18:36 am (UTC+00:00)

    Scanned the following paths: @@ -2715,7 +2715,7 @@

    NVD Description

    See How to fix? for Alpine:3.19 relevant fixed versions and status.

    A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

    Remediation

    -

    Upgrade Alpine:3.19 busybox to version 1.36.1-r17 or higher.

    +

    Upgrade Alpine:3.19 busybox to version 1.36.1-r19 or higher.

    References


    diff --git a/docs/snyk/v2.11.3/haproxy_2.6.14-alpine.html b/docs/snyk/v2.11.3/haproxy_2.6.14-alpine.html index 919162bc4cd0f..fa33763c2c255 100644 --- a/docs/snyk/v2.11.3/haproxy_2.6.14-alpine.html +++ b/docs/snyk/v2.11.3/haproxy_2.6.14-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:19:53 am (UTC+00:00)

    +

    June 16th 2024, 12:18:41 am (UTC+00:00)

    Scanned the following path: @@ -466,8 +466,8 @@

    Snyk test report

    -
    8 known vulnerabilities
    -
    68 vulnerable dependency paths
    +
    11 known vulnerabilities
    +
    83 vulnerable dependency paths
    18 dependencies
    @@ -1333,6 +1333,330 @@

    References

    More about this vulnerability

    +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|haproxy@2.6.14-alpine and busybox/busybox@1.36.1-r2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/ssl_client@1.36.1-r2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in xasprintf function in xfuncs_printf.c:344 in BusyBox v.1.36.1.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|haproxy@2.6.14-alpine and busybox/busybox@1.36.1-r2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/ssl_client@1.36.1-r2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|haproxy@2.6.14-alpine and busybox/busybox@1.36.1-r2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/ssl_client@1.36.1-r2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + +

    CVE-2023-6237

    @@ -1502,6 +1826,7 @@

    References

  • https://github.com/openssl/openssl/commit/a830f551557d3d66a84bbb18a5b889c640c36294
  • https://www.openssl.org/news/secadv/20240115.txt
  • http://www.openwall.com/lists/oss-security/2024/03/11/1
  • +
  • https://security.netapp.com/advisory/ntap-20240531-0007/

  • @@ -1856,6 +2181,7 @@

    References

  • https://github.com/openssl/openssl/commit/9c39b3858091c152f52513c066ff2c5a47969f0d
  • https://github.com/openssl/openssl/commit/da343d0605c826ef197aceedc67e8e04f065f740
  • https://www.openssl.org/news/secadv/20240516.txt
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/2

  • diff --git a/docs/snyk/v2.11.3/quay.io_argoproj_argocd_v2.11.3.html b/docs/snyk/v2.11.3/quay.io_argoproj_argocd_v2.11.3.html index 614295d9f0bc9..f4f1f66704dd0 100644 --- a/docs/snyk/v2.11.3/quay.io_argoproj_argocd_v2.11.3.html +++ b/docs/snyk/v2.11.3/quay.io_argoproj_argocd_v2.11.3.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:20:14 am (UTC+00:00)

    +

    June 16th 2024, 12:18:59 am (UTC+00:00)

    Scanned the following paths: @@ -2575,6 +2575,7 @@

    References

  • https://github.com/openssl/openssl/commit/9c39b3858091c152f52513c066ff2c5a47969f0d
  • https://github.com/openssl/openssl/commit/da343d0605c826ef197aceedc67e8e04f065f740
  • https://www.openssl.org/news/secadv/20240516.txt
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/2

  • diff --git a/docs/snyk/v2.11.3/redis_7.0.14-alpine.html b/docs/snyk/v2.11.3/redis_7.0.14-alpine.html index ec0f1815865ca..76b8256a89710 100644 --- a/docs/snyk/v2.11.3/redis_7.0.14-alpine.html +++ b/docs/snyk/v2.11.3/redis_7.0.14-alpine.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:20:20 am (UTC+00:00)

    +

    June 16th 2024, 12:19:04 am (UTC+00:00)

    Scanned the following paths: @@ -1045,7 +1045,7 @@

    NVD Description

    See How to fix? for Alpine:3.19 relevant fixed versions and status.

    A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

    Remediation

    -

    Upgrade Alpine:3.19 busybox to version 1.36.1-r17 or higher.

    +

    Upgrade Alpine:3.19 busybox to version 1.36.1-r19 or higher.

    References


    diff --git a/docs/snyk/v2.9.17/argocd-iac-install.html b/docs/snyk/v2.9.17/argocd-iac-install.html index 9d734376569b2..7c7157d625886 100644 --- a/docs/snyk/v2.9.17/argocd-iac-install.html +++ b/docs/snyk/v2.9.17/argocd-iac-install.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:26:29 am (UTC+00:00)

    +

    June 16th 2024, 12:24:44 am (UTC+00:00)

    Scanned the following path: diff --git a/docs/snyk/v2.9.17/argocd-iac-namespace-install.html b/docs/snyk/v2.9.17/argocd-iac-namespace-install.html index 1094c0730b945..e07f677ceb5da 100644 --- a/docs/snyk/v2.9.17/argocd-iac-namespace-install.html +++ b/docs/snyk/v2.9.17/argocd-iac-namespace-install.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:26:40 am (UTC+00:00)

    +

    June 16th 2024, 12:24:52 am (UTC+00:00)

    Scanned the following path: diff --git a/docs/snyk/v2.9.17/argocd-test.html b/docs/snyk/v2.9.17/argocd-test.html index e78ae70ea8133..a9fd4cf5773f8 100644 --- a/docs/snyk/v2.9.17/argocd-test.html +++ b/docs/snyk/v2.9.17/argocd-test.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:24:33 am (UTC+00:00)

    +

    June 16th 2024, 12:22:56 am (UTC+00:00)

    Scanned the following paths: @@ -467,8 +467,8 @@

    Snyk test report

    -
    10 known vulnerabilities
    -
    175 vulnerable dependency paths
    +
    11 known vulnerabilities
    +
    176 vulnerable dependency paths
    1919 dependencies
    @@ -4022,6 +4022,97 @@

    Detailed paths

    More about this vulnerability

    +
    +
    +

    Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Manifest file: /argo-cd/argoproj/argo-cd/v2 go.mod +
    • +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + github.com/Azure/azure-sdk-for-go/sdk/azidentity +
    • + +
    • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, github.com/Azure/kubelogin/pkg/token@0.0.20 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/Azure/kubelogin/pkg/token@0.0.20 + + github.com/Azure/azure-sdk-for-go/sdk/azidentity@1.1.0 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    github.com/Azure/azure-sdk-for-go/sdk/azidentity is a module that provides Microsoft Entra ID (formerly Azure Active Directory) token authentication support across the Azure SDK. It includes a set of TokenCredential implementations, which can be used with Azure SDK clients supporting token authentication.

    +

    Affected versions of this package are vulnerable to Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition') in the authentication process. An attacker can elevate privileges by exploiting race conditions during the token validation steps. This is only exploitable if the application is configured to use multiple threads or processes for handling authentication requests.

    +

    Notes:

    +
      +
    1. An attacker who successfully exploited the vulnerability could elevate privileges and read any file on the file system with SYSTEM access permissions;

      +
    2. +
    3. An attacker who successfully exploits this vulnerability can only obtain read access to the system files by exploiting this vulnerability. The attacker cannot perform write or delete operations on the files;

      +
    4. +
    5. The vulnerability exists in the following credential types: DefaultAzureCredential and ManagedIdentityCredential;

      +
    6. +
    7. The vulnerability exists in the following credential types:

      +
    8. +
    +

    ManagedIdentityApplication (.NET)

    +

    ManagedIdentityApplication (Java)

    +

    ManagedIdentityApplication (Node.js)

    +

    Remediation

    +

    Upgrade github.com/Azure/azure-sdk-for-go/sdk/azidentity to version 1.6.0 or higher.

    +

    References

    + + +
    + + +

    Template Injection

    diff --git a/docs/snyk/v2.9.17/ghcr.io_dexidp_dex_v2.37.0.html b/docs/snyk/v2.9.17/ghcr.io_dexidp_dex_v2.37.0.html index 89bc4392cbc37..39dd138e3930d 100644 --- a/docs/snyk/v2.9.17/ghcr.io_dexidp_dex_v2.37.0.html +++ b/docs/snyk/v2.9.17/ghcr.io_dexidp_dex_v2.37.0.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:24:40 am (UTC+00:00)

    +

    June 16th 2024, 12:23:03 am (UTC+00:00)

    Scanned the following paths: @@ -469,8 +469,8 @@

    Snyk test report

    -
    46 known vulnerabilities
    -
    142 vulnerable dependency paths
    +
    49 known vulnerabilities
    +
    157 vulnerable dependency paths
    786 dependencies
    @@ -1557,6 +1557,7 @@

    References

  • https://security.netapp.com/advisory/ntap-20230803-0011/
  • https://lists.debian.org/debian-lts-announce/2023/08/msg00019.html
  • https://security.gentoo.org/glsa/202402-08
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/1

  • @@ -4404,6 +4405,330 @@

    References

    More about this vulnerability

    +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.37.0 and busybox/busybox@1.36.1-r0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/ssl_client@1.36.1-r0 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in xasprintf function in xfuncs_printf.c:344 in BusyBox v.1.36.1.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.37.0 and busybox/busybox@1.36.1-r0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/ssl_client@1.36.1-r0 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.37.0 and busybox/busybox@1.36.1-r0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + busybox/busybox@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.37.0 + + busybox/ssl_client@1.36.1-r0 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + +

    CVE-2023-6237

    @@ -4551,6 +4876,7 @@

    References

  • https://github.com/openssl/openssl/commit/a830f551557d3d66a84bbb18a5b889c640c36294
  • https://www.openssl.org/news/secadv/20240115.txt
  • http://www.openwall.com/lists/oss-security/2024/03/11/1
  • +
  • https://security.netapp.com/advisory/ntap-20240531-0007/

  • @@ -4861,6 +5187,7 @@

    References

  • https://github.com/openssl/openssl/commit/9c39b3858091c152f52513c066ff2c5a47969f0d
  • https://github.com/openssl/openssl/commit/da343d0605c826ef197aceedc67e8e04f065f740
  • https://www.openssl.org/news/secadv/20240516.txt
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/2

  • diff --git a/docs/snyk/v2.9.17/haproxy_2.6.14-alpine.html b/docs/snyk/v2.9.17/haproxy_2.6.14-alpine.html index 11fbb4f09f5d0..052909ea91cb3 100644 --- a/docs/snyk/v2.9.17/haproxy_2.6.14-alpine.html +++ b/docs/snyk/v2.9.17/haproxy_2.6.14-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:24:44 am (UTC+00:00)

    +

    June 16th 2024, 12:23:06 am (UTC+00:00)

    Scanned the following path: @@ -466,8 +466,8 @@

    Snyk test report

    -
    8 known vulnerabilities
    -
    68 vulnerable dependency paths
    +
    11 known vulnerabilities
    +
    83 vulnerable dependency paths
    18 dependencies
    @@ -1333,6 +1333,330 @@

    References

    More about this vulnerability

    +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|haproxy@2.6.14-alpine and busybox/busybox@1.36.1-r2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/ssl_client@1.36.1-r2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in xasprintf function in xfuncs_printf.c:344 in BusyBox v.1.36.1.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|haproxy@2.6.14-alpine and busybox/busybox@1.36.1-r2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/ssl_client@1.36.1-r2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.18 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|haproxy@2.6.14-alpine and busybox/busybox@1.36.1-r2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + busybox/busybox@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + alpine-baselayout/alpine-baselayout@3.4.3-r1 + + busybox/busybox-binsh@1.36.1-r2 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.6.14-alpine + + busybox/ssl_client@1.36.1-r2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.18 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.18 busybox to version 1.36.1-r7 or higher.

    +

    References

    + + +
    + + +

    CVE-2023-6237

    @@ -1502,6 +1826,7 @@

    References

  • https://github.com/openssl/openssl/commit/a830f551557d3d66a84bbb18a5b889c640c36294
  • https://www.openssl.org/news/secadv/20240115.txt
  • http://www.openwall.com/lists/oss-security/2024/03/11/1
  • +
  • https://security.netapp.com/advisory/ntap-20240531-0007/

  • @@ -1856,6 +2181,7 @@

    References

  • https://github.com/openssl/openssl/commit/9c39b3858091c152f52513c066ff2c5a47969f0d
  • https://github.com/openssl/openssl/commit/da343d0605c826ef197aceedc67e8e04f065f740
  • https://www.openssl.org/news/secadv/20240516.txt
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/2

  • diff --git a/docs/snyk/v2.9.17/quay.io_argoproj_argocd_v2.9.17.html b/docs/snyk/v2.9.17/quay.io_argoproj_argocd_v2.9.17.html index 412873331855c..fd7178f489899 100644 --- a/docs/snyk/v2.9.17/quay.io_argoproj_argocd_v2.9.17.html +++ b/docs/snyk/v2.9.17/quay.io_argoproj_argocd_v2.9.17.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:25:07 am (UTC+00:00)

    +

    June 16th 2024, 12:23:24 am (UTC+00:00)

    Scanned the following paths: @@ -2657,6 +2657,7 @@

    References

  • https://github.com/openssl/openssl/commit/9c39b3858091c152f52513c066ff2c5a47969f0d
  • https://github.com/openssl/openssl/commit/da343d0605c826ef197aceedc67e8e04f065f740
  • https://www.openssl.org/news/secadv/20240516.txt
  • +
  • http://www.openwall.com/lists/oss-security/2024/05/16/2

  • diff --git a/docs/snyk/v2.9.17/redis_7.0.15-alpine.html b/docs/snyk/v2.9.17/redis_7.0.15-alpine.html index 5c361df09b486..09de90da5f9fc 100644 --- a/docs/snyk/v2.9.17/redis_7.0.15-alpine.html +++ b/docs/snyk/v2.9.17/redis_7.0.15-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    June 9th 2024, 12:25:11 am (UTC+00:00)

    +

    June 16th 2024, 12:23:28 am (UTC+00:00)

    Scanned the following paths: @@ -467,8 +467,8 @@

    Snyk test report

    -
    1 known vulnerabilities
    -
    9 vulnerable dependency paths
    +
    3 known vulnerabilities
    +
    19 vulnerable dependency paths
    18 dependencies
    @@ -477,6 +477,222 @@

    Snyk test report

    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.20 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|redis@7.0.15-alpine and busybox/busybox@1.36.1-r28 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/ssl_client@1.36.1-r28 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.20 relevant fixed versions and status.

    +

    A use-after-free vulnerability in BusyBox v.1.36.1 allows attackers to cause a denial of service via a crafted awk pattern in the awk.c evaluate function.

    +

    Remediation

    +

    Upgrade Alpine:3.20 busybox to version 1.36.1-r29 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.20 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|redis@7.0.15-alpine and busybox/busybox@1.36.1-r28 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + busybox/busybox@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + alpine-baselayout/alpine-baselayout@3.6.5-r0 + + busybox/busybox-binsh@1.36.1-r28 + + + +
    • +
    • + Introduced through: + docker-image|redis@7.0.15-alpine + + busybox/ssl_client@1.36.1-r28 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply only to the upstream busybox package and not the busybox package as distributed by Alpine. + See How to fix? for Alpine:3.20 relevant fixed versions and status.

    +

    A use-after-free vulnerability was discovered in BusyBox v.1.36.1 via a crafted awk pattern in the awk.c copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.20 busybox to version 1.36.1-r29 or higher.

    +

    References

    + + +
    + + + +

    CVE-2024-4741

    From 52b1b434a3430cbdce275cecfb54b52a393b71e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Jun 2024 21:26:20 -0400 Subject: [PATCH 42/74] chore(deps): bump tj-actions/changed-files from 42.0.2 to 44.5.2 (#18461) Bumps [tj-actions/changed-files](https://github.com/tj-actions/changed-files) from 42.0.2 to 44.5.2. - [Release notes](https://github.com/tj-actions/changed-files/releases) - [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md) - [Commits](https://github.com/tj-actions/changed-files/compare/90a06d6ba9543371ab4df8eeca0be07ca6054959...d6babd6899969df1a11d14c368283ea4436bca78) --- updated-dependencies: - dependency-name: tj-actions/changed-files dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-build.yaml b/.github/workflows/ci-build.yaml index ac98529340eaf..51de323f3b76c 100644 --- a/.github/workflows/ci-build.yaml +++ b/.github/workflows/ci-build.yaml @@ -31,7 +31,7 @@ jobs: docs: ${{ steps.filter.outputs.docs_any_changed }} steps: - uses: actions/checkout@8410ad0602e1e429cee44a835ae9f77f654a6694 # v4.0.0 - - uses: tj-actions/changed-files@90a06d6ba9543371ab4df8eeca0be07ca6054959 # v42.0.2 + - uses: tj-actions/changed-files@d6babd6899969df1a11d14c368283ea4436bca78 # v44.5.2 id: filter with: # Any file which is not under docs/, ui/ or is not a markdown file is counted as a backend file From 130c0f4f2eda85887977b93dca6e25a8f176e570 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Mon, 17 Jun 2024 01:21:45 +0200 Subject: [PATCH 43/74] chore: missing qtar in go exclusions (#18698) Signed-off-by: Matthieu MOREL --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index c4bc672dfe0c0..21dad92e68837 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -19,7 +19,7 @@ sonar.host.url=https://sonarcloud.io sonar.coverage.exclusions=**/*.pb.go,**/*.pb.gw.go,**/mocks/**,**/*.ts*,**/vendor/**,**/openapi_generated.go,**/*_test.go,**/*_generated*,test/**,pkg/client/**,pkg/apiclient/**,docs/** # Exclude following set of patterns from code analysis -sonar.go.exclusions=**/vendor/**,*/*.pb.go,**/*_test.go,**/*.pb.gw.go,**/mocks/**,**/openapi_generated.go,**/*_generated*.go,docs/** +sonar.go.exclusions=**/vendor/**,**/*.pb.go,**/*_test.go,**/*.pb.gw.go,**/mocks/**,**/openapi_generated.go,**/*_generated*.go,docs/** # Exclude following set of patterns from duplication detection sonar.cpd.exclusions=**/*.pb.go,**/*.g.cs,**/*.gw.go,**/mocks/*,docs/** From d57800fbaece3a8386524b9c0495fd528eef260a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:53:00 +0300 Subject: [PATCH 44/74] chore(deps): bump chromedriver from 126.0.0 to 126.0.1 in /ui-test (#18699) Bumps [chromedriver](https://github.com/giggio/node-chromedriver) from 126.0.0 to 126.0.1. - [Commits](https://github.com/giggio/node-chromedriver/compare/126.0.0...126.0.1) --- updated-dependencies: - dependency-name: chromedriver dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui-test/package.json | 2 +- ui-test/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui-test/package.json b/ui-test/package.json index 90b1d8b95363e..b61c0802f300f 100644 --- a/ui-test/package.json +++ b/ui-test/package.json @@ -14,7 +14,7 @@ "dependencies": { "@types/selenium-webdriver": "^4.1.23", "assert": "^2.1.0", - "chromedriver": "^126.0.0", + "chromedriver": "^126.0.1", "selenium-webdriver": "^4.21.0" }, "devDependencies": { diff --git a/ui-test/yarn.lock b/ui-test/yarn.lock index 53e040160e378..a5107bedd28d9 100644 --- a/ui-test/yarn.lock +++ b/ui-test/yarn.lock @@ -262,10 +262,10 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" -chromedriver@^126.0.0: - version "126.0.0" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-126.0.0.tgz#a92f116fc9a9f45b531adb708d5e00f97722cd56" - integrity sha512-rzwKp1okI9RmFtSyIzkk9+GTlTK62ai5P3/AS2qMwl86+gw84d2S/IyLkQMm5cqieFs4dgDAuqqPu0AqQACScg== +chromedriver@^126.0.1: + version "126.0.1" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-126.0.1.tgz#2591500833ba5baa626c2725f2877cce02237883" + integrity sha512-uV4xIvpPimKmV1/Hn9oX0C57tjsBbVtOeKFX9JzzPYpsu8xiSUAdqa3A8mgZE5DMJKDDoDyDIrA656QncVWRzg== dependencies: "@testim/chrome-version" "^1.1.4" axios "^1.6.7" From 1fd2f627e49926478f8d131d845738b51ec79201 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:53:54 +0300 Subject: [PATCH 45/74] chore(deps): bump library/redis in /test/container (#18652) Bumps library/redis from `01afb31` to `2cf43d9`. --- updated-dependencies: - dependency-name: library/redis dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/container/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/container/Dockerfile b/test/container/Dockerfile index 71cbdaaad3f6f..ec27e0f0e21d3 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/library/redis:7.2.5@sha256:01afb31d6d633451d84475ff3eb95f8c48bf0ee59ec9c948b161adb4da882053 as redis +FROM docker.io/library/redis:7.2.5@sha256:f5ef9e24a9ef3b7cc552ae0cbc3cbade4f2877502683496c5d775605ae071412 as redis # There are libraries we will want to copy from here in the final stage of the # build, but the COPY directive does not have a way to determine system From af6021542ad4a60dede27ff3da573961e4e9c4ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 10:29:00 +0300 Subject: [PATCH 46/74] chore(deps): bump library/golang in /test/container (#18653) Bumps library/golang from `0f76912` to `a1dc408`. --- updated-dependencies: - dependency-name: library/golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/container/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/container/Dockerfile b/test/container/Dockerfile index ec27e0f0e21d3..83099ff5da91b 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -8,7 +8,7 @@ RUN ln -s /usr/lib/$(uname -m)-linux-gnu /usr/lib/linux-gnu # Please make sure to also check the contained yarn version and update the references below when upgrading this image's version FROM docker.io/library/node:22.3.0@sha256:5e4044ff6001d06e7748e35bfa4f80c73cf5f5a7360a1b782995e038a01b0585 as node -FROM docker.io/library/golang:1.22.4@sha256:a0679accac8685cc5389bd2298e045e570100940e6bdcca666a8ca7b32a1276c as golang +FROM docker.io/library/golang:1.22.4@sha256:4950c1cce16bb754e23ee70d25a67e906149d0faedc0aaeed49c075b696fa889 as golang FROM docker.io/library/registry:2.8@sha256:4fac7a8257b1d7a86599043fcc181dfbdf9c8f57e337db763ac94b0e67c6cfb5 as registry From e5c0526de450bf5659c38eedda5c7818d16a1b39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 10:29:27 +0300 Subject: [PATCH 47/74] chore(deps): bump library/golang from `0f76912` to `a1dc408` (#18655) Bumps library/golang from `0f76912` to `a1dc408`. --- updated-dependencies: - dependency-name: library/golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index ac5f16db425a7..8fd2adcbf3a3c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ ARG BASE_IMAGE=docker.io/library/ubuntu:24.04@sha256:3f85b7caad41a95462cf5b787d8 # Initial stage which pulls prepares build dependencies and CLI tooling we need for our final image # Also used as the image in CI jobs so needs all dependencies #################################################################################################### -FROM docker.io/library/golang:1.22.4@sha256:a0679accac8685cc5389bd2298e045e570100940e6bdcca666a8ca7b32a1276c AS builder +FROM docker.io/library/golang:1.22.4@sha256:4950c1cce16bb754e23ee70d25a67e906149d0faedc0aaeed49c075b696fa889 AS builder RUN echo 'deb http://archive.debian.org/debian buster-backports main' >> /etc/apt/sources.list @@ -101,7 +101,7 @@ RUN HOST_ARCH=$TARGETARCH NODE_ENV='production' NODE_ONLINE_ENV='online' NODE_OP #################################################################################################### # Argo CD Build stage which performs the actual build of Argo CD binaries #################################################################################################### -FROM --platform=$BUILDPLATFORM docker.io/library/golang:1.22.4@sha256:a0679accac8685cc5389bd2298e045e570100940e6bdcca666a8ca7b32a1276c AS argocd-build +FROM --platform=$BUILDPLATFORM docker.io/library/golang:1.22.4@sha256:4950c1cce16bb754e23ee70d25a67e906149d0faedc0aaeed49c075b696fa889 AS argocd-build WORKDIR /go/src/github.com/argoproj/argo-cd From 89a0cc33c5632f0b4de1be17aae2fe309e035d42 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Mon, 17 Jun 2024 10:54:22 +0200 Subject: [PATCH 48/74] chore: enable require-error rule from errorlint linter on pkg folder (#18691) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 2 +- pkg/apiclient/apiclient_test.go | 5 +- pkg/apis/application/v1alpha1/types_test.go | 169 +++++++++---------- pkg/apis/application/v1alpha1/values_test.go | 7 +- 4 files changed, 92 insertions(+), 91 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 7226203cf2fd1..a472d5183e8f6 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -3,7 +3,7 @@ issues: - SA1019 - SA5011 exclude-rules: - - path: "(applicationset|cmpserver|controller|pkg|reposerver)/" + - path: "(applicationset|cmpserver|controller|reposerver)/" text: "require-error:" linters: - testifylint diff --git a/pkg/apiclient/apiclient_test.go b/pkg/apiclient/apiclient_test.go index b1dc9278ce76a..221b20eb07bcc 100644 --- a/pkg/apiclient/apiclient_test.go +++ b/pkg/apiclient/apiclient_test.go @@ -4,13 +4,14 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_parseHeaders(t *testing.T) { t.Run("Header parsed successfully", func(t *testing.T) { headerString := []string{"foo:", "foo1:bar1", "foo2:bar2:bar2"} headers, err := parseHeaders(headerString) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "", headers.Get("foo")) assert.Equal(t, "bar1", headers.Get("foo1")) assert.Equal(t, "bar2:bar2", headers.Get("foo2")) @@ -27,7 +28,7 @@ func Test_parseGRPCHeaders(t *testing.T) { t.Run("Header parsed successfully", func(t *testing.T) { headerStrings := []string{"origin: https://foo.bar", "content-length: 123"} headers, err := parseGRPCHeaders(headerStrings) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []string{" https://foo.bar"}, headers.Get("origin")) assert.Equal(t, []string{" 123"}, headers.Get("content-length")) }) diff --git a/pkg/apis/application/v1alpha1/types_test.go b/pkg/apis/application/v1alpha1/types_test.go index e878864028cce..2c1c5859efd99 100644 --- a/pkg/apis/application/v1alpha1/types_test.go +++ b/pkg/apis/application/v1alpha1/types_test.go @@ -442,7 +442,7 @@ func TestAppProject_IsDestinationPermitted_PermitOnlyProjectScopedClusters(t *te _, err := proj.IsDestinationPermitted(ApplicationDestination{Server: "https://my-cluster.123.com", Namespace: "default"}, func(_ string) ([]*Cluster, error) { return nil, errors.New("some error") }) - assert.Error(t, err) + require.Error(t, err) assert.True(t, strings.Contains(err.Error(), "could not retrieve project clusters")) } @@ -501,14 +501,14 @@ func TestAppProject_GetRoleByName(t *testing.T) { t.Run("NotExists", func(t *testing.T) { p := &AppProject{} role, i, err := p.GetRoleByName("test-role") - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, -1, i) assert.Nil(t, role) }) t.Run("NotExists", func(t *testing.T) { p := AppProject{Spec: AppProjectSpec{Roles: []ProjectRole{{Name: "test-role"}}}} role, i, err := p.GetRoleByName("test-role") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, 0, i) assert.Equal(t, &ProjectRole{Name: "test-role"}, role) }) @@ -518,20 +518,20 @@ func TestAppProject_AddGroupToRole(t *testing.T) { t.Run("NoRole", func(t *testing.T) { p := &AppProject{} got, err := p.AddGroupToRole("test-role", "test-group") - assert.Error(t, err) + require.Error(t, err) assert.False(t, got) }) t.Run("NoGroup", func(t *testing.T) { p := &AppProject{Spec: AppProjectSpec{Roles: []ProjectRole{{Name: "test-role", Groups: []string{}}}}} got, err := p.AddGroupToRole("test-role", "test-group") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, got) assert.Len(t, p.Spec.Roles[0].Groups, 1) }) t.Run("Exists", func(t *testing.T) { p := &AppProject{Spec: AppProjectSpec{Roles: []ProjectRole{{Name: "test-role", Groups: []string{"test-group"}}}}} got, err := p.AddGroupToRole("test-role", "test-group") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, got) }) } @@ -540,19 +540,19 @@ func TestAppProject_RemoveGroupFromRole(t *testing.T) { t.Run("NoRole", func(t *testing.T) { p := &AppProject{} got, err := p.RemoveGroupFromRole("test-role", "test-group") - assert.Error(t, err) + require.Error(t, err) assert.False(t, got) }) t.Run("NoGroup", func(t *testing.T) { p := &AppProject{Spec: AppProjectSpec{Roles: []ProjectRole{{Name: "test-role", Groups: []string{}}}}} got, err := p.RemoveGroupFromRole("test-role", "test-group") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, got) }) t.Run("Exists", func(t *testing.T) { p := &AppProject{Spec: AppProjectSpec{Roles: []ProjectRole{{Name: "test-role", Groups: []string{"test-group"}}}}} got, err := p.RemoveGroupFromRole("test-role", "test-group") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, got) assert.Empty(t, p.Spec.Roles[0].Groups) }) @@ -570,14 +570,14 @@ func newTestProject() *AppProject { func TestAppProject_ValidateSources(t *testing.T) { p := newTestProject() err := p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) badSources := []string{ "!*", } for _, badName := range badSources { p.Spec.SourceRepos = []string{badName} err = p.ValidateProject() - assert.Error(t, err) + require.Error(t, err) } duplicateSources := []string{ @@ -586,21 +586,21 @@ func TestAppProject_ValidateSources(t *testing.T) { } p.Spec.SourceRepos = duplicateSources err = p.ValidateProject() - assert.Error(t, err) + require.Error(t, err) } // TestAppProject_ValidateDestinations tests for an invalid destination func TestAppProject_ValidateDestinations(t *testing.T) { p := newTestProject() err := p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) badNamespaces := []string{ "!*", } for _, badName := range badNamespaces { p.Spec.Destinations[0].Namespace = badName err = p.ValidateProject() - assert.Error(t, err) + require.Error(t, err) } goodNamespaces := []string{ @@ -610,7 +610,7 @@ func TestAppProject_ValidateDestinations(t *testing.T) { for _, goodNamespace := range goodNamespaces { p.Spec.Destinations[0].Namespace = goodNamespace err = p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) } badServers := []string{ @@ -619,7 +619,7 @@ func TestAppProject_ValidateDestinations(t *testing.T) { for _, badServer := range badServers { p.Spec.Destinations[0].Server = badServer err = p.ValidateProject() - assert.Error(t, err) + require.Error(t, err) } goodServers := []string{ @@ -629,7 +629,7 @@ func TestAppProject_ValidateDestinations(t *testing.T) { for _, badName := range goodServers { p.Spec.Destinations[0].Server = badName err = p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) } badNames := []string{ @@ -638,7 +638,7 @@ func TestAppProject_ValidateDestinations(t *testing.T) { for _, badName := range badNames { p.Spec.Destinations[0].Name = badName err = p.ValidateProject() - assert.Error(t, err) + require.Error(t, err) } goodNames := []string{ @@ -648,7 +648,7 @@ func TestAppProject_ValidateDestinations(t *testing.T) { for _, goodName := range goodNames { p.Spec.Destinations[0].Name = goodName err = p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) } validDestination := ApplicationDestination{ @@ -658,12 +658,12 @@ func TestAppProject_ValidateDestinations(t *testing.T) { p.Spec.Destinations[0] = validDestination err = p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) // no duplicates allowed p.Spec.Destinations = []ApplicationDestination{validDestination, validDestination} err = p.ValidateProject() - assert.Error(t, err) + require.Error(t, err) cluster1Destination := ApplicationDestination{ Name: "cluster1", @@ -676,12 +676,12 @@ func TestAppProject_ValidateDestinations(t *testing.T) { // allow multiple destinations with blank server, same namespace but unique cluster name p.Spec.Destinations = []ApplicationDestination{cluster1Destination, cluster2Destination} err = p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) t.Run("must reject duplicate source namespaces", func(t *testing.T) { p.Spec.SourceNamespaces = []string{"argocd", "argocd"} err = p.ValidateProject() - assert.Error(t, err) + require.Error(t, err) }) } @@ -689,7 +689,7 @@ func TestAppProject_ValidateDestinations(t *testing.T) { func TestAppProject_ValidateRoleName(t *testing.T) { p := newTestProject() err := p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) badRoleNames := []string{ "", " ", @@ -705,7 +705,7 @@ func TestAppProject_ValidateRoleName(t *testing.T) { for _, badName := range badRoleNames { p.Spec.Roles[0].Name = badName err = p.ValidateProject() - assert.Error(t, err) + require.Error(t, err) } goodRoleNames := []string{ "MY-ROLE", @@ -714,7 +714,7 @@ func TestAppProject_ValidateRoleName(t *testing.T) { for _, goodName := range goodRoleNames { p.Spec.Roles[0].Name = goodName err = p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) } } @@ -722,10 +722,10 @@ func TestAppProject_ValidateRoleName(t *testing.T) { func TestAppProject_ValidateGroupName(t *testing.T) { p := newTestProject() err := p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) p.Spec.Roles[0].Groups = []string{"mygroup"} err = p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) badGroupNames := []string{ "", " ", @@ -739,7 +739,7 @@ func TestAppProject_ValidateGroupName(t *testing.T) { for _, badName := range badGroupNames { p.Spec.Roles[0].Groups = []string{badName} err = p.ValidateProject() - assert.Error(t, err) + require.Error(t, err) } goodGroupNames := []string{ "my:group", @@ -747,7 +747,7 @@ func TestAppProject_ValidateGroupName(t *testing.T) { for _, goodName := range goodGroupNames { p.Spec.Roles[0].Groups = []string{goodName} err = p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) } } @@ -755,15 +755,15 @@ func TestAppProject_ValidateSyncWindowList(t *testing.T) { t.Run("WorkingSyncWindow", func(t *testing.T) { p := newTestProjectWithSyncWindows() err := p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("HasNilSyncWindow", func(t *testing.T) { p := newTestProjectWithSyncWindows() err := p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) p.Spec.SyncWindows = append(p.Spec.SyncWindows, nil) err = p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -771,7 +771,7 @@ func TestAppProject_ValidateSyncWindowList(t *testing.T) { func TestAppProject_InvalidPolicyRules(t *testing.T) { p := newTestProject() err := p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) type badPolicy struct { policy string errmsg string @@ -805,9 +805,8 @@ func TestAppProject_InvalidPolicyRules(t *testing.T) { for _, bad := range badPolicies { p.Spec.Roles[0].Policies = []string{bad.policy} err = p.ValidateProject() - if assert.Error(t, err) { - assert.Contains(t, err.Error(), bad.errmsg) - } + require.Error(t, err) + assert.Contains(t, err.Error(), bad.errmsg) } } @@ -815,7 +814,7 @@ func TestAppProject_InvalidPolicyRules(t *testing.T) { func TestAppProject_ValidPolicyRules(t *testing.T) { p := newTestProject() err := p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) goodPolicies := []string{ "p,proj:my-proj:my-role,applications,get,my-proj/*,allow", "p, proj:my-proj:my-role, applications, get, my-proj/*, allow", @@ -836,7 +835,7 @@ func TestAppProject_ValidPolicyRules(t *testing.T) { for _, good := range goodPolicies { p.Spec.Roles[0].Policies = []string{good} err = p.ValidateProject() - assert.NoError(t, err) + require.NoError(t, err) } } @@ -850,7 +849,7 @@ func TestExplicitType(t *testing.T) { }, } explicitType, err := src.ExplicitType() - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, explicitType) src = ApplicationSource{ Helm: &ApplicationSourceHelm{ @@ -859,7 +858,7 @@ func TestExplicitType(t *testing.T) { } explicitType, err = src.ExplicitType() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, ApplicationSourceTypeHelm, *explicitType) } @@ -869,7 +868,7 @@ func TestExplicitTypeWithDirectory(t *testing.T) { Directory: &ApplicationSourceDirectory{}, } _, err := src.ExplicitType() - assert.Error(t, err, "cannot add directory with any other types") + require.Error(t, err, "cannot add directory with any other types") } func TestAppSourceEquality(t *testing.T) { @@ -1314,16 +1313,16 @@ func TestApplicationSourceHelm_AddFileParameter(t *testing.T) { func TestNewHelmParameter(t *testing.T) { t.Run("Invalid", func(t *testing.T) { _, err := NewHelmParameter("garbage", false) - assert.EqualError(t, err, "Expected helm parameter of the form: param=value. Received: garbage") + require.EqualError(t, err, "Expected helm parameter of the form: param=value. Received: garbage") }) t.Run("NonString", func(t *testing.T) { p, err := NewHelmParameter("foo=bar", false) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &HelmParameter{Name: "foo", Value: "bar"}, p) }) t.Run("String", func(t *testing.T) { p, err := NewHelmParameter("foo=bar", true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &HelmParameter{Name: "foo", Value: "bar", ForceString: true}, p) }) } @@ -1331,16 +1330,16 @@ func TestNewHelmParameter(t *testing.T) { func TestNewKustomizeReplica(t *testing.T) { t.Run("Valid", func(t *testing.T) { r, err := NewKustomizeReplica("my-deployment=2") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &KustomizeReplica{Name: "my-deployment", Count: intstr.Parse("2")}, r) }) t.Run("InvalidFormat", func(t *testing.T) { _, err := NewKustomizeReplica("garbage") - assert.EqualError(t, err, "expected parameter of the form: name=count. Received: garbage") + require.EqualError(t, err, "expected parameter of the form: name=count. Received: garbage") }) t.Run("InvalidCount", func(t *testing.T) { _, err := NewKustomizeReplica("my-deployment=garbage") - assert.EqualError(t, err, "expected integer value for count. Received: garbage") + require.EqualError(t, err, "expected integer value for count. Received: garbage") }) } @@ -1351,7 +1350,7 @@ func TestKustomizeReplica_GetIntCount(t *testing.T) { Count: intstr.FromString("2"), } count, err := kr.GetIntCount() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, 2, count) }) t.Run("String which cannot be converted to integer", func(t *testing.T) { @@ -1360,7 +1359,7 @@ func TestKustomizeReplica_GetIntCount(t *testing.T) { Count: intstr.FromString("garbage"), } count, err := kr.GetIntCount() - assert.EqualError(t, err, "expected integer value for count. Received: garbage") + require.EqualError(t, err, "expected integer value for count. Received: garbage") assert.Equal(t, 0, count) }) t.Run("Integer", func(t *testing.T) { @@ -1369,7 +1368,7 @@ func TestKustomizeReplica_GetIntCount(t *testing.T) { Count: intstr.FromInt(2), } count, err := kr.GetIntCount() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, 2, count) }) } @@ -1623,7 +1622,7 @@ func TestSyncWindows_HasWindows(t *testing.T) { t.Run("False", func(t *testing.T) { proj := newTestProjectWithSyncWindows() err := proj.Spec.DeleteWindow(0) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, proj.Spec.SyncWindows.HasWindows()) }) } @@ -1982,10 +1981,10 @@ func TestAppProjectSpec_AddWindow(t *testing.T) { t.Run(tt.name, func(t *testing.T) { switch tt.want { case "error": - assert.Error(t, tt.p.Spec.AddWindow(tt.k, tt.s, tt.d, tt.a, tt.n, tt.c, tt.m, tt.t)) + require.Error(t, tt.p.Spec.AddWindow(tt.k, tt.s, tt.d, tt.a, tt.n, tt.c, tt.m, tt.t)) case "noError": - assert.NoError(t, tt.p.Spec.AddWindow(tt.k, tt.s, tt.d, tt.a, tt.n, tt.c, tt.m, tt.t)) - assert.NoError(t, tt.p.Spec.DeleteWindow(0)) + require.NoError(t, tt.p.Spec.AddWindow(tt.k, tt.s, tt.d, tt.a, tt.n, tt.c, tt.m, tt.t)) + require.NoError(t, tt.p.Spec.DeleteWindow(0)) } }) } @@ -1997,12 +1996,12 @@ func TestAppProjectSpec_DeleteWindow(t *testing.T) { proj.Spec.SyncWindows = append(proj.Spec.SyncWindows, window2) t.Run("CannotFind", func(t *testing.T) { err := proj.Spec.DeleteWindow(3) - assert.Error(t, err) + require.Error(t, err) assert.Len(t, proj.Spec.SyncWindows, 2) }) t.Run("Delete", func(t *testing.T) { err := proj.Spec.DeleteWindow(0) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, proj.Spec.SyncWindows, 1) }) } @@ -2506,31 +2505,31 @@ func TestSyncWindow_Update(t *testing.T) { e := SyncWindow{Kind: "allow", Schedule: "* * * * *", Duration: "1h", Applications: []string{"app1"}} t.Run("AddApplication", func(t *testing.T) { err := e.Update("", "", []string{"app1", "app2"}, []string{}, []string{}, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []string{"app1", "app2"}, e.Applications) }) t.Run("AddNamespace", func(t *testing.T) { err := e.Update("", "", []string{}, []string{"namespace1"}, []string{}, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []string{"namespace1"}, e.Namespaces) }) t.Run("AddCluster", func(t *testing.T) { err := e.Update("", "", []string{}, []string{}, []string{"cluster1"}, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []string{"cluster1"}, e.Clusters) }) t.Run("MissingConfig", func(t *testing.T) { err := e.Update("", "", []string{}, []string{}, []string{}, "") - assert.EqualError(t, err, "cannot update: require one or more of schedule, duration, application, namespace, or cluster") + require.EqualError(t, err, "cannot update: require one or more of schedule, duration, application, namespace, or cluster") }) t.Run("ChangeDuration", func(t *testing.T) { err := e.Update("", "10h", []string{}, []string{}, []string{}, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "10h", e.Duration) }) t.Run("ChangeSchedule", func(t *testing.T) { err := e.Update("* 1 0 0 *", "", []string{}, []string{}, []string{}, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "* 1 0 0 *", e.Schedule) }) } @@ -2538,22 +2537,22 @@ func TestSyncWindow_Update(t *testing.T) { func TestSyncWindow_Validate(t *testing.T) { window := &SyncWindow{Kind: "allow", Schedule: "* * * * *", Duration: "1h"} t.Run("Validates", func(t *testing.T) { - assert.NoError(t, window.Validate()) + require.NoError(t, window.Validate()) }) t.Run("IncorrectKind", func(t *testing.T) { window.Kind = "wrong" - assert.Error(t, window.Validate()) + require.Error(t, window.Validate()) }) t.Run("IncorrectSchedule", func(t *testing.T) { window.Kind = "allow" window.Schedule = "* * *" - assert.Error(t, window.Validate()) + require.Error(t, window.Validate()) }) t.Run("IncorrectDuration", func(t *testing.T) { window.Kind = "allow" window.Schedule = "* * * * *" window.Duration = "1000days" - assert.Error(t, window.Validate()) + require.Error(t, window.Validate()) }) } @@ -2965,7 +2964,7 @@ func TestRetryStrategy_NextRetryAtDefaultBackoff(t *testing.T) { for i, expected := range expectedTimes { retryAt, err := retry.NextRetryAt(now, int64(i)) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expected.Format(time.RFC850), retryAt.Format(time.RFC850)) } } @@ -2989,7 +2988,7 @@ func TestRetryStrategy_NextRetryAtCustomBackoff(t *testing.T) { for i, expected := range expectedTimes { retryAt, err := retry.NextRetryAt(now, int64(i)) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expected.Format(time.RFC850), retryAt.Format(time.RFC850)) } } @@ -3049,7 +3048,7 @@ func TestRemoveEnvEntry(t *testing.T) { &EnvEntry{"gamma", "delta"}, }, } - assert.NoError(t, plugins.RemoveEnvEntry("alpha")) + require.NoError(t, plugins.RemoveEnvEntry("alpha")) want := Env{&EnvEntry{"foo", "bar"}, &EnvEntry{"gamma", "delta"}} assert.Equal(t, want, plugins.Env) }) @@ -3058,7 +3057,7 @@ func TestRemoveEnvEntry(t *testing.T) { Name: "test", Env: Env{&EnvEntry{"foo", "bar"}}, } - assert.NoError(t, plugins.RemoveEnvEntry("foo")) + require.NoError(t, plugins.RemoveEnvEntry("foo")) assert.Equal(t, Env{}, plugins.Env) }) t.Run("Remove unknown element from the list", func(t *testing.T) { @@ -3067,15 +3066,15 @@ func TestRemoveEnvEntry(t *testing.T) { Env: Env{&EnvEntry{"foo", "bar"}}, } err := plugins.RemoveEnvEntry("key") - assert.EqualError(t, err, `unable to find env variable with key "key" for plugin "test"`) + require.EqualError(t, err, `unable to find env variable with key "key" for plugin "test"`) err = plugins.RemoveEnvEntry("bar") - assert.EqualError(t, err, `unable to find env variable with key "bar" for plugin "test"`) + require.EqualError(t, err, `unable to find env variable with key "bar" for plugin "test"`) assert.Equal(t, Env{&EnvEntry{"foo", "bar"}}, plugins.Env) }) t.Run("Remove element from an empty list", func(t *testing.T) { plugins := &ApplicationSourcePlugin{Name: "test"} err := plugins.RemoveEnvEntry("key") - assert.EqualError(t, err, `unable to find env variable with key "key" for plugin "test"`) + require.EqualError(t, err, `unable to find env variable with key "key" for plugin "test"`) }) } @@ -3156,28 +3155,28 @@ func Test_isValidPolicy(t *testing.T) { func Test_validatePolicy_projIsNotRegex(t *testing.T) { // Make sure the "." in "some.project" isn't treated as the regex wildcard. err := validatePolicy("some.project", "org-admin", "p, proj:some.project:org-admin, applications, *, some-project/*, allow") - assert.Error(t, err) + require.Error(t, err) err = validatePolicy("some.project", "org-admin", "p, proj:some.project:org-admin, applications, *, some.project/*, allow") - assert.NoError(t, err) + require.NoError(t, err) err = validatePolicy("some-project", "org-admin", "p, proj:some-project:org-admin, applications, *, some-project/*, allow") - assert.NoError(t, err) + require.NoError(t, err) } func Test_validatePolicy_ValidResource(t *testing.T) { err := validatePolicy("some-project", "org-admin", "p, proj:some-project:org-admin, applications, *, some-project/*, allow") - assert.NoError(t, err) + require.NoError(t, err) err = validatePolicy("some-project", "org-admin", "p, proj:some-project:org-admin, repositories, *, some-project/*, allow") - assert.NoError(t, err) + require.NoError(t, err) err = validatePolicy("some-project", "org-admin", "p, proj:some-project:org-admin, clusters, *, some-project/*, allow") - assert.NoError(t, err) + require.NoError(t, err) err = validatePolicy("some-project", "org-admin", "p, proj:some-project:org-admin, exec, *, some-project/*, allow") - assert.NoError(t, err) + require.NoError(t, err) err = validatePolicy("some-project", "org-admin", "p, proj:some-project:org-admin, logs, *, some-project/*, allow") - assert.NoError(t, err) + require.NoError(t, err) err = validatePolicy("some-project", "org-admin", "p, proj:some-project:org-admin, unknown, *, some-project/*, allow") - assert.Error(t, err) + require.Error(t, err) } func TestEnvsubst(t *testing.T) { @@ -3217,9 +3216,9 @@ func Test_validateGroupName(t *testing.T) { t.Run(tt.name, func(t *testing.T) { err := validateGroupName(tt.groupname) if tt.isvalid { - assert.NoError(t, err) + require.NoError(t, err) } else { - assert.Error(t, err) + require.Error(t, err) } }) } diff --git a/pkg/apis/application/v1alpha1/values_test.go b/pkg/apis/application/v1alpha1/values_test.go index f21f17168a2e8..6c2c5676f3f62 100644 --- a/pkg/apis/application/v1alpha1/values_test.go +++ b/pkg/apis/application/v1alpha1/values_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestValues_SetString(t *testing.T) { @@ -69,12 +70,12 @@ func TestValues_SetString(t *testing.T) { if !testCase.expectError { assert.Equal(t, testCase.expectValue, source.ValuesString()) data, err := source.ValuesObject.MarshalJSON() - assert.NoError(t, err) + require.NoError(t, err) err = source.ValuesObject.UnmarshalJSON(data) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCase.expectValue, source.ValuesString()) } else { - assert.Error(t, err) + require.Error(t, err) } }) } From 4494fe5d3d4c70cb51ec1dc5dc20ea1e680aa38d Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Mon, 17 Jun 2024 11:51:06 +0200 Subject: [PATCH 49/74] chore: enable require-error rule from errorlint linter on applicationset folder (#18689) Signed-off-by: Matthieu MOREL Signed-off-by: pasha-codefresh Co-authored-by: pasha-codefresh --- .golangci.yaml | 2 +- .../applicationset_controller_test.go | 187 +++++++++--------- .../controllers/clustereventhandler_test.go | 11 +- .../controllers/requeue_after_test.go | 3 +- applicationset/generators/cluster_test.go | 9 +- applicationset/generators/duck_type_test.go | 9 +- .../generator_spec_processor_test.go | 8 +- applicationset/generators/git_test.go | 25 +-- applicationset/generators/list_test.go | 5 +- applicationset/generators/matrix_test.go | 22 +-- applicationset/generators/merge_test.go | 13 +- applicationset/generators/plugin_test.go | 6 +- .../generators/pull_request_test.go | 9 +- .../generators/scm_provider_test.go | 9 +- .../generators/value_interpolation_test.go | 5 +- .../pull_request/azure_devops_test.go | 3 +- .../pull_request/bitbucket_cloud_test.go | 47 ++--- .../pull_request/bitbucket_server_test.go | 33 ++-- .../services/pull_request/gitea_test.go | 5 +- .../services/pull_request/gitlab_test.go | 21 +- .../services/pull_request/utils_test.go | 13 +- applicationset/services/repo_service_test.go | 3 +- .../scm_provider/azure_devops_test.go | 27 +-- .../scm_provider/bitbucket_cloud_test.go | 17 +- .../scm_provider/bitbucket_server_test.go | 67 +++---- .../services/scm_provider/gitea_test.go | 10 +- .../services/scm_provider/github_test.go | 15 +- .../services/scm_provider/gitlab_test.go | 11 +- .../services/scm_provider/utils_test.go | 21 +- applicationset/utils/clusterUtils_test.go | 9 +- applicationset/utils/map_test.go | 3 +- applicationset/utils/utils_test.go | 28 +-- applicationset/webhook/webhook_test.go | 11 +- server/applicationset/applicationset_test.go | 23 +-- 34 files changed, 359 insertions(+), 331 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index a472d5183e8f6..4684842e6d7a2 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -3,7 +3,7 @@ issues: - SA1019 - SA5011 exclude-rules: - - path: "(applicationset|cmpserver|controller|reposerver)/" + - path: "(cmpserver|controller|reposerver)/" text: "require-error:" linters: - testifylint diff --git a/applicationset/controllers/applicationset_controller_test.go b/applicationset/controllers/applicationset_controller_test.go index 33e27cb53ff5f..41f6a54e02743 100644 --- a/applicationset/controllers/applicationset_controller_test.go +++ b/applicationset/controllers/applicationset_controller_test.go @@ -12,6 +12,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -123,7 +124,7 @@ func (r *rendererMock) Replace(tmpl string, replaceMap map[string]interface{}, u func TestExtractApplications(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, c := range []struct { name string @@ -238,9 +239,9 @@ func TestExtractApplications(t *testing.T) { }) if cc.expectErr { - assert.Error(t, err) + require.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) } assert.Equal(t, expectedApps, got) assert.Equal(t, cc.expectedReason, reason) @@ -356,10 +357,10 @@ func TestMergeTemplateApplications(t *testing.T) { func TestCreateOrUpdateInCluster(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, c := range []struct { // name is human-readable test name @@ -1350,7 +1351,7 @@ func TestCreateOrUpdateInCluster(t *testing.T) { for _, a := range c.existingApps { err = controllerutil.SetControllerReference(&c.appSet, &a, scheme) - assert.NoError(t, err) + require.NoError(t, err) initObjs = append(initObjs, &a) } @@ -1364,7 +1365,7 @@ func TestCreateOrUpdateInCluster(t *testing.T) { } err = r.createOrUpdateInCluster(context.TODO(), log.NewEntry(log.StandardLogger()), c.appSet, c.desiredApps) - assert.NoError(t, err) + require.NoError(t, err) for _, obj := range c.expected { got := &v1alpha1.Application{} @@ -1383,10 +1384,10 @@ func TestCreateOrUpdateInCluster(t *testing.T) { func TestRemoveFinalizerOnInvalidDestination_FinalizerTypes(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, c := range []struct { // name is human-readable test name @@ -1477,18 +1478,18 @@ func TestRemoveFinalizerOnInvalidDestination_FinalizerTypes(t *testing.T) { // argoDB := db.NewDB("namespace", settingsMgr, r.KubeClientset) // clusterList, err := argoDB.ListClusters(context.Background()) clusterList, err := utils.ListClusters(context.Background(), kubeclientset, "namespace") - assert.NoError(t, err, "Unexpected error") + require.NoError(t, err, "Unexpected error") appLog := log.WithFields(log.Fields{"app": app.Name, "appSet": ""}) appInputParam := app.DeepCopy() err = r.removeFinalizerOnInvalidDestination(context.Background(), appSet, appInputParam, clusterList, appLog) - assert.NoError(t, err, "Unexpected error") + require.NoError(t, err, "Unexpected error") retrievedApp := v1alpha1.Application{} err = client.Get(context.Background(), crtclient.ObjectKeyFromObject(&app), &retrievedApp) - assert.NoError(t, err, "Unexpected error") + require.NoError(t, err, "Unexpected error") // App on the cluster should have the expected finalizers assert.ElementsMatch(t, c.expectedFinalizers, retrievedApp.Finalizers) @@ -1505,10 +1506,10 @@ func TestRemoveFinalizerOnInvalidDestination_FinalizerTypes(t *testing.T) { func TestRemoveFinalizerOnInvalidDestination_DestinationTypes(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, c := range []struct { // name is human-readable test name @@ -1635,18 +1636,18 @@ func TestRemoveFinalizerOnInvalidDestination_DestinationTypes(t *testing.T) { // argoDB := db.NewDB("argocd", settingsMgr, r.KubeClientset) // clusterList, err := argoDB.ListClusters(context.Background()) clusterList, err := utils.ListClusters(context.Background(), kubeclientset, "namespace") - assert.NoError(t, err, "Unexpected error") + require.NoError(t, err, "Unexpected error") appLog := log.WithFields(log.Fields{"app": app.Name, "appSet": ""}) appInputParam := app.DeepCopy() err = r.removeFinalizerOnInvalidDestination(context.Background(), appSet, appInputParam, clusterList, appLog) - assert.NoError(t, err, "Unexpected error") + require.NoError(t, err, "Unexpected error") retrievedApp := v1alpha1.Application{} err = client.Get(context.Background(), crtclient.ObjectKeyFromObject(&app), &retrievedApp) - assert.NoError(t, err, "Unexpected error") + require.NoError(t, err, "Unexpected error") finalizerRemoved := len(retrievedApp.Finalizers) == 0 @@ -1661,10 +1662,10 @@ func TestRemoveFinalizerOnInvalidDestination_DestinationTypes(t *testing.T) { func TestRemoveOwnerReferencesOnDeleteAppSet(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, c := range []struct { // name is human-readable test name @@ -1706,7 +1707,7 @@ func TestRemoveOwnerReferencesOnDeleteAppSet(t *testing.T) { } err := controllerutil.SetControllerReference(&appSet, &app, scheme) - assert.NoError(t, err, "Unexpected error") + require.NoError(t, err, "Unexpected error") initObjs := []crtclient.Object{&app, &appSet} @@ -1721,11 +1722,11 @@ func TestRemoveOwnerReferencesOnDeleteAppSet(t *testing.T) { } err = r.removeOwnerReferencesOnDeleteAppSet(context.Background(), appSet) - assert.NoError(t, err, "Unexpected error") + require.NoError(t, err, "Unexpected error") retrievedApp := v1alpha1.Application{} err = client.Get(context.Background(), crtclient.ObjectKeyFromObject(&app), &retrievedApp) - assert.NoError(t, err, "Unexpected error") + require.NoError(t, err, "Unexpected error") ownerReferencesRemoved := len(retrievedApp.OwnerReferences) == 0 assert.True(t, ownerReferencesRemoved) @@ -1736,10 +1737,10 @@ func TestRemoveOwnerReferencesOnDeleteAppSet(t *testing.T) { func TestCreateApplications(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) testCases := []struct { name string @@ -1904,7 +1905,7 @@ func TestCreateApplications(t *testing.T) { initObjs := []crtclient.Object{&c.appSet} for _, a := range c.existsApps { err = controllerutil.SetControllerReference(&c.appSet, &a, scheme) - assert.NoError(t, err) + require.NoError(t, err) initObjs = append(initObjs, &a) } @@ -1918,7 +1919,7 @@ func TestCreateApplications(t *testing.T) { } err = r.createInCluster(context.TODO(), log.NewEntry(log.StandardLogger()), c.appSet, c.apps) - assert.NoError(t, err) + require.NoError(t, err) for _, obj := range c.expected { got := &v1alpha1.Application{} @@ -1928,7 +1929,7 @@ func TestCreateApplications(t *testing.T) { }, got) err = controllerutil.SetControllerReference(&c.appSet, &obj, r.Scheme) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, obj, *got) } @@ -1939,9 +1940,9 @@ func TestCreateApplications(t *testing.T) { func TestDeleteInCluster(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, c := range []struct { // appSet is the application set on which the delete function is called @@ -2047,7 +2048,7 @@ func TestDeleteInCluster(t *testing.T) { for _, a := range c.existingApps { temp := a err = controllerutil.SetControllerReference(&c.appSet, &temp, scheme) - assert.NoError(t, err) + require.NoError(t, err) initObjs = append(initObjs, &temp) } @@ -2061,7 +2062,7 @@ func TestDeleteInCluster(t *testing.T) { } err = r.deleteInCluster(context.TODO(), log.NewEntry(log.StandardLogger()), c.appSet, c.desiredApps) - assert.NoError(t, err) + require.NoError(t, err) // For each of the expected objects, verify they exist on the cluster for _, obj := range c.expected { @@ -2072,7 +2073,7 @@ func TestDeleteInCluster(t *testing.T) { }, got) err = controllerutil.SetControllerReference(&c.appSet, &obj, r.Scheme) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, obj, *got) } @@ -2093,9 +2094,9 @@ func TestDeleteInCluster(t *testing.T) { func TestGetMinRequeueAfter(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) client := fake.NewClientBuilder().WithScheme(scheme).Build() @@ -2141,10 +2142,10 @@ func TestGetMinRequeueAfter(t *testing.T) { func TestValidateGeneratedApplications(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) client := fake.NewClientBuilder().WithScheme(scheme).Build() @@ -2378,9 +2379,9 @@ func TestValidateGeneratedApplications(t *testing.T) { func TestReconcilerValidationProjectErrorBehaviour(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) project := v1alpha1.AppProject{ ObjectMeta: metav1.ObjectMeta{Name: "good-project", Namespace: "argocd"}, @@ -2455,27 +2456,27 @@ func TestReconcilerValidationProjectErrorBehaviour(t *testing.T) { // Verify that on validation error, no error is returned, but the object is requeued res, err := r.Reconcile(context.Background(), req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, ReconcileRequeueOnValidationError, res.RequeueAfter) var app v1alpha1.Application // make sure good app got created err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "good-project"}, &app) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "good-project", app.Name) // make sure bad app was not created err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "bad-project"}, &app) - assert.Error(t, err) + require.Error(t, err) } func TestReconcilerCreateAppsRecoveringRenderError(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) project := v1alpha1.AppProject{ ObjectMeta: metav1.ObjectMeta{Name: "default", Namespace: "argocd"}, @@ -2543,23 +2544,23 @@ func TestReconcilerCreateAppsRecoveringRenderError(t *testing.T) { // Verify that on generatorsError, no error is returned, but the object is requeued res, err := r.Reconcile(context.Background(), req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, ReconcileRequeueOnValidationError, res.RequeueAfter) var app v1alpha1.Application // make sure good app got created err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "app"}, &app) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "app", app.Name) } func TestSetApplicationSetStatusCondition(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) appSet := v1alpha1.ApplicationSet{ ObjectMeta: metav1.ObjectMeta{ @@ -2606,7 +2607,7 @@ func TestSetApplicationSetStatusCondition(t *testing.T) { } err = r.setApplicationSetStatusCondition(context.TODO(), &appSet, appCondition, true) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, appSet.Status.Conditions, 3) } @@ -2614,9 +2615,9 @@ func TestSetApplicationSetStatusCondition(t *testing.T) { func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alpha1.ApplicationsSyncPolicy, recordBuffer int, allowPolicyOverride bool) v1alpha1.Application { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) defaultProject := v1alpha1.AppProject{ ObjectMeta: metav1.ObjectMeta{Name: "default", Namespace: "argocd"}, @@ -2691,20 +2692,20 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp // Verify that on validation error, no error is returned, but the object is requeued resCreate, err := r.Reconcile(context.Background(), req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, time.Duration(0), resCreate.RequeueAfter) var app v1alpha1.Application // make sure good app got created err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "good-cluster"}, &app) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "good-cluster", app.Name) // Update resource var retrievedApplicationSet v1alpha1.ApplicationSet err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "name"}, &retrievedApplicationSet) - assert.NoError(t, err) + require.NoError(t, err) retrievedApplicationSet.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} retrievedApplicationSet.Spec.Template.Labels = map[string]string{"label-key": "label-value"} @@ -2714,13 +2715,13 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp } err = r.Client.Update(context.TODO(), &retrievedApplicationSet) - assert.NoError(t, err) + require.NoError(t, err) resUpdate, err := r.Reconcile(context.Background(), req) - assert.NoError(t, err) + require.NoError(t, err) err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "good-cluster"}, &app) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, time.Duration(0), resUpdate.RequeueAfter) assert.Equal(t, "good-cluster", app.Name) @@ -2778,9 +2779,9 @@ func TestUpdatePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *t func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alpha1.ApplicationsSyncPolicy, recordBuffer int, allowPolicyOverride bool) v1alpha1.ApplicationList { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) defaultProject := v1alpha1.AppProject{ ObjectMeta: metav1.ObjectMeta{Name: "default", Namespace: "argocd"}, @@ -2855,20 +2856,20 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp // Verify that on validation error, no error is returned, but the object is requeued resCreate, err := r.Reconcile(context.Background(), req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, time.Duration(0), resCreate.RequeueAfter) var app v1alpha1.Application // make sure good app got created err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "good-cluster"}, &app) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "good-cluster", app.Name) // Update resource var retrievedApplicationSet v1alpha1.ApplicationSet err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "name"}, &retrievedApplicationSet) - assert.NoError(t, err) + require.NoError(t, err) retrievedApplicationSet.Spec.Generators = []v1alpha1.ApplicationSetGenerator{ { List: &v1alpha1.ListGenerator{ @@ -2878,15 +2879,15 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp } err = r.Client.Update(context.TODO(), &retrievedApplicationSet) - assert.NoError(t, err) + require.NoError(t, err) resUpdate, err := r.Reconcile(context.Background(), req) - assert.NoError(t, err) + require.NoError(t, err) var apps v1alpha1.ApplicationList err = r.Client.List(context.TODO(), &apps) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, time.Duration(0), resUpdate.RequeueAfter) return apps @@ -3049,10 +3050,10 @@ func TestGenerateAppsUsingPullRequestGenerator(t *testing.T) { func TestPolicies(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) defaultProject := v1alpha1.AppProject{ ObjectMeta: metav1.ObjectMeta{Name: "default", Namespace: "argocd"}, @@ -3165,25 +3166,25 @@ func TestPolicies(t *testing.T) { // Check if Application is created res, err := r.Reconcile(context.Background(), req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, time.Duration(0), res.RequeueAfter) var app v1alpha1.Application err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "my-app"}, &app) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "value", app.Annotations["key"]) // Check if Application is updated app.Annotations["key"] = "edited" err = r.Client.Update(context.TODO(), &app) - assert.NoError(t, err) + require.NoError(t, err) res, err = r.Reconcile(context.Background(), req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, time.Duration(0), res.RequeueAfter) err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "my-app"}, &app) - assert.NoError(t, err) + require.NoError(t, err) if c.allowedUpdate { assert.Equal(t, "value", app.Annotations["key"]) @@ -3193,21 +3194,21 @@ func TestPolicies(t *testing.T) { // Check if Application is deleted err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "name"}, &appSet) - assert.NoError(t, err) + require.NoError(t, err) appSet.Spec.Generators[0] = v1alpha1.ApplicationSetGenerator{ List: &v1alpha1.ListGenerator{ Elements: []apiextensionsv1.JSON{}, }, } err = r.Client.Update(context.TODO(), &appSet) - assert.NoError(t, err) + require.NoError(t, err) res, err = r.Reconcile(context.Background(), req) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, time.Duration(0), res.RequeueAfter) err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "my-app"}, &app) - assert.NoError(t, err) + require.NoError(t, err) if c.allowedDelete { assert.NotNil(t, app.DeletionTimestamp) } else { @@ -3220,9 +3221,9 @@ func TestPolicies(t *testing.T) { func TestSetApplicationSetApplicationStatus(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) kubeclientset := kubefake.NewSimpleClientset([]runtime.Object{}...) argoDBMock := dbmocks.ArgoDB{} @@ -3316,7 +3317,7 @@ func TestSetApplicationSetApplicationStatus(t *testing.T) { } err = r.setAppSetApplicationStatus(context.TODO(), log.NewEntry(log.StandardLogger()), &cc.appSet, cc.appStatuses) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, cc.expectedAppStatuses, cc.appSet.Status.ApplicationStatus) }) @@ -3326,10 +3327,10 @@ func TestSetApplicationSetApplicationStatus(t *testing.T) { func TestBuildAppDependencyList(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) client := fake.NewClientBuilder().WithScheme(scheme).Build() @@ -4076,7 +4077,7 @@ func TestBuildAppDependencyList(t *testing.T) { } appDependencyList, appStepMap, err := r.buildAppDependencyList(log.NewEntry(log.StandardLogger()), cc.appSet, cc.apps) - assert.NoError(t, err, "expected no errors, but errors occurred") + require.NoError(t, err, "expected no errors, but errors occurred") assert.Equal(t, cc.expectedList, appDependencyList, "expected appDependencyList did not match actual") assert.Equal(t, cc.expectedStepMap, appStepMap, "expected appStepMap did not match actual") }) @@ -4086,10 +4087,10 @@ func TestBuildAppDependencyList(t *testing.T) { func TestBuildAppSyncMap(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) client := fake.NewClientBuilder().WithScheme(scheme).Build() @@ -4667,7 +4668,7 @@ func TestBuildAppSyncMap(t *testing.T) { } appSyncMap, err := r.buildAppSyncMap(context.TODO(), cc.appSet, cc.appDependencyList, cc.appMap) - assert.NoError(t, err, "expected no errors, but errors occurred") + require.NoError(t, err, "expected no errors, but errors occurred") assert.Equal(t, cc.expectedMap, appSyncMap, "expected appSyncMap did not match actual") }) } @@ -4676,10 +4677,10 @@ func TestBuildAppSyncMap(t *testing.T) { func TestUpdateApplicationSetApplicationStatus(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, cc := range []struct { name string @@ -5400,7 +5401,7 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) { appStatuses[i].LastTransitionTime = nil } - assert.NoError(t, err, "expected no errors, but errors occurred") + require.NoError(t, err, "expected no errors, but errors occurred") assert.Equal(t, cc.expectedAppStatus, appStatuses, "expected appStatuses did not match actual") }) } @@ -5409,10 +5410,10 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) { func TestUpdateApplicationSetApplicationStatusProgress(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, cc := range []struct { name string @@ -6151,7 +6152,7 @@ func TestUpdateApplicationSetApplicationStatusProgress(t *testing.T) { appStatuses[i].LastTransitionTime = nil } - assert.NoError(t, err, "expected no errors, but errors occurred") + require.NoError(t, err, "expected no errors, but errors occurred") assert.Equal(t, cc.expectedAppStatus, appStatuses, "expected appStatuses did not match actual") }) } @@ -6160,10 +6161,10 @@ func TestUpdateApplicationSetApplicationStatusProgress(t *testing.T) { func TestUpdateResourceStatus(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, cc := range []struct { name string @@ -6361,7 +6362,7 @@ func TestUpdateResourceStatus(t *testing.T) { err := r.updateResourcesStatus(context.TODO(), log.NewEntry(log.StandardLogger()), &cc.appSet, cc.apps) - assert.NoError(t, err, "expected no errors, but errors occurred") + require.NoError(t, err, "expected no errors, but errors occurred") assert.Equal(t, cc.expectedResources, cc.appSet.Status.Resources, "expected resources did not match actual") }) } diff --git a/applicationset/controllers/clustereventhandler_test.go b/applicationset/controllers/clustereventhandler_test.go index cfec651434f35..15ce757954db2 100644 --- a/applicationset/controllers/clustereventhandler_test.go +++ b/applicationset/controllers/clustereventhandler_test.go @@ -6,6 +6,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -22,10 +23,10 @@ import ( func TestClusterEventHandler(t *testing.T) { scheme := runtime.NewScheme() err := argov1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = argov1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) tests := []struct { name string @@ -577,7 +578,7 @@ func TestNestedGeneratorHasClusterGenerator_NestedClusterGenerator(t *testing.T) hasClusterGenerator, err := nestedGeneratorHasClusterGenerator(nested) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, hasClusterGenerator) } @@ -604,7 +605,7 @@ func TestNestedGeneratorHasClusterGenerator_NestedMergeGenerator(t *testing.T) { hasClusterGenerator, err := nestedGeneratorHasClusterGenerator(nested) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, hasClusterGenerator) } @@ -631,6 +632,6 @@ func TestNestedGeneratorHasClusterGenerator_NestedMergeGeneratorWithInvalidJSON( hasClusterGenerator, err := nestedGeneratorHasClusterGenerator(nested) - assert.Error(t, err) + require.Error(t, err) assert.False(t, hasClusterGenerator) } diff --git a/applicationset/controllers/requeue_after_test.go b/applicationset/controllers/requeue_after_test.go index 73075bd246cca..10067c119b78d 100644 --- a/applicationset/controllers/requeue_after_test.go +++ b/applicationset/controllers/requeue_after_test.go @@ -6,6 +6,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" @@ -25,7 +26,7 @@ func TestRequeueAfter(t *testing.T) { ctx := context.Background() scheme := runtime.NewScheme() err := argov1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) gvrToListKind := map[schema.GroupVersionResource]string{{ Group: "mallard.io", Version: "v1", diff --git a/applicationset/generators/cluster_test.go b/applicationset/generators/cluster_test.go index 50908e7f7b705..a943dc98cdf2b 100644 --- a/applicationset/generators/cluster_test.go +++ b/applicationset/generators/cluster_test.go @@ -17,6 +17,7 @@ import ( argoprojiov1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) type possiblyErroringFakeCtrlRuntimeClient struct { @@ -262,9 +263,9 @@ func TestGenerateParams(t *testing.T) { }, &applicationSetInfo, nil) if testCase.expectedError != nil { - assert.EqualError(t, err, testCase.expectedError.Error()) + require.EqualError(t, err, testCase.expectedError.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCase.expected, got) } }) @@ -635,9 +636,9 @@ func TestGenerateParamsGoTemplate(t *testing.T) { }, &applicationSetInfo, nil) if testCase.expectedError != nil { - assert.EqualError(t, err, testCase.expectedError.Error()) + require.EqualError(t, err, testCase.expectedError.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCase.expected, got) } }) diff --git a/applicationset/generators/duck_type_test.go b/applicationset/generators/duck_type_test.go index ed82a5c9fe075..d2cfdbc59d6bc 100644 --- a/applicationset/generators/duck_type_test.go +++ b/applicationset/generators/duck_type_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -311,9 +312,9 @@ func TestGenerateParamsForDuckType(t *testing.T) { }, &applicationSetInfo, nil) if testCase.expectedError != nil { - assert.EqualError(t, err, testCase.expectedError.Error()) + require.EqualError(t, err, testCase.expectedError.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCase.expected, got) } }) @@ -609,9 +610,9 @@ func TestGenerateParamsForDuckTypeGoTemplate(t *testing.T) { }, &applicationSetInfo, nil) if testCase.expectedError != nil { - assert.EqualError(t, err, testCase.expectedError.Error()) + require.EqualError(t, err, testCase.expectedError.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCase.expected, got) } }) diff --git a/applicationset/generators/generator_spec_processor_test.go b/applicationset/generators/generator_spec_processor_test.go index 8f29aba4d698b..dfa89782f9a1f 100644 --- a/applicationset/generators/generator_spec_processor_test.go +++ b/applicationset/generators/generator_spec_processor_test.go @@ -90,7 +90,7 @@ func TestMatchValues(t *testing.T) { emptyTemplate(), &applicationSetInfo, nil, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCase.expected, results[0].Params) }) } @@ -174,7 +174,7 @@ func TestMatchValuesGoTemplate(t *testing.T) { emptyTemplate(), &applicationSetInfo, nil, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCase.expected, results[0].Params) }) } @@ -244,7 +244,7 @@ func TestTransForm(t *testing.T) { emptyTemplate(), &applicationSetInfo, nil, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCase.expected, results[0].Params) }) } @@ -555,7 +555,7 @@ func TestInterpolateGeneratorError(t *testing.T) { t.Run(tt.name, func(t *testing.T) { got, err := InterpolateGenerator(tt.args.requestedGenerator, tt.args.params, tt.args.useGoTemplate, tt.args.goTemplateOptions) if tt.expectedErrStr != "" { - assert.EqualError(t, err, tt.expectedErrStr) + require.EqualError(t, err, tt.expectedErrStr) } else { require.NoError(t, err) } diff --git a/applicationset/generators/git_test.go b/applicationset/generators/git_test.go index 275406cd6fc1a..4f55b1c4391b2 100644 --- a/applicationset/generators/git_test.go +++ b/applicationset/generators/git_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -342,7 +343,7 @@ func TestGitGenerateParamsFromDirectories(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) appProject := argoprojiov1alpha1.AppProject{} client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appProject).Build() @@ -350,9 +351,9 @@ func TestGitGenerateParamsFromDirectories(t *testing.T) { got, err := gitGenerator.GenerateParams(&applicationSetInfo.Spec.Generators[0], &applicationSetInfo, client) if testCaseCopy.expectedError != nil { - assert.EqualError(t, err, testCaseCopy.expectedError.Error()) + require.EqualError(t, err, testCaseCopy.expectedError.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCaseCopy.expected, got) } @@ -643,7 +644,7 @@ func TestGitGenerateParamsFromDirectoriesGoTemplate(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) appProject := argoprojiov1alpha1.AppProject{} client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appProject).Build() @@ -651,9 +652,9 @@ func TestGitGenerateParamsFromDirectoriesGoTemplate(t *testing.T) { got, err := gitGenerator.GenerateParams(&applicationSetInfo.Spec.Generators[0], &applicationSetInfo, client) if testCaseCopy.expectedError != nil { - assert.EqualError(t, err, testCaseCopy.expectedError.Error()) + require.EqualError(t, err, testCaseCopy.expectedError.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCaseCopy.expected, got) } @@ -1007,7 +1008,7 @@ cluster: scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) appProject := argoprojiov1alpha1.AppProject{} client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appProject).Build() @@ -1016,9 +1017,9 @@ cluster: fmt.Println(got, err) if testCaseCopy.expectedError != nil { - assert.EqualError(t, err, testCaseCopy.expectedError.Error()) + require.EqualError(t, err, testCaseCopy.expectedError.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCaseCopy.expected, got) } @@ -1363,7 +1364,7 @@ cluster: scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) appProject := argoprojiov1alpha1.AppProject{} client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appProject).Build() @@ -1372,9 +1373,9 @@ cluster: fmt.Println(got, err) if testCaseCopy.expectedError != nil { - assert.EqualError(t, err, testCaseCopy.expectedError.Error()) + require.EqualError(t, err, testCaseCopy.expectedError.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCaseCopy.expected, got) } diff --git a/applicationset/generators/list_test.go b/applicationset/generators/list_test.go index cf8f0bca54938..5a3b1d88dd4f4 100644 --- a/applicationset/generators/list_test.go +++ b/applicationset/generators/list_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -40,7 +41,7 @@ func TestGenerateListParams(t *testing.T) { }, }, &applicationSetInfo, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCase.expected, got) } } @@ -77,7 +78,7 @@ func TestGenerateListParamsGoTemplate(t *testing.T) { }, }, &applicationSetInfo, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, testCase.expected, got) } } diff --git a/applicationset/generators/matrix_test.go b/applicationset/generators/matrix_test.go index 86e7f236364ff..440fafd3f3ad2 100644 --- a/applicationset/generators/matrix_test.go +++ b/applicationset/generators/matrix_test.go @@ -183,9 +183,9 @@ func TestMatrixGenerate(t *testing.T) { }, appSet, nil) if testCaseCopy.expectedErr != nil { - assert.ErrorIs(t, err, testCaseCopy.expectedErr) + require.ErrorIs(t, err, testCaseCopy.expectedErr) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCaseCopy.expected, got) } }) @@ -396,9 +396,9 @@ func TestMatrixGenerateGoTemplate(t *testing.T) { }, appSet, nil) if testCaseCopy.expectedErr != nil { - assert.ErrorIs(t, err, testCaseCopy.expectedErr) + require.ErrorIs(t, err, testCaseCopy.expectedErr) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCaseCopy.expected, got) } }) @@ -682,9 +682,9 @@ func TestInterpolatedMatrixGenerate(t *testing.T) { }, appSet, nil) if testCaseCopy.expectedErr != nil { - assert.ErrorIs(t, err, testCaseCopy.expectedErr) + require.ErrorIs(t, err, testCaseCopy.expectedErr) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCaseCopy.expected, got) } }) @@ -867,9 +867,9 @@ func TestInterpolatedMatrixGenerateGoTemplate(t *testing.T) { }, appSet, nil) if testCaseCopy.expectedErr != nil { - assert.ErrorIs(t, err, testCaseCopy.expectedErr) + require.ErrorIs(t, err, testCaseCopy.expectedErr) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCaseCopy.expected, got) } }) @@ -1028,9 +1028,9 @@ func TestMatrixGenerateListElementsYaml(t *testing.T) { }, appSet, nil) if testCaseCopy.expectedErr != nil { - assert.ErrorIs(t, err, testCaseCopy.expectedErr) + require.ErrorIs(t, err, testCaseCopy.expectedErr) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCaseCopy.expected, got) } }) @@ -1115,7 +1115,7 @@ func TestGitGenerator_GenerateParams_list_x_git_matrix_generator(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) appProject := argoprojiov1alpha1.AppProject{} client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appProject).Build() diff --git a/applicationset/generators/merge_test.go b/applicationset/generators/merge_test.go index eba356c081f72..005e5c2c32905 100644 --- a/applicationset/generators/merge_test.go +++ b/applicationset/generators/merge_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" argoprojiov1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" @@ -180,15 +181,15 @@ func TestMergeGenerate(t *testing.T) { }, appSet, nil) if testCaseCopy.expectedErr != nil { - assert.EqualError(t, err, testCaseCopy.expectedErr.Error()) + require.EqualError(t, err, testCaseCopy.expectedErr.Error()) } else { expectedSet, err := listOfMapsToSet(testCaseCopy.expected) - assert.NoError(t, err) + require.NoError(t, err) actualSet, err := listOfMapsToSet(got) - assert.NoError(t, err) + require.NoError(t, err) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedSet, actualSet) } }) @@ -337,9 +338,9 @@ func TestParamSetsAreUniqueByMergeKeys(t *testing.T) { got, err := getParamSetsByMergeKey(testCaseCopy.mergeKeys, testCaseCopy.paramSets) if testCaseCopy.expectedErr != nil { - assert.EqualError(t, err, testCaseCopy.expectedErr.Error()) + require.EqualError(t, err, testCaseCopy.expectedErr.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCaseCopy.expected, got) } }) diff --git a/applicationset/generators/plugin_test.go b/applicationset/generators/plugin_test.go index 0b3deb9e0ab04..55ebcfd5c7820 100644 --- a/applicationset/generators/plugin_test.go +++ b/applicationset/generators/plugin_test.go @@ -654,7 +654,7 @@ func TestPluginGenerateParams(t *testing.T) { w.Header().Set("Content-Type", "application/json") _, err := w.Write(testCase.content) if err != nil { - assert.NoError(t, fmt.Errorf("Error Write %w", err)) + require.NoError(t, fmt.Errorf("Error Write %w", err)) } }) @@ -687,9 +687,9 @@ func TestPluginGenerateParams(t *testing.T) { } if testCase.expectedError != nil { - assert.EqualError(t, err, testCase.expectedError.Error()) + require.EqualError(t, err, testCase.expectedError.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) expectedJson, err := json.Marshal(testCase.expected) require.NoError(t, err) gotJson, err := json.Marshal(got) diff --git a/applicationset/generators/pull_request_test.go b/applicationset/generators/pull_request_test.go index 7be1a2f8025dd..b293623077009 100644 --- a/applicationset/generators/pull_request_test.go +++ b/applicationset/generators/pull_request_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -207,7 +208,7 @@ func TestPullRequestGithubGenerateParams(t *testing.T) { if c.expectedErr != nil { assert.Equal(t, c.expectedErr.Error(), gotErr.Error()) } else { - assert.NoError(t, gotErr) + require.NoError(t, gotErr) } assert.ElementsMatch(t, c.expected, got) } @@ -269,9 +270,9 @@ func TestPullRequestGetSecretRef(t *testing.T) { t.Run(c.name, func(t *testing.T) { token, err := gen.getSecretRef(ctx, c.ref, c.namespace) if c.hasError { - assert.Error(t, err) + require.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) } assert.Equal(t, c.token, token) }) @@ -349,7 +350,7 @@ func TestAllowedSCMProviderPullRequest(t *testing.T) { _, err := pullRequestGenerator.GenerateParams(&applicationSetInfo.Spec.Generators[0], &applicationSetInfo, nil) - assert.Error(t, err, "Must return an error") + require.Error(t, err, "Must return an error") assert.ErrorAs(t, err, testCaseCopy.expectedError) }) } diff --git a/applicationset/generators/scm_provider_test.go b/applicationset/generators/scm_provider_test.go index d2ce25f38b26a..04291b6303e83 100644 --- a/applicationset/generators/scm_provider_test.go +++ b/applicationset/generators/scm_provider_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -69,9 +70,9 @@ func TestSCMProviderGetSecretRef(t *testing.T) { t.Run(c.name, func(t *testing.T) { token, err := gen.getSecretRef(ctx, c.ref, c.namespace) if c.hasError { - assert.Error(t, err) + require.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) } assert.Equal(t, c.token, token) }) @@ -192,7 +193,7 @@ func TestSCMProviderGenerateParams(t *testing.T) { if testCaseCopy.expectedError != nil { assert.EqualError(t, err, testCaseCopy.expectedError.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCaseCopy.expected, got) } }) @@ -282,7 +283,7 @@ func TestAllowedSCMProvider(t *testing.T) { _, err := scmGenerator.GenerateParams(&applicationSetInfo.Spec.Generators[0], &applicationSetInfo, nil) - assert.Error(t, err, "Must return an error") + require.Error(t, err, "Must return an error") assert.ErrorAs(t, err, testCaseCopy.expectedError) }) } diff --git a/applicationset/generators/value_interpolation_test.go b/applicationset/generators/value_interpolation_test.go index adf39ccb7642b..5b490233d5d7e 100644 --- a/applicationset/generators/value_interpolation_test.go +++ b/applicationset/generators/value_interpolation_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestValueInterpolation(t *testing.T) { @@ -55,7 +56,7 @@ func TestValueInterpolation(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { err := appendTemplatedValues(testCase.values, testCase.params, false, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, testCase.expected, testCase.params) }) } @@ -116,7 +117,7 @@ func TestValueInterpolationWithGoTemplating(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { err := appendTemplatedValues(testCase.values, testCase.params, true, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, testCase.expected, testCase.params) }) } diff --git a/applicationset/services/pull_request/azure_devops_test.go b/applicationset/services/pull_request/azure_devops_test.go index d32eac0b8a330..5c6f344bc5f29 100644 --- a/applicationset/services/pull_request/azure_devops_test.go +++ b/applicationset/services/pull_request/azure_devops_test.go @@ -8,6 +8,7 @@ import ( git "github.com/microsoft/azure-devops-go-api/azuredevops/git" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" azureMock "github.com/argoproj/argo-cd/v2/applicationset/services/scm_provider/azure_devops/git/mocks" ) @@ -90,7 +91,7 @@ func TestListPullRequest(t *testing.T) { } list, err := provider.List(ctx) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, list, 1) assert.Equal(t, "feature-branch", list[0].Branch) assert.Equal(t, pr_head_sha, list[0].HeadSHA) diff --git a/applicationset/services/pull_request/bitbucket_cloud_test.go b/applicationset/services/pull_request/bitbucket_cloud_test.go index 8756aee5f1652..cbadc26b16733 100644 --- a/applicationset/services/pull_request/bitbucket_cloud_test.go +++ b/applicationset/services/pull_request/bitbucket_cloud_test.go @@ -9,6 +9,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" ) @@ -51,26 +52,26 @@ func TestParseUrlEmptyUrl(t *testing.T) { url, err := parseUrl("") bitbucketUrl, _ := url.Parse("https://api.bitbucket.org/2.0") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, bitbucketUrl, url) } func TestInvalidBaseUrlBasicAuthCloud(t *testing.T) { _, err := NewBitbucketCloudServiceBasicAuth("http:// example.org", "user", "password", "OWNER", "REPO") - assert.Error(t, err) + require.Error(t, err) } func TestInvalidBaseUrlBearerTokenCloud(t *testing.T) { _, err := NewBitbucketCloudServiceBearerToken("http:// example.org", "TOKEN", "OWNER", "REPO") - assert.Error(t, err) + require.Error(t, err) } func TestInvalidBaseUrlNoAuthCloud(t *testing.T) { _, err := NewBitbucketCloudServiceNoAuth("http:// example.org", "OWNER", "REPO") - assert.Error(t, err) + require.Error(t, err) } func TestListPullRequestBearerTokenCloud(t *testing.T) { @@ -80,9 +81,9 @@ func TestListPullRequestBearerTokenCloud(t *testing.T) { })) defer ts.Close() svc, err := NewBitbucketCloudServiceBearerToken(ts.URL, "TOKEN", "OWNER", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 1) assert.Equal(t, 101, pullRequests[0].Number) assert.Equal(t, "feature/foo-bar", pullRequests[0].Branch) @@ -96,9 +97,9 @@ func TestListPullRequestNoAuthCloud(t *testing.T) { })) defer ts.Close() svc, err := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 1) assert.Equal(t, 101, pullRequests[0].Number) assert.Equal(t, "feature/foo-bar", pullRequests[0].Branch) @@ -112,9 +113,9 @@ func TestListPullRequestBasicAuthCloud(t *testing.T) { })) defer ts.Close() svc, err := NewBitbucketCloudServiceBasicAuth(ts.URL, "user", "password", "OWNER", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 1) assert.Equal(t, 101, pullRequests[0].Number) assert.Equal(t, "feature/foo-bar", pullRequests[0].Branch) @@ -189,9 +190,9 @@ func TestListPullRequestPaginationCloud(t *testing.T) { })) defer ts.Close() svc, err := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 3) assert.Equal(t, PullRequest{ Number: 101, @@ -217,7 +218,7 @@ func TestListResponseErrorCloud(t *testing.T) { defer ts.Close() svc, _ := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO") _, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.Error(t, err) + require.Error(t, err) } func TestListResponseMalformedCloud(t *testing.T) { @@ -241,7 +242,7 @@ func TestListResponseMalformedCloud(t *testing.T) { defer ts.Close() svc, _ := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO") _, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.Error(t, err) + require.Error(t, err) } func TestListResponseMalformedValuesCloud(t *testing.T) { @@ -265,7 +266,7 @@ func TestListResponseMalformedValuesCloud(t *testing.T) { defer ts.Close() svc, _ := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO") _, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.Error(t, err) + require.Error(t, err) } func TestListResponseEmptyCloud(t *testing.T) { @@ -288,9 +289,9 @@ func TestListResponseEmptyCloud(t *testing.T) { })) defer ts.Close() svc, err := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, pullRequests) } @@ -363,13 +364,13 @@ func TestListPullRequestBranchMatchCloud(t *testing.T) { defer ts.Close() regexp := `feature-1[\d]{2}` svc, err := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{ { BranchMatch: ®exp, }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 2) assert.Equal(t, PullRequest{ Number: 101, @@ -384,13 +385,13 @@ func TestListPullRequestBranchMatchCloud(t *testing.T) { regexp = `.*2$` svc, err = NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err = ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{ { BranchMatch: ®exp, }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 1) assert.Equal(t, PullRequest{ Number: 102, @@ -400,11 +401,11 @@ func TestListPullRequestBranchMatchCloud(t *testing.T) { regexp = `[\d{2}` svc, err = NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO") - assert.NoError(t, err) + require.NoError(t, err) _, err = ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{ { BranchMatch: ®exp, }, }) - assert.Error(t, err) + require.Error(t, err) } diff --git a/applicationset/services/pull_request/bitbucket_server_test.go b/applicationset/services/pull_request/bitbucket_server_test.go index e50c286528d5b..cc3f6863205d6 100644 --- a/applicationset/services/pull_request/bitbucket_server_test.go +++ b/applicationset/services/pull_request/bitbucket_server_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" ) @@ -55,9 +56,9 @@ func TestListPullRequestNoAuth(t *testing.T) { })) defer ts.Close() svc, err := NewBitbucketServiceNoAuth(context.Background(), ts.URL, "PROJECT", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 1) assert.Equal(t, 101, pullRequests[0].Number) assert.Equal(t, "feature-ABC-123", pullRequests[0].Branch) @@ -136,9 +137,9 @@ func TestListPullRequestPagination(t *testing.T) { })) defer ts.Close() svc, err := NewBitbucketServiceNoAuth(context.Background(), ts.URL, "PROJECT", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 3) assert.Equal(t, PullRequest{ Number: 101, @@ -172,9 +173,9 @@ func TestListPullRequestBasicAuth(t *testing.T) { })) defer ts.Close() svc, err := NewBitbucketServiceBasicAuth(context.Background(), "user", "password", ts.URL, "PROJECT", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 1) assert.Equal(t, 101, pullRequests[0].Number) assert.Equal(t, "feature-ABC-123", pullRequests[0].Branch) @@ -188,7 +189,7 @@ func TestListResponseError(t *testing.T) { defer ts.Close() svc, _ := NewBitbucketServiceNoAuth(context.Background(), ts.URL, "PROJECT", "REPO") _, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.Error(t, err) + require.Error(t, err) } func TestListResponseMalformed(t *testing.T) { @@ -213,7 +214,7 @@ func TestListResponseMalformed(t *testing.T) { defer ts.Close() svc, _ := NewBitbucketServiceNoAuth(context.Background(), ts.URL, "PROJECT", "REPO") _, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.Error(t, err) + require.Error(t, err) } func TestListResponseEmpty(t *testing.T) { @@ -237,9 +238,9 @@ func TestListResponseEmpty(t *testing.T) { })) defer ts.Close() svc, err := NewBitbucketServiceNoAuth(context.Background(), ts.URL, "PROJECT", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, pullRequests) } @@ -315,13 +316,13 @@ func TestListPullRequestBranchMatch(t *testing.T) { defer ts.Close() regexp := `feature-1[\d]{2}` svc, err := NewBitbucketServiceNoAuth(context.Background(), ts.URL, "PROJECT", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{ { BranchMatch: ®exp, }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 2) assert.Equal(t, PullRequest{ Number: 101, @@ -340,13 +341,13 @@ func TestListPullRequestBranchMatch(t *testing.T) { regexp = `.*2$` svc, err = NewBitbucketServiceNoAuth(context.Background(), ts.URL, "PROJECT", "REPO") - assert.NoError(t, err) + require.NoError(t, err) pullRequests, err = ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{ { BranchMatch: ®exp, }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 1) assert.Equal(t, PullRequest{ Number: 102, @@ -358,11 +359,11 @@ func TestListPullRequestBranchMatch(t *testing.T) { regexp = `[\d{2}` svc, err = NewBitbucketServiceNoAuth(context.Background(), ts.URL, "PROJECT", "REPO") - assert.NoError(t, err) + require.NoError(t, err) _, err = ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{ { BranchMatch: ®exp, }, }) - assert.Error(t, err) + require.Error(t, err) } diff --git a/applicationset/services/pull_request/gitea_test.go b/applicationset/services/pull_request/gitea_test.go index 5a5eb4262c616..0e55d2376179e 100644 --- a/applicationset/services/pull_request/gitea_test.go +++ b/applicationset/services/pull_request/gitea_test.go @@ -10,6 +10,7 @@ import ( "code.gitea.io/sdk/gitea" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func giteaMockHandler(t *testing.T) func(http.ResponseWriter, *http.Request) { @@ -250,9 +251,9 @@ func TestGiteaList(t *testing.T) { giteaMockHandler(t)(w, r) })) host, err := NewGiteaService(context.Background(), "", ts.URL, "test-argocd", "pr-test", false) - assert.NoError(t, err) + require.NoError(t, err) prs, err := host.List(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, prs, 1) assert.Equal(t, 1, prs[0].Number) assert.Equal(t, "test", prs[0].Branch) diff --git a/applicationset/services/pull_request/gitlab_test.go b/applicationset/services/pull_request/gitlab_test.go index 2d327068224cd..cc8eed7bea102 100644 --- a/applicationset/services/pull_request/gitlab_test.go +++ b/applicationset/services/pull_request/gitlab_test.go @@ -9,6 +9,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func writeMRListResponse(t *testing.T, w io.Writer) { @@ -35,10 +36,10 @@ func TestGitLabServiceCustomBaseURL(t *testing.T) { }) svc, err := NewGitLabService(context.Background(), "", server.URL, "278964", nil, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) _, err = svc.List(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) } func TestGitLabServiceToken(t *testing.T) { @@ -54,10 +55,10 @@ func TestGitLabServiceToken(t *testing.T) { }) svc, err := NewGitLabService(context.Background(), "token-123", server.URL, "278964", nil, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) _, err = svc.List(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) } func TestList(t *testing.T) { @@ -73,10 +74,10 @@ func TestList(t *testing.T) { }) svc, err := NewGitLabService(context.Background(), "", server.URL, "278964", []string{}, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) prs, err := svc.List(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, prs, 1) assert.Equal(t, 15442, prs[0].Number) assert.Equal(t, "use-structured-logging-for-db-load-balancer", prs[0].Branch) @@ -97,10 +98,10 @@ func TestListWithLabels(t *testing.T) { }) svc, err := NewGitLabService(context.Background(), "", server.URL, "278964", []string{"feature", "ready"}, "", "", false) - assert.NoError(t, err) + require.NoError(t, err) _, err = svc.List(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) } func TestListWithState(t *testing.T) { @@ -116,8 +117,8 @@ func TestListWithState(t *testing.T) { }) svc, err := NewGitLabService(context.Background(), "", server.URL, "278964", []string{}, "opened", "", false) - assert.NoError(t, err) + require.NoError(t, err) _, err = svc.List(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) } diff --git a/applicationset/services/pull_request/utils_test.go b/applicationset/services/pull_request/utils_test.go index 5e4f4be5d4070..a352348d40588 100644 --- a/applicationset/services/pull_request/utils_test.go +++ b/applicationset/services/pull_request/utils_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" argoprojiov1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" ) @@ -32,7 +33,7 @@ func TestFilterBranchMatchBadRegexp(t *testing.T) { }, } _, err := ListPullRequests(context.Background(), provider, filters) - assert.Error(t, err) + require.Error(t, err) } func TestFilterBranchMatch(t *testing.T) { @@ -72,7 +73,7 @@ func TestFilterBranchMatch(t *testing.T) { }, } pullRequests, err := ListPullRequests(context.Background(), provider, filters) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 1) assert.Equal(t, "two", pullRequests[0].Branch) } @@ -114,7 +115,7 @@ func TestFilterTargetBranchMatch(t *testing.T) { }, } pullRequests, err := ListPullRequests(context.Background(), provider, filters) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 1) assert.Equal(t, "two", pullRequests[0].Branch) } @@ -159,7 +160,7 @@ func TestMultiFilterOr(t *testing.T) { }, } pullRequests, err := ListPullRequests(context.Background(), provider, filters) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 3) assert.Equal(t, "two", pullRequests[0].Branch) assert.Equal(t, "three", pullRequests[1].Branch) @@ -208,7 +209,7 @@ func TestMultiFilterOrWithTargetBranchFilter(t *testing.T) { }, } pullRequests, err := ListPullRequests(context.Background(), provider, filters) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, pullRequests, 2) assert.Equal(t, "two", pullRequests[0].Branch) assert.Equal(t, "four", pullRequests[1].Branch) @@ -235,7 +236,7 @@ func TestNoFilters(t *testing.T) { ) filters := []argoprojiov1alpha1.PullRequestGeneratorFilter{} repos, err := ListPullRequests(context.Background(), provider, filters) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 2) assert.Equal(t, "one", repos[0].Branch) assert.Equal(t, "two", repos[1].Branch) diff --git a/applicationset/services/repo_service_test.go b/applicationset/services/repo_service_test.go index 7660502130ce5..dbce9843a1b23 100644 --- a/applicationset/services/repo_service_test.go +++ b/applicationset/services/repo_service_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/reposerver/apiclient" repo_mocks "github.com/argoproj/argo-cd/v2/reposerver/apiclient/mocks" @@ -190,6 +191,6 @@ func TestNewArgoCDService(t *testing.T) { service, err := NewArgoCDService(func(ctx context.Context, url, project string) (*v1alpha1.Repository, error) { return &v1alpha1.Repository{}, nil }, false, &repo_mocks.Clientset{}, false) - assert.NoError(t, err, err) + require.NoError(t, err, err) assert.NotNil(t, service) } diff --git a/applicationset/services/scm_provider/azure_devops_test.go b/applicationset/services/scm_provider/azure_devops_test.go index aa9e48582c5a2..3379653401888 100644 --- a/applicationset/services/scm_provider/azure_devops_test.go +++ b/applicationset/services/scm_provider/azure_devops_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "k8s.io/utils/ptr" "github.com/microsoft/azure-devops-go-api/azuredevops" @@ -92,14 +93,14 @@ func TestAzureDevopsRepoHasPath(t *testing.T) { hasPath, err := provider.RepoHasPath(ctx, repo, path) if testCase.clientError != nil { - assert.ErrorContains(t, err, testCase.clientError.Error()) + require.ErrorContains(t, err, testCase.clientError.Error()) gitClientMock.AssertNotCalled(t, "GetItem", ctx, azureGit.GetItemArgs{Project: &teamProject, Path: &path, VersionDescriptor: &azureGit.GitVersionDescriptor{Version: &branchName}, RepositoryId: repoId}) return } if testCase.returnError { - assert.ErrorContains(t, err, testCase.errorMessage) + require.ErrorContains(t, err, testCase.errorMessage) } assert.Equal(t, testCase.pathFound, hasPath) @@ -156,9 +157,9 @@ func TestGetDefaultBranchOnDisabledRepo(t *testing.T) { branches, err := provider.GetBranches(ctx, repo) if testCase.shouldReturnError { - assert.Error(t, err) + require.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) } assert.Empty(t, branches) @@ -215,9 +216,9 @@ func TestGetAllBranchesOnDisabledRepo(t *testing.T) { branches, err := provider.GetBranches(ctx, repo) if testCase.shouldReturnError { - assert.Error(t, err) + require.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) } assert.Empty(t, branches) @@ -251,7 +252,7 @@ func TestAzureDevOpsGetDefaultBranchStripsRefsName(t *testing.T) { provider := AzureDevOpsProvider{organization: organization, teamProject: teamProject, clientFactory: clientFactoryMock, allBranches: false} branches, err := provider.GetBranches(ctx, repo) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, branches, 1) assert.Equal(t, strippedBranchName, branches[0].Branch) @@ -308,7 +309,7 @@ func TestAzureDevOpsGetBranchesDefultBranchOnly(t *testing.T) { branches, err := provider.GetBranches(ctx, repo) if testCase.clientError != nil { - assert.ErrorContains(t, err, testCase.clientError.Error()) + require.ErrorContains(t, err, testCase.clientError.Error()) gitClientMock.AssertNotCalled(t, "GetBranch", ctx, azureGit.GetBranchArgs{RepositoryId: &repoName, Project: &teamProject, Name: &defaultBranch}) return @@ -316,7 +317,7 @@ func TestAzureDevOpsGetBranchesDefultBranchOnly(t *testing.T) { if testCase.getBranchesApiError != nil { assert.Empty(t, branches) - assert.ErrorContains(t, err, testCase.getBranchesApiError.Error()) + require.ErrorContains(t, err, testCase.getBranchesApiError.Error()) } else { if testCase.expectedBranch != nil { assert.NotEmpty(t, branches) @@ -392,20 +393,20 @@ func TestAzureDevopsGetBranches(t *testing.T) { branches, err := provider.GetBranches(ctx, repo) if testCase.expectedProcessingErrorMsg != "" { - assert.ErrorContains(t, err, testCase.expectedProcessingErrorMsg) + require.ErrorContains(t, err, testCase.expectedProcessingErrorMsg) assert.Nil(t, branches) return } if testCase.clientError != nil { - assert.ErrorContains(t, err, testCase.clientError.Error()) + require.ErrorContains(t, err, testCase.clientError.Error()) gitClientMock.AssertNotCalled(t, "GetBranches", ctx, azureGit.GetBranchesArgs{RepositoryId: &repoName, Project: &teamProject}) return } if testCase.getBranchesApiError != nil { assert.Empty(t, branches) - assert.ErrorContains(t, err, testCase.getBranchesApiError.Error()) + require.ErrorContains(t, err, testCase.getBranchesApiError.Error()) } else { if len(*testCase.expectedBranches) > 0 { assert.NotEmpty(t, branches) @@ -488,7 +489,7 @@ func TestGetAzureDevopsRepositories(t *testing.T) { repositories, err := provider.ListRepos(ctx, "https") if testCase.getRepositoriesError != nil { - assert.Error(t, err, "Expected an error from test case %v", testCase.name) + require.Error(t, err, "Expected an error from test case %v", testCase.name) } if testCase.expectedNumberOfRepos == 0 { diff --git a/applicationset/services/scm_provider/bitbucket_cloud_test.go b/applicationset/services/scm_provider/bitbucket_cloud_test.go index dc7732e9f6850..d4127dbbf4002 100644 --- a/applicationset/services/scm_provider/bitbucket_cloud_test.go +++ b/applicationset/services/scm_provider/bitbucket_cloud_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" ) @@ -18,7 +19,7 @@ func TestBitbucketHasRepo(t *testing.T) { res.WriteHeader(http.StatusNotFound) _, err := res.Write([]byte("")) if err != nil { - assert.NoError(t, fmt.Errorf("Error in mock response %w", err)) + require.NoError(t, fmt.Errorf("Error in mock response %w", err)) } } if req.URL.Path == "/repositories/test-owner/testmike/src/dc1edb6c7d650d8ba67719ddf7b662ad8f8fb798/.gitignore" { @@ -55,7 +56,7 @@ func TestBitbucketHasRepo(t *testing.T) { "size": 624 }`)) if err != nil { - assert.NoError(t, fmt.Errorf("Error in mock response %w", err)) + require.NoError(t, fmt.Errorf("Error in mock response %w", err)) } } })) @@ -95,7 +96,7 @@ func TestBitbucketHasRepo(t *testing.T) { } hasPath, err := provider.RepoHasPath(context.Background(), repo, c.path) if err != nil { - assert.Error(t, fmt.Errorf("Error in test %w", err)) + require.Error(t, fmt.Errorf("Error in test %w", err)) } if c.status != http.StatusOK { assert.False(t, hasPath) @@ -208,7 +209,7 @@ func TestBitbucketListRepos(t *testing.T) { "size": 1 }`)) if err != nil { - assert.NoError(t, fmt.Errorf("Error in mock response %w", err)) + require.NoError(t, fmt.Errorf("Error in mock response %w", err)) } } if req.URL.Path == "/repositories/test-owner/testmike/refs/branches/main" { @@ -303,7 +304,7 @@ func TestBitbucketListRepos(t *testing.T) { } }`)) if err != nil { - assert.NoError(t, fmt.Errorf("Error in mock response %w", err)) + require.NoError(t, fmt.Errorf("Error in mock response %w", err)) } } if req.URL.Path == "/repositories/test-owner" { @@ -442,7 +443,7 @@ func TestBitbucketListRepos(t *testing.T) { "size": 1 }`)) if err != nil { - assert.NoError(t, fmt.Errorf("Error in mock response %w", err)) + require.NoError(t, fmt.Errorf("Error in mock response %w", err)) } } })) @@ -489,9 +490,9 @@ func TestBitbucketListRepos(t *testing.T) { provider, _ := NewBitBucketCloudProvider(context.Background(), c.owner, "user", "password", c.allBranches) rawRepos, err := ListRepos(context.Background(), provider, c.filters, c.proto) if c.hasError { - assert.Error(t, err) + require.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) repos := []*Repository{} branches := []string{} for _, r := range rawRepos { diff --git a/applicationset/services/scm_provider/bitbucket_server_test.go b/applicationset/services/scm_provider/bitbucket_server_test.go index e1990b8d116a2..a8fc7afac5580 100644 --- a/applicationset/services/scm_provider/bitbucket_server_test.go +++ b/applicationset/services/scm_provider/bitbucket_server_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func defaultHandler(t *testing.T) func(http.ResponseWriter, *http.Request) { @@ -79,7 +80,7 @@ func defaultHandler(t *testing.T) func(http.ResponseWriter, *http.Request) { } func verifyDefaultRepo(t *testing.T, err error, repos []*Repository) { - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 1) assert.Equal(t, Repository{ Organization: "PROJECT", @@ -99,7 +100,7 @@ func TestListReposNoAuth(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", true) - assert.NoError(t, err) + require.NoError(t, err) repos, err := provider.ListRepos(context.Background(), "ssh") verifyDefaultRepo(t, err, repos) } @@ -191,9 +192,9 @@ func TestListReposPagination(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", true) - assert.NoError(t, err) + require.NoError(t, err) repos, err := provider.ListRepos(context.Background(), "ssh") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 2) assert.Equal(t, Repository{ Organization: "PROJECT", @@ -268,7 +269,7 @@ func TestGetBranchesBranchPagination(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", true) - assert.NoError(t, err) + require.NoError(t, err) repos, err := provider.GetBranches(context.Background(), &Repository{ Organization: "PROJECT", Repository: "REPO", @@ -276,7 +277,7 @@ func TestGetBranchesBranchPagination(t *testing.T) { Labels: []string{}, RepositoryId: 1, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 2) assert.Equal(t, Repository{ Organization: "PROJECT", @@ -321,7 +322,7 @@ func TestGetBranchesDefaultOnly(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", false) - assert.NoError(t, err) + require.NoError(t, err) repos, err := provider.GetBranches(context.Background(), &Repository{ Organization: "PROJECT", Repository: "REPO", @@ -329,7 +330,7 @@ func TestGetBranchesDefaultOnly(t *testing.T) { Labels: []string{}, RepositoryId: 1, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 1) assert.Equal(t, Repository{ Organization: "PROJECT", @@ -353,7 +354,7 @@ func TestGetBranchesMissingDefault(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", false) - assert.NoError(t, err) + require.NoError(t, err) repos, err := provider.GetBranches(context.Background(), &Repository{ Organization: "PROJECT", Repository: "REPO", @@ -361,7 +362,7 @@ func TestGetBranchesMissingDefault(t *testing.T) { Labels: []string{}, RepositoryId: 1, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, repos) } @@ -375,7 +376,7 @@ func TestGetBranchesEmptyRepo(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", false) - assert.NoError(t, err) + require.NoError(t, err) repos, err := provider.GetBranches(context.Background(), &Repository{ Organization: "PROJECT", Repository: "REPO", @@ -384,7 +385,7 @@ func TestGetBranchesEmptyRepo(t *testing.T) { RepositoryId: 1, }) assert.Empty(t, repos) - assert.NoError(t, err) + require.NoError(t, err) } func TestGetBranchesErrorDefaultBranch(t *testing.T) { @@ -398,7 +399,7 @@ func TestGetBranchesErrorDefaultBranch(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", false) - assert.NoError(t, err) + require.NoError(t, err) _, err = provider.GetBranches(context.Background(), &Repository{ Organization: "PROJECT", Repository: "REPO", @@ -406,7 +407,7 @@ func TestGetBranchesErrorDefaultBranch(t *testing.T) { Labels: []string{}, RepositoryId: 1, }) - assert.Error(t, err) + require.Error(t, err) } func TestListReposBasicAuth(t *testing.T) { @@ -417,7 +418,7 @@ func TestListReposBasicAuth(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderBasicAuth(context.Background(), "user", "password", ts.URL, "PROJECT", true) - assert.NoError(t, err) + require.NoError(t, err) repos, err := provider.ListRepos(context.Background(), "ssh") verifyDefaultRepo(t, err, repos) } @@ -444,9 +445,9 @@ func TestListReposDefaultBranch(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", false) - assert.NoError(t, err) + require.NoError(t, err) repos, err := provider.ListRepos(context.Background(), "ssh") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 1) assert.Equal(t, Repository{ Organization: "PROJECT", @@ -470,9 +471,9 @@ func TestListReposMissingDefaultBranch(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", false) - assert.NoError(t, err) + require.NoError(t, err) repos, err := provider.ListRepos(context.Background(), "ssh") - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, repos) } @@ -487,9 +488,9 @@ func TestListReposErrorDefaultBranch(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", false) - assert.NoError(t, err) + require.NoError(t, err) _, err = provider.ListRepos(context.Background(), "ssh") - assert.Error(t, err) + require.Error(t, err) } func TestListReposCloneProtocol(t *testing.T) { @@ -499,9 +500,9 @@ func TestListReposCloneProtocol(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", true) - assert.NoError(t, err) + require.NoError(t, err) repos, err := provider.ListRepos(context.Background(), "https") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 1) assert.Equal(t, Repository{ Organization: "PROJECT", @@ -521,9 +522,9 @@ func TestListReposUnknownProtocol(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", true) - assert.NoError(t, err) + require.NoError(t, err) _, errProtocol := provider.ListRepos(context.Background(), "http") - assert.Error(t, errProtocol) + require.Error(t, errProtocol) } func TestBitbucketServerHasPath(t *testing.T) { @@ -559,36 +560,36 @@ func TestBitbucketServerHasPath(t *testing.T) { })) defer ts.Close() provider, err := NewBitbucketServerProviderNoAuth(context.Background(), ts.URL, "PROJECT", true) - assert.NoError(t, err) + require.NoError(t, err) repo := &Repository{ Organization: "PROJECT", Repository: "REPO", Branch: "main", } ok, err := provider.RepoHasPath(context.Background(), repo, "pkg") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, ok) ok, err = provider.RepoHasPath(context.Background(), repo, "pkg/") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, ok) ok, err = provider.RepoHasPath(context.Background(), repo, "anotherpkg/file.txt") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, ok) ok, err = provider.RepoHasPath(context.Background(), repo, "anotherpkg/missing.txt") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, ok) ok, err = provider.RepoHasPath(context.Background(), repo, "notathing") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, ok) ok, err = provider.RepoHasPath(context.Background(), repo, "return-redirect") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, ok) _, err = provider.RepoHasPath(context.Background(), repo, "unauthorized-response") - assert.Error(t, err) + require.Error(t, err) } diff --git a/applicationset/services/scm_provider/gitea_test.go b/applicationset/services/scm_provider/gitea_test.go index fedbe22d986c4..231913761014b 100644 --- a/applicationset/services/scm_provider/gitea_test.go +++ b/applicationset/services/scm_provider/gitea_test.go @@ -306,9 +306,9 @@ func TestGiteaListRepos(t *testing.T) { provider, _ := NewGiteaProvider(context.Background(), "test-argocd", "", ts.URL, c.allBranches, false) rawRepos, err := ListRepos(context.Background(), provider, c.filters, c.proto) if c.hasError { - assert.Error(t, err) + require.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) // Just check that this one project shows up. Not a great test but better thing nothing? repos := []*Repository{} branches := []string{} @@ -342,19 +342,19 @@ func TestGiteaHasPath(t *testing.T) { t.Run("file exists", func(t *testing.T) { ok, err := host.RepoHasPath(context.Background(), repo, "README.md") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, ok) }) t.Run("directory exists", func(t *testing.T) { ok, err := host.RepoHasPath(context.Background(), repo, "gitea") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, ok) }) t.Run("does not exists", func(t *testing.T) { ok, err := host.RepoHasPath(context.Background(), repo, "notathing") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, ok) }) } diff --git a/applicationset/services/scm_provider/github_test.go b/applicationset/services/scm_provider/github_test.go index b9f576617135c..03b59c801721a 100644 --- a/applicationset/services/scm_provider/github_test.go +++ b/applicationset/services/scm_provider/github_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" ) @@ -244,9 +245,9 @@ func TestGithubListRepos(t *testing.T) { provider, _ := NewGithubProvider(context.Background(), "argoproj", "", ts.URL, c.allBranches) rawRepos, err := ListRepos(context.Background(), provider, c.filters, c.proto) if c.hasError { - assert.Error(t, err) + require.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) // Just check that this one project shows up. Not a great test but better thing nothing? repos := []*Repository{} branches := []string{} @@ -278,11 +279,11 @@ func TestGithubHasPath(t *testing.T) { Branch: "master", } ok, err := host.RepoHasPath(context.Background(), repo, "pkg/") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, ok) ok, err = host.RepoHasPath(context.Background(), repo, "notathing/") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, ok) } @@ -299,7 +300,7 @@ func TestGithubGetBranches(t *testing.T) { } repos, err := host.GetBranches(context.Background(), repo) if err != nil { - assert.NoError(t, err) + require.NoError(t, err) } else { assert.Equal(t, "master", repos[0].Branch) } @@ -310,13 +311,13 @@ func TestGithubGetBranches(t *testing.T) { Branch: "main", } _, err = host.GetBranches(context.Background(), repo2) - assert.NoError(t, err) + require.NoError(t, err) // Get all branches host.allBranches = true repos, err = host.GetBranches(context.Background(), repo) if err != nil { - assert.NoError(t, err) + require.NoError(t, err) } else { // considering master branch to exist. assert.Len(t, repos, 1) diff --git a/applicationset/services/scm_provider/gitlab_test.go b/applicationset/services/scm_provider/gitlab_test.go index 0e8403b1663a6..c897e9b3183de 100644 --- a/applicationset/services/scm_provider/gitlab_test.go +++ b/applicationset/services/scm_provider/gitlab_test.go @@ -9,6 +9,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" ) @@ -1123,9 +1124,9 @@ func TestGitlabListRepos(t *testing.T) { provider, _ := NewGitlabProvider(context.Background(), "test-argocd-proton", "", ts.URL, c.allBranches, c.includeSubgroups, c.includeSharedProjects, c.insecure, "", c.topic) rawRepos, err := ListRepos(context.Background(), provider, c.filters, c.proto) if c.hasError { - assert.Error(t, err) + require.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) // Just check that this one project shows up. Not a great test but better than nothing? repos := []*Repository{} uniqueRepos := map[string]int{} @@ -1195,7 +1196,7 @@ func TestGitlabHasPath(t *testing.T) { for _, c := range cases { t.Run(c.name, func(t *testing.T) { ok, err := host.RepoHasPath(context.Background(), repo, c.path) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, c.exists, ok) }) } @@ -1213,7 +1214,7 @@ func TestGitlabGetBranches(t *testing.T) { } t.Run("branch exists", func(t *testing.T) { repos, err := host.GetBranches(context.Background(), repo) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "master", repos[0].Branch) }) @@ -1223,6 +1224,6 @@ func TestGitlabGetBranches(t *testing.T) { } t.Run("unknown branch", func(t *testing.T) { _, err := host.GetBranches(context.Background(), repo2) - assert.NoError(t, err) + require.NoError(t, err) }) } diff --git a/applicationset/services/scm_provider/utils_test.go b/applicationset/services/scm_provider/utils_test.go index 452148a34b633..83c6c4fc23d9e 100644 --- a/applicationset/services/scm_provider/utils_test.go +++ b/applicationset/services/scm_provider/utils_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" argoprojiov1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" ) @@ -37,7 +38,7 @@ func TestFilterRepoMatch(t *testing.T) { }, } repos, err := ListRepos(context.Background(), provider, filters, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 2) assert.Equal(t, "one", repos[0].Repository) assert.Equal(t, "three", repos[1].Repository) @@ -66,7 +67,7 @@ func TestFilterLabelMatch(t *testing.T) { }, } repos, err := ListRepos(context.Background(), provider, filters, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 2) assert.Equal(t, "one", repos[0].Repository) assert.Equal(t, "two", repos[1].Repository) @@ -92,7 +93,7 @@ func TestFilterPathExists(t *testing.T) { }, } repos, err := ListRepos(context.Background(), provider, filters, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 1) assert.Equal(t, "two", repos[0].Repository) } @@ -117,7 +118,7 @@ func TestFilterPathDoesntExists(t *testing.T) { }, } repos, err := ListRepos(context.Background(), provider, filters, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 2) } @@ -135,7 +136,7 @@ func TestFilterRepoMatchBadRegexp(t *testing.T) { }, } _, err := ListRepos(context.Background(), provider, filters, "") - assert.Error(t, err) + require.Error(t, err) } func TestFilterLabelMatchBadRegexp(t *testing.T) { @@ -152,7 +153,7 @@ func TestFilterLabelMatchBadRegexp(t *testing.T) { }, } _, err := ListRepos(context.Background(), provider, filters, "") - assert.Error(t, err) + require.Error(t, err) } func TestFilterBranchMatch(t *testing.T) { @@ -186,7 +187,7 @@ func TestFilterBranchMatch(t *testing.T) { }, } repos, err := ListRepos(context.Background(), provider, filters, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 2) assert.Equal(t, "one", repos[0].Repository) assert.Equal(t, "two", repos[0].Branch) @@ -218,7 +219,7 @@ func TestMultiFilterAnd(t *testing.T) { }, } repos, err := ListRepos(context.Background(), provider, filters, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 1) assert.Equal(t, "two", repos[0].Repository) } @@ -249,7 +250,7 @@ func TestMultiFilterOr(t *testing.T) { }, } repos, err := ListRepos(context.Background(), provider, filters, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 3) assert.Equal(t, "one", repos[0].Repository) assert.Equal(t, "two", repos[1].Repository) @@ -275,7 +276,7 @@ func TestNoFilters(t *testing.T) { } filters := []argoprojiov1alpha1.SCMProviderGeneratorFilter{} repos, err := ListRepos(context.Background(), provider, filters, "") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 3) assert.Equal(t, "one", repos[0].Repository) assert.Equal(t, "two", repos[1].Repository) diff --git a/applicationset/utils/clusterUtils_test.go b/applicationset/utils/clusterUtils_test.go index 63d9b3887175d..9e8694359b6bd 100644 --- a/applicationset/utils/clusterUtils_test.go +++ b/applicationset/utils/clusterUtils_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -33,7 +34,7 @@ func Test_secretToCluster(t *testing.T) { }, } cluster, err := secretToCluster(secret) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, argoappv1.Cluster{ Name: "test", Server: "http://mycluster", @@ -56,7 +57,7 @@ func Test_secretToCluster_NoConfig(t *testing.T) { }, } cluster, err := secretToCluster(secret) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, argoappv1.Cluster{ Name: "test", Server: "http://mycluster", @@ -92,7 +93,7 @@ func TestValidateDestination(t *testing.T) { } appCond := ValidateDestination(context.Background(), &dest, nil, fakeNamespace) - assert.NoError(t, appCond) + require.NoError(t, appCond) assert.False(t, dest.IsServerInferred()) }) @@ -107,7 +108,7 @@ func TestValidateDestination(t *testing.T) { kubeclientset := fake.NewSimpleClientset(objects...) appCond := ValidateDestination(context.Background(), &dest, kubeclientset, fakeNamespace) - assert.NoError(t, appCond) + require.NoError(t, appCond) assert.Equal(t, "https://127.0.0.1:6443", dest.Server) assert.True(t, dest.IsServerInferred()) }) diff --git a/applicationset/utils/map_test.go b/applicationset/utils/map_test.go index 6fd4ae906baa1..c12216e0e1ac6 100644 --- a/applicationset/utils/map_test.go +++ b/applicationset/utils/map_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestCombineStringMaps(t *testing.T) { @@ -49,7 +50,7 @@ func TestCombineStringMaps(t *testing.T) { if testCaseCopy.expectedErr != nil { assert.EqualError(t, err, testCaseCopy.expectedErr.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testCaseCopy.expected, got) } }) diff --git a/applicationset/utils/utils_test.go b/applicationset/utils/utils_test.go index e029a4e909c4f..5b9ed9295780b 100644 --- a/applicationset/utils/utils_test.go +++ b/applicationset/utils/utils_test.go @@ -188,7 +188,7 @@ func TestRenderTemplateParams(t *testing.T) { assert.Equal(t, "default", newApplication.ObjectMeta.Namespace) assert.Equal(t, newApplication.ObjectMeta.UID, types.UID("d546da12-06b7-4f9a-8ea2-3adb16a20e2b")) assert.Equal(t, newApplication.ObjectMeta.CreationTimestamp, application.ObjectMeta.CreationTimestamp) - assert.NoError(t, err) + require.NoError(t, err) } }) } @@ -237,13 +237,13 @@ func TestRenderHelmValuesObjectJson(t *testing.T) { render := Render{} newApplication, err := render.RenderTemplateParams(application, nil, params, true, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, newApplication) var unmarshaled interface{} err = json.Unmarshal(newApplication.Spec.Source.Helm.ValuesObject.Raw, &unmarshaled) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Hello world", unmarshaled.(map[string]interface{})["some"].(map[string]interface{})["string"]) } @@ -287,13 +287,13 @@ func TestRenderHelmValuesObjectYaml(t *testing.T) { render := Render{} newApplication, err := render.RenderTemplateParams(application, nil, params, true, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, newApplication) var unmarshaled interface{} err = json.Unmarshal(newApplication.Spec.Source.Helm.ValuesObject.Raw, &unmarshaled) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Hello world", unmarshaled.(map[string]interface{})["some"].(map[string]interface{})["string"]) } @@ -621,10 +621,10 @@ func TestRenderTemplateParamsGoTemplate(t *testing.T) { // Retrieve the value of the target field from the newApplication, then verify that // the target field has been templated into the expected value if test.errorMessage != "" { - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, test.errorMessage, err.Error()) } else { - assert.NoError(t, err) + require.NoError(t, err) actualValue := *getPtrFunc(newApplication) assert.Equal(t, test.expectedVal, actualValue, "Field '%s' had an unexpected value. expected: '%s' value: '%s'", fieldName, test.expectedVal, actualValue) assert.Equal(t, "annotation-value", newApplication.ObjectMeta.Annotations["annotation-key"]) @@ -666,7 +666,7 @@ func TestRenderGeneratorParams_does_not_panic(t *testing.T) { }, } _, err := render.RenderGeneratorParams(generator, params, true, []string{}) - assert.NoError(t, err) + require.NoError(t, err) } func TestRenderTemplateKeys(t *testing.T) { @@ -716,7 +716,7 @@ func Test_Render_Replace_no_panic_on_missing_closing_brace(t *testing.T) { r := &Render{} assert.NotPanics(t, func() { _, err := r.Replace("{{properly.closed}} {{improperly.closed}", nil, false, []string{}) - assert.Error(t, err) + require.Error(t, err) }) } @@ -812,7 +812,7 @@ func TestRenderTemplateParamsFinalizers(t *testing.T) { render := Render{} res, err := render.RenderTemplateParams(application, c.syncPolicy, params, true, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, res.Finalizers, c.expectedFinalizers) }) @@ -822,9 +822,9 @@ func TestRenderTemplateParamsFinalizers(t *testing.T) { func TestCheckInvalidGenerators(t *testing.T) { scheme := runtime.NewScheme() err := argoappsv1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = argoappsv1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, c := range []struct { testName string @@ -925,9 +925,9 @@ func TestCheckInvalidGenerators(t *testing.T) { func TestInvalidGenerators(t *testing.T) { scheme := runtime.NewScheme() err := argoappsv1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = argoappsv1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, c := range []struct { testName string diff --git a/applicationset/webhook/webhook_test.go b/applicationset/webhook/webhook_test.go index 6c1f6be29cfc4..14fc5ce68503b 100644 --- a/applicationset/webhook/webhook_test.go +++ b/applicationset/webhook/webhook_test.go @@ -14,6 +14,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -180,9 +181,9 @@ func TestWebhookHandler(t *testing.T) { fakeClient := newFakeClient(namespace) scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) err = v1alpha1.AddToScheme(scheme) - assert.NoError(t, err) + require.NoError(t, err) for _, test := range tt { t.Run(test.desc, func(t *testing.T) { @@ -206,12 +207,12 @@ func TestWebhookHandler(t *testing.T) { ).Build() set := argosettings.NewSettingsManager(context.TODO(), fakeClient, namespace) h, err := NewWebhookHandler(namespace, set, fc, mockGenerators()) - assert.NoError(t, err) + require.NoError(t, err) req := httptest.NewRequest(http.MethodPost, "/api/webhook", nil) req.Header.Set(test.headerKey, test.headerValue) eventJSON, err := os.ReadFile(filepath.Join("testdata", test.payloadFile)) - assert.NoError(t, err) + require.NoError(t, err) req.Body = io.NopCloser(bytes.NewReader(eventJSON)) w := httptest.NewRecorder() @@ -220,7 +221,7 @@ func TestWebhookHandler(t *testing.T) { list := &v1alpha1.ApplicationSetList{} err = fc.List(context.TODO(), list) - assert.NoError(t, err) + require.NoError(t, err) effectedAppSetsAsExpected := make(map[string]bool) for _, appSetName := range test.effectedAppSets { effectedAppSetsAsExpected[appSetName] = false diff --git a/server/applicationset/applicationset_test.go b/server/applicationset/applicationset_test.go index 031a58cfde62e..da8c980fdd4e5 100644 --- a/server/applicationset/applicationset_test.go +++ b/server/applicationset/applicationset_test.go @@ -7,6 +7,7 @@ import ( "github.com/argoproj/gitops-engine/pkg/health" "github.com/argoproj/pkg/sync" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -221,7 +222,7 @@ func testListAppsetsWithLabels(t *testing.T, appsetQuery applicationset.Applicat t.Run(validTest.testName, func(t *testing.T) { appsetQuery.Selector = validTest.label res, err := appServer.List(context.Background(), &appsetQuery) - assert.NoError(t, err) + require.NoError(t, err) apps := []string{} for i := range res.Items { apps = append(apps, res.Items[i].Name) @@ -315,7 +316,7 @@ func TestListAppSetsWithoutNamespace(t *testing.T) { appsetQuery := applicationset.ApplicationSetListQuery{} res, err := appSetServer.List(context.Background(), &appsetQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, res.Items) } @@ -331,7 +332,7 @@ func TestCreateAppSet(t *testing.T) { Applicationset: testAppSet, } _, err := appServer.Create(context.Background(), &createReq) - assert.NoError(t, err) + require.NoError(t, err) } func TestCreateAppSetTemplatedProject(t *testing.T) { @@ -376,7 +377,7 @@ func TestGetAppSet(t *testing.T) { appsetQuery := applicationset.ApplicationSetGetQuery{Name: "AppSet1"} res, err := appSetServer.Get(context.Background(), &appsetQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "AppSet1", res.Name) }) @@ -386,7 +387,7 @@ func TestGetAppSet(t *testing.T) { appsetQuery := applicationset.ApplicationSetGetQuery{Name: "AppSet1", AppsetNamespace: testNamespace} res, err := appSetServer.Get(context.Background(), &appsetQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "AppSet1", res.Name) }) @@ -419,7 +420,7 @@ func TestDeleteAppSet(t *testing.T) { appsetQuery := applicationset.ApplicationSetDeleteRequest{Name: "AppSet1"} res, err := appSetServer.Delete(context.Background(), &appsetQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &applicationset.ApplicationSetResponse{}, res) }) @@ -429,7 +430,7 @@ func TestDeleteAppSet(t *testing.T) { appsetQuery := applicationset.ApplicationSetDeleteRequest{Name: "AppSet1", AppsetNamespace: testNamespace} res, err := appSetServer.Delete(context.Background(), &appsetQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &applicationset.ApplicationSetResponse{}, res) }) } @@ -460,7 +461,7 @@ func TestUpdateAppSet(t *testing.T) { updated, err := appServer.updateAppSet(appSet, newAppSet, context.Background(), true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, map[string]string{ "annotation-key1": "annotation-value1-updated", "annotation-key2": "annotation-value2", @@ -476,7 +477,7 @@ func TestUpdateAppSet(t *testing.T) { updated, err := appServer.updateAppSet(appSet, newAppSet, context.Background(), false) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, map[string]string{ "annotation-key1": "annotation-value1-updated", }, updated.Annotations) @@ -546,7 +547,7 @@ func TestResourceTree(t *testing.T) { appsetQuery := applicationset.ApplicationSetTreeQuery{Name: "AppSet1"} res, err := appSetServer.ResourceTree(context.Background(), &appsetQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedTree, res) }) @@ -556,7 +557,7 @@ func TestResourceTree(t *testing.T) { appsetQuery := applicationset.ApplicationSetTreeQuery{Name: "AppSet1", AppsetNamespace: testNamespace} res, err := appSetServer.ResourceTree(context.Background(), &appsetQuery) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedTree, res) }) From d7fc1bf2d7afd88f40add2bdb40ae797e80afc35 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Mon, 17 Jun 2024 15:05:27 +0200 Subject: [PATCH 50/74] chore: enable require-error rule from errorlint linter on controller folder (#18690) Signed-off-by: Matthieu MOREL Signed-off-by: pasha-codefresh Co-authored-by: pasha-codefresh --- .golangci.yaml | 2 +- controller/appcontroller_test.go | 72 ++++++++--------- controller/clusterinfoupdater_test.go | 9 ++- controller/health_test.go | 17 ++-- controller/metrics/metrics_test.go | 31 +++---- controller/sharding/sharding_test.go | 17 ++-- controller/state_test.go | 81 ++++++++++--------- controller/sync_namespace_test.go | 3 +- controller/sync_test.go | 4 +- .../controller/controller_test.go | 5 +- 10 files changed, 124 insertions(+), 117 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 4684842e6d7a2..0b549fd364ff6 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -3,7 +3,7 @@ issues: - SA1019 - SA5011 exclude-rules: - - path: "(cmpserver|controller|reposerver)/" + - path: "(cmpserver|reposerver)/" text: "require-error:" linters: - testifylint diff --git a/controller/appcontroller_test.go b/controller/appcontroller_test.go index 1833d28c2bd4f..389466908e71d 100644 --- a/controller/appcontroller_test.go +++ b/controller/appcontroller_test.go @@ -457,7 +457,7 @@ func TestAutoSync(t *testing.T) { cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{{Name: "guestbook", Kind: kube.DeploymentKind, Status: v1alpha1.SyncStatusCodeOutOfSync}}) assert.Nil(t, cond) app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(context.Background(), "my-app", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app.Operation) assert.NotNil(t, app.Operation.Sync) assert.False(t, app.Operation.Sync.Prune) @@ -501,7 +501,7 @@ func TestSkipAutoSync(t *testing.T) { cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{}) assert.Nil(t, cond) app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(context.Background(), "my-app", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, app.Operation) }) @@ -516,7 +516,7 @@ func TestSkipAutoSync(t *testing.T) { cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{}) assert.Nil(t, cond) app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(context.Background(), "my-app", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, app.Operation) }) @@ -532,7 +532,7 @@ func TestSkipAutoSync(t *testing.T) { cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{}) assert.Nil(t, cond) app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(context.Background(), "my-app", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, app.Operation) }) @@ -549,7 +549,7 @@ func TestSkipAutoSync(t *testing.T) { cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{}) assert.Nil(t, cond) app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(context.Background(), "my-app", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, app.Operation) }) @@ -575,7 +575,7 @@ func TestSkipAutoSync(t *testing.T) { cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{{Name: "guestbook", Kind: kube.DeploymentKind, Status: v1alpha1.SyncStatusCodeOutOfSync}}) assert.NotNil(t, cond) app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(context.Background(), "my-app", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, app.Operation) }) @@ -591,7 +591,7 @@ func TestSkipAutoSync(t *testing.T) { }) assert.Nil(t, cond) app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(context.Background(), "my-app", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, app.Operation) }) } @@ -627,7 +627,7 @@ func TestAutoSyncIndicateError(t *testing.T) { cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{{Name: "guestbook", Kind: kube.DeploymentKind, Status: v1alpha1.SyncStatusCodeOutOfSync}}) assert.NotNil(t, cond) app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(context.Background(), "my-app", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, app.Operation) } @@ -670,7 +670,7 @@ func TestAutoSyncParameterOverrides(t *testing.T) { cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{{Name: "guestbook", Kind: kube.DeploymentKind, Status: v1alpha1.SyncStatusCodeOutOfSync}}) assert.Nil(t, cond) app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(context.Background(), "my-app", metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, app.Operation) } @@ -715,7 +715,7 @@ func TestFinalizeAppDeletion(t *testing.T) { err := ctrl.finalizeApplicationDeletion(app, func(project string) ([]*v1alpha1.Cluster, error) { return []*v1alpha1.Cluster{}, nil }) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, patched) }) @@ -766,11 +766,11 @@ func TestFinalizeAppDeletion(t *testing.T) { err := ctrl.finalizeApplicationDeletion(app, func(project string) ([]*v1alpha1.Cluster, error) { return []*v1alpha1.Cluster{}, nil }) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, patched) objsMap, err := ctrl.stateCache.GetManagedLiveObjs(app, []*unstructured.Unstructured{}) if err != nil { - assert.NoError(t, err) + require.NoError(t, err) } // Managed objects must be empty assert.Empty(t, objsMap) @@ -802,7 +802,7 @@ func TestFinalizeAppDeletion(t *testing.T) { err := ctrl.finalizeApplicationDeletion(app, func(project string) ([]*v1alpha1.Cluster, error) { return []*v1alpha1.Cluster{}, nil }) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, patched) }) @@ -826,7 +826,7 @@ func TestFinalizeAppDeletion(t *testing.T) { err := ctrl.finalizeApplicationDeletion(app, func(project string) ([]*v1alpha1.Cluster, error) { return []*v1alpha1.Cluster{}, nil }) - assert.NoError(t, err) + require.NoError(t, err) } app1 := appTemplate.DeepCopy() @@ -869,7 +869,7 @@ func TestFinalizeAppDeletion(t *testing.T) { err := ctrl.finalizeApplicationDeletion(app, func(project string) ([]*v1alpha1.Cluster, error) { return []*v1alpha1.Cluster{}, nil }) - assert.NoError(t, err) + require.NoError(t, err) // finalizer is not deleted assert.False(t, patched) // post-delete hook is created @@ -907,7 +907,7 @@ func TestFinalizeAppDeletion(t *testing.T) { err := ctrl.finalizeApplicationDeletion(app, func(project string) ([]*v1alpha1.Cluster, error) { return []*v1alpha1.Cluster{}, nil }) - assert.NoError(t, err) + require.NoError(t, err) // finalizer is removed assert.True(t, patched) }) @@ -942,7 +942,7 @@ func TestFinalizeAppDeletion(t *testing.T) { err := ctrl.finalizeApplicationDeletion(app, func(project string) ([]*v1alpha1.Cluster, error) { return []*v1alpha1.Cluster{}, nil }) - assert.NoError(t, err) + require.NoError(t, err) // post-delete hook is deleted require.Len(t, ctrl.kubectl.(*MockKubectl).DeletedResources, 1) require.Equal(t, "post-delete-hook", ctrl.kubectl.(*MockKubectl).DeletedResources[0].Name) @@ -1103,7 +1103,7 @@ func TestGetResourceTree_HasOrphanedResources(t *testing.T) { TargetState: test.DeploymentManifest, }}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []v1alpha1.ResourceNode{managedDeploy}, tree.Nodes) assert.Equal(t, []v1alpha1.ResourceNode{orphanedDeploy1, orphanedDeploy2}, tree.OrphanedNodes) } @@ -1463,7 +1463,7 @@ func TestUpdateReconciledAt(t *testing.T) { receivedPatch := map[string]interface{}{} fakeAppCs.AddReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { if patchAction, ok := action.(kubetesting.PatchAction); ok { - assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) + require.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) } return true, &v1alpha1.Application{}, nil }) @@ -1476,11 +1476,11 @@ func TestUpdateReconciledAt(t *testing.T) { ctrl.processAppRefreshQueueItem() _, updated, err := unstructured.NestedString(receivedPatch, "status", "reconciledAt") - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, updated) _, updated, err = unstructured.NestedString(receivedPatch, "status", "observedAt") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, updated) }) @@ -1492,11 +1492,11 @@ func TestUpdateReconciledAt(t *testing.T) { ctrl.processAppRefreshQueueItem() _, updated, err := unstructured.NestedString(receivedPatch, "status", "reconciledAt") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, updated) _, updated, err = unstructured.NestedString(receivedPatch, "status", "observedAt") - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, updated) }) } @@ -1522,7 +1522,7 @@ func TestProjectErrorToCondition(t *testing.T) { obj, ok, err := ctrl.appInformer.GetIndexer().GetByKey(key) assert.True(t, ok) - assert.NoError(t, err) + require.NoError(t, err) updatedApp := obj.(*v1alpha1.Application) assert.Equal(t, v1alpha1.ApplicationConditionInvalidSpecError, updatedApp.Status.Conditions[0].Type) assert.Equal(t, "Application referencing project wrong project which does not exist", updatedApp.Status.Conditions[0].Message) @@ -1542,7 +1542,7 @@ func TestFinalizeProjectDeletion_HasApplications(t *testing.T) { }) err := ctrl.finalizeProjectDeletion(proj) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, patched) } @@ -1554,13 +1554,13 @@ func TestFinalizeProjectDeletion_DoesNotHaveApplications(t *testing.T) { receivedPatch := map[string]interface{}{} fakeAppCs.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { if patchAction, ok := action.(kubetesting.PatchAction); ok { - assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) + require.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) } return true, &v1alpha1.AppProject{}, nil }) err := ctrl.finalizeProjectDeletion(proj) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, map[string]interface{}{ "metadata": map[string]interface{}{ "finalizers": nil, @@ -1579,7 +1579,7 @@ func TestProcessRequestedAppOperation_FailedNoRetries(t *testing.T) { receivedPatch := map[string]interface{}{} fakeAppCs.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { if patchAction, ok := action.(kubetesting.PatchAction); ok { - assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) + require.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) } return true, &v1alpha1.Application{}, nil }) @@ -1607,7 +1607,7 @@ func TestProcessRequestedAppOperation_InvalidDestination(t *testing.T) { defer fakeAppCs.Unlock() fakeAppCs.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { if patchAction, ok := action.(kubetesting.PatchAction); ok { - assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) + require.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) } return true, &v1alpha1.Application{}, nil }) @@ -1633,7 +1633,7 @@ func TestProcessRequestedAppOperation_FailedHasRetries(t *testing.T) { receivedPatch := map[string]interface{}{} fakeAppCs.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { if patchAction, ok := action.(kubetesting.PatchAction); ok { - assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) + require.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) } return true, &v1alpha1.Application{}, nil }) @@ -1676,7 +1676,7 @@ func TestProcessRequestedAppOperation_RunningPreviouslyFailed(t *testing.T) { receivedPatch := map[string]interface{}{} fakeAppCs.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { if patchAction, ok := action.(kubetesting.PatchAction); ok { - assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) + require.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) } return true, &v1alpha1.Application{}, nil }) @@ -1709,7 +1709,7 @@ func TestProcessRequestedAppOperation_HasRetriesTerminated(t *testing.T) { receivedPatch := map[string]interface{}{} fakeAppCs.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { if patchAction, ok := action.(kubetesting.PatchAction); ok { - assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) + require.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) } return true, &v1alpha1.Application{}, nil }) @@ -1736,7 +1736,7 @@ func TestProcessRequestedAppOperation_Successful(t *testing.T) { receivedPatch := map[string]interface{}{} fakeAppCs.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { if patchAction, ok := action.(kubetesting.PatchAction); ok { - assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) + require.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch)) } return true, &v1alpha1.Application{}, nil }) @@ -1799,7 +1799,7 @@ func TestGetAppHosts(t *testing.T) { }}, }}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []v1alpha1.HostInfo{{ Name: "minikube", SystemInfo: corev1.NodeSystemInfo{OSImage: "debian"}, @@ -1926,7 +1926,7 @@ func TestAddControllerNamespace(t *testing.T) { ctrl.processAppRefreshQueueItem() updatedApp, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(ctrl.namespace).Get(context.Background(), app.Name, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, test.FakeArgoCDNamespace, updatedApp.Status.ControllerNamespace) }) t.Run("set controllerNamespace when the app is in another namespace than the controller", func(t *testing.T) { @@ -1945,7 +1945,7 @@ func TestAddControllerNamespace(t *testing.T) { ctrl.processAppRefreshQueueItem() updatedApp, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(appNamespace).Get(context.Background(), app.Name, metav1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, test.FakeArgoCDNamespace, updatedApp.Status.ControllerNamespace) }) } diff --git a/controller/clusterinfoupdater_test.go b/controller/clusterinfoupdater_test.go index b0a873f4ef587..989ac630d528a 100644 --- a/controller/clusterinfoupdater_test.go +++ b/controller/clusterinfoupdater_test.go @@ -23,6 +23,7 @@ import ( clustercache "github.com/argoproj/gitops-engine/pkg/cache" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/tools/cache" ) @@ -76,7 +77,7 @@ func TestClusterSecretUpdater(t *testing.T) { appCache := appstate.NewCache(cacheutil.NewCache(cacheutil.NewInMemoryCache(time.Minute)), time.Minute) cluster, err := argoDB.CreateCluster(ctx, &v1alpha1.Cluster{Server: "http://minikube"}) - assert.NoError(t, err, "Test prepare test data create cluster failed") + require.NoError(t, err, "Test prepare test data create cluster failed") for _, test := range tests { info := &clustercache.ClusterInfo{ @@ -90,11 +91,11 @@ func TestClusterSecretUpdater(t *testing.T) { updater := NewClusterInfoUpdater(nil, argoDB, lister, appCache, nil, nil, fakeNamespace) err = updater.updateClusterInfo(context.Background(), *cluster, info) - assert.NoError(t, err, "Invoking updateClusterInfo failed.") + require.NoError(t, err, "Invoking updateClusterInfo failed.") var clusterInfo v1alpha1.ClusterInfo err = appCache.GetClusterInfo(cluster.Server, &clusterInfo) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, updatedK8sVersion, clusterInfo.ServerVersion) assert.Equal(t, test.ExpectedStatus, clusterInfo.ConnectionState.Status) } @@ -103,7 +104,7 @@ func TestClusterSecretUpdater(t *testing.T) { func TestUpdateClusterLabels(t *testing.T) { shouldNotBeInvoked := func(ctx context.Context, cluster *v1alpha1.Cluster) (*v1alpha1.Cluster, error) { shouldNotHappen := errors.New("if an error happens here, something's wrong") - assert.NoError(t, shouldNotHappen) + require.NoError(t, shouldNotHappen) return nil, shouldNotHappen } tests := []struct { diff --git a/controller/health_test.go b/controller/health_test.go index ed2358bcbdfee..efaf4b2a8fc80 100644 --- a/controller/health_test.go +++ b/controller/health_test.go @@ -8,6 +8,7 @@ import ( synccommon "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/argoproj/gitops-engine/pkg/utils/kube" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" @@ -53,7 +54,7 @@ func TestSetApplicationHealth(t *testing.T) { resourceStatuses := initStatuses(resources) healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusDegraded, healthStatus.Status) assert.Equal(t, health.HealthStatusHealthy, resourceStatuses[0].Health.Status) @@ -62,7 +63,7 @@ func TestSetApplicationHealth(t *testing.T) { // now mark the job as a hook and retry. it should ignore the hook and consider the app healthy failedJob.SetAnnotations(map[string]string{synccommon.AnnotationKeyHook: "PreSync"}) healthStatus, err = setApplicationHealth(resources, resourceStatuses, nil, app, true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusHealthy, healthStatus.Status) } @@ -75,7 +76,7 @@ func TestSetApplicationHealth_ResourceHealthNotPersisted(t *testing.T) { resourceStatuses := initStatuses(resources) healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, false) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusDegraded, healthStatus.Status) assert.Nil(t, resourceStatuses[0].Health) @@ -90,7 +91,7 @@ func TestSetApplicationHealth_MissingResource(t *testing.T) { resourceStatuses := initStatuses(resources) healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusMissing, healthStatus.Status) } @@ -104,7 +105,7 @@ func TestSetApplicationHealth_MissingResourceNoBuiltHealthCheck(t *testing.T) { t.Run("NoOverride", func(t *testing.T) { healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusHealthy, healthStatus.Status) assert.Equal(t, health.HealthStatusMissing, resourceStatuses[0].Health.Status) }) @@ -115,7 +116,7 @@ func TestSetApplicationHealth_MissingResourceNoBuiltHealthCheck(t *testing.T) { HealthLua: "some health check", }, }, app, true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusMissing, healthStatus.Status) }) } @@ -166,7 +167,7 @@ return hs`, resourceStatuses := initStatuses(resources) healthStatus, err := setApplicationHealth(resources, resourceStatuses, overrides, app, true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusDegraded, healthStatus.Status) }) @@ -178,7 +179,7 @@ return hs`, resourceStatuses := initStatuses(resources) healthStatus, err := setApplicationHealth(resources, resourceStatuses, overrides, app, true) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusHealthy, healthStatus.Status) }) } diff --git a/controller/metrics/metrics_test.go b/controller/metrics/metrics_test.go index a1977fe888de9..28422be55f653 100644 --- a/controller/metrics/metrics_test.go +++ b/controller/metrics/metrics_test.go @@ -12,6 +12,7 @@ import ( gitopsCache "github.com/argoproj/gitops-engine/pkg/cache" "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/cache" @@ -212,7 +213,7 @@ func runTest(t *testing.T, cfg TestMetricServerConfig) { cancel, appLister := newFakeLister(cfg.FakeAppYAMLs...) defer cancel() metricsServ, err := NewMetricsServer("localhost:8082", appLister, appFilter, noOpHealthCheck, cfg.AppLabels) - assert.NoError(t, err) + require.NoError(t, err) if len(cfg.ClustersInfo) > 0 { ci := &fakeClusterInfo{clustersInfo: cfg.ClustersInfo} @@ -224,7 +225,7 @@ func runTest(t *testing.T, cfg TestMetricServerConfig) { } req, err := http.NewRequest(http.MethodGet, "/metrics", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() metricsServ.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusOK, rr.Code) @@ -335,7 +336,7 @@ func TestMetricsSyncCounter(t *testing.T) { cancel, appLister := newFakeLister() defer cancel() metricsServ, err := NewMetricsServer("localhost:8082", appLister, appFilter, noOpHealthCheck, []string{}) - assert.NoError(t, err) + require.NoError(t, err) appSyncTotal := ` # HELP argocd_app_sync_total Number of application syncs. @@ -353,7 +354,7 @@ argocd_app_sync_total{dest_server="https://localhost:6443",name="my-app",namespa metricsServ.IncSync(fakeApp, &argoappv1.OperationState{Phase: common.OperationSucceeded}) req, err := http.NewRequest(http.MethodGet, "/metrics", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() metricsServ.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusOK, rr.Code) @@ -387,7 +388,7 @@ func TestReconcileMetrics(t *testing.T) { cancel, appLister := newFakeLister() defer cancel() metricsServ, err := NewMetricsServer("localhost:8082", appLister, appFilter, noOpHealthCheck, []string{}) - assert.NoError(t, err) + require.NoError(t, err) appReconcileMetrics := ` # HELP argocd_app_reconcile Application reconciliation performance in seconds. @@ -407,7 +408,7 @@ argocd_app_reconcile_count{dest_server="https://localhost:6443",namespace="argoc metricsServ.IncReconcile(fakeApp, 5*time.Second) req, err := http.NewRequest(http.MethodGet, "/metrics", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() metricsServ.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusOK, rr.Code) @@ -420,7 +421,7 @@ func TestMetricsReset(t *testing.T) { cancel, appLister := newFakeLister() defer cancel() metricsServ, err := NewMetricsServer("localhost:8082", appLister, appFilter, noOpHealthCheck, []string{}) - assert.NoError(t, err) + require.NoError(t, err) appSyncTotal := ` # HELP argocd_app_sync_total Number of application syncs. @@ -431,7 +432,7 @@ argocd_app_sync_total{dest_server="https://localhost:6443",name="my-app",namespa ` req, err := http.NewRequest(http.MethodGet, "/metrics", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() metricsServ.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusOK, rr.Code) @@ -439,10 +440,10 @@ argocd_app_sync_total{dest_server="https://localhost:6443",name="my-app",namespa assertMetricsPrinted(t, appSyncTotal, body) err = metricsServ.SetExpiration(time.Second) - assert.NoError(t, err) + require.NoError(t, err) time.Sleep(2 * time.Second) req, err = http.NewRequest(http.MethodGet, "/metrics", nil) - assert.NoError(t, err) + require.NoError(t, err) rr = httptest.NewRecorder() metricsServ.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusOK, rr.Code) @@ -450,14 +451,14 @@ argocd_app_sync_total{dest_server="https://localhost:6443",name="my-app",namespa log.Println(body) assertMetricsNotPrinted(t, appSyncTotal, body) err = metricsServ.SetExpiration(time.Second) - assert.Error(t, err) + require.Error(t, err) } func TestWorkqueueMetrics(t *testing.T) { cancel, appLister := newFakeLister() defer cancel() metricsServ, err := NewMetricsServer("localhost:8082", appLister, appFilter, noOpHealthCheck, []string{}) - assert.NoError(t, err) + require.NoError(t, err) expectedMetrics := ` # TYPE workqueue_adds_total counter @@ -479,7 +480,7 @@ workqueue_unfinished_work_seconds{name="test"} workqueue.NewNamed("test") req, err := http.NewRequest(http.MethodGet, "/metrics", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() metricsServ.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusOK, rr.Code) @@ -492,7 +493,7 @@ func TestGoMetrics(t *testing.T) { cancel, appLister := newFakeLister() defer cancel() metricsServ, err := NewMetricsServer("localhost:8082", appLister, appFilter, noOpHealthCheck, []string{}) - assert.NoError(t, err) + require.NoError(t, err) expectedMetrics := ` # TYPE go_gc_duration_seconds summary @@ -511,7 +512,7 @@ go_threads ` req, err := http.NewRequest(http.MethodGet, "/metrics", nil) - assert.NoError(t, err) + require.NoError(t, err) rr := httptest.NewRecorder() metricsServ.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusOK, rr.Code) diff --git a/controller/sharding/sharding_test.go b/controller/sharding/sharding_test.go index ca44b638961cc..ebd212062b199 100644 --- a/controller/sharding/sharding_test.go +++ b/controller/sharding/sharding_test.go @@ -12,6 +12,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -410,16 +411,16 @@ func TestInferShard(t *testing.T) { osHostnameError := errors.New("cannot resolve hostname") osHostnameFunction = func() (string, error) { return "exampleshard", osHostnameError } _, err := InferShard() - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, err, osHostnameError) osHostnameFunction = func() (string, error) { return "exampleshard", nil } _, err = InferShard() - assert.NoError(t, err) + require.NoError(t, err) osHostnameFunction = func() (string, error) { return "example-shard", nil } _, err = InferShard() - assert.NoError(t, err) + require.NoError(t, err) } func createTestClusters() (clusterAccessor, *dbmocks.ArgoDB, v1alpha1.Cluster, v1alpha1.Cluster, v1alpha1.Cluster, v1alpha1.Cluster, v1alpha1.Cluster) { @@ -494,7 +495,7 @@ func Test_generateDefaultShardMappingCM_NoPredefinedShard(t *testing.T) { } expectedMappingCM, err := json.Marshal(expectedMapping) - assert.NoError(t, err) + require.NoError(t, err) expectedShadingCM := &v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ @@ -508,7 +509,7 @@ func Test_generateDefaultShardMappingCM_NoPredefinedShard(t *testing.T) { heartbeatCurrentTime = func() metav1.Time { return expectedTime } osHostnameFunction = func() (string, error) { return "test-example", nil } shardingCM, err := generateDefaultShardMappingCM("test", "test-example", replicas, -1) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedShadingCM, shardingCM) } @@ -529,7 +530,7 @@ func Test_generateDefaultShardMappingCM_PredefinedShard(t *testing.T) { } expectedMappingCM, err := json.Marshal(expectedMapping) - assert.NoError(t, err) + require.NoError(t, err) expectedShadingCM := &v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ @@ -543,7 +544,7 @@ func Test_generateDefaultShardMappingCM_PredefinedShard(t *testing.T) { heartbeatCurrentTime = func() metav1.Time { return expectedTime } osHostnameFunction = func() (string, error) { return "test-example", nil } shardingCM, err := generateDefaultShardMappingCM("test", "test-example", replicas, 1) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedShadingCM, shardingCM) } @@ -970,7 +971,7 @@ func TestGetClusterSharding(t *testing.T) { t.Errorf("Expected error %v but got nil", tc.expectedErr) } } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } diff --git a/controller/state_test.go b/controller/state_test.go index 95dba246a72cf..58cfe5c596ebc 100644 --- a/controller/state_test.go +++ b/controller/state_test.go @@ -15,6 +15,7 @@ import ( "github.com/sirupsen/logrus" logrustest "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" networkingv1 "k8s.io/api/networking/v1" @@ -50,7 +51,7 @@ func TestCompareAppStateEmpty(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -69,18 +70,18 @@ func TestCompareAppStateRepoError(t *testing.T) { revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) assert.Nil(t, compRes) - assert.EqualError(t, err, CompareStateRepoError.Error()) + require.EqualError(t, err, CompareStateRepoError.Error()) // expect to still get compare state error to as inside grace period compRes, err = ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) assert.Nil(t, compRes) - assert.EqualError(t, err, CompareStateRepoError.Error()) + require.EqualError(t, err, CompareStateRepoError.Error()) time.Sleep(10 * time.Second) // expect to not get error as outside of grace period, but status should be unknown compRes, err = ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) assert.NotNil(t, compRes) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, argoappv1.SyncStatusCodeUnknown, compRes.syncStatus.Status) } @@ -114,7 +115,7 @@ func TestCompareAppStateNamespaceMetadataDiffers(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeOutOfSync, compRes.syncStatus.Status) @@ -163,7 +164,7 @@ func TestCompareAppStateNamespaceMetadataDiffersToManifest(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeOutOfSync, compRes.syncStatus.Status) @@ -173,7 +174,7 @@ func TestCompareAppStateNamespaceMetadataDiffersToManifest(t *testing.T) { assert.Len(t, compRes.diffResultList.Diffs, 1) result := NewNamespace() - assert.NoError(t, json.Unmarshal(compRes.diffResultList.Diffs[0].PredictedLive, result)) + require.NoError(t, json.Unmarshal(compRes.diffResultList.Diffs[0].PredictedLive, result)) labels := result.GetLabels() delete(labels, "kubernetes.io/metadata.name") @@ -221,7 +222,7 @@ func TestCompareAppStateNamespaceMetadata(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeOutOfSync, compRes.syncStatus.Status) @@ -231,7 +232,7 @@ func TestCompareAppStateNamespaceMetadata(t *testing.T) { assert.Len(t, compRes.diffResultList.Diffs, 1) result := NewNamespace() - assert.NoError(t, json.Unmarshal(compRes.diffResultList.Diffs[0].PredictedLive, result)) + require.NoError(t, json.Unmarshal(compRes.diffResultList.Diffs[0].PredictedLive, result)) labels := result.GetLabels() delete(labels, "kubernetes.io/metadata.name") @@ -280,7 +281,7 @@ func TestCompareAppStateNamespaceMetadataIsTheSame(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -308,7 +309,7 @@ func TestCompareAppStateMissing(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeOutOfSync, compRes.syncStatus.Status) @@ -340,7 +341,7 @@ func TestCompareAppStateExtra(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeOutOfSync, compRes.syncStatus.Status) assert.Len(t, compRes.resources, 1) @@ -371,7 +372,7 @@ func TestCompareAppStateHook(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) assert.Empty(t, compRes.resources) @@ -403,7 +404,7 @@ func TestCompareAppStateSkipHook(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) assert.Len(t, compRes.resources, 1) @@ -434,7 +435,7 @@ func TestCompareAppStateCompareOptionIgnoreExtraneous(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -467,7 +468,7 @@ func TestCompareAppStateExtraHook(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -496,7 +497,7 @@ func TestAppRevisionsSingleSource(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, app.Spec.GetSources(), false, false, nil, app.Spec.HasMultipleSources(), false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.NotEmpty(t, compRes.syncStatus.Revision) @@ -536,7 +537,7 @@ func TestAppRevisionsMultiSource(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, app.Spec.GetSources(), false, false, nil, app.Spec.HasMultipleSources(), false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Empty(t, compRes.syncStatus.Revision) @@ -548,7 +549,7 @@ func TestAppRevisionsMultiSource(t *testing.T) { func toJSON(t *testing.T, obj *unstructured.Unstructured) string { data, err := json.Marshal(obj) - assert.NoError(t, err) + require.NoError(t, err) return string(data) } @@ -584,7 +585,7 @@ func TestCompareAppStateDuplicatedNamespacedResources(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.Len(t, app.Status.Conditions, 1) @@ -621,7 +622,7 @@ func TestCompareAppStateManagedNamespaceMetadataWithLiveNsDoesNotGetPruned(t *te } ctrl := newFakeController(&data, nil) compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, []string{}, app.Spec.Sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.Empty(t, app.Status.Conditions) @@ -675,7 +676,7 @@ func TestCompareAppStateWithManifestGeneratePath(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "abc123") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, app.Spec.GetSources(), false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) assert.Equal(t, "abc123", compRes.syncStatus.Revision) @@ -712,7 +713,7 @@ func TestSetHealth(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusHealthy, compRes.healthStatus.Status) } @@ -749,7 +750,7 @@ func TestSetHealthSelfReferencedApp(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusHealthy, compRes.healthStatus.Status) } @@ -773,7 +774,7 @@ func TestSetManagedResourcesWithOrphanedResources(t *testing.T) { tree, err := ctrl.setAppManagedResources(app, &comparisonResult{managedResources: make([]managedResource, 0)}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, tree.OrphanedNodes, 1) assert.Equal(t, "guestbook", tree.OrphanedNodes[0].Name) assert.Equal(t, app.Namespace, tree.OrphanedNodes[0].Namespace) @@ -802,7 +803,7 @@ func TestSetManagedResourcesWithResourcesOfAnotherApp(t *testing.T) { tree, err := ctrl.setAppManagedResources(app1, &comparisonResult{managedResources: make([]managedResource, 0)}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, tree.OrphanedNodes) } @@ -824,7 +825,7 @@ func TestReturnUnknownComparisonStateOnSettingLoadError(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, health.HealthStatusUnknown, compRes.healthStatus.Status) assert.Equal(t, argoappv1.SyncStatusCodeUnknown, compRes.syncStatus.Status) @@ -855,7 +856,7 @@ func TestSetManagedResourcesKnownOrphanedResourceExceptions(t *testing.T) { tree, err := ctrl.setAppManagedResources(app, &comparisonResult{managedResources: make([]managedResource, 0)}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, tree.OrphanedNodes, 1) assert.Equal(t, "guestbook", tree.OrphanedNodes[0].Name) } @@ -872,7 +873,7 @@ func Test_appStateManager_persistRevisionHistory(t *testing.T) { } addHistory := func() { err := manager.persistRevisionHistory(app, "my-revision", argoappv1.ApplicationSource{}, []string{}, []argoappv1.ApplicationSource{}, false, metav1.Time{}, v1alpha1.OperationInitiator{}) - assert.NoError(t, err) + require.NoError(t, err) } addHistory() assert.Len(t, app.Status.History, 1) @@ -908,7 +909,7 @@ func Test_appStateManager_persistRevisionHistory(t *testing.T) { metav1NowTime := metav1.NewTime(time.Now()) err := manager.persistRevisionHistory(app, "my-revision", argoappv1.ApplicationSource{}, []string{}, []argoappv1.ApplicationSource{}, false, metav1NowTime, v1alpha1.OperationInitiator{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, app.Status.History.LastRevisionHistory().DeployStartedAt, &metav1NowTime) } @@ -965,7 +966,7 @@ func TestSignedResponseNoSignatureRequired(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -992,7 +993,7 @@ func TestSignedResponseNoSignatureRequired(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -1024,7 +1025,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "") compRes, err := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -1051,7 +1052,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "abc123") compRes, err := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -1078,7 +1079,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "abc123") compRes, err := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -1105,7 +1106,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "abc123") compRes, err := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -1135,7 +1136,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "abc123") compRes, err := ctrl.appStateManager.CompareAppState(app, &testProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -1165,7 +1166,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "abc123") compRes, err := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, localManifests, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeUnknown, compRes.syncStatus.Status) @@ -1195,7 +1196,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "abc123") compRes, err := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, nil, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -1225,7 +1226,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { revisions := make([]string, 0) revisions = append(revisions, "abc123") compRes, err := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, localManifests, false, false) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) diff --git a/controller/sync_namespace_test.go b/controller/sync_namespace_test.go index 5d3ed4299db5a..7e60b0d287789 100644 --- a/controller/sync_namespace_test.go +++ b/controller/sync_namespace_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/types" @@ -250,7 +251,7 @@ func Test_shouldNamespaceSync(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { actual, err := syncNamespace(argo.NewResourceTracking(), common.LabelKeyAppInstance, argo.TrackingMethodAnnotation, "some-app", tt.syncPolicy)(tt.managedNs, tt.liveNs) - assert.NoError(t, err) + require.NoError(t, err) if tt.managedNs != nil { assert.Equal(t, tt.expectedLabels, tt.managedNs.GetLabels()) diff --git a/controller/sync_test.go b/controller/sync_test.go index 59095d5d40e35..1dbfa2ff9e1a5 100644 --- a/controller/sync_test.go +++ b/controller/sync_test.go @@ -53,7 +53,7 @@ func TestPersistRevisionHistory(t *testing.T) { assert.Equal(t, app.Spec.GetSource(), opState.SyncResult.Source) updatedApp, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace).Get(context.Background(), app.Name, v1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, updatedApp.Status.History, 1) assert.Equal(t, app.Spec.GetSource(), updatedApp.Status.History[0].Source) assert.Equal(t, "abc123", updatedApp.Status.History[0].Revision) @@ -142,7 +142,7 @@ func TestPersistRevisionHistoryRollback(t *testing.T) { assert.Equal(t, source, opState.SyncResult.Source) updatedApp, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace).Get(context.Background(), app.Name, v1.GetOptions{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, updatedApp.Status.History, 1) assert.Equal(t, source, updatedApp.Status.History[0].Source) assert.Equal(t, "abc123", updatedApp.Status.History[0].Revision) diff --git a/notification_controller/controller/controller_test.go b/notification_controller/controller/controller_test.go index 5cef5023473aa..ca901cf2c1890 100644 --- a/notification_controller/controller/controller_test.go +++ b/notification_controller/controller/controller_test.go @@ -7,6 +7,7 @@ import ( "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/dynamic/fake" @@ -133,7 +134,7 @@ func TestInit(t *testing.T) { err = nc.Init(ctx) - assert.NoError(t, err) + require.NoError(t, err) } } @@ -169,7 +170,7 @@ func TestInitTimeout(t *testing.T) { err = nc.Init(ctx) // Expect an error & add assertion for the error message - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "Timed out waiting for caches to sync", err.Error()) } From 4c6ad9dcc1556d6a352d20d6c5a087b47e6d9fe3 Mon Sep 17 00:00:00 2001 From: Siddhesh Ghadi <61187612+svghadi@users.noreply.github.com> Date: Mon, 17 Jun 2024 22:57:54 +0530 Subject: [PATCH 51/74] feat: Add labels on Application's k8s events (#11381) (#18160) * Add labels on Application's k8s events Signed-off-by: Siddhesh Ghadi * Fix typo Signed-off-by: Siddhesh Ghadi * Add new cm keys & doc Signed-off-by: Siddhesh Ghadi * Fix typo Signed-off-by: Siddhesh Ghadi * correct rebase changes Signed-off-by: Siddhesh Ghadi * Fix linting Signed-off-by: Siddhesh Ghadi --------- Signed-off-by: Siddhesh Ghadi --- controller/appcontroller.go | 16 ++-- docs/operator-manual/argocd-cm.yaml | 10 ++ docs/operator-manual/declarative-setup.md | 16 ++++ server/application/application.go | 3 +- test/e2e/app_k8s_events_test.go | 64 +++++++++++++ util/argo/argo.go | 47 +++++++++ util/argo/argo_test.go | 111 ++++++++++++++++++++++ util/argo/audit_logger.go | 13 +-- util/argo/audit_logger_test.go | 2 +- util/settings/settings.go | 36 +++++++ util/settings/settings_test.go | 40 ++++++++ 11 files changed, 344 insertions(+), 14 deletions(-) create mode 100644 test/e2e/app_k8s_events_test.go diff --git a/controller/appcontroller.go b/controller/appcontroller.go index a15628d8b640f..2b462d0c95cb4 100644 --- a/controller/appcontroller.go +++ b/controller/appcontroller.go @@ -937,7 +937,7 @@ func (ctrl *ApplicationController) processAppOperationQueueItem() (processNext b Message: err.Error(), }) message := fmt.Sprintf("Unable to delete application resources: %v", err.Error()) - ctrl.auditLogger.LogAppEvent(app, argo.EventInfo{Reason: argo.EventReasonStatusRefreshed, Type: v1.EventTypeWarning}, message, "") + ctrl.logAppEvent(app, argo.EventInfo{Reason: argo.EventReasonStatusRefreshed, Type: v1.EventTypeWarning}, message, context.TODO()) } } return @@ -1440,7 +1440,7 @@ func (ctrl *ApplicationController) setOperationState(app *appv1.Application, sta eventInfo.Type = v1.EventTypeWarning messages = append(messages, "failed:", state.Message) } - ctrl.auditLogger.LogAppEvent(app, eventInfo, strings.Join(messages, " "), "") + ctrl.logAppEvent(app, eventInfo, strings.Join(messages, " "), context.TODO()) ctrl.metricsServer.IncSync(app, state) } } @@ -1772,11 +1772,11 @@ func (ctrl *ApplicationController) persistAppStatus(orig *appv1.Application, new logCtx := getAppLog(orig) if orig.Status.Sync.Status != newStatus.Sync.Status { message := fmt.Sprintf("Updated sync status: %s -> %s", orig.Status.Sync.Status, newStatus.Sync.Status) - ctrl.auditLogger.LogAppEvent(orig, argo.EventInfo{Reason: argo.EventReasonResourceUpdated, Type: v1.EventTypeNormal}, message, "") + ctrl.logAppEvent(orig, argo.EventInfo{Reason: argo.EventReasonResourceUpdated, Type: v1.EventTypeNormal}, message, context.TODO()) } if orig.Status.Health.Status != newStatus.Health.Status { message := fmt.Sprintf("Updated health status: %s -> %s", orig.Status.Health.Status, newStatus.Health.Status) - ctrl.auditLogger.LogAppEvent(orig, argo.EventInfo{Reason: argo.EventReasonResourceUpdated, Type: v1.EventTypeNormal}, message, "") + ctrl.logAppEvent(orig, argo.EventInfo{Reason: argo.EventReasonResourceUpdated, Type: v1.EventTypeNormal}, message, context.TODO()) } var newAnnotations map[string]string if orig.GetAnnotations() != nil { @@ -1934,8 +1934,7 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus * target = desiredCommitSHA } message := fmt.Sprintf("Initiated automated sync to '%s'", target) - - ctrl.auditLogger.LogAppEvent(app, argo.EventInfo{Reason: argo.EventReasonOperationStarted, Type: v1.EventTypeNormal}, message, "") + ctrl.logAppEvent(app, argo.EventInfo{Reason: argo.EventReasonOperationStarted, Type: v1.EventTypeNormal}, message, context.TODO()) logCtx.Info(message) return nil, setOpTime } @@ -2275,4 +2274,9 @@ func (ctrl *ApplicationController) getAppList(options metav1.ListOptions) (*appv return appList, nil } +func (ctrl *ApplicationController) logAppEvent(a *appv1.Application, eventInfo argo.EventInfo, message string, ctx context.Context) { + eventLabels := argo.GetAppEventLabels(a, applisters.NewAppProjectLister(ctrl.projInformer.GetIndexer()), ctrl.namespace, ctrl.settingsMgr, ctrl.db, ctx) + ctrl.auditLogger.LogAppEvent(a, eventInfo, message, "", eventLabels) +} + type ClusterFilterFunction func(c *appv1.Cluster, distributionFunction sharding.DistributionFunction) bool diff --git a/docs/operator-manual/argocd-cm.yaml b/docs/operator-manual/argocd-cm.yaml index 88daa86c64334..61b8c3faa5d4f 100644 --- a/docs/operator-manual/argocd-cm.yaml +++ b/docs/operator-manual/argocd-cm.yaml @@ -221,6 +221,16 @@ data: # An optional comma-separated list of metadata.labels to observe in the UI. resource.customLabels: tier + # An optional comma-separated list of metadata.labels keys to add to Kubernetes events generated for Applications. + # The keys are compared against the Application and its AppProject. If matched, + # the corresponding labels are added to the generated event. + # In case of a conflict between labels on the Application and AppProject, + # the Application label values are prioritized and added to the event. Supports wildcards. + resource.includeEventLabelKeys: team,env* + # An optional comma-separated list of metadata.labels keys to exclude from Kubernetes events generated for Applications. Supports wildcards. + resource.excludeEventLabelKeys: environment,bu + + resource.compareoptions: | # if ignoreAggregatedRoles set to true then differences caused by aggregated roles in RBAC resources are ignored. ignoreAggregatedRoles: true diff --git a/docs/operator-manual/declarative-setup.md b/docs/operator-manual/declarative-setup.md index 2851ac953082f..324e6dc74620b 100644 --- a/docs/operator-manual/declarative-setup.md +++ b/docs/operator-manual/declarative-setup.md @@ -1132,6 +1132,22 @@ data: Custom Labels configured with `resource.customLabels` (comma separated string) will be displayed in the UI (for any resource that defines them). +## Labels on Application Events + +An optional comma-separated list of `metadata.labels` keys can be configured with `resource.includeEventLabelKeys` to add to Kubernetes events generated for Argo CD Applications. When events are generated for Applications containing the specified labels, the controller adds the matching labels to the event. This establishes an easy link between the event and the application, allowing for filtering using labels. In case of conflict between labels on the Application and AppProject, the Application label values are prioritized and added to the event. + +```yaml + resource.includeEventLabelKeys: team,env* +``` + +To exclude certain labels from events, use the `resource.excludeEventLabelKeys` key, which takes a comma-separated list of `metadata.labels` keys. + +```yaml + resource.excludeEventLabelKeys: environment,bu +``` + +Both `resource.includeEventLabelKeys` and `resource.excludeEventLabelKeys` support wildcards. + ## SSO & RBAC * SSO configuration details: [SSO](./user-management/index.md) diff --git a/server/application/application.go b/server/application/application.go index 7fd22c37458d6..b919bcdd66ac7 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -2305,7 +2305,8 @@ func (s *Server) logAppEvent(a *appv1.Application, ctx context.Context, reason s user = "Unknown user" } message := fmt.Sprintf("%s %s", user, action) - s.auditLogger.LogAppEvent(a, eventInfo, message, user) + eventLabels := argo.GetAppEventLabels(a, applisters.NewAppProjectLister(s.projInformer.GetIndexer()), s.ns, s.settingsMgr, s.db, ctx) + s.auditLogger.LogAppEvent(a, eventInfo, message, user, eventLabels) } func (s *Server) logResourceEvent(res *appv1.ResourceNode, ctx context.Context, reason string, action string) { diff --git a/test/e2e/app_k8s_events_test.go b/test/e2e/app_k8s_events_test.go new file mode 100644 index 0000000000000..e306e2ddf0d5a --- /dev/null +++ b/test/e2e/app_k8s_events_test.go @@ -0,0 +1,64 @@ +package e2e + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" + . "github.com/argoproj/argo-cd/v2/test/e2e/fixture" + . "github.com/argoproj/argo-cd/v2/test/e2e/fixture/app" +) + +// resource.includeEventLabelKeys keys set in argocd-cm +func TestLabelsOnAppK8sEvents(t *testing.T) { + expectedLabels := map[string]string{"app": "test", "environment": "dev"} + + Given(t). + Timeout(60). + Path("two-nice-pods"). + When(). + SetParamInSettingConfigMap("resource.includeEventLabelKeys", "app,team,env*"). + SetParamInSettingConfigMap("resource.excludeEventLabelKeys", "team"). + CreateApp("--label=app=test", "--label=environment=dev", "--label=team=A", "--label=tier=ui"). + Sync(). + Then(). + Expect(SyncStatusIs(SyncStatusCodeSynced)). + And(func(app *Application) { + events, err := KubeClientset.CoreV1().Events(app.Namespace).List(context.Background(), metav1.ListOptions{ + FieldSelector: fmt.Sprintf("involvedObject.name=%s,involvedObject.kind=Application", app.Name), + }) + assert.NoError(t, err) + for _, event := range events.Items { + for k, v := range event.Labels { + ev, found := expectedLabels[k] + assert.True(t, found) + assert.Equal(t, ev, v) + } + } + }) +} + +// resource.includeEventLabelKeys keys not set in argocd-cm +func TestNoLabelsOnAppK8sEvents(t *testing.T) { + Given(t). + Timeout(60). + Path("two-nice-pods"). + When(). + CreateApp("--label=app=test", "--label=environment=dev", "--label=team=A", "--label=tier=ui"). + Sync(). + Then(). + Expect(SyncStatusIs(SyncStatusCodeSynced)). + And(func(app *Application) { + events, err := KubeClientset.CoreV1().Events(app.Namespace).List(context.Background(), metav1.ListOptions{ + FieldSelector: fmt.Sprintf("involvedObject.name=%s,involvedObject.kind=Application", app.Name), + }) + assert.NoError(t, err) + for _, event := range events.Items { + assert.Nil(t, event.Labels) + } + }) +} diff --git a/util/argo/argo.go b/util/argo/argo.go index 8024e07bcddab..2afcce850e71a 100644 --- a/util/argo/argo.go +++ b/util/argo/argo.go @@ -27,6 +27,7 @@ import ( applicationsv1 "github.com/argoproj/argo-cd/v2/pkg/client/listers/application/v1alpha1" "github.com/argoproj/argo-cd/v2/reposerver/apiclient" "github.com/argoproj/argo-cd/v2/util/db" + "github.com/argoproj/argo-cd/v2/util/glob" "github.com/argoproj/argo-cd/v2/util/io" "github.com/argoproj/argo-cd/v2/util/settings" ) @@ -1102,3 +1103,49 @@ func IsValidContainerName(name string) bool { validationErrors := apimachineryvalidation.NameIsDNSLabel(name, false) return len(validationErrors) == 0 } + +// GetAppEventLabels returns a map of labels to add to a K8s event. +// The Application and its AppProject labels are compared against the `resource.includeEventLabelKeys` key in argocd-cm. +// If matched, the corresponding labels are returned to be added to the generated event. In case of a conflict +// between labels on the Application and AppProject, the Application label values are prioritized and added to the event. +// Furthermore, labels specified in `resource.excludeEventLabelKeys` in argocd-cm are removed from the event labels, if they were included. +func GetAppEventLabels(app *argoappv1.Application, projLister applicationsv1.AppProjectLister, ns string, settingsManager *settings.SettingsManager, db db.ArgoDB, ctx context.Context) map[string]string { + eventLabels := make(map[string]string) + + // Get all app & app-project labels + labels := app.Labels + if labels == nil { + labels = make(map[string]string) + } + proj, err := GetAppProject(app, projLister, ns, settingsManager, db, ctx) + if err == nil { + for k, v := range proj.Labels { + _, found := labels[k] + if !found { + labels[k] = v + } + } + } else { + log.Warn(err) + } + + // Filter out event labels to include + inKeys := settingsManager.GetIncludeEventLabelKeys() + for k, v := range labels { + found := glob.MatchStringInList(inKeys, k, false) + if found { + eventLabels[k] = v + } + } + + // Remove excluded event labels + exKeys := settingsManager.GetExcludeEventLabelKeys() + for k := range eventLabels { + found := glob.MatchStringInList(exKeys, k, false) + if found { + delete(eventLabels, k) + } + } + + return eventLabels +} diff --git a/util/argo/argo_test.go b/util/argo/argo_test.go index 885504d9c9ffa..2ad6ceacaab8c 100644 --- a/util/argo/argo_test.go +++ b/util/argo/argo_test.go @@ -1575,3 +1575,114 @@ func TestAugmentSyncMsg(t *testing.T) { }) } } + +func TestGetAppEventLabels(t *testing.T) { + tests := []struct { + name string + cmInEventLabelKeys string + cmExEventLabelKeys string + appLabels map[string]string + projLabels map[string]string + expectedEventLabels map[string]string + }{ + { + name: "no label keys in cm - no event labels", + cmInEventLabelKeys: "", + appLabels: map[string]string{"team": "A", "tier": "frontend"}, + projLabels: map[string]string{"environment": "dev"}, + expectedEventLabels: nil, + }, + { + name: "label keys in cm, no labels on app & proj - no event labels", + cmInEventLabelKeys: "team, environment", + appLabels: nil, + projLabels: nil, + expectedEventLabels: nil, + }, + { + name: "labels on app, no labels on proj - event labels matched on app only", + cmInEventLabelKeys: "team, environment", + appLabels: map[string]string{"team": "A", "tier": "frontend"}, + projLabels: nil, + expectedEventLabels: map[string]string{"team": "A"}, + }, + { + name: "no labels on app, labels on proj - event labels matched on proj only", + cmInEventLabelKeys: "team, environment", + appLabels: nil, + projLabels: map[string]string{"environment": "dev"}, + expectedEventLabels: map[string]string{"environment": "dev"}, + }, + { + name: "labels on app & proj with conflicts - event labels matched on both app & proj and app labels prioritized on conflict", + cmInEventLabelKeys: "team, environment", + appLabels: map[string]string{"team": "A", "environment": "stage", "tier": "frontend"}, + projLabels: map[string]string{"environment": "dev"}, + expectedEventLabels: map[string]string{"team": "A", "environment": "stage"}, + }, + { + name: "wildcard support - matched all labels", + cmInEventLabelKeys: "*", + appLabels: map[string]string{"team": "A", "tier": "frontend"}, + projLabels: map[string]string{"environment": "dev"}, + expectedEventLabels: map[string]string{"team": "A", "tier": "frontend", "environment": "dev"}, + }, + { + name: "exclude event labels", + cmInEventLabelKeys: "example.com/team,tier,env*", + cmExEventLabelKeys: "tie*", + appLabels: map[string]string{"example.com/team": "A", "tier": "frontend"}, + projLabels: map[string]string{"environment": "dev"}, + expectedEventLabels: map[string]string{"example.com/team": "A", "environment": "dev"}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cm := corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "argocd-cm", + Namespace: test.FakeArgoCDNamespace, + Labels: map[string]string{ + "app.kubernetes.io/part-of": "argocd", + }, + }, + Data: map[string]string{ + "resource.includeEventLabelKeys": tt.cmInEventLabelKeys, + "resource.excludeEventLabelKeys": tt.cmExEventLabelKeys, + }, + } + + proj := &argoappv1.AppProject{ + ObjectMeta: metav1.ObjectMeta{ + Name: "default", + Namespace: test.FakeArgoCDNamespace, + Labels: tt.projLabels, + }, + } + + var app argoappv1.Application + app.Name = "test-app" + app.Namespace = test.FakeArgoCDNamespace + app.Labels = tt.appLabels + appClientset := appclientset.NewSimpleClientset(proj) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + indexers := cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc} + informer := v1alpha1.NewAppProjectInformer(appClientset, test.FakeArgoCDNamespace, 0, indexers) + go informer.Run(ctx.Done()) + cache.WaitForCacheSync(ctx.Done(), informer.HasSynced) + + kubeClient := fake.NewSimpleClientset(&cm) + settingsMgr := settings.NewSettingsManager(context.Background(), kubeClient, test.FakeArgoCDNamespace) + argoDB := db.NewDB("default", settingsMgr, kubeClient) + + eventLabels := GetAppEventLabels(&app, applisters.NewAppProjectLister(informer.GetIndexer()), test.FakeArgoCDNamespace, settingsMgr, argoDB, ctx) + assert.Equal(t, len(tt.expectedEventLabels), len(eventLabels)) + for ek, ev := range tt.expectedEventLabels { + v, found := eventLabels[ek] + assert.True(t, found) + assert.Equal(t, ev, v) + } + }) + } +} diff --git a/util/argo/audit_logger.go b/util/argo/audit_logger.go index 1645e8d7d65d8..ba0d483922b9c 100644 --- a/util/argo/audit_logger.go +++ b/util/argo/audit_logger.go @@ -45,7 +45,7 @@ const ( EventReasonOperationCompleted = "OperationCompleted" ) -func (l *AuditLogger) logEvent(objMeta ObjectRef, gvk schema.GroupVersionKind, info EventInfo, message string, logFields map[string]string) { +func (l *AuditLogger) logEvent(objMeta ObjectRef, gvk schema.GroupVersionKind, info EventInfo, message string, logFields map[string]string, eventLabels map[string]string) { logCtx := log.WithFields(log.Fields{ "type": info.Type, "reason": info.Reason, @@ -66,6 +66,7 @@ func (l *AuditLogger) logEvent(objMeta ObjectRef, gvk schema.GroupVersionKind, i event := v1.Event{ ObjectMeta: metav1.ObjectMeta{ Name: fmt.Sprintf("%v.%x", objMeta.Name, t.UnixNano()), + Labels: eventLabels, Annotations: logFields, }, Source: v1.EventSource{ @@ -94,7 +95,7 @@ func (l *AuditLogger) logEvent(objMeta ObjectRef, gvk schema.GroupVersionKind, i } } -func (l *AuditLogger) LogAppEvent(app *v1alpha1.Application, info EventInfo, message, user string) { +func (l *AuditLogger) LogAppEvent(app *v1alpha1.Application, info EventInfo, message, user string, eventLabels map[string]string) { objectMeta := ObjectRef{ Name: app.ObjectMeta.Name, Namespace: app.ObjectMeta.Namespace, @@ -108,7 +109,7 @@ func (l *AuditLogger) LogAppEvent(app *v1alpha1.Application, info EventInfo, mes if user != "" { fields["user"] = user } - l.logEvent(objectMeta, v1alpha1.ApplicationSchemaGroupVersionKind, info, message, fields) + l.logEvent(objectMeta, v1alpha1.ApplicationSchemaGroupVersionKind, info, message, fields, eventLabels) } func (l *AuditLogger) LogAppSetEvent(app *v1alpha1.ApplicationSet, info EventInfo, message, user string) { @@ -122,7 +123,7 @@ func (l *AuditLogger) LogAppSetEvent(app *v1alpha1.ApplicationSet, info EventInf if user != "" { fields["user"] = user } - l.logEvent(objectMeta, v1alpha1.ApplicationSetSchemaGroupVersionKind, info, message, fields) + l.logEvent(objectMeta, v1alpha1.ApplicationSetSchemaGroupVersionKind, info, message, fields, nil) } func (l *AuditLogger) LogResourceEvent(res *v1alpha1.ResourceNode, info EventInfo, message, user string) { @@ -140,7 +141,7 @@ func (l *AuditLogger) LogResourceEvent(res *v1alpha1.ResourceNode, info EventInf Group: res.Group, Version: res.Version, Kind: res.Kind, - }, info, message, fields) + }, info, message, fields, nil) } func (l *AuditLogger) LogAppProjEvent(proj *v1alpha1.AppProject, info EventInfo, message, user string) { @@ -154,7 +155,7 @@ func (l *AuditLogger) LogAppProjEvent(proj *v1alpha1.AppProject, info EventInfo, if user != "" { fields["user"] = user } - l.logEvent(objectMeta, v1alpha1.AppProjectSchemaGroupVersionKind, info, message, nil) + l.logEvent(objectMeta, v1alpha1.AppProjectSchemaGroupVersionKind, info, message, nil, nil) } func NewAuditLogger(ns string, kIf kubernetes.Interface, component string) *AuditLogger { diff --git a/util/argo/audit_logger_test.go b/util/argo/audit_logger_test.go index eef1780d0b4e7..17fcaf366c1d3 100644 --- a/util/argo/audit_logger_test.go +++ b/util/argo/audit_logger_test.go @@ -90,7 +90,7 @@ func TestLogAppEvent(t *testing.T) { } output := captureLogEntries(func() { - logger.LogAppEvent(&app, ei, "This is a test message", "") + logger.LogAppEvent(&app, ei, "This is a test message", "", nil) }) assert.Contains(t, output, "level=info") diff --git a/util/settings/settings.go b/util/settings/settings.go index 7b11274140365..1f036ddeff7c6 100644 --- a/util/settings/settings.go +++ b/util/settings/settings.go @@ -448,6 +448,10 @@ const ( resourceIgnoreResourceUpdatesEnabledKey = "resource.ignoreResourceUpdatesEnabled" // resourceCustomLabelKey is the key to a custom label to show in node info, if present resourceCustomLabelsKey = "resource.customLabels" + // resourceIncludeEventLabelKeys is the key to labels to be added onto Application k8s events if present on an Application or it's AppProject. Supports wildcard. + resourceIncludeEventLabelKeys = "resource.includeEventLabelKeys" + // resourceExcludeEventLabelKeys is the key to labels to be excluded from adding onto Application's k8s events. Supports wildcard. + resourceExcludeEventLabelKeys = "resource.excludeEventLabelKeys" // kustomizeBuildOptionsKey is a string of kustomize build parameters kustomizeBuildOptionsKey = "kustomize.buildOptions" // kustomizeVersionKeyPrefix is a kustomize version key prefix @@ -2221,3 +2225,35 @@ func (mgr *SettingsManager) GetResourceCustomLabels() ([]string, error) { } return []string{}, nil } + +func (mgr *SettingsManager) GetIncludeEventLabelKeys() []string { + labelKeys := []string{} + argoCDCM, err := mgr.getConfigMap() + if err != nil { + log.Error(fmt.Errorf("failed getting configmap: %w", err)) + return labelKeys + } + if value, ok := argoCDCM.Data[resourceIncludeEventLabelKeys]; ok { + if value != "" { + value = strings.ReplaceAll(value, " ", "") + labelKeys = strings.Split(value, ",") + } + } + return labelKeys +} + +func (mgr *SettingsManager) GetExcludeEventLabelKeys() []string { + labelKeys := []string{} + argoCDCM, err := mgr.getConfigMap() + if err != nil { + log.Error(fmt.Errorf("failed getting configmap: %w", err)) + return labelKeys + } + if value, ok := argoCDCM.Data[resourceExcludeEventLabelKeys]; ok { + if value != "" { + value = strings.ReplaceAll(value, " ", "") + labelKeys = strings.Split(value, ",") + } + } + return labelKeys +} diff --git a/util/settings/settings_test.go b/util/settings/settings_test.go index 0011a79adcf59..b8b1b8665eb12 100644 --- a/util/settings/settings_test.go +++ b/util/settings/settings_test.go @@ -710,6 +710,46 @@ func TestSettingsManager_GetKustomizeBuildOptions(t *testing.T) { }) } +func TestSettingsManager_GetEventLabelKeys(t *testing.T) { + tests := []struct { + name string + data string + expectedKeys []string + }{ + { + name: "Comma separated data", + data: "app,env, tier, example.com/team-*, *", + expectedKeys: []string{"app", "env", "tier", "example.com/team-*", "*"}, + }, + { + name: "Empty data", + expectedKeys: []string{}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, settingsManager := fixtures(map[string]string{}) + if tt.data != "" { + _, settingsManager = fixtures(map[string]string{ + resourceIncludeEventLabelKeys: tt.data, + resourceExcludeEventLabelKeys: tt.data, + }) + } + + inKeys := settingsManager.GetIncludeEventLabelKeys() + assert.Equal(t, len(tt.expectedKeys), len(inKeys)) + + exKeys := settingsManager.GetExcludeEventLabelKeys() + assert.Equal(t, len(tt.expectedKeys), len(exKeys)) + + for i := range tt.expectedKeys { + assert.Equal(t, tt.expectedKeys[i], inKeys[i]) + assert.Equal(t, tt.expectedKeys[i], exKeys[i]) + } + }) + } +} + func TestKustomizeSettings_GetOptions(t *testing.T) { settings := KustomizeSettings{ BuildOptions: "--opt1 val1", From 8f281996c6c4a7a3ea0ef400ffbbcfad4d80b577 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Tue, 18 Jun 2024 03:35:35 +0200 Subject: [PATCH 52/74] chore: enable require-error from testifylint on cmpserver and reposerver folders (#18702) * chore: enable require-error from testifylint on cmpserver and reposerver folders Signed-off-by: Matthieu MOREL * Update app_k8s_events_test.go Signed-off-by: Matthieu MOREL --------- Signed-off-by: Matthieu MOREL --- .golangci.yaml | 5 - cmpserver/plugin/config_test.go | 4 +- cmpserver/plugin/plugin_test.go | 46 +-- reposerver/apiclient/clientset_test.go | 9 +- reposerver/cache/cache_test.go | 115 ++++---- reposerver/repository/chart_test.go | 9 +- reposerver/repository/repository_test.go | 360 +++++++++++------------ test/e2e/app_k8s_events_test.go | 5 +- 8 files changed, 270 insertions(+), 283 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 0b549fd364ff6..7d6b684a83683 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -2,11 +2,6 @@ issues: exclude: - SA1019 - SA5011 - exclude-rules: - - path: "(cmpserver|reposerver)/" - text: "require-error:" - linters: - - testifylint max-issues-per-linter: 0 max-same-issues: 0 linters: diff --git a/cmpserver/plugin/config_test.go b/cmpserver/plugin/config_test.go index 3b5a58a1826a7..db08e92a2f563 100644 --- a/cmpserver/plugin/config_test.go +++ b/cmpserver/plugin/config_test.go @@ -159,9 +159,9 @@ spec: require.NoError(t, err) config, err := ReadPluginConfig(tempDir) if tcc.expectedErr != "" { - assert.EqualError(t, err, tcc.expectedErr) + require.EqualError(t, err, tcc.expectedErr) } else { - assert.NoError(t, err) + require.NoError(t, err) } assert.Equal(t, tcc.expected, config) }) diff --git a/cmpserver/plugin/plugin_test.go b/cmpserver/plugin/plugin_test.go index 51b4b5c4c11d4..c5f431a8fad42 100644 --- a/cmpserver/plugin/plugin_test.go +++ b/cmpserver/plugin/plugin_test.go @@ -103,7 +103,7 @@ func TestMatchRepository(t *testing.T) { match, discovery, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, match) assert.True(t, discovery) }) @@ -118,7 +118,7 @@ func TestMatchRepository(t *testing.T) { match, discovery, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, match) assert.True(t, discovery) }) @@ -133,7 +133,7 @@ func TestMatchRepository(t *testing.T) { _, _, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.ErrorContains(t, err, "syntax error") + require.ErrorContains(t, err, "syntax error") }) t.Run("will match plugin by glob", func(t *testing.T) { // given @@ -148,7 +148,7 @@ func TestMatchRepository(t *testing.T) { match, discovery, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, match) assert.True(t, discovery) }) @@ -165,7 +165,7 @@ func TestMatchRepository(t *testing.T) { match, discovery, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, match) assert.True(t, discovery) }) @@ -182,7 +182,7 @@ func TestMatchRepository(t *testing.T) { _, _, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.ErrorContains(t, err, "error finding glob match for pattern") + require.ErrorContains(t, err, "error finding glob match for pattern") }) t.Run("will match plugin by command when returns any output", func(t *testing.T) { // given @@ -199,7 +199,7 @@ func TestMatchRepository(t *testing.T) { match, discovery, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, match) assert.True(t, discovery) }) @@ -217,7 +217,7 @@ func TestMatchRepository(t *testing.T) { // when match, discovery, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, match) assert.True(t, discovery) }) @@ -236,7 +236,7 @@ func TestMatchRepository(t *testing.T) { match, discovery, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, match) assert.True(t, discovery) }) @@ -256,7 +256,7 @@ func TestMatchRepository(t *testing.T) { match, discovery, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, match) assert.True(t, discovery) }) @@ -275,7 +275,7 @@ func TestMatchRepository(t *testing.T) { match, discovery, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.Error(t, err) + require.Error(t, err) assert.False(t, match) assert.True(t, discovery) }) @@ -288,7 +288,7 @@ func TestMatchRepository(t *testing.T) { match, discovery, err := f.service.matchRepository(context.Background(), f.path, f.env, ".") // then - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, match) assert.False(t, discovery) }) @@ -323,7 +323,7 @@ func TestGenerateManifest(t *testing.T) { service.WithGenerateCommand(Command{Command: []string{"bad-command"}}) res, err := service.generateManifest(context.Background(), "testdata/kustomize", nil) - assert.ErrorContains(t, err, "executable file not found") + require.ErrorContains(t, err, "executable file not found") assert.Nil(t, res.Manifests) }) t.Run("bad yaml output", func(t *testing.T) { @@ -332,7 +332,7 @@ func TestGenerateManifest(t *testing.T) { service.WithGenerateCommand(Command{Command: []string{"echo", "invalid yaml: }"}}) res, err := service.generateManifest(context.Background(), "testdata/kustomize", nil) - assert.ErrorContains(t, err, "failed to unmarshal manifest") + require.ErrorContains(t, err, "failed to unmarshal manifest") assert.Nil(t, res.Manifests) }) } @@ -345,7 +345,7 @@ func TestGenerateManifest_deadline_exceeded(t *testing.T) { expiredCtx, cancel := context.WithTimeout(context.Background(), time.Second*0) defer cancel() _, err = service.generateManifest(expiredCtx, "", nil) - assert.ErrorContains(t, err, "context deadline exceeded") + require.ErrorContains(t, err, "context deadline exceeded") } // TestRunCommandContextTimeout makes sure the command dies at timeout rather than sleeping past the timeout. @@ -360,13 +360,13 @@ func TestRunCommandContextTimeout(t *testing.T) { before := time.Now() _, err := runCommand(ctx, command, "", []string{}) after := time.Now() - assert.Error(t, err) // The command should time out, causing an error. + require.Error(t, err) // The command should time out, causing an error. assert.Less(t, after.Sub(before), 1*time.Second) } func TestRunCommandEmptyCommand(t *testing.T) { _, err := runCommand(context.Background(), Command{}, "", nil) - assert.ErrorContains(t, err, "Command is empty") + require.ErrorContains(t, err, "Command is empty") } // TestRunCommandContextTimeoutWithCleanup makes sure that the process is given enough time to cleanup before sending SIGKILL. @@ -385,7 +385,7 @@ func TestRunCommandContextTimeoutWithCleanup(t *testing.T) { output, err := runCommand(ctx, command, "", []string{}) after := time.Now() - assert.Error(t, err) // The command should time out, causing an error. + require.Error(t, err) // The command should time out, causing an error. assert.Less(t, after.Sub(before), 1*time.Second) // The command should still have completed the cleanup after termination. assert.Contains(t, output, "cleanup completed") @@ -451,7 +451,7 @@ func Test_getParametersAnnouncement_invalid_json(t *testing.T) { Args: []string{`[`}, } _, err := getParametersAnnouncement(context.Background(), "", []*repoclient.ParameterAnnouncement{}, command, []*apiclient.EnvEntry{}) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "unexpected end of JSON input") } @@ -461,7 +461,7 @@ func Test_getParametersAnnouncement_bad_command(t *testing.T) { Args: []string{"1"}, } _, err := getParametersAnnouncement(context.Background(), "", []*repoclient.ParameterAnnouncement{}, command, []*apiclient.EnvEntry{}) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "error executing dynamic parameter output command") } @@ -472,7 +472,7 @@ func Test_getTempDirMustCleanup(t *testing.T) { err := os.Chmod(tempDir, 0o000) require.NoError(t, err) _, _, err = getTempDirMustCleanup(path.Join(tempDir, "test")) - assert.ErrorContains(t, err, "error creating temp dir") + require.ErrorContains(t, err, "error creating temp dir") err = os.Chmod(tempDir, 0o700) require.NoError(t, err) @@ -500,13 +500,13 @@ func TestService_Init(t *testing.T) { require.NoError(t, err) s := NewService(CMPServerInitConstants{PluginConfig: PluginConfig{}}) err = s.Init(workDir) - assert.ErrorContains(t, err, "error removing workdir", "Init must throw an error if it can't remove the work directory") + require.ErrorContains(t, err, "error removing workdir", "Init must throw an error if it can't remove the work directory") // Make the base directory writable so Init's cleanup succeeds. err = os.Chmod(tempDir, 0o700) require.NoError(t, err) err = s.Init(workDir) - assert.NoError(t, err) + require.NoError(t, err) assert.DirExists(t, workDir) assert.NoFileExists(t, testfile) } diff --git a/reposerver/apiclient/clientset_test.go b/reposerver/apiclient/clientset_test.go index 8ae768cb58119..c0966b799de50 100644 --- a/reposerver/apiclient/clientset_test.go +++ b/reposerver/apiclient/clientset_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v2/reposerver/apiclient" "github.com/argoproj/argo-cd/v2/reposerver/apiclient/mocks" @@ -16,7 +17,7 @@ func TestNewRepoServerClient_CorrectClientReturned(t *testing.T) { closer, client, err := mockClientset.NewRepoServerClient() - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, closer) assert.NotNil(t, client) assert.Equal(t, mockClientset.RepoServerServiceClient, client) @@ -59,7 +60,7 @@ func TestNewConnection_TLSWithStrictValidation(t *testing.T) { conn, err := apiclient.NewConnection("example.com:443", 10, &tlsConfig) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, conn) } @@ -72,7 +73,7 @@ func TestNewConnection_TLSWithStrictValidationAndCertificates(t *testing.T) { conn, err := apiclient.NewConnection("example.com:443", 10, &tlsConfig) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, conn) } @@ -86,6 +87,6 @@ func TestNewConnection_InsecureConnection(t *testing.T) { conn, err := apiclient.NewConnection("example.com:80", 10, &tlsConfig) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, conn) } diff --git a/reposerver/cache/cache_test.go b/reposerver/cache/cache_test.go index 6cc0a3f53333a..c05fc14134ad6 100644 --- a/reposerver/cache/cache_test.go +++ b/reposerver/cache/cache_test.go @@ -12,6 +12,7 @@ import ( "github.com/spf13/cobra" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" appv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" @@ -48,7 +49,7 @@ func TestCache_GetRevisionMetadata(t *testing.T) { mockCache.RedisClient.AssertCalled(t, "Get", mock.Anything, mock.Anything) // populate cache err = cache.SetRevisionMetadata("my-repo-url", "my-revision", &RevisionMetadata{Message: "my-message"}) - assert.NoError(t, err) + require.NoError(t, err) // cache miss _, err = cache.GetRevisionMetadata("other-repo-url", "my-revision") assert.Equal(t, ErrCacheMiss, err) @@ -57,7 +58,7 @@ func TestCache_GetRevisionMetadata(t *testing.T) { assert.Equal(t, ErrCacheMiss, err) // cache hit value, err := cache.GetRevisionMetadata("my-repo-url", "my-revision") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &RevisionMetadata{Message: "my-message"}, value) mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 1, ExternalGets: 4}) } @@ -72,7 +73,7 @@ func TestCache_ListApps(t *testing.T) { assert.Equal(t, ErrCacheMiss, err) // populate cache err = cache.SetApps("my-repo-url", "my-revision", map[string]string{"foo": "bar"}) - assert.NoError(t, err) + require.NoError(t, err) // cache miss _, err = cache.ListApps("other-repo-url", "my-revision") assert.Equal(t, ErrCacheMiss, err) @@ -81,7 +82,7 @@ func TestCache_ListApps(t *testing.T) { assert.Equal(t, ErrCacheMiss, err) // cache hit value, err := cache.ListApps("my-repo-url", "my-revision") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, map[string]string{"foo": "bar"}, value) mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 1, ExternalGets: 4}) } @@ -99,7 +100,7 @@ func TestCache_GetManifests(t *testing.T) { // populate cache res := &CachedManifestResponse{ManifestResponse: &apiclient.ManifestResponse{SourceType: "my-source-type"}} err = cache.SetManifests("my-revision", &ApplicationSource{}, q.RefSources, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", res, nil) - assert.NoError(t, err) + require.NoError(t, err) t.Run("expect cache miss because of changed revision", func(t *testing.T) { err = cache.GetManifests("other-revision", &ApplicationSource{}, q.RefSources, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", value, nil) assert.Equal(t, ErrCacheMiss, err) @@ -128,10 +129,10 @@ func TestCache_GetManifests(t *testing.T) { err = cache.SetManifests( "my-revision1", &ApplicationSource{}, q.RefSources, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", &CachedManifestResponse{ManifestResponse: &apiclient.ManifestResponse{SourceType: "my-source-type", Revision: "my-revision2"}}, nil) - assert.NoError(t, err) + require.NoError(t, err) err = cache.GetManifests("my-revision1", &ApplicationSource{}, q.RefSources, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", value, nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "my-source-type", value.ManifestResponse.SourceType) assert.Equal(t, "my-revision1", value.ManifestResponse.Revision) @@ -151,7 +152,7 @@ func TestCache_GetAppDetails(t *testing.T) { assert.Equal(t, ErrCacheMiss, err) res := &apiclient.RepoAppDetailsResponse{Type: "my-type"} err = cache.SetAppDetails("my-revision", &ApplicationSource{}, emptyRefSources, res, "", nil) - assert.NoError(t, err) + require.NoError(t, err) // cache miss err = cache.GetAppDetails("other-revision", &ApplicationSource{}, emptyRefSources, value, "", nil) assert.Equal(t, ErrCacheMiss, err) @@ -160,14 +161,14 @@ func TestCache_GetAppDetails(t *testing.T) { assert.Equal(t, ErrCacheMiss, err) // cache hit err = cache.GetAppDetails("my-revision", &ApplicationSource{}, emptyRefSources, value, "", nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, &apiclient.RepoAppDetailsResponse{Type: "my-type"}, value) mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 1, ExternalGets: 4}) } func TestAddCacheFlagsToCmd(t *testing.T) { cache, err := AddCacheFlagsToCmd(&cobra.Command{})() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, 24*time.Hour, cache.repoCacheExpiration) } @@ -347,7 +348,7 @@ func TestGetGitReferences(t *testing.T) { cache := fixtures.cache var references []*plumbing.Reference lockOwner, err := cache.GetGitReferences("test-repo", &references) - assert.NoError(t, err, "Error is cache miss handled inside function") + require.NoError(t, err, "Error is cache miss handled inside function") assert.Equal(t, "", lockOwner, "Lock owner should be empty") assert.Nil(t, references) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1}) @@ -359,7 +360,7 @@ func TestGetGitReferences(t *testing.T) { cache := fixtures.cache var references []*plumbing.Reference lockOwner, err := cache.GetGitReferences("test-repo", &references) - assert.NoError(t, err, "Error is cache miss handled inside function") + require.NoError(t, err, "Error is cache miss handled inside function") assert.Equal(t, "", lockOwner, "Lock owner should be empty") assert.Nil(t, references) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1}) @@ -370,10 +371,10 @@ func TestGetGitReferences(t *testing.T) { t.Cleanup(fixtures.mockCache.StopRedisCallback) cache := fixtures.cache err := cache.SetGitReferences("test-repo", *GitRefCacheItemToReferences([][2]string{{"test-repo", "ref: test"}})) - assert.NoError(t, err) + require.NoError(t, err) var references []*plumbing.Reference lockOwner, err := cache.GetGitReferences("test-repo", &references) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "", lockOwner, "Lock owner should be empty") assert.Len(t, references, 1) assert.Equal(t, "test", (references)[0].Target().String()) @@ -389,7 +390,7 @@ func TestGetGitReferences(t *testing.T) { fixtures.mockCache.RedisClient.On("Get", mock.Anything, mock.Anything).Return(errors.New("test cache error")) var references []*plumbing.Reference lockOwner, err := cache.GetGitReferences("test-repo", &references) - assert.ErrorContains(t, err, "test cache error", "Error should be propagated") + require.ErrorContains(t, err, "test cache error", "Error should be propagated") assert.Equal(t, "", lockOwner, "Lock owner should be empty") assert.Nil(t, references) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1}) @@ -428,32 +429,32 @@ func TestTryLockGitRefCache_OwnershipFlows(t *testing.T) { // Test setting the lock _, err := cache.TryLockGitRefCache("my-repo-url", "my-lock-id", &references) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 1, ExternalGets: 1}) - assert.NoError(t, err) + require.NoError(t, err) var output [][2]string key := fmt.Sprintf("git-refs|%s", "my-repo-url") err = utilCache.GetItem(key, &output) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 1, ExternalGets: 2}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "locked", output[0][0], "The lock should be set") assert.Equal(t, "my-lock-id", output[0][1], "The lock should be set to the provided lock id") // Test not being able to overwrite the lock _, err = cache.TryLockGitRefCache("my-repo-url", "other-lock-id", &references) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 2, ExternalGets: 3}) - assert.NoError(t, err) + require.NoError(t, err) err = utilCache.GetItem(key, &output) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 2, ExternalGets: 4}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "locked", output[0][0], "The lock should not have changed") assert.Equal(t, "my-lock-id", output[0][1], "The lock should not have changed") // Test can overwrite once there is nothing set err = utilCache.SetItem(key, [][2]string{}, &cacheutil.CacheActionOpts{Expiration: 0, Delete: true}) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 2, ExternalGets: 4, ExternalDeletes: 1}) - assert.NoError(t, err) + require.NoError(t, err) _, err = cache.TryLockGitRefCache("my-repo-url", "other-lock-id", &references) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 3, ExternalGets: 5, ExternalDeletes: 1}) - assert.NoError(t, err) + require.NoError(t, err) err = utilCache.GetItem(key, &output) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "locked", output[0][0], "The lock should be set") assert.Equal(t, "other-lock-id", output[0][1], "The lock id should have changed to other-lock-id") fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 3, ExternalGets: 6, ExternalDeletes: 1}) @@ -466,7 +467,7 @@ func TestGetOrLockGitReferences(t *testing.T) { cache := fixtures.cache var references []*plumbing.Reference lockId, err := cache.GetOrLockGitReferences("test-repo", "test-lock-id", &references) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test-lock-id", lockId) assert.NotEqual(t, "", lockId, "Lock id should be set") fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 1, ExternalGets: 2}) @@ -477,10 +478,10 @@ func TestGetOrLockGitReferences(t *testing.T) { t.Cleanup(fixtures.mockCache.StopRedisCallback) cache := fixtures.cache err := cache.SetGitReferences("test-repo", *GitRefCacheItemToReferences([][2]string{{"test-repo", "ref: test"}})) - assert.NoError(t, err) + require.NoError(t, err) var references []*plumbing.Reference lockId, err := cache.GetOrLockGitReferences("test-repo", "test-lock-id", &references) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, "test-lock-id", lockId) assert.Equal(t, "", lockId, "Lock id should not be set") assert.Equal(t, "test-repo", references[0].Name().String()) @@ -498,10 +499,10 @@ func TestGetOrLockGitReferences(t *testing.T) { &cacheutil.CacheActionOpts{ Expiration: 30 * time.Second, }) - assert.NoError(t, err) + require.NoError(t, err) var references []*plumbing.Reference lockId, err := cache.GetOrLockGitReferences("test-repo", "test-lock-id", &references) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, "test-lock-id", lockId) assert.Equal(t, "", lockId, "Lock id should not be set") assert.Equal(t, "test-repo", references[0].Name().String()) @@ -518,11 +519,11 @@ func TestGetOrLockGitReferences(t *testing.T) { fixtures.mockCache.RedisClient.On("Get", mock.Anything, mock.Anything).Unset() fixtures.mockCache.RedisClient.On("Get", mock.Anything, mock.Anything).Return(cacheutil.ErrCacheMiss).Once().Run(func(args mock.Arguments) { err := cache.SetGitReferences("test-repo", *GitRefCacheItemToReferences([][2]string{{"test-repo", "ref: test"}})) - assert.NoError(t, err) + require.NoError(t, err) }).On("Get", mock.Anything, mock.Anything).Return(nil) var references []*plumbing.Reference lockId, err := cache.GetOrLockGitReferences("test-repo", "test-lock-id", &references) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, "test-lock-id", lockId) assert.Equal(t, "", lockId, "Lock id should not be set") fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 2, ExternalGets: 2}) @@ -534,11 +535,11 @@ func TestGetOrLockGitReferences(t *testing.T) { cache := fixtures.cache // Create conditions for cache hit, which would result in false on updateCache if we weren't reaching the timeout err := cache.SetGitReferences("test-repo", *GitRefCacheItemToReferences([][2]string{{"test-repo", "ref: test"}})) - assert.NoError(t, err) + require.NoError(t, err) cache.revisionCacheLockTimeout = -1 * time.Second var references []*plumbing.Reference lockId, err := cache.GetOrLockGitReferences("test-repo", "test-lock-id", &references) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test-lock-id", lockId) assert.NotEqual(t, "", lockId, "Lock id should be set") cache.revisionCacheLockTimeout = 10 * time.Second @@ -555,7 +556,7 @@ func TestGetOrLockGitReferences(t *testing.T) { On("Set", mock.Anything).Return(nil) var references []*plumbing.Reference lockId, err := cache.GetOrLockGitReferences("test-repo", "test-lock-id", &references) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test-lock-id", lockId) assert.NotEqual(t, "", lockId, "Lock id should be set") fixtures.mockCache.RedisClient.AssertNumberOfCalls(t, "Set", 2) @@ -570,7 +571,7 @@ func TestUnlockGitReferences(t *testing.T) { t.Run("Test not locked", func(t *testing.T) { err := cache.UnlockGitReferences("test-repo", "") - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "key is missing") }) @@ -578,12 +579,12 @@ func TestUnlockGitReferences(t *testing.T) { // Get lock var references []*plumbing.Reference lockId, err := cache.GetOrLockGitReferences("test-repo", "test-lock-id", &references) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test-lock-id", lockId) assert.NotEqual(t, "", lockId, "Lock id should be set") // Release lock err = cache.UnlockGitReferences("test-repo", lockId) - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -592,17 +593,17 @@ func TestSetHelmIndex(t *testing.T) { fixtures := newFixtures() t.Cleanup(fixtures.mockCache.StopRedisCallback) err := fixtures.cache.SetHelmIndex("test-repo", []byte("test-data")) - assert.NoError(t, err) + require.NoError(t, err) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalSets: 1}) }) t.Run("SetHelmIndex with nil", func(t *testing.T) { fixtures := newFixtures() t.Cleanup(fixtures.mockCache.StopRedisCallback) err := fixtures.cache.SetHelmIndex("test-repo", nil) - assert.Error(t, err, "nil data should not be cached") + require.Error(t, err, "nil data should not be cached") var indexData []byte err = fixtures.cache.GetHelmIndex("test-repo", &indexData) - assert.Error(t, err) + require.Error(t, err) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1}) }) } @@ -612,7 +613,7 @@ func TestRevisionChartDetails(t *testing.T) { fixtures := newFixtures() t.Cleanup(fixtures.mockCache.StopRedisCallback) details, err := fixtures.cache.GetRevisionChartDetails("test-repo", "test-revision", "v1.0.0") - assert.ErrorAs(t, err, &ErrCacheMiss) + require.ErrorAs(t, err, &ErrCacheMiss) assert.Equal(t, &appv1.ChartDetails{}, details) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1}) }) @@ -629,9 +630,9 @@ func TestRevisionChartDetails(t *testing.T) { revisionChartDetailsKey("test-repo", "test-revision", "v1.0.0"), expectedItem, &cacheutil.CacheActionOpts{Expiration: 30 * time.Second}) - assert.NoError(t, err) + require.NoError(t, err) details, err := fixtures.cache.GetRevisionChartDetails("test-repo", "test-revision", "v1.0.0") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedItem, details) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1, ExternalSets: 1}) }) @@ -649,9 +650,9 @@ func TestRevisionChartDetails(t *testing.T) { revisionChartDetailsKey("test-repo", "test-revision", "v1.0.0"), expectedItem, &cacheutil.CacheActionOpts{Expiration: 30 * time.Second}) - assert.NoError(t, err) + require.NoError(t, err) details, err := fixtures.cache.GetRevisionChartDetails("test-repo", "test-revision", "v1.0.0") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedItem, details) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1, ExternalSets: 1}) }) @@ -665,9 +666,9 @@ func TestRevisionChartDetails(t *testing.T) { Maintainers: []string{"test-maintainer"}, } err := fixtures.cache.SetRevisionChartDetails("test-repo", "test-revision", "v1.0.0", expectedItem) - assert.NoError(t, err) + require.NoError(t, err) details, err := fixtures.cache.GetRevisionChartDetails("test-repo", "test-revision", "v1.0.0") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedItem, details) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1, ExternalSets: 1}) }) @@ -678,7 +679,7 @@ func TestGetGitDirectories(t *testing.T) { fixtures := newFixtures() t.Cleanup(fixtures.mockCache.StopRedisCallback) directories, err := fixtures.cache.GetGitDirectories("test-repo", "test-revision") - assert.ErrorAs(t, err, &ErrCacheMiss) + require.ErrorAs(t, err, &ErrCacheMiss) assert.Empty(t, directories) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1}) }) @@ -691,9 +692,9 @@ func TestGetGitDirectories(t *testing.T) { gitDirectoriesKey("test-repo", "test-revision"), expectedItem, &cacheutil.CacheActionOpts{Expiration: 30 * time.Second}) - assert.NoError(t, err) + require.NoError(t, err) directories, err := fixtures.cache.GetGitDirectories("test-repo", "test-revision") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedItem, directories) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1, ExternalSets: 1}) }) @@ -707,9 +708,9 @@ func TestGetGitDirectories(t *testing.T) { gitDirectoriesKey("test-repo", "test-revision"), expectedItem, &cacheutil.CacheActionOpts{Expiration: 30 * time.Second}) - assert.NoError(t, err) + require.NoError(t, err) directories, err := fixtures.cache.GetGitDirectories("test-repo", "test-revision") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedItem, directories) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1, ExternalSets: 1}) }) @@ -719,9 +720,9 @@ func TestGetGitDirectories(t *testing.T) { t.Cleanup(fixtures.mockCache.StopRedisCallback) expectedItem := []string{"test/dir", "test/dir2"} err := fixtures.cache.SetGitDirectories("test-repo", "test-revision", expectedItem) - assert.NoError(t, err) + require.NoError(t, err) directories, err := fixtures.cache.GetGitDirectories("test-repo", "test-revision") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedItem, directories) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1, ExternalSets: 1}) }) @@ -732,7 +733,7 @@ func TestGetGitFiles(t *testing.T) { fixtures := newFixtures() t.Cleanup(fixtures.mockCache.StopRedisCallback) directories, err := fixtures.cache.GetGitFiles("test-repo", "test-revision", "*.json") - assert.ErrorAs(t, err, &ErrCacheMiss) + require.ErrorAs(t, err, &ErrCacheMiss) assert.Empty(t, directories) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1}) }) @@ -745,9 +746,9 @@ func TestGetGitFiles(t *testing.T) { gitFilesKey("test-repo", "test-revision", "*.json"), expectedItem, &cacheutil.CacheActionOpts{Expiration: 30 * time.Second}) - assert.NoError(t, err) + require.NoError(t, err) files, err := fixtures.cache.GetGitFiles("test-repo", "test-revision", "*.json") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedItem, files) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1, ExternalSets: 1}) }) @@ -757,9 +758,9 @@ func TestGetGitFiles(t *testing.T) { t.Cleanup(fixtures.mockCache.StopRedisCallback) expectedItem := map[string][]byte{"test/file.json": []byte("\"test\":\"contents\""), "test/file1.json": []byte("\"test1\":\"contents1\"")} err := fixtures.cache.SetGitFiles("test-repo", "test-revision", "*.json", expectedItem) - assert.NoError(t, err) + require.NoError(t, err) files, err := fixtures.cache.GetGitFiles("test-repo", "test-revision", "*.json") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedItem, files) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1, ExternalSets: 1}) }) diff --git a/reposerver/repository/chart_test.go b/reposerver/repository/chart_test.go index f948e4bc59e46..3e1bccfa46a07 100644 --- a/reposerver/repository/chart_test.go +++ b/reposerver/repository/chart_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_getChartDetailsNotSet(t *testing.T) { @@ -12,7 +13,7 @@ name: mychart version: 0.0.0` cd, err := getChartDetails(chart1) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "", cd.Description) assert.Equal(t, cd.Maintainers, []string(nil)) assert.Equal(t, "", cd.Home) @@ -30,7 +31,7 @@ maintainers: ` cd, err := getChartDetails(chart1) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "a good chart", cd.Description) assert.Equal(t, []string{"alex "}, cd.Maintainers) assert.Equal(t, "https://example.com", cd.Home) @@ -44,7 +45,7 @@ maintainers: - name: alex ` cd, err = getChartDetails(chart1) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []string{"alex"}, cd.Maintainers) } @@ -58,6 +59,6 @@ maintainers: alex ` cd, err := getChartDetails(chart1) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, cd) } diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go index 38006085fe4d0..6d4ec29d7788c 100644 --- a/reposerver/repository/repository_test.go +++ b/reposerver/repository/repository_test.go @@ -211,12 +211,12 @@ func TestGenerateYamlManifestInDir(t *testing.T) { res1, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res1.Manifests, countOfManifests) // this will test concatenated manifests to verify we split YAMLs correctly res2, err := GenerateManifests(context.Background(), "./testdata/concatenated", "/", "", &q, false, &git.NoopCredsStore{}, resource.MustParse("0"), nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res2.Manifests, 3) } @@ -311,15 +311,15 @@ func TestGenerateManifests_K8SAPIResetCache(t *testing.T) { cachedFakeResponse := &apiclient.ManifestResponse{Manifests: []string{"Fake"}, Revision: mock.Anything} err := service.cache.SetManifests(mock.Anything, &src, q.RefSources, &q, "", "", "", "", &cache.CachedManifestResponse{ManifestResponse: cachedFakeResponse}, nil) - assert.NoError(t, err) + require.NoError(t, err) res, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, cachedFakeResponse, res) q.KubeVersion = "v1.17.0" res, err = service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEqual(t, cachedFakeResponse, res) assert.Greater(t, len(res.Manifests), 1) } @@ -336,10 +336,10 @@ func TestGenerateManifests_EmptyCache(t *testing.T) { } err := service.cache.SetManifests(mock.Anything, &src, q.RefSources, &q, "", "", "", "", &cache.CachedManifestResponse{ManifestResponse: nil}, nil) - assert.NoError(t, err) + require.NoError(t, err) res, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Positive(t, len(res.Manifests)) mockCache.mockCache.AssertCacheCalledTimes(t, &repositorymocks.CacheCallCounts{ ExternalSets: 2, @@ -396,14 +396,14 @@ func TestGenerateManifest_RefOnlyShortCircuit(t *testing.T) { ProjectSourceRepos: []string{"*"}, } _, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) cacheMocks.mockCache.AssertCacheCalledTimes(t, &repositorymocks.CacheCallCounts{ ExternalSets: 2, ExternalGets: 2, }) assert.True(t, lsremoteCalled, "ls-remote should be called when the source is ref only") var revisions [][2]string - assert.NoError(t, cacheMocks.cacheutilCache.GetItem(fmt.Sprintf("git-refs|%s", repoRemote), &revisions)) + require.NoError(t, cacheMocks.cacheutilCache.GetItem(fmt.Sprintf("git-refs|%s", repoRemote), &revisions)) assert.ElementsMatch(t, [][2]string{{"refs/heads/main", revision}, {"HEAD", "ref: refs/heads/main"}}, revisions) } @@ -467,9 +467,9 @@ func TestGenerateManifestsHelmWithRefs_CachedNoLsRemote(t *testing.T) { RefSources: map[string]*argoappv1.RefTarget{"$ref": {TargetRevision: "HEAD", Repo: *repo}}, } err = cacheMocks.cacheutilCache.SetItem(fmt.Sprintf("git-refs|%s", repoRemote), [][2]string{{"HEAD", revision}}, nil) - assert.NoError(t, err) + require.NoError(t, err) _, err = service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) cacheMocks.mockCache.AssertCacheCalledTimes(t, &repositorymocks.CacheCallCounts{ ExternalSets: 2, ExternalGets: 5, @@ -486,7 +486,7 @@ func TestHelmManifestFromChartRepo(t *testing.T) { ProjectSourceRepos: []string{"*"}, } response, err := service.GenerateManifest(context.Background(), request) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, response) assert.Equal(t, &apiclient.ManifestResponse{ Manifests: []string{"{\"apiVersion\":\"v1\",\"kind\":\"ConfigMap\",\"metadata\":{\"name\":\"my-map\"}}"}, @@ -523,7 +523,7 @@ func TestHelmChartReferencingExternalValues(t *testing.T) { ProjectSourceRepos: []string{"*"}, } response, err := service.GenerateManifest(context.Background(), request) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, response) assert.Equal(t, &apiclient.ManifestResponse{ Manifests: []string{"{\"apiVersion\":\"v1\",\"kind\":\"ConfigMap\",\"metadata\":{\"name\":\"my-map\"}}"}, @@ -561,7 +561,7 @@ func TestHelmChartReferencingExternalValues_InvalidRefs(t *testing.T) { ProjectSourceRepos: []string{"*"}, } response, err := service.GenerateManifest(context.Background(), request) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, response) // Invalid ref @@ -576,7 +576,7 @@ func TestHelmChartReferencingExternalValues_InvalidRefs(t *testing.T) { ProjectSourceRepos: []string{"*"}, } response, err = service.GenerateManifest(context.Background(), request) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, response) // Helm chart as ref (unsupported) @@ -592,7 +592,7 @@ func TestHelmChartReferencingExternalValues_InvalidRefs(t *testing.T) { ProjectSourceRepos: []string{"*"}, } response, err = service.GenerateManifest(context.Background(), request) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, response) } @@ -627,7 +627,7 @@ func TestHelmChartReferencingExternalValues_OutOfBounds_Symlink(t *testing.T) { require.NoError(t, err) request := &apiclient.ManifestRequest{Repo: &argoappv1.Repository{}, ApplicationSource: &spec.Sources[0], NoCache: true, RefSources: refSources, HasMultipleSources: true} _, err = service.GenerateManifest(context.Background(), request) - assert.Error(t, err) + require.Error(t, err) } func TestGenerateManifestsUseExactRevision(t *testing.T) { @@ -641,7 +641,7 @@ func TestGenerateManifestsUseExactRevision(t *testing.T) { } res1, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res1.Manifests, 2) assert.Equal(t, "abc", gitClient.Calls[0].Arguments[0]) } @@ -657,7 +657,7 @@ func TestRecurseManifestsInDir(t *testing.T) { } res1, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res1.Manifests, 2) } @@ -669,7 +669,7 @@ func TestInvalidManifestsInDir(t *testing.T) { q := apiclient.ManifestRequest{Repo: &argoappv1.Repository{}, ApplicationSource: &src} _, err := service.GenerateManifest(context.Background(), &q) - assert.Error(t, err) + require.Error(t, err) } func TestInvalidMetadata(t *testing.T) { @@ -678,7 +678,7 @@ func TestInvalidMetadata(t *testing.T) { src := argoappv1.ApplicationSource{Path: "./testdata/invalid-metadata", Directory: &argoappv1.ApplicationSourceDirectory{Recurse: true}} q := apiclient.ManifestRequest{Repo: &argoappv1.Repository{}, ApplicationSource: &src, AppLabelKey: "test", AppName: "invalid-metadata", TrackingMethod: "annotation+label"} _, err := service.GenerateManifest(context.Background(), &q) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "contains non-string value in the map under key \"invalid\"") } @@ -689,7 +689,7 @@ func TestNilMetadataAccessors(t *testing.T) { src := argoappv1.ApplicationSource{Path: "./testdata/nil-metadata-accessors", Directory: &argoappv1.ApplicationSourceDirectory{Recurse: true}} q := apiclient.ManifestRequest{Repo: &argoappv1.Repository{}, ApplicationSource: &src, AppLabelKey: "test", AppName: "nil-metadata-accessors", TrackingMethod: "annotation+label"} res, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res.Manifests, 1) assert.Equal(t, expected, res.Manifests[0]) } @@ -713,7 +713,7 @@ func TestGenerateJsonnetManifestInDir(t *testing.T) { ProjectSourceRepos: []string{"*"}, } res1, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res1.Manifests, 2) } @@ -736,7 +736,7 @@ func TestGenerateJsonnetManifestInRootDir(t *testing.T) { ProjectSourceRepos: []string{"*"}, } res1, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res1.Manifests, 2) } @@ -769,7 +769,7 @@ func TestManifestGenErrorCacheByNumRequests(t *testing.T) { cachedManifestResponse := &cache.CachedManifestResponse{} err := service.cache.GetManifests(mock.Anything, manifestRequest.ApplicationSource, manifestRequest.RefSources, manifestRequest, manifestRequest.Namespace, "", manifestRequest.AppLabelKey, manifestRequest.AppName, cachedManifestResponse, nil) - assert.NoError(t, err) + require.NoError(t, err) return cachedManifestResponse } @@ -905,17 +905,17 @@ func TestManifestGenErrorCacheFileContentsChange(t *testing.T) { // Ensure that the target directory will succeed or fail, so we can verify the cache correctly handles it err := os.RemoveAll(tmpDir) - assert.NoError(t, err) + require.NoError(t, err) err = os.MkdirAll(tmpDir, 0o777) - assert.NoError(t, err) + require.NoError(t, err) if errorExpected { // Copy invalid helm chart into temporary directory, ensuring manifest generation will fail err = fileutil.CopyDir("./testdata/invalid-helm", tmpDir) - assert.NoError(t, err) + require.NoError(t, err) } else { // Copy valid helm chart into temporary directory, ensuring generation will succeed err = fileutil.CopyDir("./testdata/my-chart", tmpDir) - assert.NoError(t, err) + require.NoError(t, err) } res, err := service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ @@ -934,16 +934,16 @@ func TestManifestGenErrorCacheFileContentsChange(t *testing.T) { if step < 2 { if errorExpected { - assert.Error(t, err, "error return value and error expected did not match") + require.Error(t, err, "error return value and error expected did not match") assert.Nil(t, res, "GenerateManifest return value and expected value did not match") } else { - assert.NoError(t, err, "error return value and error expected did not match") + require.NoError(t, err, "error return value and error expected did not match") assert.NotNil(t, res, "GenerateManifest return value and expected value did not match") } } if step == 2 { - assert.NoError(t, err, "error ret val was non-nil on step 3") + require.NoError(t, err, "error ret val was non-nil on step 3") assert.NotNil(t, res, "GenerateManifest ret val was nil on step 3") } } @@ -1097,18 +1097,18 @@ func TestGenerateHelmWithValues(t *testing.T) { ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) replicasVerified := false for _, src := range res.Manifests { obj := unstructured.Unstructured{} err = json.Unmarshal([]byte(src), &obj) - assert.NoError(t, err) + require.NoError(t, err) if obj.GetKind() == "Deployment" && obj.GetName() == "test-redis-slave" { var dep v1.Deployment err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &dep) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int32(2), *dep.Spec.Replicas) replicasVerified = true } @@ -1135,13 +1135,13 @@ func TestHelmWithMissingValueFiles(t *testing.T) { // Should fail since we're passing a non-existent values file, and error should indicate that _, err := service.GenerateManifest(context.Background(), req) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("%s: no such file or directory", missingValuesFile)) // Should template without error even if defining a non-existent values file req.ApplicationSource.Helm.IgnoreMissingValueFiles = true _, err = service.GenerateManifest(context.Background(), req) - assert.NoError(t, err) + require.NoError(t, err) } func TestGenerateHelmWithEnvVars(t *testing.T) { @@ -1160,18 +1160,18 @@ func TestGenerateHelmWithEnvVars(t *testing.T) { ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) replicasVerified := false for _, src := range res.Manifests { obj := unstructured.Unstructured{} err = json.Unmarshal([]byte(src), &obj) - assert.NoError(t, err) + require.NoError(t, err) if obj.GetKind() == "Deployment" && obj.GetName() == "production-redis-slave" { var dep v1.Deployment err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &dep) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int32(3), *dep.Spec.Replicas) replicasVerified = true } @@ -1196,7 +1196,7 @@ func TestGenerateHelmWithValuesDirectoryTraversal(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) // Test the case where the path is "." service = newService(t, "./testdata") @@ -1209,7 +1209,7 @@ func TestGenerateHelmWithValuesDirectoryTraversal(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) } func TestChartRepoWithOutOfBoundsSymlink(t *testing.T) { @@ -1239,7 +1239,7 @@ func TestHelmManifestFromChartRepoWithValueFile(t *testing.T) { ProjectSourceRepos: []string{"*"}, } response, err := service.GenerateManifest(context.Background(), request) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, response) assert.Equal(t, &apiclient.ManifestResponse{ Manifests: []string{"{\"apiVersion\":\"v1\",\"kind\":\"ConfigMap\",\"metadata\":{\"name\":\"my-map\"}}"}, @@ -1263,7 +1263,7 @@ func TestHelmManifestFromChartRepoWithValueFileOutsideRepo(t *testing.T) { } request := &apiclient.ManifestRequest{Repo: &argoappv1.Repository{}, ApplicationSource: source, NoCache: true} _, err := service.GenerateManifest(context.Background(), request) - assert.Error(t, err) + require.Error(t, err) } func TestHelmManifestFromChartRepoWithValueFileLinks(t *testing.T) { @@ -1281,7 +1281,7 @@ func TestHelmManifestFromChartRepoWithValueFileLinks(t *testing.T) { ProjectSourceRepos: []string{"*"}, } _, err := service.GenerateManifest(context.Background(), request) - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -1302,7 +1302,7 @@ func TestGenerateHelmWithURL(t *testing.T) { ProjectSourceRepos: []string{"*"}, HelmOptions: &argoappv1.HelmOptions{ValuesFileSchemes: []string{"https"}}, }) - assert.NoError(t, err) + require.NoError(t, err) } // The requested value file (`../minio/values.yaml`) is outside the repo directory @@ -1323,7 +1323,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "outside repository root") }) @@ -1342,7 +1342,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Values file with absolute path stays within repo root", func(t *testing.T) { @@ -1360,7 +1360,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Values file with absolute path using back-references outside repo root", func(t *testing.T) { @@ -1378,7 +1378,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "outside repository root") }) @@ -1397,7 +1397,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "is not allowed") }) @@ -1416,7 +1416,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.Error(t, err) + require.Error(t, err) assert.Contains(t, err.Error(), "s3://my-bucket/my-chart-values.yaml: no such file or directory") }) } @@ -1426,13 +1426,13 @@ func TestGenerateHelmWithAbsoluteFileParameter(t *testing.T) { service := newService(t, "../..") file, err := os.CreateTemp("", "external-secret.txt") - assert.NoError(t, err) + require.NoError(t, err) externalSecretPath := file.Name() defer func() { _ = os.RemoveAll(externalSecretPath) }() expectedFileContent, err := os.ReadFile("../../util/helm/testdata/external/external-secret.txt") - assert.NoError(t, err) + require.NoError(t, err) err = os.WriteFile(externalSecretPath, expectedFileContent, 0o644) - assert.NoError(t, err) + require.NoError(t, err) defer func() { if err = file.Close(); err != nil { panic(err) @@ -1456,7 +1456,7 @@ func TestGenerateHelmWithAbsoluteFileParameter(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.Error(t, err) + require.Error(t, err) } // The requested file parameter (`../external/external-secret.txt`) is outside the app path @@ -1484,7 +1484,7 @@ func TestGenerateHelmWithFileParameter(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, res.Manifests[6], `"replicas":2`, "ValuesObject should override Values") } @@ -1499,7 +1499,7 @@ func TestGenerateNullList(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res1.Manifests, 1) assert.Contains(t, res1.Manifests[0], "prometheus-operator-operator") }) @@ -1512,7 +1512,7 @@ func TestGenerateNullList(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res1.Manifests, 1) assert.Contains(t, res1.Manifests[0], "prometheus-operator-operator") }) @@ -1525,22 +1525,22 @@ func TestGenerateNullList(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res1.Manifests, 2) }) } func TestIdentifyAppSourceTypeByAppDirWithKustomizations(t *testing.T) { sourceType, err := GetAppSourceType(context.Background(), &argoappv1.ApplicationSource{}, "./testdata/kustomization_yaml", "./testdata", "testapp", map[string]bool{}, []string{}, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, argoappv1.ApplicationSourceTypeKustomize, sourceType) sourceType, err = GetAppSourceType(context.Background(), &argoappv1.ApplicationSource{}, "./testdata/kustomization_yml", "./testdata", "testapp", map[string]bool{}, []string{}, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, argoappv1.ApplicationSourceTypeKustomize, sourceType) sourceType, err = GetAppSourceType(context.Background(), &argoappv1.ApplicationSource{}, "./testdata/Kustomization", "./testdata", "testapp", map[string]bool{}, []string{}, []string{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, argoappv1.ApplicationSourceTypeKustomize, sourceType) } @@ -1552,7 +1552,7 @@ func TestGenerateFromUTF16(t *testing.T) { ProjectSourceRepos: []string{"*"}, } res1, err := GenerateManifests(context.Background(), "./testdata/utf-16", "/", "", &q, false, &git.NoopCredsStore{}, resource.MustParse("0"), nil) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res1.Manifests, 2) } @@ -1560,7 +1560,7 @@ func TestListApps(t *testing.T) { service := newService(t, "./testdata") res, err := service.ListApps(context.Background(), &apiclient.ListAppsRequest{Repo: &argoappv1.Repository{}}) - assert.NoError(t, err) + require.NoError(t, err) expectedApps := map[string]string{ "Kustomization": "Kustomize", @@ -1594,7 +1594,7 @@ func TestGetAppDetailsHelm(t *testing.T) { }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, res.Helm) assert.Equal(t, "Helm", res.Type) @@ -1611,7 +1611,7 @@ func TestGetAppDetailsHelmUsesCache(t *testing.T) { }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, res.Helm) assert.Equal(t, "Helm", res.Type) @@ -1628,7 +1628,7 @@ func TestGetAppDetailsHelm_WithNoValuesFile(t *testing.T) { }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, res.Helm) assert.Equal(t, "Helm", res.Type) @@ -1646,7 +1646,7 @@ func TestGetAppDetailsKustomize(t *testing.T) { }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "Kustomize", res.Type) assert.NotNil(t, res.Kustomize) @@ -1662,7 +1662,7 @@ func TestGetHelmCharts(t *testing.T) { return res.Items[i].Name < res.Items[j].Name }) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res.Items, 2) item := res.Items[0] @@ -1691,7 +1691,7 @@ func TestGetRevisionMetadata(t *testing.T) { CheckSignature: true, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test", res.Message) assert.Equal(t, now, res.Date.Time) assert.Equal(t, "author", res.Author) @@ -1705,7 +1705,7 @@ func TestGetRevisionMetadata(t *testing.T) { CheckSignature: true, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test", res.Message) assert.Equal(t, now, res.Date.Time) assert.Equal(t, "author", res.Author) @@ -1718,7 +1718,7 @@ func TestGetRevisionMetadata(t *testing.T) { Revision: "c0b400fc458875d925171398f9ba9eabd5529923", CheckSignature: false, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, res.SignatureInfo) // Enforce cache miss - signature info should not be in result @@ -1727,7 +1727,7 @@ func TestGetRevisionMetadata(t *testing.T) { Revision: "da52afd3b2df1ec49470603d8bbb46954dab1091", CheckSignature: false, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, res.SignatureInfo) // Cache hit on previous entry that did not have signature info @@ -1736,7 +1736,7 @@ func TestGetRevisionMetadata(t *testing.T) { Revision: "da52afd3b2df1ec49470603d8bbb46954dab1091", CheckSignature: true, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, res.SignatureInfo) } @@ -1755,7 +1755,7 @@ func TestGetSignatureVerificationResult(t *testing.T) { } res, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, testSignature, res.VerifyResult) } // Commit with signature and verification not requested @@ -1769,7 +1769,7 @@ func TestGetSignatureVerificationResult(t *testing.T) { } res, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, res.VerifyResult) } // Commit without signature and verification requested @@ -1783,7 +1783,7 @@ func TestGetSignatureVerificationResult(t *testing.T) { } res, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, res.VerifyResult) } // Commit without signature and verification not requested @@ -1797,7 +1797,7 @@ func TestGetSignatureVerificationResult(t *testing.T) { } res, err := service.GenerateManifest(context.Background(), &q) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, res.VerifyResult) } } @@ -1915,7 +1915,7 @@ func TestGetAppDetailsWithAppParameterFile(t *testing.T) { }, AppName: "broken", }) - assert.Error(t, err) + require.Error(t, err) }) }) } @@ -1962,9 +1962,7 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { for _, manifest := range manifests.Manifests { var un unstructured.Unstructured err := yaml.Unmarshal([]byte(manifest), &un) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) resourceByKindName[fmt.Sprintf("%s/%s", un.GetKind(), un.GetName())] = &un } deployment, ok := resourceByKindName["Deployment/guestbook-ui"] @@ -1993,9 +1991,7 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { for _, manifest := range manifests.Manifests { var un unstructured.Unstructured err := yaml.Unmarshal([]byte(manifest), &un) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) resourceByKindName[fmt.Sprintf("%s/%s", un.GetKind(), un.GetName())] = &un } deployment, ok := resourceByKindName["Deployment/guestbook-ui"] @@ -2025,9 +2021,7 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { for _, manifest := range manifests.Manifests { var un unstructured.Unstructured err := yaml.Unmarshal([]byte(manifest), &un) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) resourceByKindName[fmt.Sprintf("%s/%s", un.GetKind(), un.GetName())] = &un } deployment, ok := resourceByKindName["Deployment/guestbook-ui"] @@ -2055,7 +2049,7 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { ProjectSourceRepos: []string{"*"}, HasMultipleSources: true, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, manifests.Manifests) assert.NotEmpty(t, manifests.Revision) }) @@ -2078,9 +2072,7 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { for _, manifest := range manifests.Manifests { var un unstructured.Unstructured err := yaml.Unmarshal([]byte(manifest), &un) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) resourceByKindName[fmt.Sprintf("%s/%s", un.GetKind(), un.GetName())] = &un } deployment, ok := resourceByKindName["Deployment/guestbook-ui"] @@ -2107,13 +2099,13 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) - assert.NoError(t, err) + require.NoError(t, err) res := &cache.CachedManifestResponse{} // Try to pull from the cache with a `source` that does not include any overrides. Overrides should not be // part of the cache key, because you can't get the overrides without a repo operation. And avoiding repo // operations is the point of the cache. err = service.cache.GetManifests(mock.Anything, source, argoappv1.RefTargetRevisionMapping{}, &argoappv1.ClusterInfo{}, "", "", "", "test", res, nil) - assert.NoError(t, err) + require.NoError(t, err) }) }) } @@ -2274,9 +2266,7 @@ func TestFindResources(t *testing.T) { Include: tc.include, Exclude: tc.exclude, }, map[string]bool{}, resource.MustParse("0")) - if !assert.NoError(t, err) { - return - } + require.NoError(t, err) var names []string for i := range objs { names = append(names, objs[i].GetName()) @@ -2292,9 +2282,8 @@ func TestFindManifests_Exclude(t *testing.T) { Exclude: "subdir/deploymentSub.yaml", }, map[string]bool{}, resource.MustParse("0")) - if !assert.NoError(t, err) || !assert.Len(t, objs, 1) { - return - } + require.NoError(t, err) + require.Len(t, objs, 1) assert.Equal(t, "nginx-deployment", objs[0].GetName()) } @@ -2305,9 +2294,8 @@ func TestFindManifests_Exclude_NothingMatches(t *testing.T) { Exclude: "nothing.yaml", }, map[string]bool{}, resource.MustParse("0")) - if !assert.NoError(t, err) || !assert.Len(t, objs, 2) { - return - } + require.NoError(t, err) + require.Len(t, objs, 2) assert.ElementsMatch(t, []string{"nginx-deployment", "nginx-deployment-sub"}, []string{objs[0].GetName(), objs[1].GetName()}) @@ -2360,7 +2348,7 @@ func Test_getPotentiallyValidManifestFile(t *testing.T) { realFileInfo, ignoreMessage, err := getPotentiallyValidManifestFile(filePath, info, appDir, appDir, "", "") assert.Nil(t, realFileInfo) assert.Empty(t, ignoreMessage) - assert.NoError(t, err) + require.NoError(t, err) }) }) @@ -2394,7 +2382,7 @@ func Test_getPotentiallyValidManifestFile(t *testing.T) { realFileInfo, ignoreMessage, err := getPotentiallyValidManifestFile(aPath, info, appDir, appDir, "", "") assert.Nil(t, realFileInfo) assert.NotEmpty(t, ignoreMessage) - assert.NoError(t, err) + require.NoError(t, err) }) }) @@ -2427,7 +2415,7 @@ func Test_getPotentiallyValidManifestFile(t *testing.T) { realFileInfo, ignoreMessage, err := getPotentiallyValidManifestFile(linkPath, info, appDir, appDir, "", "") assert.Nil(t, realFileInfo) assert.Contains(t, ignoreMessage, "non-regular file") - assert.NoError(t, err) + require.NoError(t, err) }) }) @@ -2444,7 +2432,7 @@ func Test_getPotentiallyValidManifestFile(t *testing.T) { realFileInfo, ignoreMessage, err := getPotentiallyValidManifestFile(filePath, info, appDir, appDir, "*.json", "") assert.Nil(t, realFileInfo) assert.Empty(t, ignoreMessage) - assert.NoError(t, err) + require.NoError(t, err) }) }) @@ -2461,7 +2449,7 @@ func Test_getPotentiallyValidManifestFile(t *testing.T) { realFileInfo, ignoreMessage, err := getPotentiallyValidManifestFile(filePath, info, appDir, appDir, "", "excluded.*") assert.Nil(t, realFileInfo) assert.Empty(t, ignoreMessage) - assert.NoError(t, err) + require.NoError(t, err) }) }) @@ -2482,7 +2470,7 @@ func Test_getPotentiallyValidManifestFile(t *testing.T) { realFileInfo, ignoreMessage, err := getPotentiallyValidManifestFile(linkPath, info, appDir, appDir, "", "") assert.NotNil(t, realFileInfo) assert.Empty(t, ignoreMessage) - assert.NoError(t, err) + require.NoError(t, err) }) }) @@ -2499,7 +2487,7 @@ func Test_getPotentiallyValidManifestFile(t *testing.T) { realFileInfo, ignoreMessage, err := getPotentiallyValidManifestFile(filePath, info, appDir, appDir, "", "") assert.NotNil(t, realFileInfo) assert.Empty(t, ignoreMessage) - assert.NoError(t, err) + require.NoError(t, err) }) }) @@ -2521,7 +2509,7 @@ func Test_getPotentiallyValidManifestFile(t *testing.T) { assert.NotNil(t, realFileInfo) assert.Equal(t, filepath.Base(filePath), realFileInfo.Name()) assert.Empty(t, ignoreMessage) - assert.NoError(t, err) + require.NoError(t, err) }) }) } @@ -2542,7 +2530,7 @@ func Test_getPotentiallyValidManifests(t *testing.T) { manifests, err := getPotentiallyValidManifests(logCtx, appDir, appDir, false, "", "", resource.MustParse("0")) assert.Empty(t, manifests) - assert.Error(t, err) + require.Error(t, err) // allow cleanup err = os.Chmod(appDir, 0o777) @@ -2554,19 +2542,19 @@ func Test_getPotentiallyValidManifests(t *testing.T) { t.Run("no recursion when recursion is disabled", func(t *testing.T) { manifests, err := getPotentiallyValidManifests(logCtx, "./testdata/recurse", "./testdata/recurse", false, "", "", resource.MustParse("0")) assert.Len(t, manifests, 1) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("recursion when recursion is enabled", func(t *testing.T) { manifests, err := getPotentiallyValidManifests(logCtx, "./testdata/recurse", "./testdata/recurse", true, "", "", resource.MustParse("0")) assert.Len(t, manifests, 2) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("non-JSON/YAML is skipped", func(t *testing.T) { manifests, err := getPotentiallyValidManifests(logCtx, "./testdata/non-manifest-file", "./testdata/non-manifest-file", false, "", "", resource.MustParse("0")) assert.Empty(t, manifests) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("circular link should throw an error", func(t *testing.T) { @@ -2578,14 +2566,14 @@ func Test_getPotentiallyValidManifests(t *testing.T) { defer os.Remove(path.Join(testDir, "b.json")) manifests, err := getPotentiallyValidManifests(logCtx, "./testdata/circular-link", "./testdata/circular-link", false, "", "", resource.MustParse("0")) assert.Empty(t, manifests) - assert.Error(t, err) + require.Error(t, err) }) t.Run("out-of-bounds symlink should throw an error", func(t *testing.T) { require.DirExists(t, "./testdata/out-of-bounds-link") manifests, err := getPotentiallyValidManifests(logCtx, "./testdata/out-of-bounds-link", "./testdata/out-of-bounds-link", false, "", "", resource.MustParse("0")) assert.Empty(t, manifests) - assert.Error(t, err) + require.Error(t, err) }) t.Run("symlink to a regular file works", func(t *testing.T) { @@ -2595,13 +2583,13 @@ func Test_getPotentiallyValidManifests(t *testing.T) { require.NoError(t, err) manifests, err := getPotentiallyValidManifests(logCtx, appPath, repoRoot, false, "", "", resource.MustParse("0")) assert.Len(t, manifests, 1) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("symlink to nowhere should be ignored", func(t *testing.T) { manifests, err := getPotentiallyValidManifests(logCtx, "./testdata/link-to-nowhere", "./testdata/link-to-nowhere", false, "", "", resource.MustParse("0")) assert.Empty(t, manifests) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("link to over-sized manifest fails", func(t *testing.T) { @@ -2619,7 +2607,7 @@ func Test_getPotentiallyValidManifests(t *testing.T) { // There is a total of 10 files, ech file being 10 bytes. manifests, err := getPotentiallyValidManifests(logCtx, "./testdata/several-files", "./testdata/several-files", false, "", "", resource.MustParse("365")) assert.Len(t, manifests, 10) - assert.NoError(t, err) + require.NoError(t, err) manifests, err = getPotentiallyValidManifests(logCtx, "./testdata/several-files", "./testdata/several-files", false, "", "", resource.MustParse("100")) assert.Empty(t, manifests) @@ -2641,7 +2629,7 @@ func Test_findManifests(t *testing.T) { manifests, err := findManifests(logCtx, appDir, appDir, nil, noRecurse, nil, resource.MustParse("0")) assert.Empty(t, manifests) - assert.Error(t, err) + require.Error(t, err) // allow cleanup err = os.Chmod(appDir, 0o777) @@ -2653,20 +2641,20 @@ func Test_findManifests(t *testing.T) { t.Run("no recursion when recursion is disabled", func(t *testing.T) { manifests, err := findManifests(logCtx, "./testdata/recurse", "./testdata/recurse", nil, noRecurse, nil, resource.MustParse("0")) assert.Len(t, manifests, 2) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("recursion when recursion is enabled", func(t *testing.T) { recurse := argoappv1.ApplicationSourceDirectory{Recurse: true} manifests, err := findManifests(logCtx, "./testdata/recurse", "./testdata/recurse", nil, recurse, nil, resource.MustParse("0")) assert.Len(t, manifests, 4) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("non-JSON/YAML is skipped", func(t *testing.T) { manifests, err := findManifests(logCtx, "./testdata/non-manifest-file", "./testdata/non-manifest-file", nil, noRecurse, nil, resource.MustParse("0")) assert.Empty(t, manifests) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("circular link should throw an error", func(t *testing.T) { @@ -2678,14 +2666,14 @@ func Test_findManifests(t *testing.T) { defer os.Remove(path.Join(testDir, "b.json")) manifests, err := findManifests(logCtx, "./testdata/circular-link", "./testdata/circular-link", nil, noRecurse, nil, resource.MustParse("0")) assert.Empty(t, manifests) - assert.Error(t, err) + require.Error(t, err) }) t.Run("out-of-bounds symlink should throw an error", func(t *testing.T) { require.DirExists(t, "./testdata/out-of-bounds-link") manifests, err := findManifests(logCtx, "./testdata/out-of-bounds-link", "./testdata/out-of-bounds-link", nil, noRecurse, nil, resource.MustParse("0")) assert.Empty(t, manifests) - assert.Error(t, err) + require.Error(t, err) }) t.Run("symlink to a regular file works", func(t *testing.T) { @@ -2695,13 +2683,13 @@ func Test_findManifests(t *testing.T) { require.NoError(t, err) manifests, err := findManifests(logCtx, appPath, repoRoot, nil, noRecurse, nil, resource.MustParse("0")) assert.Len(t, manifests, 1) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("symlink to nowhere should be ignored", func(t *testing.T) { manifests, err := findManifests(logCtx, "./testdata/link-to-nowhere", "./testdata/link-to-nowhere", nil, noRecurse, nil, resource.MustParse("0")) assert.Empty(t, manifests) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("link to over-sized manifest fails", func(t *testing.T) { @@ -2719,7 +2707,7 @@ func Test_findManifests(t *testing.T) { // There is a total of 10 files, each file being 10 bytes. manifests, err := findManifests(logCtx, "./testdata/several-files", "./testdata/several-files", nil, noRecurse, nil, resource.MustParse("365")) assert.Len(t, manifests, 10) - assert.NoError(t, err) + require.NoError(t, err) manifests, err = findManifests(logCtx, "./testdata/several-files", "./testdata/several-files", nil, noRecurse, nil, resource.MustParse("364")) assert.Empty(t, manifests) @@ -2730,7 +2718,7 @@ func Test_findManifests(t *testing.T) { // Each file is 36 bytes. Only the 36-byte json file should be counted against the limit. manifests, err := findManifests(logCtx, "./testdata/jsonnet-and-json", "./testdata/jsonnet-and-json", nil, noRecurse, nil, resource.MustParse("36")) assert.Len(t, manifests, 2) - assert.NoError(t, err) + require.NoError(t, err) manifests, err = findManifests(logCtx, "./testdata/jsonnet-and-json", "./testdata/jsonnet-and-json", nil, noRecurse, nil, resource.MustParse("35")) assert.Empty(t, manifests) @@ -2741,46 +2729,46 @@ func Test_findManifests(t *testing.T) { require.DirExists(t, "./testdata/partially-valid-yaml") manifests, err := findManifests(logCtx, "./testdata/partially-valid-yaml", "./testdata/partially-valid-yaml", nil, noRecurse, nil, resource.MustParse("0")) assert.Empty(t, manifests) - assert.Error(t, err) + require.Error(t, err) }) t.Run("invalid manifest throws an error", func(t *testing.T) { require.DirExists(t, "./testdata/invalid-manifests") manifests, err := findManifests(logCtx, "./testdata/invalid-manifests", "./testdata/invalid-manifests", nil, noRecurse, nil, resource.MustParse("0")) assert.Empty(t, manifests) - assert.Error(t, err) + require.Error(t, err) }) t.Run("irrelevant YAML gets skipped, relevant YAML gets parsed", func(t *testing.T) { manifests, err := findManifests(logCtx, "./testdata/irrelevant-yaml", "./testdata/irrelevant-yaml", nil, noRecurse, nil, resource.MustParse("0")) assert.Len(t, manifests, 1) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("multiple JSON objects in one file throws an error", func(t *testing.T) { require.DirExists(t, "./testdata/json-list") manifests, err := findManifests(logCtx, "./testdata/json-list", "./testdata/json-list", nil, noRecurse, nil, resource.MustParse("0")) assert.Empty(t, manifests) - assert.Error(t, err) + require.Error(t, err) }) t.Run("invalid JSON throws an error", func(t *testing.T) { require.DirExists(t, "./testdata/invalid-json") manifests, err := findManifests(logCtx, "./testdata/invalid-json", "./testdata/invalid-json", nil, noRecurse, nil, resource.MustParse("0")) assert.Empty(t, manifests) - assert.Error(t, err) + require.Error(t, err) }) t.Run("valid JSON returns manifest and no error", func(t *testing.T) { manifests, err := findManifests(logCtx, "./testdata/valid-json", "./testdata/valid-json", nil, noRecurse, nil, resource.MustParse("0")) assert.Len(t, manifests, 1) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("YAML with an empty document doesn't throw an error", func(t *testing.T) { manifests, err := findManifests(logCtx, "./testdata/yaml-with-empty-document", "./testdata/yaml-with-empty-document", nil, noRecurse, nil, resource.MustParse("0")) assert.Len(t, manifests, 1) - assert.NoError(t, err) + require.NoError(t, err) }) } @@ -2802,7 +2790,7 @@ func Test_getHelmDependencyRepos(t *testing.T) { repo2 := "https://eventstore.github.io/EventStore.Charts" repos, err := getHelmDependencyRepos("../../util/helm/testdata/dependency") - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, repos, 2) assert.Equal(t, repos[0].Repo, repo1) assert.Equal(t, repos[1].Repo, repo2) @@ -2824,7 +2812,7 @@ func TestResolveRevision(t *testing.T) { } assert.NotNil(t, resolveRevisionResponse.Revision) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResolveRevisionResponse, resolveRevisionResponse) } @@ -2844,7 +2832,7 @@ func TestResolveRevisionNegativeScenarios(t *testing.T) { } assert.NotNil(t, resolveRevisionResponse.Revision) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, expectedResolveRevisionResponse, resolveRevisionResponse) } @@ -2856,7 +2844,7 @@ func TestDirectoryPermissionInitializer(t *testing.T) { io.Close(file) // remove read permissions - assert.NoError(t, os.Chmod(dir, 0o000)) + require.NoError(t, os.Chmod(dir, 0o000)) // Remember to restore permissions when the test finishes so dir can // be removed properly. @@ -2877,42 +2865,42 @@ func TestDirectoryPermissionInitializer(t *testing.T) { func addHelmToGitRepo(t *testing.T, options newGitRepoOptions) { err := os.WriteFile(filepath.Join(options.path, "Chart.yaml"), []byte("name: test\nversion: v1.0.0"), 0o777) - assert.NoError(t, err) + require.NoError(t, err) for valuesFileName, values := range options.helmChartOptions.valuesFiles { valuesFileContents, err := yaml.Marshal(values) - assert.NoError(t, err) + require.NoError(t, err) err = os.WriteFile(filepath.Join(options.path, valuesFileName), valuesFileContents, 0o777) - assert.NoError(t, err) + require.NoError(t, err) } - assert.NoError(t, err) + require.NoError(t, err) cmd := exec.Command("git", "add", "-A") cmd.Dir = options.path - assert.NoError(t, cmd.Run()) + require.NoError(t, cmd.Run()) cmd = exec.Command("git", "commit", "-m", "Initial commit") cmd.Dir = options.path - assert.NoError(t, cmd.Run()) + require.NoError(t, cmd.Run()) } func initGitRepo(t *testing.T, options newGitRepoOptions) (revision string) { if options.createPath { - assert.NoError(t, os.Mkdir(options.path, 0o755)) + require.NoError(t, os.Mkdir(options.path, 0o755)) } cmd := exec.Command("git", "init", "-b", "main", options.path) cmd.Dir = options.path - assert.NoError(t, cmd.Run()) + require.NoError(t, cmd.Run()) if options.remote != "" { cmd = exec.Command("git", "remote", "add", "origin", options.path) cmd.Dir = options.path - assert.NoError(t, cmd.Run()) + require.NoError(t, cmd.Run()) } commitAdded := options.addEmptyCommit || options.helmChartOptions.chartName != "" if options.addEmptyCommit { cmd = exec.Command("git", "commit", "-m", "Initial commit", "--allow-empty") cmd.Dir = options.path - assert.NoError(t, cmd.Run()) + require.NoError(t, cmd.Run()) } else if options.helmChartOptions.chartName != "" { addHelmToGitRepo(t, options) } @@ -2922,7 +2910,7 @@ func initGitRepo(t *testing.T, options newGitRepoOptions) (revision string) { cmd = exec.Command("git", "rev-parse", "HEAD", options.path) cmd.Dir = options.path cmd.Stdout = &revB - assert.NoError(t, cmd.Run()) + require.NoError(t, cmd.Run()) revision = strings.Split(revB.String(), "\n")[0] } return revision @@ -2980,10 +2968,10 @@ func TestCheckoutRevisionCanGetNonstandardRefs(t *testing.T) { require.NoError(t, err) err = checkoutRevision(gitClient, "does-not-exist", false) - assert.Error(t, err) + require.Error(t, err) err = checkoutRevision(gitClient, pullSha, false) - assert.NoError(t, err) + require.NoError(t, err) } func TestCheckoutRevisionPresentSkipFetch(t *testing.T) { @@ -2995,7 +2983,7 @@ func TestCheckoutRevisionPresentSkipFetch(t *testing.T) { gitClient.On("Checkout", revision, mock.Anything).Return(nil) err := checkoutRevision(gitClient, revision, false) - assert.NoError(t, err) + require.NoError(t, err) } func TestCheckoutRevisionNotPresentCallFetch(t *testing.T) { @@ -3008,7 +2996,7 @@ func TestCheckoutRevisionNotPresentCallFetch(t *testing.T) { gitClient.On("Checkout", revision, mock.Anything).Return(nil) err := checkoutRevision(gitClient, revision, false) - assert.NoError(t, err) + require.NoError(t, err) } // runGit runs a git command in the given working directory. If the command succeeds, it returns the combined standard @@ -3027,14 +3015,14 @@ func Test_walkHelmValueFilesInPath(t *testing.T) { var files []string root := "/obviously/does/not/exist" err := filepath.Walk(root, walkHelmValueFilesInPath(root, &files)) - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, files) }) t.Run("values files", func(t *testing.T) { var files []string root := "./testdata/values-files" err := filepath.Walk(root, walkHelmValueFilesInPath(root, &files)) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, files, 5) }) t.Run("unrelated root", func(t *testing.T) { @@ -3042,7 +3030,7 @@ func Test_walkHelmValueFilesInPath(t *testing.T) { root := "./testdata/values-files" unrelated_root := "/different/root/path" err := filepath.Walk(root, walkHelmValueFilesInPath(unrelated_root, &files)) - assert.Error(t, err) + require.Error(t, err) }) } @@ -3091,7 +3079,7 @@ func TestGetHelmRepos_OCIDependenciesWithHelmRepo(t *testing.T) { }} helmRepos, err := getHelmRepos("./testdata/oci-dependencies", q.Repos, q.HelmRepoCreds) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, helmRepos, 1) assert.Equal(t, "test", helmRepos[0].Username) @@ -3104,7 +3092,7 @@ func TestGetHelmRepos_OCIDependenciesWithRepo(t *testing.T) { q := apiclient.ManifestRequest{Repos: []*argoappv1.Repository{{Repo: "example.com", Username: "test", Password: "test", EnableOCI: true}}, ApplicationSource: &src, HelmRepoCreds: []*argoappv1.RepoCreds{}} helmRepos, err := getHelmRepos("./testdata/oci-dependencies", q.Repos, q.HelmRepoCreds) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, helmRepos, 1) assert.Equal(t, "test", helmRepos[0].Username) @@ -3121,7 +3109,7 @@ func TestGetHelmRepo_NamedRepos(t *testing.T) { }}} helmRepos, err := getHelmRepos("./testdata/helm-with-dependencies", q.Repos, q.HelmRepoCreds) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, helmRepos, 1) assert.Equal(t, "test", helmRepos[0].Username) @@ -3137,7 +3125,7 @@ func TestGetHelmRepo_NamedReposAlias(t *testing.T) { }}} helmRepos, err := getHelmRepos("./testdata/helm-with-dependencies-alias", q.Repos, q.HelmRepoCreds) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, helmRepos, 1) assert.Equal(t, "test-alias", helmRepos[0].Username) @@ -3291,11 +3279,11 @@ func Test_getResolvedValueFiles(t *testing.T) { t.Parallel() resolvedPaths, err := getResolvedValueFiles(path.Join(tempDir, "main-repo"), path.Join(tempDir, "main-repo"), tcc.env, []string{}, []string{tcc.rawPath}, tcc.refSources, paths, false) if !tcc.expectedErr { - assert.NoError(t, err) + require.NoError(t, err) require.Len(t, resolvedPaths, 1) assert.Equal(t, tcc.expectedPath, string(resolvedPaths[0])) } else { - assert.Error(t, err) + require.Error(t, err) assert.Empty(t, resolvedPaths) } }) @@ -3396,13 +3384,13 @@ func TestGetGitDirectories(t *testing.T) { Revision: "HEAD", } directories, err := s.GetGitDirectories(context.TODO(), dirRequest) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, directories.GetPaths(), []string{"app", "app/bar", "app/foo/bar", "somedir", "app/foo"}) // do the same request again to use the cache // we only allow CheckOut to be called once in the mock directories, err = s.GetGitDirectories(context.TODO(), dirRequest) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, []string{"app", "app/bar", "app/foo/bar", "somedir", "app/foo"}, directories.GetPaths()) cacheMocks.mockCache.AssertCacheCalledTimes(t, &repositorymocks.CacheCallCounts{ ExternalSets: 1, @@ -3430,13 +3418,13 @@ func TestGetGitDirectoriesWithHiddenDirSupported(t *testing.T) { Revision: "HEAD", } directories, err := s.GetGitDirectories(context.TODO(), dirRequest) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, directories.GetPaths(), []string{"app", "app/bar", "app/foo/bar", "somedir", "app/foo", "app/bar/.hidden"}) // do the same request again to use the cache // we only allow CheckOut to be called once in the mock directories, err = s.GetGitDirectories(context.TODO(), dirRequest) - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, []string{"app", "app/bar", "app/foo/bar", "somedir", "app/foo", "app/bar/.hidden"}, directories.GetPaths()) cacheMocks.mockCache.AssertCacheCalledTimes(t, &repositorymocks.CacheCallCounts{ ExternalSets: 1, @@ -3528,18 +3516,18 @@ func TestGetGitFiles(t *testing.T) { expected := make(map[string][]byte) for _, filePath := range files { fileContents, err := os.ReadFile(filePath) - assert.NoError(t, err) + require.NoError(t, err) expected[filePath] = fileContents } fileResponse, err := s.GetGitFiles(context.TODO(), filesRequest) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expected, fileResponse.GetMap()) // do the same request again to use the cache // we only allow LsFiles to be called once in the mock fileResponse, err = s.GetGitFiles(context.TODO(), filesRequest) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expected, fileResponse.GetMap()) cacheMocks.mockCache.AssertCacheCalledTimes(t, &repositorymocks.CacheCallCounts{ ExternalSets: 1, @@ -3839,7 +3827,7 @@ func TestGetRefs_CacheWithLockDisabled(t *testing.T) { client, err := git.NewClient(fmt.Sprintf("file://%s", dir), git.NopCreds{}, true, false, "", git.WithCache(cacheMocks.cache, true)) require.NoError(t, err) refs, err := client.LsRefs() - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, refs) assert.NotEmpty(t, refs.Branches, "Expected branches to be populated") assert.NotEmpty(t, refs.Branches[0]) @@ -3866,7 +3854,7 @@ func TestGetRefs_CacheDisabled(t *testing.T) { client, err := git.NewClient(fmt.Sprintf("file://%s", dir), git.NopCreds{}, true, false, "", git.WithCache(cacheMocks.cache, false)) require.NoError(t, err) refs, err := client.LsRefs() - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, refs) assert.NotEmpty(t, refs.Branches, "Expected branches to be populated") assert.NotEmpty(t, refs.Branches[0]) @@ -3895,7 +3883,7 @@ func TestGetRefs_CacheWithLock(t *testing.T) { client, err := git.NewClient(fmt.Sprintf("file://%s", dir), git.NopCreds{}, true, false, "", git.WithCache(cacheMocks.cache, true)) require.NoError(t, err) refs, err := client.LsRefs() - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, refs) assert.NotEmpty(t, refs.Branches, "Expected branches to be populated") assert.NotEmpty(t, refs.Branches[0]) @@ -3924,13 +3912,13 @@ func TestGetRefs_CacheUnlockedOnUpdateFailed(t *testing.T) { client, err := git.NewClient(repoUrl, git.NopCreds{}, true, false, "", git.WithCache(cacheMocks.cache, true)) require.NoError(t, err) refs, err := client.LsRefs() - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, refs) assert.NotEmpty(t, refs.Branches, "Expected branches to be populated") assert.NotEmpty(t, refs.Branches[0]) var output [][2]string err = cacheMocks.cacheutilCache.GetItem(fmt.Sprintf("git-refs|%s|%s", repoUrl, common.CacheVersion), &output) - assert.Error(t, err, "Should be a cache miss") + require.Error(t, err, "Should be a cache miss") assert.Empty(t, output, "Expected cache to be empty for key") cacheMocks.mockCache.AssertNumberOfCalls(t, "UnlockGitReferences", 0) cacheMocks.mockCache.AssertNumberOfCalls(t, "GetOrLockGitReferences", 0) @@ -3955,7 +3943,7 @@ func TestGetRefs_CacheLockTryLockGitRefCacheError(t *testing.T) { client, err := git.NewClient(repoUrl, git.NopCreds{}, true, false, "", git.WithCache(cacheMocks.cache, true)) require.NoError(t, err) refs, err := client.LsRefs() - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, refs) } @@ -3984,7 +3972,7 @@ func TestGetRevisionChartDetails(t *testing.T) { Home: "test-home", Maintainers: []string{"test-maintainer"}, }) - assert.NoError(t, err) + require.NoError(t, err) chartDetails, err := service.GetRevisionChartDetails(context.Background(), &apiclient.RepoServerRevisionChartDetailsRequest{ Repo: &v1alpha1.Repository{ Repo: fmt.Sprintf("file://%s", root), @@ -3994,7 +3982,7 @@ func TestGetRevisionChartDetails(t *testing.T) { Name: "my-chart", Revision: "1.1.0", }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "test-description", chartDetails.Description) assert.Equal(t, "test-home", chartDetails.Home) assert.Equal(t, []string{"test-maintainer"}, chartDetails.Maintainers) @@ -4013,7 +4001,7 @@ func TestVerifyCommitSignature(t *testing.T) { Return(testSignature, nil) err := verifyCommitSignature(true, mockGitClient, "abcd1234", repo) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("VerifyCommitSignature with invalid signature", func(t *testing.T) { @@ -4023,7 +4011,7 @@ func TestVerifyCommitSignature(t *testing.T) { Return("", nil) err := verifyCommitSignature(true, mockGitClient, "abcd1234", repo) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "revision abcd1234 is not signed", err.Error()) }) @@ -4034,7 +4022,7 @@ func TestVerifyCommitSignature(t *testing.T) { Return("", fmt.Errorf("UNKNOWN signature: gpg: Unknown signature from ABCDEFGH")) err := verifyCommitSignature(true, mockGitClient, "abcd1234", repo) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "UNKNOWN signature: gpg: Unknown signature from ABCDEFGH", err.Error()) }) @@ -4045,7 +4033,7 @@ func TestVerifyCommitSignature(t *testing.T) { Return("", fmt.Errorf("error verifying signature of commit 'abcd1234' in repo 'https://github.com/example/repo.git': failed to verify signature")) err := verifyCommitSignature(true, mockGitClient, "abcd1234", repo) - assert.Error(t, err) + require.Error(t, err) assert.Equal(t, "error verifying signature of commit 'abcd1234' in repo 'https://github.com/example/repo.git': failed to verify signature", err.Error()) }) @@ -4053,6 +4041,6 @@ func TestVerifyCommitSignature(t *testing.T) { t.Setenv("ARGOCD_GPG_ENABLED", "false") mockGitClient := &gitmocks.Client{} err := verifyCommitSignature(false, mockGitClient, "abcd1234", repo) - assert.NoError(t, err) + require.NoError(t, err) }) } diff --git a/test/e2e/app_k8s_events_test.go b/test/e2e/app_k8s_events_test.go index e306e2ddf0d5a..7438adfe7001c 100644 --- a/test/e2e/app_k8s_events_test.go +++ b/test/e2e/app_k8s_events_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" @@ -31,7 +32,7 @@ func TestLabelsOnAppK8sEvents(t *testing.T) { events, err := KubeClientset.CoreV1().Events(app.Namespace).List(context.Background(), metav1.ListOptions{ FieldSelector: fmt.Sprintf("involvedObject.name=%s,involvedObject.kind=Application", app.Name), }) - assert.NoError(t, err) + require.NoError(t, err) for _, event := range events.Items { for k, v := range event.Labels { ev, found := expectedLabels[k] @@ -56,7 +57,7 @@ func TestNoLabelsOnAppK8sEvents(t *testing.T) { events, err := KubeClientset.CoreV1().Events(app.Namespace).List(context.Background(), metav1.ListOptions{ FieldSelector: fmt.Sprintf("involvedObject.name=%s,involvedObject.kind=Application", app.Name), }) - assert.NoError(t, err) + require.NoError(t, err) for _, event := range events.Items { assert.Nil(t, event.Labels) } From 9f0d2a8fb49f6fde148429bf7a17107c9dd4bf75 Mon Sep 17 00:00:00 2001 From: yyzxw <34639446+yyzxw@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:52:08 +0800 Subject: [PATCH 53/74] fix: docs site version selector broken (#18378) Signed-off-by: xiaowu.zhu Signed-off-by: root --- docs/assets/versions.js | 95 ++++++++++++++++++++++++++--------------- 1 file changed, 61 insertions(+), 34 deletions(-) diff --git a/docs/assets/versions.js b/docs/assets/versions.js index 7a2392a392dc8..ff72b7e718564 100644 --- a/docs/assets/versions.js +++ b/docs/assets/versions.js @@ -1,48 +1,75 @@ -setTimeout(function() { - const callbackName = 'callback_' + new Date().getTime(); - window[callbackName] = function (response) { - const div = document.createElement('div'); - div.innerHTML = response.html; - document.querySelector(".md-header__inner > .md-header__title").appendChild(div); - const container = div.querySelector('.rst-versions'); - var caret = document.createElement('div'); - caret.innerHTML = "" - caret.classList.add('dropdown-caret') - div.querySelector('.rst-current-version').appendChild(caret); +const targetNode = document.querySelector('.md-header__inner'); +const observerOptions = { + childList: true, + subtree: true +}; + +const observerCallback = function(mutationsList, observer) { + for (let mutation of mutationsList) { + if (mutation.type === 'childList') { + const titleElement = document.querySelector('.md-header__inner > .md-header__title'); + if (titleElement) { + initializeVersionDropdown(); + observer.disconnect(); + } + } } +}; + +const observer = new MutationObserver(observerCallback); +observer.observe(targetNode, observerOptions); + +function initializeVersionDropdown() { + const callbackName = 'callback_' + new Date().getTime(); + window[callbackName] = function(response) { + const div = document.createElement('div'); + div.innerHTML = response.html; + document.querySelector(".md-header__inner > .md-header__title").appendChild(div); + const container = div.querySelector('.rst-versions'); + var caret = document.createElement('div'); + caret.innerHTML = ""; + caret.classList.add('dropdown-caret'); + div.querySelector('.rst-current-version').appendChild(caret); + + div.querySelector('.rst-current-version').addEventListener('click', function() { + container.classList.toggle('shift-up'); + }); + }; var CSSLink = document.createElement('link'); - CSSLink.rel='stylesheet'; + CSSLink.rel = 'stylesheet'; CSSLink.href = '/assets/versions.css'; document.getElementsByTagName('head')[0].appendChild(CSSLink); var script = document.createElement('script'); - script.src = 'https://argo-cd.readthedocs.io/_/api/v2/footer_html/?'+ + script.src = 'https://argo-cd.readthedocs.io/_/api/v2/footer_html/?' + 'callback=' + callbackName + '&project=argo-cd&page=&theme=mkdocs&format=jsonp&docroot=docs&source_suffix=.md&version=' + (window['READTHEDOCS_DATA'] || { version: 'latest' }).version; document.getElementsByTagName('head')[0].appendChild(script); -}, 0); +} // VERSION WARNINGS window.addEventListener("DOMContentLoaded", function() { - var rtdData = window['READTHEDOCS_DATA'] || { version: 'latest' }; + var currentVersion = window.location.href.match(/\/en\/(release-(?:v\d+|\w+)|latest|stable)\//); var margin = 30; - var headerHeight = document.getElementsByClassName("md-header")[0].offsetHeight; - if (rtdData.version === "latest") { - document.querySelector("div[data-md-component=announce]").innerHTML = "
    You are viewing the docs for an unreleased version of Argo CD, click here to go to the latest stable version.
    " - var bannerHeight = document.getElementById('announce-msg').offsetHeight + margin - document.querySelector("header.md-header").style.top = bannerHeight +"px"; - document.querySelector('style').textContent += - "@media screen and (min-width: 76.25em){ .md-sidebar { height: 0; top:"+ (bannerHeight+headerHeight)+"px !important; }}" - document.querySelector('style').textContent += - "@media screen and (min-width: 60em){ .md-sidebar--secondary { height: 0; top:"+ (bannerHeight+headerHeight)+"px !important; }}" - } - else if (rtdData.version !== "stable") { - document.querySelector("div[data-md-component=announce]").innerHTML = "
    You are viewing the docs for a previous version of Argo CD, click here to go to the latest stable version.
    " - var bannerHeight = document.getElementById('announce-msg').offsetHeight + margin - document.querySelector("header.md-header").style.top = bannerHeight +"px"; - document.querySelector('style').textContent += - "@media screen and (min-width: 76.25em){ .md-sidebar { height: 0; top:"+ (bannerHeight+headerHeight)+"px !important; }}" - document.querySelector('style').textContent += - "@media screen and (min-width: 60em){ .md-sidebar--secondary { height: 0; top:"+ (bannerHeight+headerHeight)+"px !important; }}" + var headerHeight = document.getElementsByClassName("md-header")[0].offsetHeight; + if (currentVersion && currentVersion.length > 1) { + currentVersion = currentVersion[1]; + if (currentVersion === "latest") { + document.querySelector("div[data-md-component=announce]").innerHTML = "
    You are viewing the docs for an unreleased version of Argo CD, click here to go to the latest stable version.
    "; + var bannerHeight = document.getElementById('announce-msg').offsetHeight + margin; + document.querySelector("header.md-header").style.top = bannerHeight + "px"; + document.querySelector('style').textContent += + "@media screen and (min-width: 76.25em){ .md-sidebar { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; + document.querySelector('style').textContent += + "@media screen and (min-width: 60em){ .md-sidebar--secondary { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; + } else if (currentVersion !== "stable") { + document.querySelector("div[data-md-component=announce]").innerHTML = "
    You are viewing the docs for a previous version of Argo CD, click here to go to the latest stable version.
    "; + var bannerHeight = document.getElementById('announce-msg').offsetHeight + margin; + document.querySelector("header.md-header").style.top = bannerHeight + "px"; + document.querySelector('style').textContent += + "@media screen and (min-width: 76.25em){ .md-sidebar { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; + document.querySelector('style').textContent += + "@media screen and (min-width: 60em){ .md-sidebar--secondary { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; + } } -}); +}); \ No newline at end of file From f8e2ca717cc8c3ee557204e32766a4cdc090360c Mon Sep 17 00:00:00 2001 From: Yonatan Sasson <107778824+Yuni-sa@users.noreply.github.com> Date: Tue, 18 Jun 2024 05:41:51 +0300 Subject: [PATCH 54/74] fix: JSON unmarshaling error handling and nil return (#18700) * fix: JSON unmarshaling error handling and nil return in ExecuteHealthLua function Signed-off-by: Yonatan Sasson * Update util/lua/lua.go Co-authored-by: Alexandre Gaudreault Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --------- Signed-off-by: Yonatan Sasson Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Co-authored-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Co-authored-by: Alexandre Gaudreault --- util/lua/lua.go | 9 +++++++++ util/lua/lua_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/util/lua/lua.go b/util/lua/lua.go index 956235751df09..843dca6c7dd91 100644 --- a/util/lua/lua.go +++ b/util/lua/lua.go @@ -4,9 +4,11 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "os" "path/filepath" + "reflect" "time" "github.com/argoproj/gitops-engine/pkg/health" @@ -109,6 +111,11 @@ func (vm VM) ExecuteHealthLua(obj *unstructured.Unstructured, script string) (*h healthStatus := &health.HealthStatus{} err = json.Unmarshal(jsonBytes, healthStatus) if err != nil { + // Validate if the error is caused by an empty object + typeError := &json.UnmarshalTypeError{Value: "array", Type: reflect.TypeOf(healthStatus)} + if errors.As(err, &typeError) { + return &health.HealthStatus{}, nil + } return nil, err } if !isValidHealthStatusCode(healthStatus.Status) { @@ -119,6 +126,8 @@ func (vm VM) ExecuteHealthLua(obj *unstructured.Unstructured, script string) (*h } return healthStatus, nil + } else if returnValue.Type() == lua.LTNil { + return &health.HealthStatus{}, nil } return nil, fmt.Errorf(incorrectReturnType, "table", returnValue.Type().String()) } diff --git a/util/lua/lua_test.go b/util/lua/lua_test.go index bcd1f644586d9..264c710ee1816 100644 --- a/util/lua/lua_test.go +++ b/util/lua/lua_test.go @@ -137,6 +137,45 @@ func TestInvalidHealthStatusStatus(t *testing.T) { assert.Equal(t, expectedStatus, status) } +const validReturnNothingHealthStatusStatus = `local healthStatus = {} +return +` + +func TestNoReturnHealthStatusStatus(t *testing.T) { + testObj := StrToUnstructured(objJSON) + vm := VM{} + status, err := vm.ExecuteHealthLua(testObj, validReturnNothingHealthStatusStatus) + require.NoError(t, err) + expectedStatus := &health.HealthStatus{} + assert.Equal(t, expectedStatus, status) +} + +const validNilHealthStatusStatus = `local healthStatus = {} +return nil +` + +func TestNilHealthStatusStatus(t *testing.T) { + testObj := StrToUnstructured(objJSON) + vm := VM{} + status, err := vm.ExecuteHealthLua(testObj, validNilHealthStatusStatus) + require.NoError(t, err) + expectedStatus := &health.HealthStatus{} + assert.Equal(t, expectedStatus, status) +} + +const validEmptyArrayHealthStatusStatus = `local healthStatus = {} +return healthStatus +` + +func TestEmptyHealthStatusStatus(t *testing.T) { + testObj := StrToUnstructured(objJSON) + vm := VM{} + status, err := vm.ExecuteHealthLua(testObj, validEmptyArrayHealthStatusStatus) + require.NoError(t, err) + expectedStatus := &health.HealthStatus{} + assert.Equal(t, expectedStatus, status) +} + const infiniteLoop = `while true do ; end` func TestHandleInfiniteLoop(t *testing.T) { From 50f889c8b2a1bfd5cabebf57a30b6df39b7b26cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:43:27 +0300 Subject: [PATCH 55/74] chore(deps): bump library/golang from `4950c1c` to `c2010b9` (#18704) Bumps library/golang from `4950c1c` to `c2010b9`. --- updated-dependencies: - dependency-name: library/golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8fd2adcbf3a3c..b6ad75c6e0c37 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ ARG BASE_IMAGE=docker.io/library/ubuntu:24.04@sha256:3f85b7caad41a95462cf5b787d8 # Initial stage which pulls prepares build dependencies and CLI tooling we need for our final image # Also used as the image in CI jobs so needs all dependencies #################################################################################################### -FROM docker.io/library/golang:1.22.4@sha256:4950c1cce16bb754e23ee70d25a67e906149d0faedc0aaeed49c075b696fa889 AS builder +FROM docker.io/library/golang:1.22.4@sha256:c2010b9c2342431a24a2e64e33d9eb2e484af49e72c820e200d332d214d5e61f AS builder RUN echo 'deb http://archive.debian.org/debian buster-backports main' >> /etc/apt/sources.list @@ -101,7 +101,7 @@ RUN HOST_ARCH=$TARGETARCH NODE_ENV='production' NODE_ONLINE_ENV='online' NODE_OP #################################################################################################### # Argo CD Build stage which performs the actual build of Argo CD binaries #################################################################################################### -FROM --platform=$BUILDPLATFORM docker.io/library/golang:1.22.4@sha256:4950c1cce16bb754e23ee70d25a67e906149d0faedc0aaeed49c075b696fa889 AS argocd-build +FROM --platform=$BUILDPLATFORM docker.io/library/golang:1.22.4@sha256:c2010b9c2342431a24a2e64e33d9eb2e484af49e72c820e200d332d214d5e61f AS argocd-build WORKDIR /go/src/github.com/argoproj/argo-cd From 3fb9d9551d2e1cf9e8845230d7606aa2572f233c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:44:07 +0300 Subject: [PATCH 56/74] chore(deps-dev): bump @types/node from 20.14.2 to 20.14.4 in /ui-test (#18705) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.14.2 to 20.14.4. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui-test/package.json | 2 +- ui-test/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui-test/package.json b/ui-test/package.json index b61c0802f300f..450a4423ef558 100644 --- a/ui-test/package.json +++ b/ui-test/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@types/mocha": "^10.0.6", - "@types/node": "^20.14.2", + "@types/node": "^20.14.4", "dotenv": "^16.4.5", "mocha": "^10.4.0", "prettier": "^2.8.8", diff --git a/ui-test/yarn.lock b/ui-test/yarn.lock index a5107bedd28d9..5bafe5b7216b7 100644 --- a/ui-test/yarn.lock +++ b/ui-test/yarn.lock @@ -38,10 +38,10 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== -"@types/node@*", "@types/node@^20.14.2": - version "20.14.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" - integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== +"@types/node@*", "@types/node@^20.14.4": + version "20.14.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.4.tgz#3426db474378502882036d595ec9e79a9b17d1e6" + integrity sha512-1ChboN+57suCT2t/f8lwtPY/k3qTpuD/qnqQuYoBg6OQOcPyaw7PiZVdGpaZYAvhDDtqrt0oAaM8+oSu1xsUGw== dependencies: undici-types "~5.26.4" From e5eddc3b46aac3dfc1fe94e5095084c8de416e3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:44:42 +0300 Subject: [PATCH 57/74] chore(deps): bump library/golang in /test/container (#18706) Bumps library/golang from `4950c1c` to `c2010b9`. --- updated-dependencies: - dependency-name: library/golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/container/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/container/Dockerfile b/test/container/Dockerfile index 83099ff5da91b..748786d6edf35 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -8,7 +8,7 @@ RUN ln -s /usr/lib/$(uname -m)-linux-gnu /usr/lib/linux-gnu # Please make sure to also check the contained yarn version and update the references below when upgrading this image's version FROM docker.io/library/node:22.3.0@sha256:5e4044ff6001d06e7748e35bfa4f80c73cf5f5a7360a1b782995e038a01b0585 as node -FROM docker.io/library/golang:1.22.4@sha256:4950c1cce16bb754e23ee70d25a67e906149d0faedc0aaeed49c075b696fa889 as golang +FROM docker.io/library/golang:1.22.4@sha256:c2010b9c2342431a24a2e64e33d9eb2e484af49e72c820e200d332d214d5e61f as golang FROM docker.io/library/registry:2.8@sha256:4fac7a8257b1d7a86599043fcc181dfbdf9c8f57e337db763ac94b0e67c6cfb5 as registry From fe965ed14d12171b4c087aace29dcece8c4a1740 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:46:24 +0300 Subject: [PATCH 58/74] chore(deps): bump library/redis in /test/container (#18707) Bumps library/redis from `f5ef9e2` to `e422889`. --- updated-dependencies: - dependency-name: library/redis dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/container/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/container/Dockerfile b/test/container/Dockerfile index 748786d6edf35..bcacb28dcfa8d 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/library/redis:7.2.5@sha256:f5ef9e24a9ef3b7cc552ae0cbc3cbade4f2877502683496c5d775605ae071412 as redis +FROM docker.io/library/redis:7.2.5@sha256:e422889e156ebea83856b6ff973bfe0c86bce867d80def228044eeecf925592b as redis # There are libraries we will want to copy from here in the final stage of the # build, but the COPY directive does not have a way to determine system From 3f0d8d562970900797a3a0de0a421e72ad557c2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:13:32 +0300 Subject: [PATCH 59/74] chore(deps): bump ws from 8.17.0 to 8.17.1 in /ui (#18712) Bumps [ws](https://github.com/websockets/ws) from 8.17.0 to 8.17.1. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/8.17.0...8.17.1) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/yarn.lock | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/ui/yarn.lock b/ui/yarn.lock index 64f62034bbbe5..436a42a107d3e 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -10535,15 +10535,10 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@^8.11.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" - integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== - -ws@^8.4.2: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== +ws@^8.11.0, ws@^8.4.2: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== xml-name-validator@^4.0.0: version "4.0.0" From 029b5acd5462e153b72fe0f7b1c5fa38e311d05c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:13:52 +0300 Subject: [PATCH 60/74] chore(deps): bump ws from 8.17.0 to 8.17.1 in /ui-test (#18711) Bumps [ws](https://github.com/websockets/ws) from 8.17.0 to 8.17.1. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/8.17.0...8.17.1) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui-test/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui-test/yarn.lock b/ui-test/yarn.lock index 5bafe5b7216b7..c04ff083abc69 100644 --- a/ui-test/yarn.lock +++ b/ui-test/yarn.lock @@ -1548,9 +1548,9 @@ wrappy@1: integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= ws@>=8.16.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" - integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== y18n@^5.0.5: version "5.0.8" From 04edbe90d19008f3fd73f80420c35865cee0ca0a Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Tue, 18 Jun 2024 16:05:03 +0200 Subject: [PATCH 61/74] chore: enable error-is-as rule from testifylint linter (#18710) Signed-off-by: Matthieu MOREL --- .golangci.yaml | 1 - applicationset/generators/pull_request_test.go | 8 ++------ applicationset/generators/scm_provider_test.go | 9 ++------- applicationset/services/repo_service_test.go | 2 +- reposerver/cache/cache_test.go | 6 +++--- util/argo/resource_tracking_test.go | 4 ++-- util/oidc/oidc_test.go | 2 +- 7 files changed, 11 insertions(+), 21 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 7d6b684a83683..589e1fa376af7 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -36,7 +36,6 @@ linters-settings: testifylint: enable-all: true disable: - - error-is-as - float-compare - go-require run: diff --git a/applicationset/generators/pull_request_test.go b/applicationset/generators/pull_request_test.go index b293623077009..dc0418554263a 100644 --- a/applicationset/generators/pull_request_test.go +++ b/applicationset/generators/pull_request_test.go @@ -283,7 +283,6 @@ func TestAllowedSCMProviderPullRequest(t *testing.T) { cases := []struct { name string providerConfig *argoprojiov1alpha1.PullRequestGenerator - expectedError error }{ { name: "Error Github", @@ -292,7 +291,6 @@ func TestAllowedSCMProviderPullRequest(t *testing.T) { API: "https://myservice.mynamespace.svc.cluster.local", }, }, - expectedError: &ErrDisallowedSCMProvider{}, }, { name: "Error Gitlab", @@ -301,7 +299,6 @@ func TestAllowedSCMProviderPullRequest(t *testing.T) { API: "https://myservice.mynamespace.svc.cluster.local", }, }, - expectedError: &ErrDisallowedSCMProvider{}, }, { name: "Error Gitea", @@ -310,7 +307,6 @@ func TestAllowedSCMProviderPullRequest(t *testing.T) { API: "https://myservice.mynamespace.svc.cluster.local", }, }, - expectedError: &ErrDisallowedSCMProvider{}, }, { name: "Error Bitbucket", @@ -319,7 +315,6 @@ func TestAllowedSCMProviderPullRequest(t *testing.T) { API: "https://myservice.mynamespace.svc.cluster.local", }, }, - expectedError: &ErrDisallowedSCMProvider{}, }, } @@ -351,7 +346,8 @@ func TestAllowedSCMProviderPullRequest(t *testing.T) { _, err := pullRequestGenerator.GenerateParams(&applicationSetInfo.Spec.Generators[0], &applicationSetInfo, nil) require.Error(t, err, "Must return an error") - assert.ErrorAs(t, err, testCaseCopy.expectedError) + var expectedError ErrDisallowedSCMProvider + assert.ErrorAs(t, err, &expectedError) }) } } diff --git a/applicationset/generators/scm_provider_test.go b/applicationset/generators/scm_provider_test.go index 04291b6303e83..a899633f2b5dc 100644 --- a/applicationset/generators/scm_provider_test.go +++ b/applicationset/generators/scm_provider_test.go @@ -204,7 +204,6 @@ func TestAllowedSCMProvider(t *testing.T) { cases := []struct { name string providerConfig *argoprojiov1alpha1.SCMProviderGenerator - expectedError error }{ { name: "Error Github", @@ -213,7 +212,6 @@ func TestAllowedSCMProvider(t *testing.T) { API: "https://myservice.mynamespace.svc.cluster.local", }, }, - expectedError: &ErrDisallowedSCMProvider{}, }, { name: "Error Gitlab", @@ -222,7 +220,6 @@ func TestAllowedSCMProvider(t *testing.T) { API: "https://myservice.mynamespace.svc.cluster.local", }, }, - expectedError: &ErrDisallowedSCMProvider{}, }, { name: "Error Gitea", @@ -231,7 +228,6 @@ func TestAllowedSCMProvider(t *testing.T) { API: "https://myservice.mynamespace.svc.cluster.local", }, }, - expectedError: &ErrDisallowedSCMProvider{}, }, { name: "Error Bitbucket", @@ -240,7 +236,6 @@ func TestAllowedSCMProvider(t *testing.T) { API: "https://myservice.mynamespace.svc.cluster.local", }, }, - expectedError: &ErrDisallowedSCMProvider{}, }, { name: "Error AzureDevops", @@ -249,7 +244,6 @@ func TestAllowedSCMProvider(t *testing.T) { API: "https://myservice.mynamespace.svc.cluster.local", }, }, - expectedError: &ErrDisallowedSCMProvider{}, }, } @@ -284,7 +278,8 @@ func TestAllowedSCMProvider(t *testing.T) { _, err := scmGenerator.GenerateParams(&applicationSetInfo.Spec.Generators[0], &applicationSetInfo, nil) require.Error(t, err, "Must return an error") - assert.ErrorAs(t, err, testCaseCopy.expectedError) + var expectedError ErrDisallowedSCMProvider + assert.ErrorAs(t, err, &expectedError) }) } } diff --git a/applicationset/services/repo_service_test.go b/applicationset/services/repo_service_test.go index dbce9843a1b23..c621c317a9f4f 100644 --- a/applicationset/services/repo_service_test.go +++ b/applicationset/services/repo_service_test.go @@ -191,6 +191,6 @@ func TestNewArgoCDService(t *testing.T) { service, err := NewArgoCDService(func(ctx context.Context, url, project string) (*v1alpha1.Repository, error) { return &v1alpha1.Repository{}, nil }, false, &repo_mocks.Clientset{}, false) - require.NoError(t, err, err) + require.NoError(t, err) assert.NotNil(t, service) } diff --git a/reposerver/cache/cache_test.go b/reposerver/cache/cache_test.go index c05fc14134ad6..fd802127bfad4 100644 --- a/reposerver/cache/cache_test.go +++ b/reposerver/cache/cache_test.go @@ -613,7 +613,7 @@ func TestRevisionChartDetails(t *testing.T) { fixtures := newFixtures() t.Cleanup(fixtures.mockCache.StopRedisCallback) details, err := fixtures.cache.GetRevisionChartDetails("test-repo", "test-revision", "v1.0.0") - require.ErrorAs(t, err, &ErrCacheMiss) + require.ErrorIs(t, err, ErrCacheMiss) assert.Equal(t, &appv1.ChartDetails{}, details) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1}) }) @@ -679,7 +679,7 @@ func TestGetGitDirectories(t *testing.T) { fixtures := newFixtures() t.Cleanup(fixtures.mockCache.StopRedisCallback) directories, err := fixtures.cache.GetGitDirectories("test-repo", "test-revision") - require.ErrorAs(t, err, &ErrCacheMiss) + require.ErrorIs(t, err, ErrCacheMiss) assert.Empty(t, directories) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1}) }) @@ -733,7 +733,7 @@ func TestGetGitFiles(t *testing.T) { fixtures := newFixtures() t.Cleanup(fixtures.mockCache.StopRedisCallback) directories, err := fixtures.cache.GetGitFiles("test-repo", "test-revision", "*.json") - require.ErrorAs(t, err, &ErrCacheMiss) + require.ErrorIs(t, err, ErrCacheMiss) assert.Empty(t, directories) fixtures.mockCache.AssertCacheCalledTimes(t, &mocks.CacheCallCounts{ExternalGets: 1}) }) diff --git a/util/argo/resource_tracking_test.go b/util/argo/resource_tracking_test.go index 08da8d878443e..3c747edf69fcb 100644 --- a/util/argo/resource_tracking_test.go +++ b/util/argo/resource_tracking_test.go @@ -156,13 +156,13 @@ func TestParseAppInstanceValueColon(t *testing.T) { func TestParseAppInstanceValueWrongFormat1(t *testing.T) { resourceTracking := NewResourceTracking() _, err := resourceTracking.ParseAppInstanceValue("app") - require.Error(t, err, WrongResourceTrackingFormat) + require.ErrorIs(t, err, WrongResourceTrackingFormat) } func TestParseAppInstanceValueWrongFormat2(t *testing.T) { resourceTracking := NewResourceTracking() _, err := resourceTracking.ParseAppInstanceValue("app;group/kind/ns") - require.Error(t, err, WrongResourceTrackingFormat) + require.ErrorIs(t, err, WrongResourceTrackingFormat) } func TestParseAppInstanceValueCorrectFormat(t *testing.T) { diff --git a/util/oidc/oidc_test.go b/util/oidc/oidc_test.go index 12a715f6a3e9a..7c6a6bed97078 100644 --- a/util/oidc/oidc_test.go +++ b/util/oidc/oidc_test.go @@ -481,7 +481,7 @@ func TestGenerateAppState_XSS(t *testing.T) { } returnURL, err := app.verifyAppState(req, httptest.NewRecorder(), state) - require.NoError(t, err, InvalidRedirectURLError) + require.NoError(t, err) assert.Equal(t, expectedReturnURL, returnURL) }) } From c88d3a9ab43c6030df9308689f0fa2ded16b5abb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:06:49 -0400 Subject: [PATCH 62/74] chore(deps): bump docker/build-push-action from 5.4.0 to 6.0.0 (#18708) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5.4.0 to 6.0.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/ca052bb54ab0790a636c9b5f226502c73d547a25...c382f710d39a5bb4e430307530a720f50c2d3318) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 5848f65be088b..4cb2ca2614e80 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -143,7 +143,7 @@ jobs: - name: Build and push container image id: image - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 #v5.4.0 + uses: docker/build-push-action@c382f710d39a5bb4e430307530a720f50c2d3318 #v6.0.0 with: context: . platforms: ${{ inputs.platforms }} From 5bf93d495511fde1d54cc1819184638766d30f6b Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:54:51 -0400 Subject: [PATCH 63/74] docs: don't populate tested versions on latest (#18719) Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- docs/operator-manual/tested-kubernetes-versions.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/operator-manual/tested-kubernetes-versions.md b/docs/operator-manual/tested-kubernetes-versions.md index 897620296a515..73475e8523f5b 100644 --- a/docs/operator-manual/tested-kubernetes-versions.md +++ b/docs/operator-manual/tested-kubernetes-versions.md @@ -1,6 +1,2 @@ -| Argo CD version | Kubernetes versions | -|-----------------|---------------------| -| 2.7 | v1.26, v1.25, v1.24, v1.23 | -| 2.6 | v1.24, v1.23, v1.22 | -| 2.5 | v1.24, v1.23, v1.22 | - +This page is populated for released Argo CD versions. Use the version selector to view this table for a specific +version. From 70755aa3c5d7b1a5d9e4aace49641d5c9b9eda2e Mon Sep 17 00:00:00 2001 From: Alexandre Gaudreault Date: Tue, 18 Jun 2024 11:15:12 -0400 Subject: [PATCH 64/74] feat(cli): add cmd to preview generated apps of appsets (#10895) (#16781) * feat(cli): add cmd to preview generated apps Signed-off-by: Alexandre Gaudreault * fix build Signed-off-by: Alexandre Gaudreault * fix local proto gen Signed-off-by: Alexandre Gaudreault * dry run client Signed-off-by: Alexandre Gaudreault * fix: allow to run codegen outside GOPATH Signed-off-by: Alexandre Gaudreault * clientgen Signed-off-by: Alexandre Gaudreault * openapigen Signed-off-by: Alexandre Gaudreault * remove ensure-gopath Signed-off-by: Alexandre Gaudreault * fix tests and templatePatch Signed-off-by: Alexandre Gaudreault * fix build Signed-off-by: Alexandre Gaudreault * convert to interfaces Signed-off-by: Alexandre Gaudreault * codegen Signed-off-by: Alexandre Gaudreault * extract common code Signed-off-by: Alexandre Gaudreault * use appset params in server Signed-off-by: Alexandre Gaudreault * codegen Signed-off-by: Alexandre Gaudreault * fix test build Signed-off-by: Alexandre Gaudreault * unit tests Signed-off-by: Alexandre Gaudreault * move test to new package Signed-off-by: Alexandre Gaudreault * move to correct folders Signed-off-by: Alexandre Gaudreault * fix build Signed-off-by: Alexandre Gaudreault * review Signed-off-by: Alexandre Gaudreault * lint Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * fix test Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * fix lint Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * auto generate mocks Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * better error handling Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * more docs Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * more docs Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * lint Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --------- Signed-off-by: Alexandre Gaudreault Signed-off-by: Alexandre Gaudreault Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Co-authored-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- .../controllers/applicationset_controller.go | 146 +--- .../applicationset_controller_test.go | 452 +----------- .../controllers/requeue_after_test.go | 6 +- .../{templatePatch.go => template/patch.go} | 2 +- .../patch_test.go} | 2 +- .../controllers/template/template.go | 99 +++ .../controllers/template/template_test.go | 349 +++++++++ applicationset/generators/interface.go | 2 + applicationset/generators/matrix_test.go | 2 +- applicationset/generators/mocks/generator.go | 100 +++ applicationset/generators/pull_request.go | 16 +- .../generators/pull_request_test.go | 6 +- applicationset/generators/scm_provider.go | 27 +- .../generators/scm_provider_test.go | 20 +- applicationset/generators/utils.go | 49 ++ applicationset/status/resource_status.go | 57 ++ applicationset/utils/mocks/renderer.go | 86 +++ applicationset/utils/utils.go | 2 + assets/swagger.json | 7 +- .../commands/applicationset_controller.go | 38 +- cmd/argocd-server/commands/argocd_server.go | 86 ++- cmd/argocd/commands/applicationset.go | 38 +- cmd/argocd/commands/headless/headless.go | 41 +- .../Controlling-Resource-Modification.md | 12 + .../server-commands/argocd-server.md | 4 + .../commands/argocd_appset_create.md | 9 +- .../base/server/argocd-server-deployment.yaml | 668 +++++++++--------- manifests/ha/install.yaml | 24 + manifests/ha/namespace-install.yaml | 24 + manifests/install.yaml | 24 + manifests/namespace-install.yaml | 24 + .../applicationset/applicationset.pb.go | 116 ++- server/applicationset/applicationset.go | 119 +++- server/applicationset/applicationset.proto | 2 +- server/applicationset/applicationset_test.go | 57 ++ server/server.go | 117 +-- server/server_test.go | 48 +- 37 files changed, 1754 insertions(+), 1127 deletions(-) rename applicationset/controllers/{templatePatch.go => template/patch.go} (98%) rename applicationset/controllers/{templatePatch_test.go => template/patch_test.go} (99%) create mode 100644 applicationset/controllers/template/template.go create mode 100644 applicationset/controllers/template/template_test.go create mode 100644 applicationset/generators/mocks/generator.go create mode 100644 applicationset/generators/utils.go create mode 100644 applicationset/status/resource_status.go create mode 100644 applicationset/utils/mocks/renderer.go diff --git a/applicationset/controllers/applicationset_controller.go b/applicationset/controllers/applicationset_controller.go index e0cba5955fe56..86ebb939cbede 100644 --- a/applicationset/controllers/applicationset_controller.go +++ b/applicationset/controllers/applicationset_controller.go @@ -43,7 +43,9 @@ import ( "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/predicate" + "github.com/argoproj/argo-cd/v2/applicationset/controllers/template" "github.com/argoproj/argo-cd/v2/applicationset/generators" + "github.com/argoproj/argo-cd/v2/applicationset/status" "github.com/argoproj/argo-cd/v2/applicationset/utils" "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/util/db" @@ -129,7 +131,7 @@ func (r *ApplicationSetReconciler) Reconcile(ctx context.Context, req ctrl.Reque // Log a warning if there are unrecognized generators _ = utils.CheckInvalidGenerators(&applicationSetInfo) // desiredApplications is the main list of all expected Applications from all generators in this appset. - desiredApplications, applicationSetReason, generatorsErr := r.generateApplications(logCtx, applicationSetInfo) + desiredApplications, applicationSetReason, generatorsErr := template.GenerateApplications(logCtx, applicationSetInfo, r.Generators, r.Renderer, r.Client) if generatorsErr != nil { _ = r.setApplicationSetStatusCondition(ctx, &applicationSetInfo, @@ -495,88 +497,6 @@ func (r *ApplicationSetReconciler) getMinRequeueAfter(applicationSetInfo *argov1 return res } -func getTempApplication(applicationSetTemplate argov1alpha1.ApplicationSetTemplate) *argov1alpha1.Application { - var tmplApplication argov1alpha1.Application - tmplApplication.Annotations = applicationSetTemplate.Annotations - tmplApplication.Labels = applicationSetTemplate.Labels - tmplApplication.Namespace = applicationSetTemplate.Namespace - tmplApplication.Name = applicationSetTemplate.Name - tmplApplication.Spec = applicationSetTemplate.Spec - tmplApplication.Finalizers = applicationSetTemplate.Finalizers - - return &tmplApplication -} - -func (r *ApplicationSetReconciler) generateApplications(logCtx *log.Entry, applicationSetInfo argov1alpha1.ApplicationSet) ([]argov1alpha1.Application, argov1alpha1.ApplicationSetReasonType, error) { - var res []argov1alpha1.Application - - var firstError error - var applicationSetReason argov1alpha1.ApplicationSetReasonType - - for _, requestedGenerator := range applicationSetInfo.Spec.Generators { - t, err := generators.Transform(requestedGenerator, r.Generators, applicationSetInfo.Spec.Template, &applicationSetInfo, map[string]interface{}{}, r.Client) - if err != nil { - logCtx.WithError(err).WithField("generator", requestedGenerator). - Error("error generating application from params") - if firstError == nil { - firstError = err - applicationSetReason = argov1alpha1.ApplicationSetReasonApplicationParamsGenerationError - } - continue - } - - for _, a := range t { - tmplApplication := getTempApplication(a.Template) - - for _, p := range a.Params { - app, err := r.Renderer.RenderTemplateParams(tmplApplication, applicationSetInfo.Spec.SyncPolicy, p, applicationSetInfo.Spec.GoTemplate, applicationSetInfo.Spec.GoTemplateOptions) - if err != nil { - logCtx.WithError(err).WithField("params", a.Params).WithField("generator", requestedGenerator). - Error("error generating application from params") - - if firstError == nil { - firstError = err - applicationSetReason = argov1alpha1.ApplicationSetReasonRenderTemplateParamsError - } - continue - } - - if applicationSetInfo.Spec.TemplatePatch != nil { - patchedApplication, err := r.applyTemplatePatch(app, applicationSetInfo, p) - if err != nil { - log.WithError(err).WithField("params", a.Params).WithField("generator", requestedGenerator). - Error("error generating application from params") - - if firstError == nil { - firstError = err - applicationSetReason = argov1alpha1.ApplicationSetReasonRenderTemplateParamsError - } - continue - } - - app = patchedApplication - } - - res = append(res, *app) - } - } - - logCtx.WithField("generator", requestedGenerator).Infof("generated %d applications", len(res)) - logCtx.WithField("generator", requestedGenerator).Debugf("apps from generator: %+v", res) - } - - return res, applicationSetReason, firstError -} - -func (r *ApplicationSetReconciler) applyTemplatePatch(app *argov1alpha1.Application, applicationSetInfo argov1alpha1.ApplicationSet, params map[string]interface{}) (*argov1alpha1.Application, error) { - replacedTemplate, err := r.Renderer.Replace(*applicationSetInfo.Spec.TemplatePatch, params, applicationSetInfo.Spec.GoTemplate, applicationSetInfo.Spec.GoTemplateOptions) - if err != nil { - return nil, fmt.Errorf("error replacing values in templatePatch: %w", err) - } - - return applyTemplatePatch(app, replacedTemplate) -} - func ignoreNotAllowedNamespaces(namespaces []string) predicate.Predicate { return predicate.Funcs{ CreateFunc: func(e event.CreateEvent) bool { @@ -650,10 +570,6 @@ func (r *ApplicationSetReconciler) createOrUpdateInCluster(ctx context.Context, var firstError error // Creates or updates the application in appList for _, generatedApp := range desiredApplications { - // The app's namespace must be the same as the AppSet's namespace to preserve the appsets-in-any-namespace - // security boundary. - generatedApp.Namespace = applicationSet.Namespace - appLog := logCtx.WithFields(log.Fields{"app": generatedApp.QualifiedName()}) // Normalize to avoid fighting with the application controller. @@ -1351,8 +1267,8 @@ func findApplicationStatusIndex(appStatuses []argov1alpha1.ApplicationSetApplica } func (r *ApplicationSetReconciler) updateResourcesStatus(ctx context.Context, logCtx *log.Entry, appset *argov1alpha1.ApplicationSet, apps []argov1alpha1.Application) error { - statusMap := getResourceStatusMap(appset) - statusMap = buildResourceStatus(statusMap, apps) + statusMap := status.GetResourceStatusMap(appset) + statusMap = status.BuildResourceStatus(statusMap, apps) statuses := []argov1alpha1.ResourceStatus{} for _, status := range statusMap { @@ -1377,58 +1293,6 @@ func (r *ApplicationSetReconciler) updateResourcesStatus(ctx context.Context, lo return nil } -func buildResourceStatus(statusMap map[string]argov1alpha1.ResourceStatus, apps []argov1alpha1.Application) map[string]argov1alpha1.ResourceStatus { - appMap := map[string]argov1alpha1.Application{} - for _, app := range apps { - appCopy := app - appMap[app.Name] = app - - gvk := app.GroupVersionKind() - // Create status if it does not exist - status, ok := statusMap[app.Name] - if !ok { - status = argov1alpha1.ResourceStatus{ - Group: gvk.Group, - Version: gvk.Version, - Kind: gvk.Kind, - Name: app.Name, - Namespace: app.Namespace, - Status: app.Status.Sync.Status, - Health: &appCopy.Status.Health, - } - } - - status.Group = gvk.Group - status.Version = gvk.Version - status.Kind = gvk.Kind - status.Name = app.Name - status.Namespace = app.Namespace - status.Status = app.Status.Sync.Status - status.Health = &appCopy.Status.Health - - statusMap[app.Name] = status - } - cleanupDeletedApplicationStatuses(statusMap, appMap) - - return statusMap -} - -func getResourceStatusMap(appset *argov1alpha1.ApplicationSet) map[string]argov1alpha1.ResourceStatus { - statusMap := map[string]argov1alpha1.ResourceStatus{} - for _, status := range appset.Status.Resources { - statusMap[status.Name] = status - } - return statusMap -} - -func cleanupDeletedApplicationStatuses(statusMap map[string]argov1alpha1.ResourceStatus, apps map[string]argov1alpha1.Application) { - for name := range statusMap { - if _, ok := apps[name]; !ok { - delete(statusMap, name) - } - } -} - // setApplicationSetApplicationStatus updates the ApplicationSet's status field // with any new/changed Application statuses. func (r *ApplicationSetReconciler) setAppSetApplicationStatus(ctx context.Context, logCtx *log.Entry, applicationSet *argov1alpha1.ApplicationSet, applicationStatuses []argov1alpha1.ApplicationSetApplicationStatus) error { diff --git a/applicationset/controllers/applicationset_controller_test.go b/applicationset/controllers/applicationset_controller_test.go index 41f6a54e02743..cd72b2ddd7362 100644 --- a/applicationset/controllers/applicationset_controller_test.go +++ b/applicationset/controllers/applicationset_controller_test.go @@ -25,7 +25,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/cache" crtcache "sigs.k8s.io/controller-runtime/pkg/cache" - "sigs.k8s.io/controller-runtime/pkg/client" crtclient "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -35,11 +34,11 @@ import ( "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/argoproj/argo-cd/v2/applicationset/generators" + "github.com/argoproj/argo-cd/v2/applicationset/generators/mocks" "github.com/argoproj/argo-cd/v2/applicationset/utils" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned/fake" - "github.com/argoproj/argo-cd/v2/util/collections" dbmocks "github.com/argoproj/argo-cd/v2/util/db/mocks" "github.com/argoproj/argo-cd/v2/pkg/apis/application" @@ -73,287 +72,6 @@ func (f *fakeCache) GetInformer(ctx context.Context, obj crtclient.Object, opt . return &fakeInformer{}, nil } -type generatorMock struct { - mock.Mock -} - -func (g *generatorMock) GetTemplate(appSetGenerator *v1alpha1.ApplicationSetGenerator) *v1alpha1.ApplicationSetTemplate { - args := g.Called(appSetGenerator) - - return args.Get(0).(*v1alpha1.ApplicationSetTemplate) -} - -func (g *generatorMock) GenerateParams(appSetGenerator *v1alpha1.ApplicationSetGenerator, _ *v1alpha1.ApplicationSet, client client.Client) ([]map[string]interface{}, error) { - args := g.Called(appSetGenerator) - - return args.Get(0).([]map[string]interface{}), args.Error(1) -} - -func (g *generatorMock) Replace(tmpl string, replaceMap map[string]interface{}, useGoTemplate bool, goTemplateOptions []string) (string, error) { - args := g.Called(tmpl, replaceMap, useGoTemplate, goTemplateOptions) - - return args.Get(0).(string), args.Error(1) -} - -type rendererMock struct { - mock.Mock -} - -func (g *generatorMock) GetRequeueAfter(appSetGenerator *v1alpha1.ApplicationSetGenerator) time.Duration { - args := g.Called(appSetGenerator) - - return args.Get(0).(time.Duration) -} - -func (r *rendererMock) RenderTemplateParams(tmpl *v1alpha1.Application, syncPolicy *v1alpha1.ApplicationSetSyncPolicy, params map[string]interface{}, useGoTemplate bool, goTemplateOptions []string) (*v1alpha1.Application, error) { - args := r.Called(tmpl, params, useGoTemplate, goTemplateOptions) - - if args.Error(1) != nil { - return nil, args.Error(1) - } - - return args.Get(0).(*v1alpha1.Application), args.Error(1) -} - -func (r *rendererMock) Replace(tmpl string, replaceMap map[string]interface{}, useGoTemplate bool, goTemplateOptions []string) (string, error) { - args := r.Called(tmpl, replaceMap, useGoTemplate, goTemplateOptions) - - return args.Get(0).(string), args.Error(1) -} - -func TestExtractApplications(t *testing.T) { - scheme := runtime.NewScheme() - err := v1alpha1.AddToScheme(scheme) - require.NoError(t, err) - - for _, c := range []struct { - name string - params []map[string]interface{} - template v1alpha1.ApplicationSetTemplate - generateParamsError error - rendererError error - expectErr bool - expectedReason v1alpha1.ApplicationSetReasonType - }{ - { - name: "Generate two applications", - params: []map[string]interface{}{{"name": "app1"}, {"name": "app2"}}, - template: v1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ - Name: "name", - Namespace: "namespace", - Labels: map[string]string{"label_name": "label_value"}, - }, - Spec: v1alpha1.ApplicationSpec{}, - }, - expectedReason: "", - }, - { - name: "Handles error from the generator", - generateParamsError: fmt.Errorf("error"), - expectErr: true, - expectedReason: v1alpha1.ApplicationSetReasonApplicationParamsGenerationError, - }, - { - name: "Handles error from the render", - params: []map[string]interface{}{{"name": "app1"}, {"name": "app2"}}, - template: v1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ - Name: "name", - Namespace: "namespace", - Labels: map[string]string{"label_name": "label_value"}, - }, - Spec: v1alpha1.ApplicationSpec{}, - }, - rendererError: fmt.Errorf("error"), - expectErr: true, - expectedReason: v1alpha1.ApplicationSetReasonRenderTemplateParamsError, - }, - } { - cc := c - app := v1alpha1.Application{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test", - }, - } - - t.Run(cc.name, func(t *testing.T) { - appSet := &v1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "namespace", - }, - } - - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(appSet).Build() - - generatorMock := generatorMock{} - generator := v1alpha1.ApplicationSetGenerator{ - List: &v1alpha1.ListGenerator{}, - } - - generatorMock.On("GenerateParams", &generator). - Return(cc.params, cc.generateParamsError) - - generatorMock.On("GetTemplate", &generator). - Return(&v1alpha1.ApplicationSetTemplate{}) - - rendererMock := rendererMock{} - - var expectedApps []v1alpha1.Application - - if cc.generateParamsError == nil { - for _, p := range cc.params { - if cc.rendererError != nil { - rendererMock.On("RenderTemplateParams", getTempApplication(cc.template), p, false, []string(nil)). - Return(nil, cc.rendererError) - } else { - rendererMock.On("RenderTemplateParams", getTempApplication(cc.template), p, false, []string(nil)). - Return(&app, nil) - expectedApps = append(expectedApps, app) - } - } - } - - r := ApplicationSetReconciler{ - Client: client, - Scheme: scheme, - Recorder: record.NewFakeRecorder(1), - Generators: map[string]generators.Generator{ - "List": &generatorMock, - }, - Renderer: &rendererMock, - KubeClientset: kubefake.NewSimpleClientset(), - Cache: &fakeCache{}, - } - - got, reason, err := r.generateApplications(log.NewEntry(log.StandardLogger()), v1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "namespace", - }, - Spec: v1alpha1.ApplicationSetSpec{ - Generators: []v1alpha1.ApplicationSetGenerator{generator}, - Template: cc.template, - }, - }) - - if cc.expectErr { - require.Error(t, err) - } else { - require.NoError(t, err) - } - assert.Equal(t, expectedApps, got) - assert.Equal(t, cc.expectedReason, reason) - generatorMock.AssertNumberOfCalls(t, "GenerateParams", 1) - - if cc.generateParamsError == nil { - rendererMock.AssertNumberOfCalls(t, "RenderTemplateParams", len(cc.params)) - } - }) - } -} - -func TestMergeTemplateApplications(t *testing.T) { - scheme := runtime.NewScheme() - _ = v1alpha1.AddToScheme(scheme) - _ = v1alpha1.AddToScheme(scheme) - - client := fake.NewClientBuilder().WithScheme(scheme).Build() - - for _, c := range []struct { - name string - params []map[string]interface{} - template v1alpha1.ApplicationSetTemplate - overrideTemplate v1alpha1.ApplicationSetTemplate - expectedMerged v1alpha1.ApplicationSetTemplate - expectedApps []v1alpha1.Application - }{ - { - name: "Generate app", - params: []map[string]interface{}{{"name": "app1"}}, - template: v1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ - Name: "name", - Namespace: "namespace", - Labels: map[string]string{"label_name": "label_value"}, - }, - Spec: v1alpha1.ApplicationSpec{}, - }, - overrideTemplate: v1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ - Name: "test", - Labels: map[string]string{"foo": "bar"}, - }, - Spec: v1alpha1.ApplicationSpec{}, - }, - expectedMerged: v1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ - Name: "test", - Namespace: "namespace", - Labels: map[string]string{"label_name": "label_value", "foo": "bar"}, - }, - Spec: v1alpha1.ApplicationSpec{}, - }, - expectedApps: []v1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "test", - Namespace: "test", - Labels: map[string]string{"foo": "bar"}, - }, - Spec: v1alpha1.ApplicationSpec{}, - }, - }, - }, - } { - cc := c - - t.Run(cc.name, func(t *testing.T) { - generatorMock := generatorMock{} - generator := v1alpha1.ApplicationSetGenerator{ - List: &v1alpha1.ListGenerator{}, - } - - generatorMock.On("GenerateParams", &generator). - Return(cc.params, nil) - - generatorMock.On("GetTemplate", &generator). - Return(&cc.overrideTemplate) - - rendererMock := rendererMock{} - - rendererMock.On("RenderTemplateParams", getTempApplication(cc.expectedMerged), cc.params[0], false, []string(nil)). - Return(&cc.expectedApps[0], nil) - - r := ApplicationSetReconciler{ - Client: client, - Scheme: scheme, - Recorder: record.NewFakeRecorder(1), - Generators: map[string]generators.Generator{ - "List": &generatorMock, - }, - Renderer: &rendererMock, - KubeClientset: kubefake.NewSimpleClientset(), - } - - got, _, _ := r.generateApplications(log.NewEntry(log.StandardLogger()), v1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "namespace", - }, - Spec: v1alpha1.ApplicationSetSpec{ - Generators: []v1alpha1.ApplicationSetGenerator{generator}, - Template: cc.template, - }, - }, - ) - - assert.Equal(t, cc.expectedApps, got) - }) - } -} - func TestCreateOrUpdateInCluster(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) @@ -386,8 +104,10 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, + Spec: v1alpha1.ApplicationSpec{Project: "default"}, }, }, expected: []v1alpha1.Application{ @@ -439,7 +159,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -497,7 +218,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app2", + Name: "app2", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -556,6 +278,7 @@ func TestCreateOrUpdateInCluster(t *testing.T) { { ObjectMeta: metav1.ObjectMeta{ Name: "app1", + Namespace: "namespace", Labels: map[string]string{"label-key": "label-value"}, Annotations: map[string]string{"annot-key": "annot-value"}, }, @@ -619,7 +342,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -685,7 +409,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -758,6 +483,7 @@ func TestCreateOrUpdateInCluster(t *testing.T) { { ObjectMeta: metav1.ObjectMeta{ Name: "app1", + Namespace: "namespace", Labels: map[string]string{"label-key": "label-value"}, Annotations: map[string]string{"annot-key": "annot-value"}, }, @@ -835,7 +561,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -904,7 +631,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -954,7 +682,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -1032,7 +761,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -1135,7 +865,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -1236,7 +967,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -1317,7 +1049,8 @@ func TestCreateOrUpdateInCluster(t *testing.T) { desiredApps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -1761,7 +1494,8 @@ func TestCreateApplications(t *testing.T) { apps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, }, }, @@ -1816,7 +1550,8 @@ func TestCreateApplications(t *testing.T) { apps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app1", + Name: "app1", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -1874,7 +1609,8 @@ func TestCreateApplications(t *testing.T) { apps: []v1alpha1.Application{ { ObjectMeta: metav1.ObjectMeta{ - Name: "app2", + Name: "app2", + Namespace: "namespace", }, Spec: v1alpha1.ApplicationSpec{ Project: "project", @@ -2106,15 +1842,15 @@ func TestGetMinRequeueAfter(t *testing.T) { Clusters: &v1alpha1.ClusterGenerator{}, } - generatorMock0 := generatorMock{} + generatorMock0 := mocks.Generator{} generatorMock0.On("GetRequeueAfter", &generator). Return(generators.NoRequeueAfter) - generatorMock1 := generatorMock{} + generatorMock1 := mocks.Generator{} generatorMock1.On("GetRequeueAfter", &generator). Return(time.Duration(1) * time.Second) - generatorMock10 := generatorMock{} + generatorMock10 := mocks.Generator{} generatorMock10.On("GetRequeueAfter", &generator). Return(time.Duration(10) * time.Second) @@ -2933,120 +2669,6 @@ func TestDeletePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *t assert.Empty(t, apps.Items) } -// Test app generation from a go template application set using a pull request generator -func TestGenerateAppsUsingPullRequestGenerator(t *testing.T) { - scheme := runtime.NewScheme() - client := fake.NewClientBuilder().WithScheme(scheme).Build() - - for _, cases := range []struct { - name string - params []map[string]interface{} - template v1alpha1.ApplicationSetTemplate - expectedApp []v1alpha1.Application - }{ - { - name: "Generate an application from a go template application set manifest using a pull request generator", - params: []map[string]interface{}{ - { - "number": "1", - "branch": "branch1", - "branch_slug": "branchSlug1", - "head_sha": "089d92cbf9ff857a39e6feccd32798ca700fb958", - "head_short_sha": "089d92cb", - "branch_slugify_default": "feat/a_really+long_pull_request_name_to_test_argo_slugification_and_branch_name_shortening_feature", - "branch_slugify_smarttruncate_disabled": "feat/areallylongpullrequestnametotestargoslugificationandbranchnameshorteningfeature", - "branch_slugify_smarttruncate_enabled": "feat/testwithsmarttruncateenabledramdomlonglistofcharacters", - "labels": []string{"label1"}, - }, - }, - template: v1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ - Name: "AppSet-{{.branch}}-{{.number}}", - Labels: map[string]string{ - "app1": "{{index .labels 0}}", - "branch-test1": "AppSet-{{.branch_slugify_default | slugify }}", - "branch-test2": "AppSet-{{.branch_slugify_smarttruncate_disabled | slugify 49 false }}", - "branch-test3": "AppSet-{{.branch_slugify_smarttruncate_enabled | slugify 50 true }}", - }, - }, - Spec: v1alpha1.ApplicationSpec{ - Source: &v1alpha1.ApplicationSource{ - RepoURL: "https://testurl/testRepo", - TargetRevision: "{{.head_short_sha}}", - }, - Destination: v1alpha1.ApplicationDestination{ - Server: "https://kubernetes.default.svc", - Namespace: "AppSet-{{.branch_slug}}-{{.head_sha}}", - }, - }, - }, - expectedApp: []v1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "AppSet-branch1-1", - Labels: map[string]string{ - "app1": "label1", - "branch-test1": "AppSet-feat-a-really-long-pull-request-name-to-test-argo", - "branch-test2": "AppSet-feat-areallylongpullrequestnametotestargoslugific", - "branch-test3": "AppSet-feat", - }, - }, - Spec: v1alpha1.ApplicationSpec{ - Source: &v1alpha1.ApplicationSource{ - RepoURL: "https://testurl/testRepo", - TargetRevision: "089d92cb", - }, - Destination: v1alpha1.ApplicationDestination{ - Server: "https://kubernetes.default.svc", - Namespace: "AppSet-branchSlug1-089d92cbf9ff857a39e6feccd32798ca700fb958", - }, - }, - }, - }, - }, - } { - t.Run(cases.name, func(t *testing.T) { - generatorMock := generatorMock{} - generator := v1alpha1.ApplicationSetGenerator{ - PullRequest: &v1alpha1.PullRequestGenerator{}, - } - - generatorMock.On("GenerateParams", &generator). - Return(cases.params, nil) - - generatorMock.On("GetTemplate", &generator). - Return(&cases.template, nil) - - appSetReconciler := ApplicationSetReconciler{ - Client: client, - Scheme: scheme, - Recorder: record.NewFakeRecorder(1), - Cache: &fakeCache{}, - Generators: map[string]generators.Generator{ - "PullRequest": &generatorMock, - }, - Renderer: &utils.Render{}, - KubeClientset: kubefake.NewSimpleClientset(), - } - - gotApp, _, _ := appSetReconciler.generateApplications(log.NewEntry(log.StandardLogger()), v1alpha1.ApplicationSet{ - Spec: v1alpha1.ApplicationSetSpec{ - GoTemplate: true, - Generators: []v1alpha1.ApplicationSetGenerator{{ - PullRequest: &v1alpha1.PullRequestGenerator{}, - }}, - Template: cases.template, - }, - }, - ) - assert.EqualValues(t, cases.expectedApp[0].ObjectMeta.Name, gotApp[0].ObjectMeta.Name) - assert.EqualValues(t, cases.expectedApp[0].Spec.Source.TargetRevision, gotApp[0].Spec.Source.TargetRevision) - assert.EqualValues(t, cases.expectedApp[0].Spec.Destination.Namespace, gotApp[0].Spec.Destination.Namespace) - assert.True(t, collections.StringMapsEqual(cases.expectedApp[0].ObjectMeta.Labels, gotApp[0].ObjectMeta.Labels)) - }) - } -} - func TestPolicies(t *testing.T) { scheme := runtime.NewScheme() err := v1alpha1.AddToScheme(scheme) diff --git a/applicationset/controllers/requeue_after_test.go b/applicationset/controllers/requeue_after_test.go index 10067c119b78d..360861ff3ad5c 100644 --- a/applicationset/controllers/requeue_after_test.go +++ b/applicationset/controllers/requeue_after_test.go @@ -56,14 +56,14 @@ func TestRequeueAfter(t *testing.T) { }, } fakeDynClient := dynfake.NewSimpleDynamicClientWithCustomListKinds(runtime.NewScheme(), gvrToListKind, duckType) - + scmConfig := generators.NewSCMConfig("", []string{""}, true, nil) terminalGenerators := map[string]generators.Generator{ "List": generators.NewListGenerator(), "Clusters": generators.NewClusterGenerator(k8sClient, ctx, appClientset, "argocd"), "Git": generators.NewGitGenerator(mockServer), - "SCMProvider": generators.NewSCMProviderGenerator(fake.NewClientBuilder().WithObjects(&corev1.Secret{}).Build(), generators.SCMAuthProviders{}, "", []string{""}, true), + "SCMProvider": generators.NewSCMProviderGenerator(fake.NewClientBuilder().WithObjects(&corev1.Secret{}).Build(), scmConfig), "ClusterDecisionResource": generators.NewDuckTypeGenerator(ctx, fakeDynClient, appClientset, "argocd"), - "PullRequest": generators.NewPullRequestGenerator(k8sClient, generators.SCMAuthProviders{}, "", []string{""}, true), + "PullRequest": generators.NewPullRequestGenerator(k8sClient, scmConfig), } nestedGenerators := map[string]generators.Generator{ diff --git a/applicationset/controllers/templatePatch.go b/applicationset/controllers/template/patch.go similarity index 98% rename from applicationset/controllers/templatePatch.go rename to applicationset/controllers/template/patch.go index 39058ac187022..b9d1166f1f237 100644 --- a/applicationset/controllers/templatePatch.go +++ b/applicationset/controllers/template/patch.go @@ -1,4 +1,4 @@ -package controllers +package template import ( "encoding/json" diff --git a/applicationset/controllers/templatePatch_test.go b/applicationset/controllers/template/patch_test.go similarity index 99% rename from applicationset/controllers/templatePatch_test.go rename to applicationset/controllers/template/patch_test.go index c1a794077c8ee..456fe445994c8 100644 --- a/applicationset/controllers/templatePatch_test.go +++ b/applicationset/controllers/template/patch_test.go @@ -1,4 +1,4 @@ -package controllers +package template import ( "testing" diff --git a/applicationset/controllers/template/template.go b/applicationset/controllers/template/template.go new file mode 100644 index 0000000000000..bb4bc155d4e59 --- /dev/null +++ b/applicationset/controllers/template/template.go @@ -0,0 +1,99 @@ +package template + +import ( + "fmt" + + "sigs.k8s.io/controller-runtime/pkg/client" + + log "github.com/sirupsen/logrus" + + "github.com/argoproj/argo-cd/v2/applicationset/generators" + "github.com/argoproj/argo-cd/v2/applicationset/utils" + + argov1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" +) + +func GenerateApplications(logCtx *log.Entry, applicationSetInfo argov1alpha1.ApplicationSet, g map[string]generators.Generator, renderer utils.Renderer, client client.Client) ([]argov1alpha1.Application, argov1alpha1.ApplicationSetReasonType, error) { + var res []argov1alpha1.Application + + var firstError error + var applicationSetReason argov1alpha1.ApplicationSetReasonType + + for _, requestedGenerator := range applicationSetInfo.Spec.Generators { + t, err := generators.Transform(requestedGenerator, g, applicationSetInfo.Spec.Template, &applicationSetInfo, map[string]interface{}{}, client) + if err != nil { + logCtx.WithError(err).WithField("generator", requestedGenerator). + Error("error generating application from params") + if firstError == nil { + firstError = err + applicationSetReason = argov1alpha1.ApplicationSetReasonApplicationParamsGenerationError + } + continue + } + + for _, a := range t { + tmplApplication := GetTempApplication(a.Template) + + for _, p := range a.Params { + app, err := renderer.RenderTemplateParams(tmplApplication, applicationSetInfo.Spec.SyncPolicy, p, applicationSetInfo.Spec.GoTemplate, applicationSetInfo.Spec.GoTemplateOptions) + if err != nil { + logCtx.WithError(err).WithField("params", a.Params).WithField("generator", requestedGenerator). + Error("error generating application from params") + + if firstError == nil { + firstError = err + applicationSetReason = argov1alpha1.ApplicationSetReasonRenderTemplateParamsError + } + continue + } + + if applicationSetInfo.Spec.TemplatePatch != nil { + patchedApplication, err := renderTemplatePatch(renderer, app, applicationSetInfo, p) + if err != nil { + log.WithError(err).WithField("params", a.Params).WithField("generator", requestedGenerator). + Error("error generating application from params") + + if firstError == nil { + firstError = err + applicationSetReason = argov1alpha1.ApplicationSetReasonRenderTemplateParamsError + } + continue + } + + app = patchedApplication + } + + // The app's namespace must be the same as the AppSet's namespace to preserve the appsets-in-any-namespace + // security boundary. + app.Namespace = applicationSetInfo.Namespace + res = append(res, *app) + } + } + + logCtx.WithField("generator", requestedGenerator).Infof("generated %d applications", len(res)) + logCtx.WithField("generator", requestedGenerator).Debugf("apps from generator: %+v", res) + } + + return res, applicationSetReason, firstError +} + +func renderTemplatePatch(r utils.Renderer, app *argov1alpha1.Application, applicationSetInfo argov1alpha1.ApplicationSet, params map[string]interface{}) (*argov1alpha1.Application, error) { + replacedTemplate, err := r.Replace(*applicationSetInfo.Spec.TemplatePatch, params, applicationSetInfo.Spec.GoTemplate, applicationSetInfo.Spec.GoTemplateOptions) + if err != nil { + return nil, fmt.Errorf("error replacing values in templatePatch: %w", err) + } + + return applyTemplatePatch(app, replacedTemplate) +} + +func GetTempApplication(applicationSetTemplate argov1alpha1.ApplicationSetTemplate) *argov1alpha1.Application { + var tmplApplication argov1alpha1.Application + tmplApplication.Annotations = applicationSetTemplate.Annotations + tmplApplication.Labels = applicationSetTemplate.Labels + tmplApplication.Namespace = applicationSetTemplate.Namespace + tmplApplication.Name = applicationSetTemplate.Name + tmplApplication.Spec = applicationSetTemplate.Spec + tmplApplication.Finalizers = applicationSetTemplate.Finalizers + + return &tmplApplication +} diff --git a/applicationset/controllers/template/template_test.go b/applicationset/controllers/template/template_test.go new file mode 100644 index 0000000000000..4c45c5f7618f9 --- /dev/null +++ b/applicationset/controllers/template/template_test.go @@ -0,0 +1,349 @@ +package template + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + + "github.com/argoproj/argo-cd/v2/applicationset/generators" + genmock "github.com/argoproj/argo-cd/v2/applicationset/generators/mocks" + "github.com/argoproj/argo-cd/v2/applicationset/utils" + rendmock "github.com/argoproj/argo-cd/v2/applicationset/utils/mocks" + "github.com/argoproj/argo-cd/v2/pkg/apis/application" + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" + "github.com/argoproj/argo-cd/v2/util/collections" +) + +func TestGenerateApplications(t *testing.T) { + scheme := runtime.NewScheme() + err := v1alpha1.AddToScheme(scheme) + require.NoError(t, err) + + err = v1alpha1.AddToScheme(scheme) + require.NoError(t, err) + + for _, c := range []struct { + name string + params []map[string]interface{} + template v1alpha1.ApplicationSetTemplate + generateParamsError error + rendererError error + expectErr bool + expectedReason v1alpha1.ApplicationSetReasonType + }{ + { + name: "Generate two applications", + params: []map[string]interface{}{{"name": "app1"}, {"name": "app2"}}, + template: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ + Name: "name", + Namespace: "namespace", + Labels: map[string]string{"label_name": "label_value"}, + }, + Spec: v1alpha1.ApplicationSpec{}, + }, + expectedReason: "", + }, + { + name: "Handles error from the generator", + generateParamsError: fmt.Errorf("error"), + expectErr: true, + expectedReason: v1alpha1.ApplicationSetReasonApplicationParamsGenerationError, + }, + { + name: "Handles error from the render", + params: []map[string]interface{}{{"name": "app1"}, {"name": "app2"}}, + template: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ + Name: "name", + Namespace: "namespace", + Labels: map[string]string{"label_name": "label_value"}, + }, + Spec: v1alpha1.ApplicationSpec{}, + }, + rendererError: fmt.Errorf("error"), + expectErr: true, + expectedReason: v1alpha1.ApplicationSetReasonRenderTemplateParamsError, + }, + } { + cc := c + app := v1alpha1.Application{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "namespace", + }, + TypeMeta: metav1.TypeMeta{ + Kind: application.ApplicationKind, + APIVersion: "argoproj.io/v1alpha1", + }, + } + + t.Run(cc.name, func(t *testing.T) { + generatorMock := genmock.Generator{} + generator := v1alpha1.ApplicationSetGenerator{ + List: &v1alpha1.ListGenerator{}, + } + + generatorMock.On("GenerateParams", &generator, mock.AnythingOfType("*v1alpha1.ApplicationSet"), mock.Anything). + Return(cc.params, cc.generateParamsError) + + generatorMock.On("GetTemplate", &generator). + Return(&v1alpha1.ApplicationSetTemplate{}) + + rendererMock := rendmock.Renderer{} + + var expectedApps []v1alpha1.Application + + if cc.generateParamsError == nil { + for _, p := range cc.params { + if cc.rendererError != nil { + rendererMock.On("RenderTemplateParams", GetTempApplication(cc.template), mock.AnythingOfType("*v1alpha1.ApplicationSetSyncPolicy"), p, false, []string(nil)). + Return(nil, cc.rendererError) + } else { + rendererMock.On("RenderTemplateParams", GetTempApplication(cc.template), mock.AnythingOfType("*v1alpha1.ApplicationSetSyncPolicy"), p, false, []string(nil)). + Return(&app, nil) + expectedApps = append(expectedApps, app) + } + } + } + + generators := map[string]generators.Generator{ + "List": &generatorMock, + } + renderer := &rendererMock + + got, reason, err := GenerateApplications(log.NewEntry(log.StandardLogger()), v1alpha1.ApplicationSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "name", + Namespace: "namespace", + }, + Spec: v1alpha1.ApplicationSetSpec{ + Generators: []v1alpha1.ApplicationSetGenerator{generator}, + Template: cc.template, + }, + }, + generators, + renderer, + nil, + ) + + if cc.expectErr { + require.Error(t, err) + } else { + require.NoError(t, err) + } + assert.Equal(t, expectedApps, got) + assert.Equal(t, cc.expectedReason, reason) + generatorMock.AssertNumberOfCalls(t, "GenerateParams", 1) + + if cc.generateParamsError == nil { + rendererMock.AssertNumberOfCalls(t, "RenderTemplateParams", len(cc.params)) + } + }) + } +} + +func TestMergeTemplateApplications(t *testing.T) { + for _, c := range []struct { + name string + params []map[string]interface{} + template v1alpha1.ApplicationSetTemplate + overrideTemplate v1alpha1.ApplicationSetTemplate + expectedMerged v1alpha1.ApplicationSetTemplate + expectedApps []v1alpha1.Application + }{ + { + name: "Generate app", + params: []map[string]interface{}{{"name": "app1"}}, + template: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ + Name: "name", + Namespace: "namespace", + Labels: map[string]string{"label_name": "label_value"}, + }, + Spec: v1alpha1.ApplicationSpec{}, + }, + overrideTemplate: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ + Name: "test", + Labels: map[string]string{"foo": "bar"}, + }, + Spec: v1alpha1.ApplicationSpec{}, + }, + expectedMerged: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ + Name: "test", + Namespace: "namespace", + Labels: map[string]string{"label_name": "label_value", "foo": "bar"}, + }, + Spec: v1alpha1.ApplicationSpec{}, + }, + expectedApps: []v1alpha1.Application{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "test", + Labels: map[string]string{"foo": "bar"}, + }, + Spec: v1alpha1.ApplicationSpec{}, + }, + }, + }, + } { + cc := c + + t.Run(cc.name, func(t *testing.T) { + generatorMock := genmock.Generator{} + generator := v1alpha1.ApplicationSetGenerator{ + List: &v1alpha1.ListGenerator{}, + } + + generatorMock.On("GenerateParams", &generator, mock.AnythingOfType("*v1alpha1.ApplicationSet"), mock.Anything). + Return(cc.params, nil) + + generatorMock.On("GetTemplate", &generator). + Return(&cc.overrideTemplate) + + rendererMock := rendmock.Renderer{} + + rendererMock.On("RenderTemplateParams", GetTempApplication(cc.expectedMerged), mock.AnythingOfType("*v1alpha1.ApplicationSetSyncPolicy"), cc.params[0], false, []string(nil)). + Return(&cc.expectedApps[0], nil) + + generators := map[string]generators.Generator{ + "List": &generatorMock, + } + renderer := &rendererMock + + got, _, _ := GenerateApplications(log.NewEntry(log.StandardLogger()), v1alpha1.ApplicationSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "name", + Namespace: "namespace", + }, + Spec: v1alpha1.ApplicationSetSpec{ + Generators: []v1alpha1.ApplicationSetGenerator{generator}, + Template: cc.template, + }, + }, + generators, + renderer, + nil, + ) + + assert.Equal(t, cc.expectedApps, got) + }) + } +} + +// Test app generation from a go template application set using a pull request generator +func TestGenerateAppsUsingPullRequestGenerator(t *testing.T) { + for _, cases := range []struct { + name string + params []map[string]interface{} + template v1alpha1.ApplicationSetTemplate + expectedApp []v1alpha1.Application + }{ + { + name: "Generate an application from a go template application set manifest using a pull request generator", + params: []map[string]interface{}{ + { + "number": "1", + "branch": "branch1", + "branch_slug": "branchSlug1", + "head_sha": "089d92cbf9ff857a39e6feccd32798ca700fb958", + "head_short_sha": "089d92cb", + "branch_slugify_default": "feat/a_really+long_pull_request_name_to_test_argo_slugification_and_branch_name_shortening_feature", + "branch_slugify_smarttruncate_disabled": "feat/areallylongpullrequestnametotestargoslugificationandbranchnameshorteningfeature", + "branch_slugify_smarttruncate_enabled": "feat/testwithsmarttruncateenabledramdomlonglistofcharacters", + "labels": []string{"label1"}, + }, + }, + template: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ + Name: "AppSet-{{.branch}}-{{.number}}", + Labels: map[string]string{ + "app1": "{{index .labels 0}}", + "branch-test1": "AppSet-{{.branch_slugify_default | slugify }}", + "branch-test2": "AppSet-{{.branch_slugify_smarttruncate_disabled | slugify 49 false }}", + "branch-test3": "AppSet-{{.branch_slugify_smarttruncate_enabled | slugify 50 true }}", + }, + }, + Spec: v1alpha1.ApplicationSpec{ + Source: &v1alpha1.ApplicationSource{ + RepoURL: "https://testurl/testRepo", + TargetRevision: "{{.head_short_sha}}", + }, + Destination: v1alpha1.ApplicationDestination{ + Server: "https://kubernetes.default.svc", + Namespace: "AppSet-{{.branch_slug}}-{{.head_sha}}", + }, + }, + }, + expectedApp: []v1alpha1.Application{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "AppSet-branch1-1", + Labels: map[string]string{ + "app1": "label1", + "branch-test1": "AppSet-feat-a-really-long-pull-request-name-to-test-argo", + "branch-test2": "AppSet-feat-areallylongpullrequestnametotestargoslugific", + "branch-test3": "AppSet-feat", + }, + }, + Spec: v1alpha1.ApplicationSpec{ + Source: &v1alpha1.ApplicationSource{ + RepoURL: "https://testurl/testRepo", + TargetRevision: "089d92cb", + }, + Destination: v1alpha1.ApplicationDestination{ + Server: "https://kubernetes.default.svc", + Namespace: "AppSet-branchSlug1-089d92cbf9ff857a39e6feccd32798ca700fb958", + }, + }, + }, + }, + }, + } { + t.Run(cases.name, func(t *testing.T) { + generatorMock := genmock.Generator{} + generator := v1alpha1.ApplicationSetGenerator{ + PullRequest: &v1alpha1.PullRequestGenerator{}, + } + + generatorMock.On("GenerateParams", &generator, mock.AnythingOfType("*v1alpha1.ApplicationSet"), mock.Anything). + Return(cases.params, nil) + + generatorMock.On("GetTemplate", &generator). + Return(&cases.template, nil) + + generators := map[string]generators.Generator{ + "PullRequest": &generatorMock, + } + renderer := &utils.Render{} + + gotApp, _, _ := GenerateApplications(log.NewEntry(log.StandardLogger()), v1alpha1.ApplicationSet{ + Spec: v1alpha1.ApplicationSetSpec{ + GoTemplate: true, + Generators: []v1alpha1.ApplicationSetGenerator{{ + PullRequest: &v1alpha1.PullRequestGenerator{}, + }}, + Template: cases.template, + }, + }, + generators, + renderer, + nil, + ) + assert.EqualValues(t, cases.expectedApp[0].ObjectMeta.Name, gotApp[0].ObjectMeta.Name) + assert.EqualValues(t, cases.expectedApp[0].Spec.Source.TargetRevision, gotApp[0].Spec.Source.TargetRevision) + assert.EqualValues(t, cases.expectedApp[0].Spec.Destination.Namespace, gotApp[0].Spec.Destination.Namespace) + assert.True(t, collections.StringMapsEqual(cases.expectedApp[0].ObjectMeta.Labels, gotApp[0].ObjectMeta.Labels)) + }) + } +} diff --git a/applicationset/generators/interface.go b/applicationset/generators/interface.go index ea105c7842279..14093bac45d98 100644 --- a/applicationset/generators/interface.go +++ b/applicationset/generators/interface.go @@ -9,6 +9,8 @@ import ( argoprojiov1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" ) +//go:generate go run github.com/vektra/mockery/v2@v2.40.2 --name=Generator + // Generator defines the interface implemented by all ApplicationSet generators. type Generator interface { // GenerateParams interprets the ApplicationSet and generates all relevant parameters for the application template. diff --git a/applicationset/generators/matrix_test.go b/applicationset/generators/matrix_test.go index 440fafd3f3ad2..0e37f01ff06d3 100644 --- a/applicationset/generators/matrix_test.go +++ b/applicationset/generators/matrix_test.go @@ -1073,7 +1073,7 @@ func TestGitGenerator_GenerateParams_list_x_git_matrix_generator(t *testing.T) { // of that bug. listGeneratorMock := &generatorMock{} - listGeneratorMock.On("GenerateParams", mock.AnythingOfType("*v1alpha1.ApplicationSetGenerator"), mock.AnythingOfType("*v1alpha1.ApplicationSet")).Return([]map[string]interface{}{ + listGeneratorMock.On("GenerateParams", mock.AnythingOfType("*v1alpha1.ApplicationSetGenerator"), mock.AnythingOfType("*v1alpha1.ApplicationSet"), mock.Anything).Return([]map[string]interface{}{ {"some": "value"}, }, nil) listGeneratorMock.On("GetTemplate", mock.AnythingOfType("*v1alpha1.ApplicationSetGenerator")).Return(&argoprojiov1alpha1.ApplicationSetTemplate{}) diff --git a/applicationset/generators/mocks/generator.go b/applicationset/generators/mocks/generator.go new file mode 100644 index 0000000000000..df337fccb44b2 --- /dev/null +++ b/applicationset/generators/mocks/generator.go @@ -0,0 +1,100 @@ +// Code generated by mockery v2.40.2. DO NOT EDIT. + +package mocks + +import ( + client "sigs.k8s.io/controller-runtime/pkg/client" + + mock "github.com/stretchr/testify/mock" + + time "time" + + v1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" +) + +// Generator is an autogenerated mock type for the Generator type +type Generator struct { + mock.Mock +} + +// GenerateParams provides a mock function with given fields: appSetGenerator, applicationSetInfo, _a2 +func (_m *Generator) GenerateParams(appSetGenerator *v1alpha1.ApplicationSetGenerator, applicationSetInfo *v1alpha1.ApplicationSet, _a2 client.Client) ([]map[string]interface{}, error) { + ret := _m.Called(appSetGenerator, applicationSetInfo, _a2) + + if len(ret) == 0 { + panic("no return value specified for GenerateParams") + } + + var r0 []map[string]interface{} + var r1 error + if rf, ok := ret.Get(0).(func(*v1alpha1.ApplicationSetGenerator, *v1alpha1.ApplicationSet, client.Client) ([]map[string]interface{}, error)); ok { + return rf(appSetGenerator, applicationSetInfo, _a2) + } + if rf, ok := ret.Get(0).(func(*v1alpha1.ApplicationSetGenerator, *v1alpha1.ApplicationSet, client.Client) []map[string]interface{}); ok { + r0 = rf(appSetGenerator, applicationSetInfo, _a2) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]map[string]interface{}) + } + } + + if rf, ok := ret.Get(1).(func(*v1alpha1.ApplicationSetGenerator, *v1alpha1.ApplicationSet, client.Client) error); ok { + r1 = rf(appSetGenerator, applicationSetInfo, _a2) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetRequeueAfter provides a mock function with given fields: appSetGenerator +func (_m *Generator) GetRequeueAfter(appSetGenerator *v1alpha1.ApplicationSetGenerator) time.Duration { + ret := _m.Called(appSetGenerator) + + if len(ret) == 0 { + panic("no return value specified for GetRequeueAfter") + } + + var r0 time.Duration + if rf, ok := ret.Get(0).(func(*v1alpha1.ApplicationSetGenerator) time.Duration); ok { + r0 = rf(appSetGenerator) + } else { + r0 = ret.Get(0).(time.Duration) + } + + return r0 +} + +// GetTemplate provides a mock function with given fields: appSetGenerator +func (_m *Generator) GetTemplate(appSetGenerator *v1alpha1.ApplicationSetGenerator) *v1alpha1.ApplicationSetTemplate { + ret := _m.Called(appSetGenerator) + + if len(ret) == 0 { + panic("no return value specified for GetTemplate") + } + + var r0 *v1alpha1.ApplicationSetTemplate + if rf, ok := ret.Get(0).(func(*v1alpha1.ApplicationSetGenerator) *v1alpha1.ApplicationSetTemplate); ok { + r0 = rf(appSetGenerator) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1alpha1.ApplicationSetTemplate) + } + } + + return r0 +} + +// NewGenerator creates a new instance of Generator. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewGenerator(t interface { + mock.TestingT + Cleanup(func()) +}) *Generator { + mock := &Generator{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/applicationset/generators/pull_request.go b/applicationset/generators/pull_request.go index 54fcb73a2d77f..a453edfc83d55 100644 --- a/applicationset/generators/pull_request.go +++ b/applicationset/generators/pull_request.go @@ -24,19 +24,13 @@ const ( type PullRequestGenerator struct { client client.Client selectServiceProviderFunc func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) - auth SCMAuthProviders - scmRootCAPath string - allowedSCMProviders []string - enableSCMProviders bool + SCMConfig } -func NewPullRequestGenerator(client client.Client, auth SCMAuthProviders, scmRootCAPath string, allowedScmProviders []string, enableSCMProviders bool) Generator { +func NewPullRequestGenerator(client client.Client, scmConfig SCMConfig) Generator { g := &PullRequestGenerator{ - client: client, - auth: auth, - scmRootCAPath: scmRootCAPath, - allowedSCMProviders: allowedScmProviders, - enableSCMProviders: enableSCMProviders, + client: client, + SCMConfig: scmConfig, } g.selectServiceProviderFunc = g.selectServiceProvider return g @@ -193,7 +187,7 @@ func (g *PullRequestGenerator) selectServiceProvider(ctx context.Context, genera func (g *PullRequestGenerator) github(ctx context.Context, cfg *argoprojiov1alpha1.PullRequestGeneratorGithub, applicationSetInfo *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) { // use an app if it was configured if cfg.AppSecretName != "" { - auth, err := g.auth.GitHubApps.GetAuthSecret(ctx, cfg.AppSecretName) + auth, err := g.GitHubApps.GetAuthSecret(ctx, cfg.AppSecretName) if err != nil { return nil, fmt.Errorf("error getting GitHub App secret: %w", err) } diff --git a/applicationset/generators/pull_request_test.go b/applicationset/generators/pull_request_test.go index dc0418554263a..7c95057c0c0ab 100644 --- a/applicationset/generators/pull_request_test.go +++ b/applicationset/generators/pull_request_test.go @@ -324,13 +324,13 @@ func TestAllowedSCMProviderPullRequest(t *testing.T) { t.Run(testCaseCopy.name, func(t *testing.T) { t.Parallel() - pullRequestGenerator := NewPullRequestGenerator(nil, SCMAuthProviders{}, "", []string{ + pullRequestGenerator := NewPullRequestGenerator(nil, NewSCMConfig("", []string{ "github.myorg.com", "gitlab.myorg.com", "gitea.myorg.com", "bitbucket.myorg.com", "azuredevops.myorg.com", - }, true) + }, true, nil)) applicationSetInfo := argoprojiov1alpha1.ApplicationSet{ ObjectMeta: metav1.ObjectMeta{ @@ -353,7 +353,7 @@ func TestAllowedSCMProviderPullRequest(t *testing.T) { } func TestSCMProviderDisabled_PRGenerator(t *testing.T) { - generator := NewPullRequestGenerator(nil, SCMAuthProviders{}, "", []string{}, false) + generator := NewPullRequestGenerator(nil, NewSCMConfig("", []string{}, false, nil)) applicationSetInfo := argoprojiov1alpha1.ApplicationSet{ ObjectMeta: metav1.ObjectMeta{ diff --git a/applicationset/generators/scm_provider.go b/applicationset/generators/scm_provider.go index 0f90240fdb25c..7a3c66754f90c 100644 --- a/applicationset/generators/scm_provider.go +++ b/applicationset/generators/scm_provider.go @@ -29,29 +29,36 @@ type SCMProviderGenerator struct { client client.Client // Testing hooks. overrideProvider scm_provider.SCMProviderService - SCMAuthProviders + SCMConfig +} +type SCMConfig struct { scmRootCAPath string allowedSCMProviders []string enableSCMProviders bool + GitHubApps github_app_auth.Credentials } -type SCMAuthProviders struct { - GitHubApps github_app_auth.Credentials -} - -func NewSCMProviderGenerator(client client.Client, providers SCMAuthProviders, scmRootCAPath string, allowedSCMProviders []string, enableSCMProviders bool) Generator { - return &SCMProviderGenerator{ - client: client, - SCMAuthProviders: providers, +func NewSCMConfig(scmRootCAPath string, allowedSCMProviders []string, enableSCMProviders bool, gitHubApps github_app_auth.Credentials) SCMConfig { + return SCMConfig{ scmRootCAPath: scmRootCAPath, allowedSCMProviders: allowedSCMProviders, enableSCMProviders: enableSCMProviders, + GitHubApps: gitHubApps, + } +} + +func NewSCMProviderGenerator(client client.Client, scmConfig SCMConfig) Generator { + return &SCMProviderGenerator{ + client: client, + SCMConfig: scmConfig, } } // Testing generator func NewTestSCMProviderGenerator(overrideProvider scm_provider.SCMProviderService) Generator { - return &SCMProviderGenerator{overrideProvider: overrideProvider, enableSCMProviders: true} + return &SCMProviderGenerator{overrideProvider: overrideProvider, SCMConfig: SCMConfig{ + enableSCMProviders: true, + }} } func (g *SCMProviderGenerator) GetRequeueAfter(appSetGenerator *argoprojiov1alpha1.ApplicationSetGenerator) time.Duration { diff --git a/applicationset/generators/scm_provider_test.go b/applicationset/generators/scm_provider_test.go index a899633f2b5dc..0b50b4b8b308a 100644 --- a/applicationset/generators/scm_provider_test.go +++ b/applicationset/generators/scm_provider_test.go @@ -174,7 +174,7 @@ func TestSCMProviderGenerateParams(t *testing.T) { mockProvider := &scm_provider.MockProvider{ Repos: testCaseCopy.repos, } - scmGenerator := &SCMProviderGenerator{overrideProvider: mockProvider, enableSCMProviders: true} + scmGenerator := &SCMProviderGenerator{overrideProvider: mockProvider, SCMConfig: SCMConfig{enableSCMProviders: true}} applicationSetInfo := argoprojiov1alpha1.ApplicationSet{ ObjectMeta: metav1.ObjectMeta{ Name: "set", @@ -254,14 +254,16 @@ func TestAllowedSCMProvider(t *testing.T) { t.Parallel() scmGenerator := &SCMProviderGenerator{ - allowedSCMProviders: []string{ - "github.myorg.com", - "gitlab.myorg.com", - "gitea.myorg.com", - "bitbucket.myorg.com", - "azuredevops.myorg.com", + SCMConfig: SCMConfig{ + allowedSCMProviders: []string{ + "github.myorg.com", + "gitlab.myorg.com", + "gitea.myorg.com", + "bitbucket.myorg.com", + "azuredevops.myorg.com", + }, + enableSCMProviders: true, }, - enableSCMProviders: true, } applicationSetInfo := argoprojiov1alpha1.ApplicationSet{ @@ -285,7 +287,7 @@ func TestAllowedSCMProvider(t *testing.T) { } func TestSCMProviderDisabled_SCMGenerator(t *testing.T) { - generator := &SCMProviderGenerator{enableSCMProviders: false} + generator := &SCMProviderGenerator{SCMConfig: SCMConfig{enableSCMProviders: false}} applicationSetInfo := argoprojiov1alpha1.ApplicationSet{ ObjectMeta: metav1.ObjectMeta{ diff --git a/applicationset/generators/utils.go b/applicationset/generators/utils.go new file mode 100644 index 0000000000000..3d106d0a79144 --- /dev/null +++ b/applicationset/generators/utils.go @@ -0,0 +1,49 @@ +package generators + +import ( + "context" + + "k8s.io/client-go/dynamic" + "k8s.io/client-go/kubernetes" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/argoproj/argo-cd/v2/applicationset/services" +) + +func GetGenerators(ctx context.Context, c client.Client, k8sClient kubernetes.Interface, namespace string, argoCDService services.Repos, dynamicClient dynamic.Interface, scmConfig SCMConfig) map[string]Generator { + terminalGenerators := map[string]Generator{ + "List": NewListGenerator(), + "Clusters": NewClusterGenerator(c, ctx, k8sClient, namespace), + "Git": NewGitGenerator(argoCDService), + "SCMProvider": NewSCMProviderGenerator(c, scmConfig), + "ClusterDecisionResource": NewDuckTypeGenerator(ctx, dynamicClient, k8sClient, namespace), + "PullRequest": NewPullRequestGenerator(c, scmConfig), + "Plugin": NewPluginGenerator(c, ctx, k8sClient, namespace), + } + + nestedGenerators := map[string]Generator{ + "List": terminalGenerators["List"], + "Clusters": terminalGenerators["Clusters"], + "Git": terminalGenerators["Git"], + "SCMProvider": terminalGenerators["SCMProvider"], + "ClusterDecisionResource": terminalGenerators["ClusterDecisionResource"], + "PullRequest": terminalGenerators["PullRequest"], + "Plugin": terminalGenerators["Plugin"], + "Matrix": NewMatrixGenerator(terminalGenerators), + "Merge": NewMergeGenerator(terminalGenerators), + } + + topLevelGenerators := map[string]Generator{ + "List": terminalGenerators["List"], + "Clusters": terminalGenerators["Clusters"], + "Git": terminalGenerators["Git"], + "SCMProvider": terminalGenerators["SCMProvider"], + "ClusterDecisionResource": terminalGenerators["ClusterDecisionResource"], + "PullRequest": terminalGenerators["PullRequest"], + "Plugin": terminalGenerators["Plugin"], + "Matrix": NewMatrixGenerator(nestedGenerators), + "Merge": NewMergeGenerator(nestedGenerators), + } + + return topLevelGenerators +} diff --git a/applicationset/status/resource_status.go b/applicationset/status/resource_status.go new file mode 100644 index 0000000000000..4e9db5ff560e9 --- /dev/null +++ b/applicationset/status/resource_status.go @@ -0,0 +1,57 @@ +package status + +import ( + argov1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" +) + +func BuildResourceStatus(statusMap map[string]argov1alpha1.ResourceStatus, apps []argov1alpha1.Application) map[string]argov1alpha1.ResourceStatus { + appMap := map[string]argov1alpha1.Application{} + for _, app := range apps { + appCopy := app + appMap[app.Name] = app + + gvk := app.GroupVersionKind() + // Create status if it does not exist + status, ok := statusMap[app.Name] + if !ok { + status = argov1alpha1.ResourceStatus{ + Group: gvk.Group, + Version: gvk.Version, + Kind: gvk.Kind, + Name: app.Name, + Namespace: app.Namespace, + Status: app.Status.Sync.Status, + Health: &appCopy.Status.Health, + } + } + + status.Group = gvk.Group + status.Version = gvk.Version + status.Kind = gvk.Kind + status.Name = app.Name + status.Namespace = app.Namespace + status.Status = app.Status.Sync.Status + status.Health = &appCopy.Status.Health + + statusMap[app.Name] = status + } + cleanupDeletedApplicationStatuses(statusMap, appMap) + + return statusMap +} + +func GetResourceStatusMap(appset *argov1alpha1.ApplicationSet) map[string]argov1alpha1.ResourceStatus { + statusMap := map[string]argov1alpha1.ResourceStatus{} + for _, status := range appset.Status.Resources { + statusMap[status.Name] = status + } + return statusMap +} + +func cleanupDeletedApplicationStatuses(statusMap map[string]argov1alpha1.ResourceStatus, apps map[string]argov1alpha1.Application) { + for name := range statusMap { + if _, ok := apps[name]; !ok { + delete(statusMap, name) + } + } +} diff --git a/applicationset/utils/mocks/renderer.go b/applicationset/utils/mocks/renderer.go new file mode 100644 index 0000000000000..a8b5fccead5a2 --- /dev/null +++ b/applicationset/utils/mocks/renderer.go @@ -0,0 +1,86 @@ +// Code generated by mockery v2.40.2. DO NOT EDIT. + +package mocks + +import ( + mock "github.com/stretchr/testify/mock" + + v1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" +) + +// Renderer is an autogenerated mock type for the Renderer type +type Renderer struct { + mock.Mock +} + +// RenderTemplateParams provides a mock function with given fields: tmpl, syncPolicy, params, useGoTemplate, goTemplateOptions +func (_m *Renderer) RenderTemplateParams(tmpl *v1alpha1.Application, syncPolicy *v1alpha1.ApplicationSetSyncPolicy, params map[string]interface{}, useGoTemplate bool, goTemplateOptions []string) (*v1alpha1.Application, error) { + ret := _m.Called(tmpl, syncPolicy, params, useGoTemplate, goTemplateOptions) + + if len(ret) == 0 { + panic("no return value specified for RenderTemplateParams") + } + + var r0 *v1alpha1.Application + var r1 error + if rf, ok := ret.Get(0).(func(*v1alpha1.Application, *v1alpha1.ApplicationSetSyncPolicy, map[string]interface{}, bool, []string) (*v1alpha1.Application, error)); ok { + return rf(tmpl, syncPolicy, params, useGoTemplate, goTemplateOptions) + } + if rf, ok := ret.Get(0).(func(*v1alpha1.Application, *v1alpha1.ApplicationSetSyncPolicy, map[string]interface{}, bool, []string) *v1alpha1.Application); ok { + r0 = rf(tmpl, syncPolicy, params, useGoTemplate, goTemplateOptions) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1alpha1.Application) + } + } + + if rf, ok := ret.Get(1).(func(*v1alpha1.Application, *v1alpha1.ApplicationSetSyncPolicy, map[string]interface{}, bool, []string) error); ok { + r1 = rf(tmpl, syncPolicy, params, useGoTemplate, goTemplateOptions) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Replace provides a mock function with given fields: tmpl, replaceMap, useGoTemplate, goTemplateOptions +func (_m *Renderer) Replace(tmpl string, replaceMap map[string]interface{}, useGoTemplate bool, goTemplateOptions []string) (string, error) { + ret := _m.Called(tmpl, replaceMap, useGoTemplate, goTemplateOptions) + + if len(ret) == 0 { + panic("no return value specified for Replace") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(string, map[string]interface{}, bool, []string) (string, error)); ok { + return rf(tmpl, replaceMap, useGoTemplate, goTemplateOptions) + } + if rf, ok := ret.Get(0).(func(string, map[string]interface{}, bool, []string) string); ok { + r0 = rf(tmpl, replaceMap, useGoTemplate, goTemplateOptions) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(string, map[string]interface{}, bool, []string) error); ok { + r1 = rf(tmpl, replaceMap, useGoTemplate, goTemplateOptions) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewRenderer creates a new instance of Renderer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRenderer(t interface { + mock.TestingT + Cleanup(func()) +}) *Renderer { + mock := &Renderer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/applicationset/utils/utils.go b/applicationset/utils/utils.go index dfcc11cbdd35a..c387c2c47ebb6 100644 --- a/applicationset/utils/utils.go +++ b/applicationset/utils/utils.go @@ -25,6 +25,8 @@ import ( argoappsv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" ) +//go:generate go run github.com/vektra/mockery/v2@v2.40.2 --name=Renderer + var sprigFuncMap = sprig.GenericFuncMap() // a singleton for better performance func init() { diff --git a/assets/swagger.json b/assets/swagger.json index 7d863dc71a028..fb3f457322cac 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -1967,6 +1967,11 @@ "type": "boolean", "name": "upsert", "in": "query" + }, + { + "type": "boolean", + "name": "dryRun", + "in": "query" } ], "responses": { @@ -6960,7 +6965,7 @@ }, "serverVersion": { "type": "string", - "title": "DEPRECATED: use Info.ServerVersion field instead.\nThe server version" + "title": "Deprecated: use Info.ServerVersion field instead.\nThe server version" }, "shard": { "description": "Shard contains optional shard number. Calculated on the fly by the application controller if not specified.", diff --git a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go index b90bd7dbd1f65..5d4c8fe15c487 100644 --- a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go +++ b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go @@ -152,9 +152,7 @@ func NewCommand() *cobra.Command { appSetConfig := appclientset.NewForConfigOrDie(mgr.GetConfig()) argoCDDB := db.NewDB(namespace, argoSettingsMgr, k8sClient) - scmAuth := generators.SCMAuthProviders{ - GitHubApps: github_app.NewAuthCredentials(argoCDDB.(db.RepoCredsDB)), - } + scmConfig := generators.NewSCMConfig(scmRootCAPath, allowedScmProviders, enableScmProviders, github_app.NewAuthCredentials(argoCDDB.(db.RepoCredsDB))) tlsConfig := apiclient.TLSConfiguration{ DisableTLS: repoServerPlaintext, @@ -174,39 +172,7 @@ func NewCommand() *cobra.Command { argoCDService, err := services.NewArgoCDService(argoCDDB.GetRepository, gitSubmoduleEnabled, repoClientset, enableNewGitFileGlobbing) errors.CheckError(err) - terminalGenerators := map[string]generators.Generator{ - "List": generators.NewListGenerator(), - "Clusters": generators.NewClusterGenerator(mgr.GetClient(), ctx, k8sClient, namespace), - "Git": generators.NewGitGenerator(argoCDService), - "SCMProvider": generators.NewSCMProviderGenerator(mgr.GetClient(), scmAuth, scmRootCAPath, allowedScmProviders, enableScmProviders), - "ClusterDecisionResource": generators.NewDuckTypeGenerator(ctx, dynamicClient, k8sClient, namespace), - "PullRequest": generators.NewPullRequestGenerator(mgr.GetClient(), scmAuth, scmRootCAPath, allowedScmProviders, enableScmProviders), - "Plugin": generators.NewPluginGenerator(mgr.GetClient(), ctx, k8sClient, namespace), - } - - nestedGenerators := map[string]generators.Generator{ - "List": terminalGenerators["List"], - "Clusters": terminalGenerators["Clusters"], - "Git": terminalGenerators["Git"], - "SCMProvider": terminalGenerators["SCMProvider"], - "ClusterDecisionResource": terminalGenerators["ClusterDecisionResource"], - "PullRequest": terminalGenerators["PullRequest"], - "Plugin": terminalGenerators["Plugin"], - "Matrix": generators.NewMatrixGenerator(terminalGenerators), - "Merge": generators.NewMergeGenerator(terminalGenerators), - } - - topLevelGenerators := map[string]generators.Generator{ - "List": terminalGenerators["List"], - "Clusters": terminalGenerators["Clusters"], - "Git": terminalGenerators["Git"], - "SCMProvider": terminalGenerators["SCMProvider"], - "ClusterDecisionResource": terminalGenerators["ClusterDecisionResource"], - "PullRequest": terminalGenerators["PullRequest"], - "Plugin": terminalGenerators["Plugin"], - "Matrix": generators.NewMatrixGenerator(nestedGenerators), - "Merge": generators.NewMergeGenerator(nestedGenerators), - } + topLevelGenerators := generators.GetGenerators(ctx, mgr.GetClient(), k8sClient, namespace, argoCDService, dynamicClient, scmConfig) // start a webhook server that listens to incoming webhook payloads webhookHandler, err := webhook.NewWebhookHandler(namespace, argoSettingsMgr, mgr.GetClient(), topLevelGenerators) diff --git a/cmd/argocd-server/commands/argocd_server.go b/cmd/argocd-server/commands/argocd_server.go index 707cc2d80eaf5..e3ba8141c51c8 100644 --- a/cmd/argocd-server/commands/argocd_server.go +++ b/cmd/argocd-server/commands/argocd_server.go @@ -12,8 +12,10 @@ import ( "github.com/argoproj/pkg/stats" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" + "sigs.k8s.io/controller-runtime/pkg/client" cmdutil "github.com/argoproj/argo-cd/v2/cmd/util" "github.com/argoproj/argo-cd/v2/common" @@ -42,6 +44,7 @@ const ( var ( failureRetryCount = env.ParseNumFromEnv(failureRetryCountEnv, 0, 0, 10) failureRetryPeriodMilliSeconds = env.ParseNumFromEnv(failureRetryPeriodMilliSecondsEnv, 100, 0, 1000) + gitSubmoduleEnabled = env.ParseBoolFromEnv(common.EnvGitSubmoduleEnabled, true) ) // NewCommand returns a new instance of an argocd command @@ -79,6 +82,12 @@ func NewCommand() *cobra.Command { staticAssetsDir string applicationNamespaces []string enableProxyExtension bool + + // ApplicationSet + enableNewGitFileGlobbing bool + scmRootCAPath string + allowedScmProviders []string + enableScmProviders bool ) command := &cobra.Command{ Use: cliName, @@ -130,6 +139,12 @@ func NewCommand() *cobra.Command { StrictValidation: repoServerStrictTLS, } + dynamicClient := dynamic.NewForConfigOrDie(config) + + controllerClient, err := client.New(config, client.Options{}) + errors.CheckError(err) + controllerClient = client.NewDryRunClient(controllerClient) + // Load CA information to use for validating connections to the // repository server, if strict TLS validation was requested. if !repoServerPlaintext && repoServerStrictTLS { @@ -179,37 +194,47 @@ func NewCommand() *cobra.Command { } argoCDOpts := server.ArgoCDServerOpts{ - Insecure: insecure, - ListenPort: listenPort, - ListenHost: listenHost, - MetricsPort: metricsPort, - MetricsHost: metricsHost, - Namespace: namespace, - BaseHRef: baseHRef, - RootPath: rootPath, - KubeClientset: kubeclientset, - AppClientset: appClientSet, - RepoClientset: repoclientset, - DexServerAddr: dexServerAddress, - DexTLSConfig: dexTlsConfig, - DisableAuth: disableAuth, - ContentTypes: contentTypesList, - EnableGZip: enableGZip, - TLSConfigCustomizer: tlsConfigCustomizer, - Cache: cache, - RepoServerCache: repoServerCache, - XFrameOptions: frameOptions, - ContentSecurityPolicy: contentSecurityPolicy, - RedisClient: redisClient, - StaticAssetsDir: staticAssetsDir, - ApplicationNamespaces: applicationNamespaces, - EnableProxyExtension: enableProxyExtension, + Insecure: insecure, + ListenPort: listenPort, + ListenHost: listenHost, + MetricsPort: metricsPort, + MetricsHost: metricsHost, + Namespace: namespace, + BaseHRef: baseHRef, + RootPath: rootPath, + DynamicClientset: dynamicClient, + KubeControllerClientset: controllerClient, + KubeClientset: kubeclientset, + AppClientset: appClientSet, + RepoClientset: repoclientset, + DexServerAddr: dexServerAddress, + DexTLSConfig: dexTlsConfig, + DisableAuth: disableAuth, + ContentTypes: contentTypesList, + EnableGZip: enableGZip, + TLSConfigCustomizer: tlsConfigCustomizer, + Cache: cache, + RepoServerCache: repoServerCache, + XFrameOptions: frameOptions, + ContentSecurityPolicy: contentSecurityPolicy, + RedisClient: redisClient, + StaticAssetsDir: staticAssetsDir, + ApplicationNamespaces: applicationNamespaces, + EnableProxyExtension: enableProxyExtension, + } + + appsetOpts := server.ApplicationSetOpts{ + GitSubmoduleEnabled: gitSubmoduleEnabled, + EnableNewGitFileGlobbing: enableNewGitFileGlobbing, + ScmRootCAPath: scmRootCAPath, + AllowedScmProviders: allowedScmProviders, + EnableScmProviders: enableScmProviders, } stats.RegisterStackDumper() stats.StartStatsTicker(10 * time.Minute) stats.RegisterHeapDumper("memprofile") - argocd := server.NewServer(ctx, argoCDOpts) + argocd := server.NewServer(ctx, argoCDOpts, appsetOpts) argocd.Init(ctx) lns, err := argocd.Listen() errors.CheckError(err) @@ -232,7 +257,7 @@ func NewCommand() *cobra.Command { Example: templates.Examples(` # Start the Argo CD API server with default settings $ argocd-server - + # Start the Argo CD API server on a custom port and enable tracing $ argocd-server --port 8888 --otlp-address localhost:4317 `), @@ -269,6 +294,13 @@ func NewCommand() *cobra.Command { command.Flags().BoolVar(&dexServerStrictTLS, "dex-server-strict-tls", env.ParseBoolFromEnv("ARGOCD_SERVER_DEX_SERVER_STRICT_TLS", false), "Perform strict validation of TLS certificates when connecting to dex server") command.Flags().StringSliceVar(&applicationNamespaces, "application-namespaces", env.StringsFromEnv("ARGOCD_APPLICATION_NAMESPACES", []string{}, ","), "List of additional namespaces where application resources can be managed in") command.Flags().BoolVar(&enableProxyExtension, "enable-proxy-extension", env.ParseBoolFromEnv("ARGOCD_SERVER_ENABLE_PROXY_EXTENSION", false), "Enable Proxy Extension feature") + + // Flags related to the applicationSet component. + command.Flags().StringVar(&scmRootCAPath, "appset-scm-root-ca-path", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_SCM_ROOT_CA_PATH", ""), "Provide Root CA Path for self-signed TLS Certificates") + command.Flags().BoolVar(&enableScmProviders, "appset-enable-scm-providers", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS", true), "Enable retrieving information from SCM providers, used by the SCM and PR generators (Default: true)") + command.Flags().StringSliceVar(&allowedScmProviders, "appset-allowed-scm-providers", env.StringsFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS", []string{}, ","), "The list of allowed custom SCM provider API URLs. This restriction does not apply to SCM or PR generators which do not accept a custom API URL. (Default: Empty = all)") + command.Flags().BoolVar(&enableNewGitFileGlobbing, "appset-enable-new-git-file-globbing", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING", false), "Enable new globbing in Git files generator.") + tlsConfigCustomizerSrc = tls.AddTLSFlagsToCmd(command) cacheSrc = servercache.AddCacheFlagsToCmd(command, cacheutil.Options{ OnClientCreated: func(client *redis.Client) { diff --git a/cmd/argocd/commands/applicationset.go b/cmd/argocd/commands/applicationset.go index ed125629b9393..bd9dff90891a0 100644 --- a/cmd/argocd/commands/applicationset.go +++ b/cmd/argocd/commands/applicationset.go @@ -114,13 +114,17 @@ func NewApplicationSetGetCommand(clientOpts *argocdclient.ClientOptions) *cobra. // NewApplicationSetCreateCommand returns a new instance of an `argocd appset create` command func NewApplicationSetCreateCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command { - var upsert bool + var output string + var upsert, dryRun bool command := &cobra.Command{ Use: "create", Short: "Create one or more ApplicationSets", Example: templates.Examples(` # Create ApplicationSets argocd appset create (...) + + # Dry-run AppSet creation to see what applications would be managed + argocd appset create --dry-run -o json | jq -r '.status.resources[].name' `), Run: func(c *cobra.Command, args []string) { ctx := c.Context() @@ -157,10 +161,16 @@ func NewApplicationSetCreateCommand(clientOpts *argocdclient.ClientOptions) *cob appSetCreateRequest := applicationset.ApplicationSetCreateRequest{ Applicationset: appset, Upsert: upsert, + DryRun: dryRun, } created, err := appIf.Create(ctx, &appSetCreateRequest) errors.CheckError(err) + dryRunMsg := "" + if dryRun { + dryRunMsg = " (dry-run)" + } + var action string if existing == nil { action = "created" @@ -170,11 +180,31 @@ func NewApplicationSetCreateCommand(clientOpts *argocdclient.ClientOptions) *cob action = "updated" } - fmt.Printf("ApplicationSet '%s' %s\n", created.ObjectMeta.Name, action) + c.PrintErrf("ApplicationSet '%s' %s%s\n", created.ObjectMeta.Name, action, dryRunMsg) + + switch output { + case "yaml", "json": + err := PrintResource(created, output) + errors.CheckError(err) + case "wide", "": + printAppSetSummaryTable(created) + + if len(created.Status.Conditions) > 0 { + fmt.Println() + w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) + printAppSetConditions(w, created) + _ = w.Flush() + fmt.Println() + } + default: + errors.CheckError(fmt.Errorf("unknown output format: %s", output)) + } } }, } command.Flags().BoolVar(&upsert, "upsert", false, "Allows to override ApplicationSet with the same name even if supplied ApplicationSet spec is different from existing spec") + command.Flags().BoolVar(&dryRun, "dry-run", false, "Allows to evaluate the ApplicationSet template on the server to get a preview of the applications that would be created") + command.Flags().StringVarP(&output, "output", "o", "wide", "Output format. One of: json|yaml|wide") return command } @@ -189,7 +219,7 @@ func NewApplicationSetListCommand(clientOpts *argocdclient.ClientOptions) *cobra command := &cobra.Command{ Use: "list", Short: "List ApplicationSets", - Example: templates.Examples(` + Example: templates.Examples(` # List all ApplicationSets argocd appset list `), @@ -230,7 +260,7 @@ func NewApplicationSetDeleteCommand(clientOpts *argocdclient.ClientOptions) *cob command := &cobra.Command{ Use: "delete", Short: "Delete one or more ApplicationSets", - Example: templates.Examples(` + Example: templates.Examples(` # Delete an applicationset argocd appset delete APPSETNAME (APPSETNAME...) `), diff --git a/cmd/argocd/commands/headless/headless.go b/cmd/argocd/commands/headless/headless.go index d148e527abab4..9ef70ae1c4748 100644 --- a/cmd/argocd/commands/headless/headless.go +++ b/cmd/argocd/commands/headless/headless.go @@ -9,6 +9,7 @@ import ( "time" "github.com/spf13/cobra" + "sigs.k8s.io/controller-runtime/pkg/client" "github.com/argoproj/argo-cd/v2/cmd/argocd/commands/initialize" "github.com/argoproj/argo-cd/v2/common" @@ -20,6 +21,7 @@ import ( "github.com/spf13/pflag" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" cache2 "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/clientcmd" @@ -231,6 +233,17 @@ func MaybeStartLocalServer(ctx context.Context, clientOpts *apiclient.ClientOpti return fmt.Errorf("error creating kubernetes clientset: %w", err) } + dynamicClientset, err := dynamic.NewForConfig(restConfig) + if err != nil { + return fmt.Errorf("error creating kubernetes dynamic clientset: %w", err) + } + + controllerClientset, err := client.New(restConfig, client.Options{}) + if err != nil { + return fmt.Errorf("error creating kubernetes controller clientset: %w", err) + } + controllerClientset = client.NewDryRunClient(controllerClientset) + namespace, _, err := clientConfig.Namespace() if err != nil { return fmt.Errorf("error getting namespace: %w", err) @@ -242,19 +255,21 @@ func MaybeStartLocalServer(ctx context.Context, clientOpts *apiclient.ClientOpti } appstateCache := appstatecache.NewCache(cache.NewCache(&forwardCacheClient{namespace: namespace, context: ctxStr, compression: compression, redisHaProxyName: clientOpts.RedisHaProxyName, redisName: clientOpts.RedisName}), time.Hour) srv := server.NewServer(ctx, server.ArgoCDServerOpts{ - EnableGZip: false, - Namespace: namespace, - ListenPort: *port, - AppClientset: appClientset, - DisableAuth: true, - RedisClient: redis.NewClient(&redis.Options{Addr: mr.Addr()}), - Cache: servercache.NewCache(appstateCache, 0, 0, 0), - KubeClientset: kubeClientset, - Insecure: true, - ListenHost: *address, - RepoClientset: &forwardRepoClientset{namespace: namespace, context: ctxStr, repoServerName: clientOpts.RepoServerName, kubeClientset: kubeClientset}, - EnableProxyExtension: false, - }) + EnableGZip: false, + Namespace: namespace, + ListenPort: *port, + AppClientset: appClientset, + DisableAuth: true, + RedisClient: redis.NewClient(&redis.Options{Addr: mr.Addr()}), + Cache: servercache.NewCache(appstateCache, 0, 0, 0), + KubeClientset: kubeClientset, + DynamicClientset: dynamicClientset, + KubeControllerClientset: controllerClientset, + Insecure: true, + ListenHost: *address, + RepoClientset: &forwardRepoClientset{namespace: namespace, context: ctxStr, repoServerName: clientOpts.RepoServerName, kubeClientset: kubeClientset}, + EnableProxyExtension: false, + }, server.ApplicationSetOpts{}) srv.Init(ctx) lns, err := srv.Listen() diff --git a/docs/operator-manual/applicationset/Controlling-Resource-Modification.md b/docs/operator-manual/applicationset/Controlling-Resource-Modification.md index ae65fa3462e5b..1636d348cb009 100644 --- a/docs/operator-manual/applicationset/Controlling-Resource-Modification.md +++ b/docs/operator-manual/applicationset/Controlling-Resource-Modification.md @@ -343,3 +343,15 @@ metadata: data: applicationsetcontroller.log.level: debug ``` + +## Previewing changes + +To preview changes that the ApplicationSet controller would make to Applications, you can create the AppSet in dry-run +mode. This works whether the AppSet already exists or not. + +```shell +argocd appset create --dry-run ./appset.yaml -o json | jq -r '.status.resources[].name' +``` + +The dry-run will populate the returned ApplicationSet's status with the Applications which would be managed with the +given config. You can compare to the existing Applications to see what would change. diff --git a/docs/operator-manual/server-commands/argocd-server.md b/docs/operator-manual/server-commands/argocd-server.md index 5b3fd72ebff00..882603d080d89 100644 --- a/docs/operator-manual/server-commands/argocd-server.md +++ b/docs/operator-manual/server-commands/argocd-server.md @@ -29,6 +29,10 @@ argocd-server [flags] --api-content-types string Semicolon separated list of allowed content types for non GET api requests. Any content type is allowed if empty. (default "application/json") --app-state-cache-expiration duration Cache expiration for app state (default 1h0m0s) --application-namespaces strings List of additional namespaces where application resources can be managed in + --appset-allowed-scm-providers strings The list of allowed custom SCM provider API URLs. This restriction does not apply to SCM or PR generators which do not accept a custom API URL. (Default: Empty = all) + --appset-enable-new-git-file-globbing Enable new globbing in Git files generator. + --appset-enable-scm-providers Enable retrieving information from SCM providers, used by the SCM and PR generators (Default: true) (default true) + --appset-scm-root-ca-path string Provide Root CA Path for self-signed TLS Certificates --as string Username to impersonate for the operation --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. --as-uid string UID to impersonate for the operation diff --git a/docs/user-guide/commands/argocd_appset_create.md b/docs/user-guide/commands/argocd_appset_create.md index fccc03fcc971c..70c9d6b61c84f 100644 --- a/docs/user-guide/commands/argocd_appset_create.md +++ b/docs/user-guide/commands/argocd_appset_create.md @@ -13,13 +13,18 @@ argocd appset create [flags] ``` # Create ApplicationSets argocd appset create (...) + + # Dry-run AppSet creation to see what applications would be managed + argocd appset create --dry-run -o json | jq -r '.status.resources[].name' ``` ### Options ``` - -h, --help help for create - --upsert Allows to override ApplicationSet with the same name even if supplied ApplicationSet spec is different from existing spec + --dry-run Allows to evaluate the ApplicationSet template on the server to get a preview of the applications that would be created + -h, --help help for create + -o, --output string Output format. One of: json|yaml|wide (default "wide") + --upsert Allows to override ApplicationSet with the same name even if supplied ApplicationSet spec is different from existing spec ``` ### Options inherited from parent commands diff --git a/manifests/base/server/argocd-server-deployment.yaml b/manifests/base/server/argocd-server-deployment.yaml index 1107323b2e3b9..b9486e7b4b2c6 100644 --- a/manifests/base/server/argocd-server-deployment.yaml +++ b/manifests/base/server/argocd-server-deployment.yaml @@ -17,332 +17,356 @@ spec: spec: serviceAccountName: argocd-server containers: - - name: argocd-server - image: quay.io/argoproj/argocd:latest - imagePullPolicy: Always - args: - - /usr/local/bin/argocd-server - env: - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - key: auth - name: argocd-redis - - name: ARGOCD_SERVER_INSECURE - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.insecure - optional: true - - name: ARGOCD_SERVER_BASEHREF - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.basehref - optional: true - - name: ARGOCD_SERVER_ROOTPATH - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.rootpath - optional: true - - name: ARGOCD_SERVER_LOGFORMAT - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.log.format - optional: true - - name: ARGOCD_SERVER_LOG_LEVEL - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.log.level - optional: true - - name: ARGOCD_SERVER_REPO_SERVER - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: repo.server - optional: true - - name: ARGOCD_SERVER_DEX_SERVER - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.dex.server - optional: true - - name: ARGOCD_SERVER_DISABLE_AUTH - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.disable.auth - optional: true - - name: ARGOCD_SERVER_ENABLE_GZIP - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.enable.gzip - optional: true - - name: ARGOCD_SERVER_REPO_SERVER_TIMEOUT_SECONDS - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.repo.server.timeout.seconds - optional: true - - name: ARGOCD_SERVER_X_FRAME_OPTIONS - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.x.frame.options - optional: true - - name: ARGOCD_SERVER_CONTENT_SECURITY_POLICY - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.content.security.policy - optional: true - - name: ARGOCD_SERVER_REPO_SERVER_PLAINTEXT - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.repo.server.plaintext - optional: true - - name: ARGOCD_SERVER_REPO_SERVER_STRICT_TLS - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.repo.server.strict.tls - optional: true - - name: ARGOCD_SERVER_DEX_SERVER_PLAINTEXT - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.dex.server.plaintext - optional: true - - name: ARGOCD_SERVER_DEX_SERVER_STRICT_TLS - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.dex.server.strict.tls - optional: true - - name: ARGOCD_TLS_MIN_VERSION - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.tls.minversion - optional: true - - name: ARGOCD_TLS_MAX_VERSION - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.tls.maxversion - optional: true - - name: ARGOCD_TLS_CIPHERS - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.tls.ciphers - optional: true - - name: ARGOCD_SERVER_CONNECTION_STATUS_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.connection.status.cache.expiration - optional: true - - name: ARGOCD_SERVER_OIDC_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.oidc.cache.expiration - optional: true - - name: ARGOCD_SERVER_LOGIN_ATTEMPTS_EXPIRATION - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.login.attempts.expiration - optional: true - - name: ARGOCD_SERVER_STATIC_ASSETS - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.staticassets - optional: true - - name: ARGOCD_APP_STATE_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.app.state.cache.expiration - optional: true - - name: REDIS_SERVER - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: redis.server - optional: true - - name: REDIS_COMPRESSION - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: redis.compression - optional: true - - name: REDISDB - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: redis.db - optional: true - - name: ARGOCD_DEFAULT_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.default.cache.expiration - optional: true - - name: ARGOCD_MAX_COOKIE_NUMBER - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.http.cookie.maxnumber - optional: true - - name: ARGOCD_SERVER_LISTEN_ADDRESS - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.listen.address - optional: true - - name: ARGOCD_SERVER_METRICS_LISTEN_ADDRESS - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.metrics.listen.address - optional: true - - name: ARGOCD_SERVER_OTLP_ADDRESS - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: otlp.address - optional: true - - name: ARGOCD_SERVER_OTLP_INSECURE - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: otlp.insecure - optional: true - - name: ARGOCD_SERVER_OTLP_HEADERS - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: otlp.headers - optional: true - - name: ARGOCD_APPLICATION_NAMESPACES - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: application.namespaces - optional: true - - name: ARGOCD_SERVER_ENABLE_PROXY_EXTENSION - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.enable.proxy.extension - optional: true - - name: ARGOCD_K8SCLIENT_RETRY_MAX - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.k8sclient.retry.max - optional: true - - name: ARGOCD_K8SCLIENT_RETRY_BASE_BACKOFF - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.k8sclient.retry.base.backoff - optional: true - - name: ARGOCD_API_CONTENT_TYPES - valueFrom: - configMapKeyRef: - name: argocd-cmd-params-cm - key: server.api.content.types - optional: true - volumeMounts: + - name: argocd-server + image: quay.io/argoproj/argocd:latest + imagePullPolicy: Always + args: + - /usr/local/bin/argocd-server + env: + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + key: auth + name: argocd-redis + - name: ARGOCD_SERVER_INSECURE + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.insecure + optional: true + - name: ARGOCD_SERVER_BASEHREF + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.basehref + optional: true + - name: ARGOCD_SERVER_ROOTPATH + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.rootpath + optional: true + - name: ARGOCD_SERVER_LOGFORMAT + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.log.format + optional: true + - name: ARGOCD_SERVER_LOG_LEVEL + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.log.level + optional: true + - name: ARGOCD_SERVER_REPO_SERVER + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: repo.server + optional: true + - name: ARGOCD_SERVER_DEX_SERVER + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.dex.server + optional: true + - name: ARGOCD_SERVER_DISABLE_AUTH + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.disable.auth + optional: true + - name: ARGOCD_SERVER_ENABLE_GZIP + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.enable.gzip + optional: true + - name: ARGOCD_SERVER_REPO_SERVER_TIMEOUT_SECONDS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.repo.server.timeout.seconds + optional: true + - name: ARGOCD_SERVER_X_FRAME_OPTIONS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.x.frame.options + optional: true + - name: ARGOCD_SERVER_CONTENT_SECURITY_POLICY + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.content.security.policy + optional: true + - name: ARGOCD_SERVER_REPO_SERVER_PLAINTEXT + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.repo.server.plaintext + optional: true + - name: ARGOCD_SERVER_REPO_SERVER_STRICT_TLS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.repo.server.strict.tls + optional: true + - name: ARGOCD_SERVER_DEX_SERVER_PLAINTEXT + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.dex.server.plaintext + optional: true + - name: ARGOCD_SERVER_DEX_SERVER_STRICT_TLS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.dex.server.strict.tls + optional: true + - name: ARGOCD_TLS_MIN_VERSION + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.tls.minversion + optional: true + - name: ARGOCD_TLS_MAX_VERSION + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.tls.maxversion + optional: true + - name: ARGOCD_TLS_CIPHERS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.tls.ciphers + optional: true + - name: ARGOCD_SERVER_CONNECTION_STATUS_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.connection.status.cache.expiration + optional: true + - name: ARGOCD_SERVER_OIDC_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.oidc.cache.expiration + optional: true + - name: ARGOCD_SERVER_LOGIN_ATTEMPTS_EXPIRATION + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.login.attempts.expiration + optional: true + - name: ARGOCD_SERVER_STATIC_ASSETS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.staticassets + optional: true + - name: ARGOCD_APP_STATE_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.app.state.cache.expiration + optional: true + - name: REDIS_SERVER + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: redis.server + optional: true + - name: REDIS_COMPRESSION + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: redis.compression + optional: true + - name: REDISDB + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: redis.db + optional: true + - name: ARGOCD_DEFAULT_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.default.cache.expiration + optional: true + - name: ARGOCD_MAX_COOKIE_NUMBER + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.http.cookie.maxnumber + optional: true + - name: ARGOCD_SERVER_LISTEN_ADDRESS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.listen.address + optional: true + - name: ARGOCD_SERVER_METRICS_LISTEN_ADDRESS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.metrics.listen.address + optional: true + - name: ARGOCD_SERVER_OTLP_ADDRESS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: otlp.address + optional: true + - name: ARGOCD_SERVER_OTLP_INSECURE + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: otlp.insecure + optional: true + - name: ARGOCD_SERVER_OTLP_HEADERS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: otlp.headers + optional: true + - name: ARGOCD_APPLICATION_NAMESPACES + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: application.namespaces + optional: true + - name: ARGOCD_SERVER_ENABLE_PROXY_EXTENSION + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.enable.proxy.extension + optional: true + - name: ARGOCD_K8SCLIENT_RETRY_MAX + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.k8sclient.retry.max + optional: true + - name: ARGOCD_K8SCLIENT_RETRY_BASE_BACKOFF + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.k8sclient.retry.base.backoff + optional: true + - name: ARGOCD_API_CONTENT_TYPES + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: server.api.content.types + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.new.git.file.globbing + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_SCM_ROOT_CA_PATH + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.scm.root.ca.path + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: applicationsetcontroller.allowed.scm.providers + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: applicationsetcontroller.enable.scm.providers + optional: true + volumeMounts: + - name: ssh-known-hosts + mountPath: /app/config/ssh + - name: tls-certs + mountPath: /app/config/tls + - name: argocd-repo-server-tls + mountPath: /app/config/server/tls + - name: argocd-dex-server-tls + mountPath: /app/config/dex/tls + - mountPath: /home/argocd + name: plugins-home + - mountPath: /tmp + name: tmp + ports: + - containerPort: 8080 + - containerPort: 8083 + livenessProbe: + httpGet: + path: /healthz?full=true + port: 8080 + initialDelaySeconds: 3 + periodSeconds: 30 + timeoutSeconds: 5 + readinessProbe: + httpGet: + path: /healthz + port: 8080 + initialDelaySeconds: 3 + periodSeconds: 30 + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + runAsNonRoot: true + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + volumes: + - emptyDir: {} + name: plugins-home + - emptyDir: {} + name: tmp - name: ssh-known-hosts - mountPath: /app/config/ssh + configMap: + name: argocd-ssh-known-hosts-cm - name: tls-certs - mountPath: /app/config/tls + configMap: + name: argocd-tls-certs-cm - name: argocd-repo-server-tls - mountPath: /app/config/server/tls + secret: + secretName: argocd-repo-server-tls + optional: true + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + - key: ca.crt + path: ca.crt - name: argocd-dex-server-tls - mountPath: /app/config/dex/tls - - mountPath: /home/argocd - name: plugins-home - - mountPath: /tmp - name: tmp - ports: - - containerPort: 8080 - - containerPort: 8083 - livenessProbe: - httpGet: - path: /healthz?full=true - port: 8080 - initialDelaySeconds: 3 - periodSeconds: 30 - timeoutSeconds: 5 - readinessProbe: - httpGet: - path: /healthz - port: 8080 - initialDelaySeconds: 3 - periodSeconds: 30 - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - runAsNonRoot: true - capabilities: - drop: - - ALL - seccompProfile: - type: RuntimeDefault - volumes: - - emptyDir: {} - name: plugins-home - - emptyDir: {} - name: tmp - - name: ssh-known-hosts - configMap: - name: argocd-ssh-known-hosts-cm - - name: tls-certs - configMap: - name: argocd-tls-certs-cm - - name: argocd-repo-server-tls - secret: - secretName: argocd-repo-server-tls - optional: true - items: - - key: tls.crt - path: tls.crt - - key: tls.key - path: tls.key - - key: ca.crt - path: ca.crt - - name: argocd-dex-server-tls - secret: - secretName: argocd-dex-server-tls - optional: true - items: - - key: tls.crt - path: tls.crt - - key: ca.crt - path: ca.crt + secret: + secretName: argocd-dex-server-tls + optional: true + items: + - key: tls.crt + path: tls.crt + - key: ca.crt + path: ca.crt affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - - weight: 100 - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/name: argocd-server - topologyKey: kubernetes.io/hostname - - weight: 5 - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/part-of: argocd - topologyKey: kubernetes.io/hostname + - weight: 100 + podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/name: argocd-server + topologyKey: kubernetes.io/hostname + - weight: 5 + podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/part-of: argocd + topologyKey: kubernetes.io/hostname diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index d77bb1b84fabb..31c131e973b7f 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -23590,6 +23590,30 @@ spec: key: server.api.content.types name: argocd-cmd-params-cm optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.new.git.file.globbing + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_SCM_ROOT_CA_PATH + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.scm.root.ca.path + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.allowed.scm.providers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.scm.providers + name: argocd-cmd-params-cm + optional: true image: quay.io/argoproj/argocd:latest imagePullPolicy: Always livenessProbe: diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml index bd0f32fdadd70..afedf6b961f04 100644 --- a/manifests/ha/namespace-install.yaml +++ b/manifests/ha/namespace-install.yaml @@ -2667,6 +2667,30 @@ spec: key: server.api.content.types name: argocd-cmd-params-cm optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.new.git.file.globbing + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_SCM_ROOT_CA_PATH + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.scm.root.ca.path + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.allowed.scm.providers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.scm.providers + name: argocd-cmd-params-cm + optional: true image: quay.io/argoproj/argocd:latest imagePullPolicy: Always livenessProbe: diff --git a/manifests/install.yaml b/manifests/install.yaml index 585483dbc76b0..b56f483cf97a4 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -22658,6 +22658,30 @@ spec: key: server.api.content.types name: argocd-cmd-params-cm optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.new.git.file.globbing + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_SCM_ROOT_CA_PATH + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.scm.root.ca.path + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.allowed.scm.providers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.scm.providers + name: argocd-cmd-params-cm + optional: true image: quay.io/argoproj/argocd:latest imagePullPolicy: Always livenessProbe: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index a1b2b31f0265d..0cc94b9415b89 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -1735,6 +1735,30 @@ spec: key: server.api.content.types name: argocd-cmd-params-cm optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.new.git.file.globbing + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_SCM_ROOT_CA_PATH + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.scm.root.ca.path + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.allowed.scm.providers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.scm.providers + name: argocd-cmd-params-cm + optional: true image: quay.io/argoproj/argocd:latest imagePullPolicy: Always livenessProbe: diff --git a/pkg/apiclient/applicationset/applicationset.pb.go b/pkg/apiclient/applicationset/applicationset.pb.go index 68db654fe9c4e..b15e27f3ebc10 100644 --- a/pkg/apiclient/applicationset/applicationset.pb.go +++ b/pkg/apiclient/applicationset/applicationset.pb.go @@ -214,6 +214,7 @@ func (m *ApplicationSetResponse) GetApplicationset() *v1alpha1.ApplicationSet { type ApplicationSetCreateRequest struct { Applicationset *v1alpha1.ApplicationSet `protobuf:"bytes,1,opt,name=applicationset,proto3" json:"applicationset,omitempty"` Upsert bool `protobuf:"varint,2,opt,name=upsert,proto3" json:"upsert,omitempty"` + DryRun bool `protobuf:"varint,3,opt,name=dryRun,proto3" json:"dryRun,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -266,6 +267,13 @@ func (m *ApplicationSetCreateRequest) GetUpsert() bool { return false } +func (m *ApplicationSetCreateRequest) GetDryRun() bool { + if m != nil { + return m.DryRun + } + return false +} + type ApplicationSetDeleteRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The application set namespace. Default empty is argocd control plane namespace @@ -392,43 +400,44 @@ func init() { } var fileDescriptor_eacb9df0ce5738fa = []byte{ - // 573 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x95, 0x4f, 0x8b, 0x13, 0x3f, - 0x18, 0xc7, 0xc9, 0x76, 0xe9, 0x6f, 0x37, 0x3f, 0x51, 0x08, 0xb8, 0x5b, 0x47, 0xa9, 0x65, 0x0e, - 0x6b, 0x5d, 0xdd, 0x84, 0x56, 0x4f, 0x7a, 0xf2, 0x0f, 0x2c, 0x42, 0x11, 0x9d, 0x15, 0x05, 0x3d, - 0x48, 0x76, 0xfa, 0x30, 0x3b, 0xee, 0x74, 0x12, 0x93, 0x74, 0x40, 0x16, 0x2f, 0x82, 0xaf, 0xc0, - 0x77, 0xa0, 0x17, 0xc1, 0xab, 0x77, 0xaf, 0x1e, 0x05, 0xdf, 0x80, 0x54, 0x5f, 0x88, 0x4c, 0x66, - 0xda, 0xee, 0x84, 0x6e, 0x2b, 0x58, 0x6f, 0x79, 0xf2, 0xe7, 0x79, 0x3e, 0x79, 0x9e, 0xef, 0x93, - 0xe0, 0x6d, 0x0d, 0x2a, 0x03, 0xc5, 0xb8, 0x94, 0x49, 0x1c, 0x72, 0x13, 0x8b, 0x54, 0x83, 0x71, - 0x4c, 0x2a, 0x95, 0x30, 0x82, 0x9c, 0xae, 0xce, 0x7a, 0x17, 0x22, 0x21, 0xa2, 0x04, 0x18, 0x97, - 0x31, 0xe3, 0x69, 0x2a, 0x4c, 0xb1, 0x52, 0xec, 0xf6, 0x7a, 0x51, 0x6c, 0x0e, 0x86, 0xfb, 0x34, - 0x14, 0x03, 0xc6, 0x55, 0x24, 0xa4, 0x12, 0x2f, 0xec, 0x60, 0x27, 0xec, 0xb3, 0xac, 0xcb, 0xe4, - 0x61, 0x94, 0x9f, 0xd4, 0xc7, 0x63, 0xb1, 0xac, 0xc3, 0x13, 0x79, 0xc0, 0x3b, 0x2c, 0x82, 0x14, - 0x14, 0x37, 0xd0, 0x2f, 0xbc, 0xf9, 0x8f, 0xf1, 0xc6, 0xad, 0xe9, 0xbe, 0x3d, 0x30, 0xbb, 0x60, - 0x1e, 0x0e, 0x41, 0xbd, 0x22, 0x04, 0xaf, 0xa6, 0x7c, 0x00, 0x0d, 0xd4, 0x42, 0xed, 0xf5, 0xc0, - 0x8e, 0x49, 0x1b, 0x9f, 0xe1, 0x52, 0x6a, 0x30, 0xf7, 0xf9, 0x00, 0xb4, 0xe4, 0x21, 0x34, 0x56, - 0xec, 0xb2, 0x3b, 0xed, 0x1f, 0xe1, 0xcd, 0xaa, 0xdf, 0x5e, 0xac, 0x4b, 0xc7, 0x1e, 0x5e, 0xcb, - 0x99, 0x21, 0x34, 0xba, 0x81, 0x5a, 0xb5, 0xf6, 0x7a, 0x30, 0xb1, 0xf3, 0x35, 0x0d, 0x09, 0x84, - 0x46, 0xa8, 0xd2, 0xf3, 0xc4, 0x9e, 0x15, 0xbc, 0x36, 0x3b, 0xf8, 0x47, 0xe4, 0xde, 0x2a, 0x00, - 0x2d, 0xf3, 0xe4, 0x92, 0x06, 0xfe, 0xaf, 0x0c, 0x56, 0x5e, 0x6c, 0x6c, 0x12, 0x83, 0x9d, 0x3a, - 0x58, 0x80, 0xff, 0xbb, 0x3d, 0x3a, 0x4d, 0x38, 0x1d, 0x27, 0xdc, 0x0e, 0x9e, 0x87, 0x7d, 0x9a, - 0x75, 0xa9, 0x3c, 0x8c, 0x68, 0x9e, 0x70, 0x7a, 0xec, 0x38, 0x1d, 0x27, 0x9c, 0x3a, 0x1c, 0x4e, - 0x0c, 0xff, 0x13, 0xc2, 0xe7, 0xab, 0x5b, 0xee, 0x28, 0xe0, 0x06, 0x02, 0x78, 0x39, 0x04, 0x3d, - 0x8b, 0x0a, 0xfd, 0x7b, 0x2a, 0xb2, 0x81, 0xeb, 0x43, 0xa9, 0x41, 0x15, 0x39, 0x58, 0x0b, 0x4a, - 0xcb, 0x7f, 0xe6, 0xc2, 0xde, 0x85, 0x04, 0xa6, 0xb0, 0x7f, 0x27, 0x99, 0x27, 0xae, 0x64, 0x1e, - 0x29, 0x80, 0x25, 0x68, 0xb1, 0xfb, 0xb3, 0x8e, 0xcf, 0x56, 0x3d, 0xef, 0x81, 0xca, 0xe2, 0x10, - 0xc8, 0x07, 0x84, 0x6b, 0xbb, 0x60, 0xc8, 0x16, 0x75, 0x1a, 0x73, 0x76, 0x4f, 0x78, 0x4b, 0xcd, - 0xba, 0xbf, 0xf5, 0xe6, 0xfb, 0xaf, 0x77, 0x2b, 0x2d, 0xd2, 0xb4, 0x9d, 0x9e, 0x75, 0x9c, 0xd7, - 0x41, 0xb3, 0xa3, 0xfc, 0xa2, 0xaf, 0xc9, 0x7b, 0x84, 0x57, 0xf3, 0xf6, 0x21, 0x97, 0xe6, 0x63, - 0x4e, 0x5a, 0xcc, 0x7b, 0xb0, 0x4c, 0xce, 0xdc, 0xad, 0x7f, 0xd1, 0xb2, 0x9e, 0x23, 0x9b, 0x27, - 0xb0, 0x92, 0xcf, 0x08, 0xd7, 0x0b, 0xe9, 0x92, 0x2b, 0xf3, 0x31, 0x2b, 0x02, 0x5f, 0x72, 0x4a, - 0x99, 0xc5, 0xbc, 0xec, 0x9f, 0x84, 0x79, 0xc3, 0x55, 0xfa, 0x5b, 0x84, 0xeb, 0x85, 0x88, 0x17, - 0x61, 0x57, 0xa4, 0xee, 0x2d, 0x50, 0xcc, 0xf8, 0xbd, 0x19, 0xd7, 0x78, 0x7b, 0x51, 0x8d, 0xbf, - 0x20, 0x7c, 0x2a, 0x00, 0x2d, 0x86, 0x2a, 0x84, 0x5c, 0xf7, 0x8b, 0x6a, 0x3d, 0xe9, 0x8d, 0xe5, - 0xd6, 0x3a, 0x77, 0xeb, 0x5f, 0xb7, 0xcc, 0x94, 0x5c, 0x9d, 0xcf, 0xcc, 0x54, 0xc9, 0xbb, 0x63, - 0x14, 0xc0, 0xed, 0x7b, 0x5f, 0x47, 0x4d, 0xf4, 0x6d, 0xd4, 0x44, 0x3f, 0x46, 0x4d, 0xf4, 0xf4, - 0xe6, 0x9f, 0xfd, 0x52, 0x61, 0x12, 0x43, 0xea, 0x7e, 0x8b, 0xfb, 0x75, 0xfb, 0x37, 0x5d, 0xfb, - 0x1d, 0x00, 0x00, 0xff, 0xff, 0xfa, 0x8f, 0x0f, 0xad, 0x45, 0x07, 0x00, 0x00, + // 586 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x95, 0xcd, 0x8a, 0x13, 0x41, + 0x10, 0xc7, 0xe9, 0xcd, 0x12, 0xb3, 0xad, 0x28, 0x34, 0xb8, 0x1b, 0x47, 0x89, 0x61, 0x0e, 0x6b, + 0x5c, 0xdd, 0x1e, 0x12, 0x3d, 0xe9, 0xc9, 0x0f, 0x58, 0x84, 0x20, 0x3a, 0x2b, 0x0a, 0x7a, 0x90, + 0xde, 0x49, 0x31, 0x3b, 0xee, 0x64, 0xa6, 0xed, 0xee, 0x19, 0x58, 0x16, 0x2f, 0x82, 0x4f, 0xe0, + 0x1b, 0xe8, 0xc5, 0x07, 0xf0, 0xee, 0xc1, 0x8b, 0x47, 0xc1, 0x17, 0x90, 0xe8, 0x83, 0x48, 0xf7, + 0x4c, 0x92, 0x9d, 0x26, 0x9b, 0x08, 0xc6, 0xdb, 0x54, 0x77, 0x4f, 0xd5, 0xaf, 0xaa, 0xfe, 0xd5, + 0x8d, 0xb7, 0x24, 0x88, 0x1c, 0x84, 0xc7, 0x38, 0x8f, 0xa3, 0x80, 0xa9, 0x28, 0x4d, 0x24, 0x28, + 0xcb, 0xa4, 0x5c, 0xa4, 0x2a, 0x25, 0x67, 0xab, 0xab, 0xce, 0xa5, 0x30, 0x4d, 0xc3, 0x18, 0x3c, + 0xc6, 0x23, 0x8f, 0x25, 0x49, 0xaa, 0x8a, 0x9d, 0xe2, 0xb4, 0xd3, 0x0f, 0x23, 0xb5, 0x9f, 0xed, + 0xd1, 0x20, 0x1d, 0x7a, 0x4c, 0x84, 0x29, 0x17, 0xe9, 0x2b, 0xf3, 0xb1, 0x1d, 0x0c, 0xbc, 0xbc, + 0xe7, 0xf1, 0x83, 0x50, 0xff, 0x29, 0x8f, 0xc7, 0xf2, 0xf2, 0x2e, 0x8b, 0xf9, 0x3e, 0xeb, 0x7a, + 0x21, 0x24, 0x20, 0x98, 0x82, 0x41, 0xe1, 0xcd, 0x7d, 0x8a, 0xd7, 0xef, 0x4c, 0xcf, 0xed, 0x82, + 0xda, 0x01, 0xf5, 0x38, 0x03, 0x71, 0x48, 0x08, 0x5e, 0x4d, 0xd8, 0x10, 0x9a, 0xa8, 0x8d, 0x3a, + 0x6b, 0xbe, 0xf9, 0x26, 0x1d, 0x7c, 0x8e, 0x71, 0x2e, 0x41, 0x3d, 0x64, 0x43, 0x90, 0x9c, 0x05, + 0xd0, 0x5c, 0x31, 0xdb, 0xf6, 0xb2, 0x7b, 0x84, 0x37, 0xaa, 0x7e, 0xfb, 0x91, 0x2c, 0x1d, 0x3b, + 0xb8, 0xa1, 0x99, 0x21, 0x50, 0xb2, 0x89, 0xda, 0xb5, 0xce, 0x9a, 0x3f, 0xb1, 0xf5, 0x9e, 0x84, + 0x18, 0x02, 0x95, 0x8a, 0xd2, 0xf3, 0xc4, 0x9e, 0x15, 0xbc, 0x36, 0x3b, 0xf8, 0x27, 0x64, 0x67, + 0xe5, 0x83, 0xe4, 0xba, 0xb8, 0xa4, 0x89, 0x4f, 0x95, 0xc1, 0xca, 0xc4, 0xc6, 0x26, 0x51, 0xd8, + 0xea, 0x83, 0x01, 0x38, 0xdd, 0xeb, 0xd3, 0x69, 0xc1, 0xe9, 0xb8, 0xe0, 0xe6, 0xe3, 0x65, 0x30, + 0xa0, 0x79, 0x8f, 0xf2, 0x83, 0x90, 0xea, 0x82, 0xd3, 0x63, 0xbf, 0xd3, 0x71, 0xc1, 0xa9, 0xc5, + 0x61, 0xc5, 0x70, 0xbf, 0x22, 0x7c, 0xb1, 0x7a, 0xe4, 0x9e, 0x00, 0xa6, 0xc0, 0x87, 0xd7, 0x19, + 0xc8, 0x59, 0x54, 0xe8, 0xff, 0x53, 0x91, 0x75, 0x5c, 0xcf, 0xb8, 0x04, 0x51, 0xd4, 0xa0, 0xe1, + 0x97, 0x96, 0x5e, 0x1f, 0x88, 0x43, 0x3f, 0x4b, 0x4c, 0xe5, 0x1b, 0x7e, 0x69, 0xb9, 0x2f, 0xec, + 0x24, 0xee, 0x43, 0x0c, 0xd3, 0x24, 0xfe, 0x4d, 0x4a, 0xcf, 0x6c, 0x29, 0x3d, 0x11, 0x00, 0x4b, + 0xd0, 0x68, 0xef, 0x57, 0x1d, 0x9f, 0xaf, 0x7a, 0xde, 0x05, 0x91, 0x47, 0x01, 0x90, 0x8f, 0x08, + 0xd7, 0x76, 0x40, 0x91, 0x4d, 0x6a, 0x0d, 0xec, 0xec, 0x59, 0x71, 0x96, 0xda, 0x0d, 0x77, 0xf3, + 0xed, 0x8f, 0xdf, 0xef, 0x57, 0xda, 0xa4, 0x65, 0x6e, 0x80, 0xbc, 0x6b, 0xdd, 0x1a, 0xd2, 0x3b, + 0xd2, 0x89, 0xbe, 0x21, 0x1f, 0x10, 0x5e, 0xd5, 0x63, 0x45, 0xae, 0xcc, 0xc7, 0x9c, 0x8c, 0x9e, + 0xf3, 0x68, 0x99, 0x9c, 0xda, 0xad, 0x7b, 0xd9, 0xb0, 0x5e, 0x20, 0x1b, 0x27, 0xb0, 0x92, 0xcf, + 0x08, 0xd7, 0x0b, 0x49, 0x93, 0x6b, 0xf3, 0x31, 0x2b, 0xc2, 0x5f, 0x72, 0x49, 0x3d, 0x83, 0x79, + 0xd5, 0x3d, 0x09, 0xf3, 0x96, 0x3d, 0x01, 0xef, 0x10, 0xae, 0x17, 0x22, 0x5e, 0x84, 0x5d, 0x91, + 0xba, 0xb3, 0x40, 0x31, 0xe3, 0x7b, 0x68, 0xdc, 0xe3, 0xad, 0x45, 0x3d, 0xfe, 0x82, 0xf0, 0x19, + 0x1f, 0x64, 0x9a, 0x89, 0x00, 0xb4, 0xee, 0x17, 0xf5, 0x7a, 0x32, 0x1b, 0xcb, 0xed, 0xb5, 0x76, + 0xeb, 0xde, 0x34, 0xcc, 0x94, 0x5c, 0x9f, 0xcf, 0xec, 0x89, 0x92, 0x77, 0x5b, 0x09, 0x80, 0xbb, + 0x0f, 0xbe, 0x8d, 0x5a, 0xe8, 0xfb, 0xa8, 0x85, 0x7e, 0x8e, 0x5a, 0xe8, 0xf9, 0xed, 0xbf, 0x7b, + 0xbd, 0x82, 0x38, 0x82, 0xc4, 0x7e, 0x2e, 0xf7, 0xea, 0xe6, 0xcd, 0xba, 0xf1, 0x27, 0x00, 0x00, + 0xff, 0xff, 0xd5, 0xe2, 0xa9, 0xbf, 0x5d, 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -826,6 +835,16 @@ func (m *ApplicationSetCreateRequest) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.DryRun { + i-- + if m.DryRun { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } if m.Upsert { i-- if m.Upsert { @@ -1023,6 +1042,9 @@ func (m *ApplicationSetCreateRequest) Size() (n int) { if m.Upsert { n += 2 } + if m.DryRun { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -1541,6 +1563,26 @@ func (m *ApplicationSetCreateRequest) Unmarshal(dAtA []byte) error { } } m.Upsert = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplicationset + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DryRun = bool(v != 0) default: iNdEx = preIndex skippy, err := skipApplicationset(dAtA[iNdEx:]) diff --git a/server/applicationset/applicationset.go b/server/applicationset/applicationset.go index 5f2b7508b9a2e..a66173384e8c1 100644 --- a/server/applicationset/applicationset.go +++ b/server/applicationset/applicationset.go @@ -17,18 +17,26 @@ import ( apierr "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" + "sigs.k8s.io/controller-runtime/pkg/client" + appsettemplate "github.com/argoproj/argo-cd/v2/applicationset/controllers/template" + "github.com/argoproj/argo-cd/v2/applicationset/generators" + "github.com/argoproj/argo-cd/v2/applicationset/services" + appsetstatus "github.com/argoproj/argo-cd/v2/applicationset/status" appsetutils "github.com/argoproj/argo-cd/v2/applicationset/utils" "github.com/argoproj/argo-cd/v2/pkg/apiclient/applicationset" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned" applisters "github.com/argoproj/argo-cd/v2/pkg/client/listers/application/v1alpha1" + repoapiclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient" "github.com/argoproj/argo-cd/v2/server/rbacpolicy" "github.com/argoproj/argo-cd/v2/util/argo" "github.com/argoproj/argo-cd/v2/util/collections" "github.com/argoproj/argo-cd/v2/util/db" + "github.com/argoproj/argo-cd/v2/util/github_app" "github.com/argoproj/argo-cd/v2/util/rbac" "github.com/argoproj/argo-cd/v2/util/security" "github.com/argoproj/argo-cd/v2/util/session" @@ -36,24 +44,36 @@ import ( ) type Server struct { - ns string - db db.ArgoDB - enf *rbac.Enforcer - appclientset appclientset.Interface - appsetInformer cache.SharedIndexInformer - appsetLister applisters.ApplicationSetLister - projLister applisters.AppProjectNamespaceLister - auditLogger *argo.AuditLogger - settings *settings.SettingsManager - projectLock sync.KeyLock - enabledNamespaces []string + ns string + db db.ArgoDB + enf *rbac.Enforcer + k8sClient kubernetes.Interface + dynamicClient dynamic.Interface + client client.Client + repoClientSet repoapiclient.Clientset + appclientset appclientset.Interface + appsetInformer cache.SharedIndexInformer + appsetLister applisters.ApplicationSetLister + projLister applisters.AppProjectNamespaceLister + auditLogger *argo.AuditLogger + settings *settings.SettingsManager + projectLock sync.KeyLock + enabledNamespaces []string + GitSubmoduleEnabled bool + EnableNewGitFileGlobbing bool + ScmRootCAPath string + AllowedScmProviders []string + EnableScmProviders bool } // NewServer returns a new instance of the ApplicationSet service func NewServer( db db.ArgoDB, kubeclientset kubernetes.Interface, + dynamicClientset dynamic.Interface, + kubeControllerClientset client.Client, enf *rbac.Enforcer, + repoClientSet repoapiclient.Clientset, appclientset appclientset.Interface, appsetInformer cache.SharedIndexInformer, appsetLister applisters.ApplicationSetLister, @@ -62,19 +82,33 @@ func NewServer( namespace string, projectLock sync.KeyLock, enabledNamespaces []string, + gitSubmoduleEnabled bool, + enableNewGitFileGlobbing bool, + scmRootCAPath string, + allowedScmProviders []string, + enableScmProviders bool, ) applicationset.ApplicationSetServiceServer { s := &Server{ - ns: namespace, - db: db, - enf: enf, - appclientset: appclientset, - appsetInformer: appsetInformer, - appsetLister: appsetLister, - projLister: projLister, - settings: settings, - projectLock: projectLock, - auditLogger: argo.NewAuditLogger(namespace, kubeclientset, "argocd-server"), - enabledNamespaces: enabledNamespaces, + ns: namespace, + db: db, + enf: enf, + dynamicClient: dynamicClientset, + client: kubeControllerClientset, + k8sClient: kubeclientset, + repoClientSet: repoClientSet, + appclientset: appclientset, + appsetInformer: appsetInformer, + appsetLister: appsetLister, + projLister: projLister, + settings: settings, + projectLock: projectLock, + auditLogger: argo.NewAuditLogger(namespace, kubeclientset, "argocd-server"), + enabledNamespaces: enabledNamespaces, + GitSubmoduleEnabled: gitSubmoduleEnabled, + EnableNewGitFileGlobbing: enableNewGitFileGlobbing, + ScmRootCAPath: scmRootCAPath, + AllowedScmProviders: allowedScmProviders, + EnableScmProviders: enableScmProviders, } return s } @@ -166,6 +200,23 @@ func (s *Server) Create(ctx context.Context, q *applicationset.ApplicationSetCre return nil, fmt.Errorf("error checking create permissions for ApplicationSets %s : %w", appset.Name, err) } + if q.GetDryRun() { + apps, err := s.generateApplicationSetApps(ctx, *appset, namespace) + if err != nil { + return nil, fmt.Errorf("unable to generate Applications of ApplicationSet: %w", err) + } + + statusMap := appsetstatus.GetResourceStatusMap(appset) + statusMap = appsetstatus.BuildResourceStatus(statusMap, apps) + + statuses := []v1alpha1.ResourceStatus{} + for _, status := range statusMap { + statuses = append(statuses, status) + } + appset.Status.Resources = statuses + return appset, nil + } + s.projectLock.RLock(projectName) defer s.projectLock.RUnlock(projectName) @@ -209,6 +260,30 @@ func (s *Server) Create(ctx context.Context, q *applicationset.ApplicationSetCre return updated, nil } +func (s *Server) generateApplicationSetApps(ctx context.Context, appset v1alpha1.ApplicationSet, namespace string) ([]v1alpha1.Application, error) { + logCtx := log.WithField("applicationset", appset.Name) + + argoCDDB := s.db + + scmConfig := generators.NewSCMConfig(s.ScmRootCAPath, s.AllowedScmProviders, s.EnableScmProviders, github_app.NewAuthCredentials(argoCDDB.(db.RepoCredsDB))) + + getRepository := func(ctx context.Context, url, project string) (*v1alpha1.Repository, error) { + return s.db.GetRepository(ctx, url, project) + } + argoCDService, err := services.NewArgoCDService(getRepository, s.GitSubmoduleEnabled, s.repoClientSet, s.EnableNewGitFileGlobbing) + if err != nil { + return nil, fmt.Errorf("error creating ArgoCDService: %w", err) + } + + appSetGenerators := generators.GetGenerators(ctx, s.client, s.k8sClient, namespace, argoCDService, s.dynamicClient, scmConfig) + + apps, _, err := appsettemplate.GenerateApplications(logCtx, appset, appSetGenerators, &appsetutils.Render{}, s.client) + if err != nil { + return nil, fmt.Errorf("error generating applications: %w", err) + } + return apps, nil +} + func (s *Server) updateAppSet(appset *v1alpha1.ApplicationSet, newAppset *v1alpha1.ApplicationSet, ctx context.Context, merge bool) (*v1alpha1.ApplicationSet, error) { if appset != nil && appset.Spec.Template.Spec.Project != newAppset.Spec.Template.Spec.Project { // When changing projects, caller must have applicationset create and update privileges in new project diff --git a/server/applicationset/applicationset.proto b/server/applicationset/applicationset.proto index 07ed4e2c89384..8feca553c2e5d 100644 --- a/server/applicationset/applicationset.proto +++ b/server/applicationset/applicationset.proto @@ -37,6 +37,7 @@ message ApplicationSetResponse { message ApplicationSetCreateRequest { github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSet applicationset = 1; bool upsert = 2; + bool dryRun = 3; } @@ -54,7 +55,6 @@ message ApplicationSetTreeQuery { // ApplicationSetService service ApplicationSetService { - // Get returns an applicationset by name rpc Get (ApplicationSetGetQuery) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSet) { option (google.api.http).get = "/api/v1/applicationsets/{name}"; diff --git a/server/applicationset/applicationset_test.go b/server/applicationset/applicationset_test.go index da8c980fdd4e5..bd72ee613e70c 100644 --- a/server/applicationset/applicationset_test.go +++ b/server/applicationset/applicationset_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" @@ -143,7 +144,10 @@ func newTestAppSetServerWithEnforcerConfigure(f func(*rbac.Enforcer), namespace server := NewServer( db, kubeclientset, + nil, + nil, enforcer, + nil, fakeAppsClientset, appInformer, factory.Argoproj().V1alpha1().ApplicationSets().Lister(), @@ -152,6 +156,11 @@ func newTestAppSetServerWithEnforcerConfigure(f func(*rbac.Enforcer), namespace testNamespace, sync.NewKeyLock(), []string{testNamespace, "external-namespace"}, + true, + true, + "", + []string{}, + true, ) return server.(*Server) } @@ -358,6 +367,54 @@ func TestCreateAppSetWrongNamespace(t *testing.T) { assert.Equal(t, "namespace 'NOT-ALLOWED' is not permitted", err.Error()) } +func TestCreateAppSetDryRun(t *testing.T) { + testAppSet := newTestAppSet() + appServer := newTestAppSetServer() + testAppSet.Spec.Template.Name = "{{name}}" + testAppSet.Spec.Generators = []appsv1.ApplicationSetGenerator{ + { + List: &appsv1.ListGenerator{ + Elements: []apiextensionsv1.JSON{{Raw: []byte(`{"name": "a"}`)}, {Raw: []byte(`{"name": "b"}`)}}, + }, + }, + } + createReq := applicationset.ApplicationSetCreateRequest{ + Applicationset: testAppSet, + DryRun: true, + } + result, err := appServer.Create(context.Background(), &createReq) + + require.NoError(t, err) + assert.Len(t, result.Status.Resources, 2) + assert.Equal(t, "a", result.Status.Resources[0].Name) + assert.Equal(t, testAppSet.Namespace, result.Status.Resources[0].Namespace) + assert.Equal(t, "b", result.Status.Resources[1].Name) + assert.Equal(t, testAppSet.Namespace, result.Status.Resources[1].Namespace) +} + +func TestCreateAppSetDryRunWithDuplicate(t *testing.T) { + testAppSet := newTestAppSet() + appServer := newTestAppSetServer() + testAppSet.Spec.Template.Name = "{{name}}" + testAppSet.Spec.Generators = []appsv1.ApplicationSetGenerator{ + { + List: &appsv1.ListGenerator{ + Elements: []apiextensionsv1.JSON{{Raw: []byte(`{"name": "a"}`)}, {Raw: []byte(`{"name": "a"}`)}}, + }, + }, + } + createReq := applicationset.ApplicationSetCreateRequest{ + Applicationset: testAppSet, + DryRun: true, + } + result, err := appServer.Create(context.Background(), &createReq) + + require.NoError(t, err) + assert.Len(t, result.Status.Resources, 1) + assert.Equal(t, "a", result.Status.Resources[0].Name) + assert.Equal(t, testAppSet.Namespace, result.Status.Resources[0].Namespace) +} + func TestGetAppSet(t *testing.T) { appSet1 := newTestAppSet(func(appset *appsv1.ApplicationSet) { appset.Name = "AppSet1" diff --git a/server/server.go b/server/server.go index 862ad4075c4f9..77e058afae959 100644 --- a/server/server.go +++ b/server/server.go @@ -54,8 +54,10 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" + "sigs.k8s.io/controller-runtime/pkg/client" "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/pkg/apiclient" @@ -167,6 +169,7 @@ func init() { // ArgoCDServer is the API server for Argo CD type ArgoCDServer struct { ArgoCDServerOpts + ApplicationSetOpts ssoClientApp *oidc.ClientApp settings *settings_util.ArgoCDSettings @@ -198,31 +201,41 @@ type ArgoCDServer struct { } type ArgoCDServerOpts struct { - DisableAuth bool - ContentTypes []string - EnableGZip bool - Insecure bool - StaticAssetsDir string - ListenPort int - ListenHost string - MetricsPort int - MetricsHost string - Namespace string - DexServerAddr string - DexTLSConfig *dexutil.DexTLSConfig - BaseHRef string - RootPath string - KubeClientset kubernetes.Interface - AppClientset appclientset.Interface - RepoClientset repoapiclient.Clientset - Cache *servercache.Cache - RepoServerCache *repocache.Cache - RedisClient *redis.Client - TLSConfigCustomizer tlsutil.ConfigCustomizer - XFrameOptions string - ContentSecurityPolicy string - ApplicationNamespaces []string - EnableProxyExtension bool + DisableAuth bool + ContentTypes []string + EnableGZip bool + Insecure bool + StaticAssetsDir string + ListenPort int + ListenHost string + MetricsPort int + MetricsHost string + Namespace string + DexServerAddr string + DexTLSConfig *dexutil.DexTLSConfig + BaseHRef string + RootPath string + DynamicClientset dynamic.Interface + KubeControllerClientset client.Client + KubeClientset kubernetes.Interface + AppClientset appclientset.Interface + RepoClientset repoapiclient.Clientset + Cache *servercache.Cache + RepoServerCache *repocache.Cache + RedisClient *redis.Client + TLSConfigCustomizer tlsutil.ConfigCustomizer + XFrameOptions string + ContentSecurityPolicy string + ApplicationNamespaces []string + EnableProxyExtension bool +} + +type ApplicationSetOpts struct { + GitSubmoduleEnabled bool + EnableNewGitFileGlobbing bool + ScmRootCAPath string + AllowedScmProviders []string + EnableScmProviders bool } // HTTPMetricsRegistry exposes operations to update http metrics in the Argo CD @@ -259,7 +272,7 @@ func initializeDefaultProject(opts ArgoCDServerOpts) error { } // NewServer returns a new instance of the Argo CD API server -func NewServer(ctx context.Context, opts ArgoCDServerOpts) *ArgoCDServer { +func NewServer(ctx context.Context, opts ArgoCDServerOpts, appsetOpts ApplicationSetOpts) *ArgoCDServer { settingsMgr := settings_util.NewSettingsManager(ctx, opts.KubeClientset, opts.Namespace) settings, err := settingsMgr.InitializeSettings(opts.Insecure) errorsutil.CheckError(err) @@ -315,26 +328,27 @@ func NewServer(ctx context.Context, opts ArgoCDServerOpts) *ArgoCDServer { em := extension.NewManager(logger, sg, ag, pg, enf) a := &ArgoCDServer{ - ArgoCDServerOpts: opts, - log: logger, - settings: settings, - sessionMgr: sessionMgr, - settingsMgr: settingsMgr, - enf: enf, - projInformer: projInformer, - projLister: projLister, - appInformer: appInformer, - appLister: appLister, - appsetInformer: appsetInformer, - appsetLister: appsetLister, - policyEnforcer: policyEnf, - userStateStorage: userStateStorage, - staticAssets: http.FS(staticFS), - db: dbInstance, - apiFactory: apiFactory, - secretInformer: secretInformer, - configMapInformer: configMapInformer, - extensionManager: em, + ArgoCDServerOpts: opts, + ApplicationSetOpts: appsetOpts, + log: logger, + settings: settings, + sessionMgr: sessionMgr, + settingsMgr: settingsMgr, + enf: enf, + projInformer: projInformer, + projLister: projLister, + appInformer: appInformer, + appLister: appLister, + appsetInformer: appsetInformer, + appsetLister: appsetLister, + policyEnforcer: policyEnf, + userStateStorage: userStateStorage, + staticAssets: http.FS(staticFS), + db: dbInstance, + apiFactory: apiFactory, + secretInformer: secretInformer, + configMapInformer: configMapInformer, + extensionManager: em, } err = a.logInClusterWarnings() @@ -868,7 +882,10 @@ func newArgoCDServiceSet(a *ArgoCDServer) *ArgoCDServiceSet { applicationSetService := applicationset.NewServer( a.db, a.KubeClientset, + a.DynamicClientset, + a.KubeControllerClientset, a.enf, + a.RepoClientset, a.AppClientset, a.appsetInformer, a.appsetLister, @@ -876,7 +893,13 @@ func newArgoCDServiceSet(a *ArgoCDServer) *ArgoCDServiceSet { a.settingsMgr, a.Namespace, projectLock, - a.ApplicationNamespaces) + a.ApplicationNamespaces, + a.GitSubmoduleEnabled, + a.EnableNewGitFileGlobbing, + a.ScmRootCAPath, + a.AllowedScmProviders, + a.EnableScmProviders, + ) projectService := project.NewServer(a.Namespace, a.KubeClientset, a.AppClientset, a.enf, projectLock, a.sessionMgr, a.policyEnforcer, a.projInformer, a.settingsMgr, a.db) appsInAnyNamespaceEnabled := len(a.ArgoCDServerOpts.ApplicationNamespaces) > 0 diff --git a/server/server_test.go b/server/server_test.go index 13bb3d6770753..7923db7f3e9d6 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -19,9 +19,13 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/grpc/metadata" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" "sigs.k8s.io/yaml" + dynfake "k8s.io/client-go/dynamic/fake" + clientfake "sigs.k8s.io/controller-runtime/pkg/client/fake" + "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/pkg/apiclient" "github.com/argoproj/argo-cd/v2/pkg/apiclient/session" @@ -52,10 +56,12 @@ func fakeServer(t *testing.T) (*FakeArgoCDServer, func()) { kubeclientset := fake.NewSimpleClientset(cm, secret) appClientSet := apps.NewSimpleClientset() redis, closer := test.NewInMemoryRedis() - port, err := test.GetFreePort() mockRepoClient := &mocks.Clientset{RepoServerServiceClient: &mocks.RepoServerServiceClient{}} tmpAssetsDir := t.TempDir() + dynamicClient := dynfake.NewSimpleDynamicClient(runtime.NewScheme()) + fakeClient := clientfake.NewClientBuilder().Build() + port, err := test.GetFreePort() if err != nil { panic(err) } @@ -78,11 +84,13 @@ func fakeServer(t *testing.T) (*FakeArgoCDServer, func()) { 1*time.Minute, 1*time.Minute, ), - RedisClient: redis, - RepoClientset: mockRepoClient, - StaticAssetsDir: tmpAssetsDir, + RedisClient: redis, + RepoClientset: mockRepoClient, + StaticAssetsDir: tmpAssetsDir, + DynamicClientset: dynamicClient, + KubeControllerClientset: fakeClient, } - srv := NewServer(context.Background(), argoCDOpts) + srv := NewServer(context.Background(), argoCDOpts, ApplicationSetOpts{}) fakeSrv := &FakeArgoCDServer{srv, tmpAssetsDir} return fakeSrv, closer } @@ -118,7 +126,7 @@ func TestEnforceProjectToken(t *testing.T) { mockRepoClient := &mocks.Clientset{RepoServerServiceClient: &mocks.RepoServerServiceClient{}} t.Run("TestEnforceProjectTokenSuccessful", func(t *testing.T) { - s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}) + s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}, ApplicationSetOpts{}) cancel := test.StartInformer(s.projInformer) defer cancel() claims := jwt.MapClaims{"sub": defaultSub, "iat": defaultIssuedAt} @@ -127,21 +135,21 @@ func TestEnforceProjectToken(t *testing.T) { }) t.Run("TestEnforceProjectTokenWithDiffCreateAtFailure", func(t *testing.T) { - s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}) + s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}, ApplicationSetOpts{}) diffCreateAt := defaultIssuedAt + 1 claims := jwt.MapClaims{"sub": defaultSub, "iat": diffCreateAt} assert.False(t, s.enf.Enforce(claims, "applications", "get", defaultTestObject)) }) t.Run("TestEnforceProjectTokenIncorrectSubFormatFailure", func(t *testing.T) { - s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}) + s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}, ApplicationSetOpts{}) invalidSub := "proj:test" claims := jwt.MapClaims{"sub": invalidSub, "iat": defaultIssuedAt} assert.False(t, s.enf.Enforce(claims, "applications", "get", defaultTestObject)) }) t.Run("TestEnforceProjectTokenNoTokenFailure", func(t *testing.T) { - s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}) + s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}, ApplicationSetOpts{}) nonExistentToken := "fake-token" invalidSub := fmt.Sprintf(subFormat, projectName, nonExistentToken) claims := jwt.MapClaims{"sub": invalidSub, "iat": defaultIssuedAt} @@ -151,7 +159,7 @@ func TestEnforceProjectToken(t *testing.T) { t.Run("TestEnforceProjectTokenNotJWTTokenFailure", func(t *testing.T) { proj := existingProj.DeepCopy() proj.Spec.Roles[0].JWTTokens = nil - s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(proj), RepoClientset: mockRepoClient}) + s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(proj), RepoClientset: mockRepoClient}, ApplicationSetOpts{}) claims := jwt.MapClaims{"sub": defaultSub, "iat": defaultIssuedAt} assert.False(t, s.enf.Enforce(claims, "applications", "get", defaultTestObject)) }) @@ -164,7 +172,7 @@ func TestEnforceProjectToken(t *testing.T) { proj := existingProj.DeepCopy() proj.Spec.Roles[0] = role - s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(proj), RepoClientset: mockRepoClient}) + s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(proj), RepoClientset: mockRepoClient}, ApplicationSetOpts{}) cancel := test.StartInformer(s.projInformer) defer cancel() claims := jwt.MapClaims{"sub": defaultSub, "iat": defaultIssuedAt} @@ -175,7 +183,7 @@ func TestEnforceProjectToken(t *testing.T) { }) t.Run("TestEnforceProjectTokenWithIdSuccessful", func(t *testing.T) { - s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}) + s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}, ApplicationSetOpts{}) cancel := test.StartInformer(s.projInformer) defer cancel() claims := jwt.MapClaims{"sub": defaultSub, "jti": defaultId} @@ -184,7 +192,7 @@ func TestEnforceProjectToken(t *testing.T) { }) t.Run("TestEnforceProjectTokenWithInvalidIdFailure", func(t *testing.T) { - s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}) + s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}, ApplicationSetOpts{}) invalidId := "invalidId" claims := jwt.MapClaims{"sub": defaultSub, "jti": defaultId} res := s.enf.Enforce(claims, "applications", "get", invalidId) @@ -268,7 +276,7 @@ func TestInitializingExistingDefaultProject(t *testing.T) { RepoClientset: mockRepoClient, } - argocd := NewServer(context.Background(), argoCDOpts) + argocd := NewServer(context.Background(), argoCDOpts, ApplicationSetOpts{}) assert.NotNil(t, argocd) proj, err := appClientSet.ArgoprojV1alpha1().AppProjects(test.FakeArgoCDNamespace).Get(context.Background(), v1alpha1.DefaultAppProjectName, metav1.GetOptions{}) @@ -291,7 +299,7 @@ func TestInitializingNotExistingDefaultProject(t *testing.T) { RepoClientset: mockRepoClient, } - argocd := NewServer(context.Background(), argoCDOpts) + argocd := NewServer(context.Background(), argoCDOpts, ApplicationSetOpts{}) assert.NotNil(t, argocd) proj, err := appClientSet.ArgoprojV1alpha1().AppProjects(test.FakeArgoCDNamespace).Get(context.Background(), v1alpha1.DefaultAppProjectName, metav1.GetOptions{}) @@ -333,7 +341,7 @@ func TestEnforceProjectGroups(t *testing.T) { } mockRepoClient := &mocks.Clientset{RepoServerServiceClient: &mocks.RepoServerServiceClient{}} kubeclientset := fake.NewSimpleClientset(test.NewFakeConfigMap(), test.NewFakeSecret()) - s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}) + s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}, ApplicationSetOpts{}) cancel := test.StartInformer(s.projInformer) defer cancel() claims := jwt.MapClaims{ @@ -395,7 +403,7 @@ func TestRevokedToken(t *testing.T) { }, } - s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}) + s := NewServer(context.Background(), ArgoCDServerOpts{Namespace: test.FakeArgoCDNamespace, KubeClientset: kubeclientset, AppClientset: apps.NewSimpleClientset(&existingProj), RepoClientset: mockRepoClient}, ApplicationSetOpts{}) cancel := test.StartInformer(s.projInformer) defer cancel() claims := jwt.MapClaims{"sub": defaultSub, "iat": defaultIssuedAt} @@ -450,7 +458,7 @@ func TestAuthenticate(t *testing.T) { AppClientset: appClientSet, RepoClientset: mockRepoClient, } - argocd := NewServer(context.Background(), argoCDOpts) + argocd := NewServer(context.Background(), argoCDOpts, ApplicationSetOpts{}) ctx := context.Background() if testData.user != "" { token, err := argocd.sessionMgr.Create(testData.user, 0, "abc") @@ -587,7 +595,7 @@ connectors: if withFakeSSO && useDexForSSO { argoCDOpts.DexServerAddr = ts.URL } - argocd = NewServer(context.Background(), argoCDOpts) + argocd = NewServer(context.Background(), argoCDOpts, ApplicationSetOpts{}) var err error argocd.ssoClientApp, err = oidc.NewClientApp(argocd.settings, argocd.DexServerAddr, argocd.DexTLSConfig, argocd.BaseHRef, cache.NewInMemoryCache(24*time.Hour)) require.NoError(t, err) @@ -1071,7 +1079,7 @@ func TestTranslateGrpcCookieHeader(t *testing.T) { AppClientset: apps.NewSimpleClientset(), RepoClientset: &mocks.Clientset{RepoServerServiceClient: &mocks.RepoServerServiceClient{}}, } - argocd := NewServer(context.Background(), argoCDOpts) + argocd := NewServer(context.Background(), argoCDOpts, ApplicationSetOpts{}) t.Run("TokenIsNotEmpty", func(t *testing.T) { recorder := httptest.NewRecorder() From ff1d37fae65669627fae1652e35c06bee1b05e48 Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Tue, 18 Jun 2024 11:35:26 -0400 Subject: [PATCH 65/74] fix(ci): use commit hash instead of release number in security insights (#18718) Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index bc8f73bfc6f6f..b2a64d09aa9a6 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -291,7 +291,7 @@ jobs: # Replace the 'project-release: vX.X.X-rcX' line in SECURITY-INSIGHTS.yml sed -i "s/project-release: v.*$/project-release: v${{ env.NEW_VERSION }}/" SECURITY-INSIGHTS.yml # Update the 'commit-hash: XXXXXXX' line in SECURITY-INSIGHTS.yml - sed -i "s/commit-hash: .*/commit-hash: ${{ env.NEW_VERSION }}/" SECURITY-INSIGHTS.yml + sed -i "s/commit-hash: .*/commit-hash: ${{ env.COMMIT_HASH }}/" SECURITY-INSIGHTS.yml if: ${{ env.UPDATE_VERSION == 'true' }} - name: Create PR to update VERSION on master branch From 7c7af4040a076dd4fc56c6d0a0bfab4f1932df05 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 15:57:01 +0000 Subject: [PATCH 66/74] chore: Bump version in master (#18717) * Bump version in master Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update SECURITY-INSIGHTS.yml Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --------- Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Co-authored-by: ishitasequeira <46771830+ishitasequeira@users.noreply.github.com> Co-authored-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> --- SECURITY-INSIGHTS.yml | 4 ++-- VERSION | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SECURITY-INSIGHTS.yml b/SECURITY-INSIGHTS.yml index 8ac4bc36b04ae..42db7962eb995 100644 --- a/SECURITY-INSIGHTS.yml +++ b/SECURITY-INSIGHTS.yml @@ -3,9 +3,9 @@ header: expiration-date: '2024-10-31T00:00:00.000Z' # One year from initial release. last-updated: '2023-10-27' last-reviewed: '2023-10-27' - commit-hash: b71277c6beb949d0199d647a582bc25822b88838 + commit-hash: fe606708859574b9b6102a505e260fac5d3fb14e project-url: https://github.com/argoproj/argo-cd - project-release: v2.9.0-rc3 + project-release: v2.13.0 changelog: https://github.com/argoproj/argo-cd/releases license: https://github.com/argoproj/argo-cd/blob/master/LICENSE project-lifecycle: diff --git a/VERSION b/VERSION index d8b698973a491..fb2c0766b7cc2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.12.0 +2.13.0 From 6bc0b29dfe251a9eee33d7f53ac2394f37dcc9eb Mon Sep 17 00:00:00 2001 From: Alexandre Gaudreault Date: Tue, 18 Jun 2024 15:24:12 -0400 Subject: [PATCH 67/74] test(cli): unstable unit test caused by unsorted array (#18722) Signed-off-by: Alexandre Gaudreault --- server/applicationset/applicationset_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/applicationset/applicationset_test.go b/server/applicationset/applicationset_test.go index bd72ee613e70c..4e2492a31a838 100644 --- a/server/applicationset/applicationset_test.go +++ b/server/applicationset/applicationset_test.go @@ -2,6 +2,7 @@ package applicationset import ( "context" + "sort" "testing" "github.com/argoproj/gitops-engine/pkg/health" @@ -386,6 +387,12 @@ func TestCreateAppSetDryRun(t *testing.T) { require.NoError(t, err) assert.Len(t, result.Status.Resources, 2) + + // Sort resulting application by name + sort.Slice(result.Status.Resources, func(i, j int) bool { + return result.Status.Resources[i].Name < result.Status.Resources[j].Name + }) + assert.Equal(t, "a", result.Status.Resources[0].Name) assert.Equal(t, testAppSet.Namespace, result.Status.Resources[0].Namespace) assert.Equal(t, "b", result.Status.Resources[1].Name) From e6dc415d3453f5053033cabb1a6a61bd050a9fa8 Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Wed, 19 Jun 2024 06:22:46 -1000 Subject: [PATCH 68/74] fix(ui): set project to empty string if undefined (#18732) There are some situations where the project will be `undefined`. When that happens, attempting to delete a repo won't be possible, since the backend will be looking for a project with the literal name `undefined`. To fix this, set an empty string for `undefined|null` values. Signed-off-by: Blake Pettersson --- ui/src/app/settings/components/repos-list/repos-list.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/app/settings/components/repos-list/repos-list.tsx b/ui/src/app/settings/components/repos-list/repos-list.tsx index 86c8f26352050..25db28e5ca6e7 100644 --- a/ui/src/app/settings/components/repos-list/repos-list.tsx +++ b/ui/src/app/settings/components/repos-list/repos-list.tsx @@ -857,7 +857,7 @@ export class ReposList extends React.Component< const confirmed = await this.appContext.apis.popup.confirm('Disconnect repository', `Are you sure you want to disconnect '${repo}'?`); if (confirmed) { try { - await services.repos.delete(repo, project); + await services.repos.delete(repo, project || ''); this.repoLoader.reload(); } catch (e) { this.appContext.apis.notifications.show({ From 331944aa6a6de8a1e741e6443d6537462f303be6 Mon Sep 17 00:00:00 2001 From: Tim Schrumpf Date: Wed, 19 Jun 2024 18:23:25 +0200 Subject: [PATCH 69/74] fix(docs): fix example in userguide/diffing (#18730) Signed-off-by: tillepille --- docs/user-guide/diffing.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/user-guide/diffing.md b/docs/user-guide/diffing.md index 95fe7f0ace3ac..7e5b72d97959c 100644 --- a/docs/user-guide/diffing.md +++ b/docs/user-guide/diffing.md @@ -74,7 +74,8 @@ If you have a slash `/` in your pointer path, you need to replace it with the `~ spec: ignoreDifferences: - kind: Node - jsonPointers: /metadata/labels/node-role.kubernetes.io~1worker + jsonPointers: + - /metadata/labels/node-role.kubernetes.io~1worker ``` ## System-Level Configuration From c83a9880090f324565162c4e0bec345915336e96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:57:13 +0300 Subject: [PATCH 70/74] chore(deps): bump chromedriver from 126.0.1 to 126.0.2 in /ui-test (#18739) Bumps [chromedriver](https://github.com/giggio/node-chromedriver) from 126.0.1 to 126.0.2. - [Commits](https://github.com/giggio/node-chromedriver/compare/126.0.1...126.0.2) --- updated-dependencies: - dependency-name: chromedriver dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui-test/package.json | 2 +- ui-test/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui-test/package.json b/ui-test/package.json index 450a4423ef558..d9469f3821fbc 100644 --- a/ui-test/package.json +++ b/ui-test/package.json @@ -14,7 +14,7 @@ "dependencies": { "@types/selenium-webdriver": "^4.1.23", "assert": "^2.1.0", - "chromedriver": "^126.0.1", + "chromedriver": "^126.0.2", "selenium-webdriver": "^4.21.0" }, "devDependencies": { diff --git a/ui-test/yarn.lock b/ui-test/yarn.lock index c04ff083abc69..906f7320a3d58 100644 --- a/ui-test/yarn.lock +++ b/ui-test/yarn.lock @@ -262,10 +262,10 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" -chromedriver@^126.0.1: - version "126.0.1" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-126.0.1.tgz#2591500833ba5baa626c2725f2877cce02237883" - integrity sha512-uV4xIvpPimKmV1/Hn9oX0C57tjsBbVtOeKFX9JzzPYpsu8xiSUAdqa3A8mgZE5DMJKDDoDyDIrA656QncVWRzg== +chromedriver@^126.0.2: + version "126.0.2" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-126.0.2.tgz#0c0840cd1ba00b73fa16d4292fa739860ee20ec8" + integrity sha512-61R0w7C+uJVCykabdqWsvitne2rg3MTI8xOKJosk+YbKdyLeGHYiCCeU82ZsUY+v9qnN1p48THcthgKubxPRWQ== dependencies: "@testim/chrome-version" "^1.1.4" axios "^1.6.7" From 1aeed6a6b19cbb7cdbfbce7fda69f54944e45603 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:57:28 +0300 Subject: [PATCH 71/74] chore(deps-dev): bump @types/node from 20.14.4 to 20.14.6 in /ui-test (#18738) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.14.4 to 20.14.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui-test/package.json | 2 +- ui-test/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui-test/package.json b/ui-test/package.json index d9469f3821fbc..72b5d7cfa87b0 100644 --- a/ui-test/package.json +++ b/ui-test/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@types/mocha": "^10.0.6", - "@types/node": "^20.14.4", + "@types/node": "^20.14.6", "dotenv": "^16.4.5", "mocha": "^10.4.0", "prettier": "^2.8.8", diff --git a/ui-test/yarn.lock b/ui-test/yarn.lock index 906f7320a3d58..47d8ca9e41e0c 100644 --- a/ui-test/yarn.lock +++ b/ui-test/yarn.lock @@ -38,10 +38,10 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== -"@types/node@*", "@types/node@^20.14.4": - version "20.14.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.4.tgz#3426db474378502882036d595ec9e79a9b17d1e6" - integrity sha512-1ChboN+57suCT2t/f8lwtPY/k3qTpuD/qnqQuYoBg6OQOcPyaw7PiZVdGpaZYAvhDDtqrt0oAaM8+oSu1xsUGw== +"@types/node@*", "@types/node@^20.14.6": + version "20.14.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.6.tgz#f3c19ffc98c2220e18de259bb172dd4d892a6075" + integrity sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw== dependencies: undici-types "~5.26.4" From d2436d9f4d789565128e0fe439f8f1b3c30d83e7 Mon Sep 17 00:00:00 2001 From: Toni Grabulosa <71640433+toniGrabulosa@users.noreply.github.com> Date: Thu, 20 Jun 2024 17:25:09 +0200 Subject: [PATCH 72/74] Update USERS.md (#18743) Signed-off-by: Toni Grabulosa <71640433+toniGrabulosa@users.noreply.github.com> --- USERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/USERS.md b/USERS.md index 609129ee498dd..ead03be9281a0 100644 --- a/USERS.md +++ b/USERS.md @@ -155,6 +155,7 @@ Currently, the following organizations are **officially** using Argo CD: 1. [Karrot](https://www.daangn.com/) 1. [KarrotPay](https://www.daangnpay.com/) 1. [Kasa](https://kasa.co.kr/) +1. [Kave Home](https://kavehome.com) 1. [Keeeb](https://www.keeeb.com/) 1. [KelkooGroup](https://www.kelkoogroup.com) 1. [Keptn](https://keptn.sh) From f7d854ec9ec1a1c3720a7584e8a7d440ddc08c6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 09:23:16 -0400 Subject: [PATCH 73/74] chore(deps-dev): bump @types/node from 20.14.6 to 20.14.7 in /ui-test (#18750) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.14.6 to 20.14.7. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui-test/package.json | 2 +- ui-test/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui-test/package.json b/ui-test/package.json index 72b5d7cfa87b0..29a915c1c41b7 100644 --- a/ui-test/package.json +++ b/ui-test/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/node": "^20.14.7", "dotenv": "^16.4.5", "mocha": "^10.4.0", "prettier": "^2.8.8", diff --git a/ui-test/yarn.lock b/ui-test/yarn.lock index 47d8ca9e41e0c..a4c86582f09c3 100644 --- a/ui-test/yarn.lock +++ b/ui-test/yarn.lock @@ -38,10 +38,10 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== -"@types/node@*", "@types/node@^20.14.6": - version "20.14.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.6.tgz#f3c19ffc98c2220e18de259bb172dd4d892a6075" - integrity sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw== +"@types/node@*", "@types/node@^20.14.7": + version "20.14.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.7.tgz#342cada27f97509eb8eb2dbc003edf21ce8ab5a8" + integrity sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ== dependencies: undici-types "~5.26.4" From e98d3b2a877fb7140880dc1450703a99db4398b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 09:23:56 -0400 Subject: [PATCH 74/74] chore(deps): bump docker/build-push-action from 6.0.0 to 6.0.2 (#18749) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.0.0 to 6.0.2. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/c382f710d39a5bb4e430307530a720f50c2d3318...f6010ea70151369b06f0194be1051fbbdff851b2) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 4cb2ca2614e80..7697d86dce33f 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -143,7 +143,7 @@ jobs: - name: Build and push container image id: image - uses: docker/build-push-action@c382f710d39a5bb4e430307530a720f50c2d3318 #v6.0.0 + uses: docker/build-push-action@f6010ea70151369b06f0194be1051fbbdff851b2 #v6.0.2 with: context: . platforms: ${{ inputs.platforms }}