From ac0fce6b6194f650fd9832f668c7b40e3ec28165 Mon Sep 17 00:00:00 2001 From: Satya Kiran Date: Wed, 25 Jan 2023 11:29:59 +0530 Subject: [PATCH 01/17] Inital commint - Argo CD v2.5.4 release version --- .gitignore | 1 - Makefile | 23 +- OWNERS | 2 - README.md | 14 +- USERS.md | 23 - VERSION | 2 +- .../controllers/applicationset_controller.go | 578 +- .../applicationset_controller_test.go | 2727 +----- .../pull-request-example.yaml | 2 - applicationset/generators/cluster.go | 2 +- .../generators/generator_spec_processor.go | 3 +- applicationset/generators/git.go | 54 +- applicationset/generators/git_test.go | 165 +- applicationset/generators/matrix.go | 7 +- applicationset/generators/matrix_test.go | 37 +- applicationset/generators/pull_request.go | 10 +- .../generators/pull_request_test.go | 74 +- .../services/internal/github_app/client.go | 4 +- .../services/pull_request/bitbucket_server.go | 1 - .../pull_request/bitbucket_server_test.go | 6 - applicationset/services/pull_request/gitea.go | 10 - .../services/pull_request/gitea_test.go | 30 - .../services/pull_request/github.go | 10 - .../services/pull_request/github_test.go | 30 - .../services/pull_request/gitlab.go | 1 - .../services/pull_request/interface.go | 2 - applicationset/services/repo_service.go | 8 +- applicationset/services/scm_provider/gitea.go | 2 +- applicationset/utils/createOrUpdate.go | 2 +- applicationset/utils/policy.go | 11 - applicationset/utils/utils.go | 2 +- applicationset/utils/utils_test.go | 6 +- argocd-cosign.pub | 4 + assets/swagger.json | 472 +- .../commands/applicationset_controller.go | 61 +- cmd/argocd-server/commands/argocd_server.go | 3 - cmd/argocd/commands/account.go | 1 - cmd/argocd/commands/admin/admin.go | 1 - cmd/argocd/commands/admin/app.go | 11 +- cmd/argocd/commands/admin/app_test.go | 1 - cmd/argocd/commands/admin/cluster.go | 31 +- .../commands/admin/generatespec_utils.go | 6 +- cmd/argocd/commands/admin/initial_password.go | 46 - cmd/argocd/commands/admin/project.go | 8 +- cmd/argocd/commands/app.go | 161 +- cmd/argocd/commands/app_test.go | 242 +- cmd/argocd/commands/applicationset.go | 13 +- cmd/argocd/commands/bcrypt.go | 36 - cmd/argocd/commands/bcrypt_test.go | 22 - cmd/argocd/commands/cluster.go | 83 +- cmd/argocd/commands/common.go | 8 +- cmd/argocd/commands/completion.go | 1 - cmd/argocd/commands/headless/headless.go | 23 +- cmd/argocd/commands/login.go | 2 +- cmd/argocd/commands/project.go | 10 +- cmd/argocd/commands/relogin.go | 2 +- cmd/argocd/commands/repo.go | 15 - cmd/argocd/commands/repocreds.go | 29 +- cmd/argocd/commands/root.go | 2 +- cmd/argocd/commands/version.go | 47 +- cmd/argocd/commands/version_test.go | 19 +- cmd/util/app.go | 93 +- cmd/util/app_test.go | 4 +- cmd/util/applicationset.go | 8 +- cmd/util/project.go | 2 +- cmd/util/repo.go | 2 - cmpserver/apiclient/plugin.pb.go | 337 +- cmpserver/plugin/config.go | 21 +- cmpserver/plugin/plugin.go | 163 +- cmpserver/plugin/plugin.proto | 12 - cmpserver/plugin/plugin_test.go | 476 +- .../testdata/kustomize/config/plugin.yaml | 8 +- cmpserver/server.go | 2 +- controller/appcontroller.go | 174 +- controller/appcontroller_test.go | 6 +- controller/cache/cache.go | 19 +- controller/cache/cache_test.go | 53 +- controller/cache/info.go | 11 +- controller/cache/info_test.go | 76 +- controller/clusterinfoupdater.go | 6 +- controller/health.go | 39 +- controller/metrics/metrics.go | 11 +- controller/state.go | 255 +- controller/state_test.go | 132 +- controller/sync.go | 95 +- controller/sync_namespace.go | 55 - controller/sync_namespace_test.go | 261 - controller/sync_test.go | 4 +- docs/assets/repo-add-google-cloud-source.png | Bin 109142 -> 0 bytes docs/assets/repo-add-overview.png | Bin 56121 -> 60954 bytes docs/cli_installation.md | 25 - docs/developer-guide/ci.md | 4 +- docs/developer-guide/code-contributions.md | 2 +- .../debugging-remote-environment.md | 43 +- docs/developer-guide/faq.md | 2 +- .../release-process-and-cadence.md | 93 +- docs/developer-guide/toolchain-guide.md | 21 - docs/faq.md | 5 +- docs/getting_started.md | 4 +- docs/operator-manual/app-any-namespace.md | 220 - docs/operator-manual/application.yaml | 26 - docs/operator-manual/applicationset.yaml | 25 - .../Controlling-Resource-Modification.md | 9 +- .../applicationset/Generators-Git.md | 3 - .../applicationset/Generators-Matrix.md | 98 - .../applicationset/Generators-Pull-Request.md | 3 +- .../applicationset/Progressive-Rollouts.md | 111 - docs/operator-manual/argocd-cm.yaml | 31 +- .../operator-manual/argocd-cmd-params-cm.yaml | 24 - .../config-management-plugins.md | 490 -- docs/operator-manual/custom-styles.md | 4 +- docs/operator-manual/custom_tools.md | 6 +- docs/operator-manual/declarative-setup.md | 33 +- docs/operator-manual/deep_links.md | 63 - docs/operator-manual/health.md | 95 +- docs/operator-manual/high_availability.md | 68 +- .../notifications/services/googlechat.md | 15 +- .../notifications/services/newrelic.md | 61 - .../notifications/services/slack.md | 74 +- .../notifications/services/webex.md | 41 - .../notifications/services/webhook.md | 14 +- docs/operator-manual/project.yaml | 2 - docs/operator-manual/secret-management.md | 21 +- .../server-commands/argocd-server.md | 1 - docs/operator-manual/signed-release-assets.md | 21 +- docs/operator-manual/upgrading/2.2-2.3.md | 2 +- docs/operator-manual/upgrading/2.3-2.4.md | 2 +- docs/operator-manual/upgrading/2.5-2.6.md | 13 - docs/operator-manual/user-management/auth0.md | 4 +- docs/operator-manual/web_based_terminal.md | 29 +- ...-13-appset-progressive-rollout-strategy.md | 177 - docs/proposals/deep-links.md | 133 - docs/proposals/proxy-extensions.md | 425 - docs/roadmap.md | 223 +- docs/snyk/index.md | 81 +- docs/snyk/master/argocd-iac-install.html | 86 +- .../master/argocd-iac-namespace-install.html | 86 +- docs/snyk/master/argocd-test.html | 247 +- ...hcr.io_dexidp_dex_v2.32.0-distroless.html} | 10 +- docs/snyk/master/haproxy_2.6.2-alpine.html | 2 +- .../quay.io_argoproj_argocd_latest.html | 1411 ++- .../redis_7.0.4-alpine.html} | 8 +- .../argocd-iac-install.html} | 666 +- .../argocd-iac-namespace-install.html | 664 +- docs/snyk/v2.2.12/argocd-test.html | 1109 +++ .../v2.2.12/ghcr.io_dexidp_dex_v2.32.0.html | 805 ++ .../haproxy_2.0.29-alpine.html | 110 +- .../quay.io_argoproj_argocd_v2.2.12.html | 4838 +++++++++++ .../redis_6.2.7-alpine.html} | 105 +- docs/snyk/v2.3.13/argocd-test.html | 3314 -------- .../v2.3.13/ghcr.io_dexidp_dex_v2.35.3.html | 492 -- .../quay.io_argoproj_argocd_v2.3.13.html | 2649 ------ .../argocd-iac-install.html | 34 +- .../argocd-iac-namespace-install.html | 34 +- docs/snyk/v2.3.7/argocd-test.html | 1101 +++ .../v2.3.7/ghcr.io_dexidp_dex_v2.32.0.html | 805 ++ .../haproxy_2.0.29-alpine.html | 110 +- ...argoproj_argocd-applicationset_v0.4.1.html | 114 +- .../quay.io_argoproj_argocd_v2.3.7.html} | 1389 +-- .../redis_6.2.7-alpine.html} | 105 +- .../argocd-iac-install.html | 86 +- .../argocd-iac-namespace-install.html | 34 +- docs/snyk/v2.4.11/argocd-test.html | 815 ++ .../v2.4.11/ghcr.io_dexidp_dex_v2.32.0.html | 805 ++ docs/snyk/v2.4.11/haproxy_2.0.29-alpine.html | 592 ++ .../quay.io_argoproj_argocd_v2.4.11.html} | 1345 ++- .../redis_7.0.4-alpine.html} | 8 +- docs/snyk/v2.4.19/argocd-iac-install.html | 2231 ----- docs/snyk/v2.4.19/argocd-test.html | 3404 -------- .../v2.4.19/ghcr.io_dexidp_dex_v2.35.3.html | 492 -- docs/snyk/v2.4.19/redis_7.0.7-alpine.html | 492 -- docs/snyk/v2.5.7/argocd-iac-install.html | 2231 ----- docs/snyk/v2.5.7/argocd-test.html | 3434 -------- .../v2.5.7/ghcr.io_dexidp_dex_v2.35.3.html | 492 -- docs/snyk/v2.5.7/redis_7.0.7-alpine.html | 492 -- docs/snyk/v2.6.0-rc4/argocd-test.html | 623 -- .../ghcr.io_dexidp_dex_v2.35.3.html | 492 -- .../quay.io_argoproj_argocd_v2.6.0-rc4.html | 2649 ------ docs/snyk/v2.6.0-rc4/redis_7.0.7-alpine.html | 492 -- docs/user-guide/app_deletion.md | 6 +- docs/user-guide/application_sources.md | 2 +- docs/user-guide/auto_sync.md | 1 - docs/user-guide/build-environment.md | 2 +- docs/user-guide/commands/argocd_account.md | 1 - .../commands/argocd_account_bcrypt.md | 42 - docs/user-guide/commands/argocd_admin.md | 7 +- .../argocd_admin_app_get-reconcile-results.md | 2 +- .../argocd_admin_cluster_kubeconfig.md | 2 +- .../argocd_admin_cluster_namespaces.md | 2 +- ...ster_namespaces_disable-namespaced-mode.md | 42 +- ...uster_namespaces_enable-namespaced-mode.md | 46 +- .../commands/argocd_admin_cluster_shards.md | 2 +- .../commands/argocd_admin_cluster_stats.md | 2 +- .../commands/argocd_admin_export.md | 2 +- .../commands/argocd_admin_import.md | 2 +- .../commands/argocd_admin_initial-password.md | 59 - .../commands/argocd_admin_notifications.md | 2 +- .../argocd_admin_proj_generate-allow-list.md | 2 +- .../argocd_admin_proj_update-role-policy.md | 2 +- .../argocd_admin_repo_generate-spec.md | 1 - .../commands/argocd_admin_settings.md | 2 +- .../argocd_admin_settings_rbac_can.md | 50 +- docs/user-guide/commands/argocd_app_sync.md | 5 +- docs/user-guide/commands/argocd_app_wait.md | 12 +- docs/user-guide/commands/argocd_cluster.md | 4 - .../user-guide/commands/argocd_cluster_set.md | 51 - docs/user-guide/commands/argocd_repo_add.md | 4 - .../commands/argocd_repocreds_add.md | 4 - docs/user-guide/config-management-plugins.md | 287 + docs/user-guide/helm.md | 21 +- docs/user-guide/kustomize.md | 4 +- docs/user-guide/multiple_sources.md | 73 - docs/user-guide/parameters.md | 7 + docs/user-guide/private-repositories.md | 27 - docs/user-guide/projects.md | 35 +- docs/user-guide/sync-options.md | 155 +- docs/user-guide/tool_detection.md | 8 +- docs/user-guide/tracking_strategies.md | 2 + examples/plugins/helm/README.md | 10 - .../argocd-repo-server-deployment-patch.yaml | 54 - examples/plugins/helm/generate.sh | 6 - examples/plugins/helm/get-parameters.sh | 8 - examples/plugins/helm/kustomization.yaml | 15 - examples/plugins/helm/plugin.yaml | 17 - go.mod | 181 +- go.sum | 631 +- .../generators/application_generator.go | 2 +- .../generators/cluster_generator.go | 118 +- .../generators/project_generator.go | 4 +- hack/gen-resources/util/gen_options_parser.go | 10 +- hack/gen-resources/util/sizedwaitgroup.go | 107 - hack/generate-proto.sh | 33 +- hack/generate-release-notes.sh | 36 +- .../helm-v3.10.3-linux-amd64.tar.gz.sha256 | 1 - .../helm-v3.10.3-linux-arm64.tar.gz.sha256 | 1 - .../helm-v3.10.3-linux-ppc64le.tar.gz.sha256 | 1 - .../helm-v3.10.3-linux-s390x.tar.gz.sha256 | 1 - hack/snyk-report.sh | 12 +- hack/tool-versions.sh | 2 +- ...-applicationset-controller-deployment.yaml | 68 +- manifests/base/kustomization.yaml | 2 +- .../base/redis/argocd-redis-deployment.yaml | 2 +- .../argocd-repo-server-deployment.yaml | 9 +- .../base/server/argocd-server-deployment.yaml | 7 - manifests/core-install.yaml | 7436 ++-------------- manifests/core-install/kustomization.yaml | 2 +- manifests/crds/application-crd.yaml | 3144 ++----- manifests/crds/applicationset-crd.yaml | 4077 +-------- manifests/ha/base/kustomization.yaml | 2 +- .../ha/base/redis-ha/chart/upstream.yaml | 18 +- manifests/ha/base/redis-ha/chart/values.yaml | 7 +- manifests/ha/install.yaml | 7556 ++--------------- manifests/ha/namespace-install.yaml | 211 +- manifests/install.yaml | 7437 ++-------------- manifests/namespace-install.yaml | 92 +- mkdocs.yml | 8 +- pkg/apiclient/apiclient.go | 10 +- pkg/apiclient/application/application.pb.go | 1283 +-- .../application/application.pb.gw.go | 238 - .../application/forwarder_overwrite.go | 96 +- .../application/forwarder_overwrite_test.go | 53 - pkg/apiclient/project/project.pb.go | 345 +- pkg/apiclient/project/project.pb.gw.go | 101 - pkg/apiclient/repository/repository.pb.go | 199 +- pkg/apis/api-rules/violation_exceptions.list | 14 - .../application/v1alpha1/app_project_types.go | 31 +- .../v1alpha1/applicationset_types.go | 61 +- pkg/apis/application/v1alpha1/generated.pb.go | 6487 ++++---------- pkg/apis/application/v1alpha1/generated.proto | 125 +- .../application/v1alpha1/openapi_generated.go | 545 +- .../application/v1alpha1/repository_types.go | 18 - pkg/apis/application/v1alpha1/types.go | 182 +- pkg/apis/application/v1alpha1/types_test.go | 247 +- .../v1alpha1/zz_generated.deepcopy.go | 358 +- .../mocks/RepoServerServiceClient.go | 34 +- reposerver/apiclient/repository.pb.go | 2110 +---- reposerver/cache/cache.go | 78 +- reposerver/cache/cache_test.go | 66 +- reposerver/repository/lock.go | 6 +- reposerver/repository/repository.go | 511 +- reposerver/repository/repository.proto | 46 - reposerver/repository/repository_test.go | 355 +- .../testdata/oci-dependencies/Chart.yaml | 6 - reposerver/server.go | 2 +- .../cluster.x-k8s.io/Cluster/health.lua | 21 +- .../cluster.x-k8s.io/Cluster/health_test.yaml | 6 +- .../Cluster/testdata/error_provisioned.yaml | 54 - .../MachineHealthCheck/health.lua | 14 - .../MachineHealthCheck/health_test.yaml | 9 - .../testdata/degraded_expectedMachines.yaml | 33 - .../MachineHealthCheck/testdata/healthy.yaml | 33 - .../SecretStore/health.lua | 20 - .../SecretStore/health_test.yaml | 9 - .../SecretStore/testdata/degraded.yaml | 24 - .../SecretStore/testdata/healthy.yaml | 29 - .../KeptnAppVersion/health.lua | 14 - .../KeptnAppVersion/health_test.yaml | 13 - .../KeptnAppVersion/testdata/degraded.yaml | 93 - .../KeptnAppVersion/testdata/healthy.yaml | 93 - .../KeptnAppVersion/testdata/progressing.yaml | 93 - .../KeptnEvaluation/health.lua | 14 - .../KeptnEvaluation/health_test.yaml | 13 - .../KeptnEvaluation/testdata/degraded.yaml | 33 - .../KeptnEvaluation/testdata/healthy.yaml | 33 - .../KeptnEvaluation/testdata/progressing.yaml | 33 - .../lifecycle.keptn.sh/KeptnTask/health.lua | 14 - .../KeptnTask/health_test.yaml | 13 - .../KeptnTask/testdata/degraded.yaml | 36 - .../KeptnTask/testdata/healthy.yaml | 37 - .../KeptnTask/testdata/progressing.yaml | 36 - .../KeptnWorkloadInstance/health.lua | 14 - .../KeptnWorkloadInstance/health_test.yaml | 13 - .../testdata/degraded.yaml | 50 - .../testdata/healthy.yaml | 51 - .../testdata/progressing.yaml | 50 - .../serving.knative.dev/Service/health.lua | 40 - .../Service/health_test.yaml | 13 - .../Service/testdata/degraded.yaml | 21 - .../Service/testdata/healthy.yaml | 17 - .../Service/testdata/progressing.yaml | 21 - .../ClusterResourceBinding/health.lua | 37 - .../ClusterResourceBinding/health_test.yaml | 31 - .../testdata/degraded_unapplied.yaml | 46 - .../testdata/degraded_unhealth.yaml | 46 - .../testdata/degraded_unknown.yaml | 46 - .../testdata/health.yaml | 83 - .../testdata/health_unknown.yaml | 46 - .../testdata/progressing.yaml | 41 - .../progressing_aggregatedStatus.yaml | 46 - .../testdata/progressing_cluster.yaml | 34 - .../ResourceBinding/health.lua | 37 - .../ResourceBinding/health_test.yaml | 31 - .../testdata/degraded_unapplied.yaml | 50 - .../testdata/degraded_unhealth.yaml | 47 - .../testdata/degraded_unknown.yaml | 47 - .../ResourceBinding/testdata/health.yaml | 84 - .../testdata/health_unknown.yaml | 47 - .../ResourceBinding/testdata/progressing.yaml | 42 - .../progressing_aggregatedStatus.yaml | 47 - .../testdata/progressing_cluster.yaml | 35 - server/application/application.go | 213 +- server/application/application.proto | 27 - server/application/application_test.go | 11 +- server/application/terminal.go | 50 +- server/application/terminal_test.go | 23 +- server/applicationset/applicationset.go | 15 +- server/deeplinks/deeplinks.go | 63 - server/deeplinks/deeplinks_test.go | 101 - server/extension/extension.go | 357 - server/extension/extension_test.go | 342 - server/extension/mocks/ApplicationGetter.go | 51 - server/extension/mocks/SettingsGetter.go | 51 - server/project/project.go | 53 +- server/project/project.proto | 12 +- server/project/project_test.go | 14 +- server/repository/repository.go | 20 +- server/repository/repository.proto | 4 +- server/repository/repository_test.go | 64 +- server/server.go | 159 +- server/settings/settings.go | 36 +- server/version/version.go | 10 +- test/cmp/plugin.yaml | 14 - test/container/Dockerfile | 12 +- test/e2e/app_autosync_test.go | 3 +- test/e2e/app_management_ns_test.go | 338 +- test/e2e/app_management_test.go | 52 +- test/e2e/app_multiple_sources_test.go | 165 - test/e2e/app_namespaces_test.go | 6 +- test/e2e/applicationset_test.go | 327 +- test/e2e/cluster_generator_test.go | 16 +- test/e2e/cluster_test.go | 23 +- test/e2e/clusterdecisiongenerator_e2e_test.go | 16 +- test/e2e/custom_tool_test.go | 23 +- test/e2e/fixture/app/actions.go | 50 +- test/e2e/fixture/app/context.go | 6 - test/e2e/fixture/app/expectation.go | 30 - .../fixture/applicationsets/expectation.go | 8 +- test/e2e/fixture/cluster/actions.go | 13 - test/e2e/fixture/cluster/context.go | 16 +- test/e2e/helm_test.go | 36 +- test/e2e/kustomize_test.go | 12 +- test/e2e/matrix_e2e_test.go | 8 +- test/e2e/merge_e2e_test.go | 8 +- test/e2e/project_management_test.go | 14 +- test/e2e/testdata/data.go | 3 - .../guestbook-ui-deployment.yaml | 23 - .../guestbook-ui-namespace.yaml | 9 - .../guestbook-ui-svc.yaml | 10 - .../kustomization.yaml | 7 - .../multiple-source-values/pod-1.yaml | 14 - .../multiple-source-values/values.yaml | 1 - test/manifests/cmp/README.md | 15 - test/manifests/cmp/app.yaml | 23 - test/manifests/cmp/app/subdir/sidecar.yaml | 4 - test/manifests/cmp/kustomization.yaml | 15 - test/manifests/cmp/plugin.yaml | 29 - test/manifests/cmp/repo-patch.yaml | 40 - test/manifests/cmp/secret-patch.yaml | 13 - test/testutil.go | 15 - ui/package.json | 16 +- .../application-conditions.tsx | 2 +- .../application-create-panel.tsx | 20 +- .../application-deployment-history.tsx | 7 +- .../application-details.scss | 71 - .../application-details.tsx | 77 +- .../application-resource-list.tsx | 16 +- .../application-node-info.tsx | 34 +- .../application-operation-state.tsx | 6 +- .../application-parameters.tsx | 111 +- .../application-pod-view/pod-view.scss | 13 +- .../application-pod-view/pod-view.tsx | 18 +- .../application-resource-tree.scss | 4 +- .../application-resource-tree.tsx | 18 +- .../application-resources-diff.tsx | 2 +- .../individual-diff-section.tsx | 2 +- .../application-retry-options.tsx | 2 +- .../application-retry-view.tsx | 2 +- .../application-status-panel.tsx | 30 +- .../application-summary.tsx | 46 +- .../edit-notification-subscriptions.tsx | 2 +- .../application-sync-options.tsx | 2 +- .../application-sync-panel.tsx | 9 +- .../components/application-urls.tsx | 18 +- .../applications-list/applications-filter.tsx | 42 +- .../applications-list/applications-labels.tsx | 5 +- .../applications-list/applications-list.scss | 11 - .../applications-list/applications-list.tsx | 24 +- .../applications-list/applications-source.tsx | 2 +- .../applications-status-bar.tsx | 2 +- .../applications-list/applications-table.tsx | 21 +- .../applications-list/applications-tiles.tsx | 341 +- .../applications-sync-panel.tsx | 4 +- .../applications/components/filter/filter.tsx | 3 +- .../pod-terminal-viewer.tsx | 13 +- .../resource-details/resource-details.tsx | 38 +- .../applications/components/utils.test.tsx | 34 +- ui/src/app/applications/components/utils.tsx | 178 +- .../components/certs-list/certs-list.tsx | 4 +- .../cluster-details/cluster-details.tsx | 24 +- .../project-details/project-details.tsx | 9 - .../components/repos-list/repos-list.tsx | 97 +- .../settings-overview/settings-overview.tsx | 4 +- .../application-selector.tsx | 6 +- .../app/shared/components/clipboard-text.tsx | 30 - ui/src/app/shared/components/cluster.tsx | 2 +- ui/src/app/shared/components/deep-links.tsx | 19 - ui/src/app/shared/components/index.ts | 1 - ui/src/app/shared/components/revision.tsx | 12 +- ui/src/app/shared/components/timestamp.tsx | 6 +- ui/src/app/shared/components/urls.ts | 12 +- ui/src/app/shared/models.ts | 43 - .../shared/services/applications-service.ts | 47 +- .../app/shared/services/extensions-service.ts | 26 +- .../app/shared/services/projects-service.ts | 7 - ui/src/app/shared/services/repo-service.ts | 28 - .../app/shared/services/repocreds-service.ts | 19 +- .../services/view-preferences-service.ts | 5 +- ui/src/app/shared/utils.test.ts | 14 - ui/src/app/shared/utils.ts | 28 - .../user-info-overview/user-info-overview.tsx | 2 +- ui/yarn.lock | 1297 ++- util/app/discovery/discovery.go | 120 +- util/appset/appset.go | 12 + util/argo/argo.go | 400 +- util/argo/argo_test.go | 386 +- util/cmp/stream.go | 48 +- util/db/cluster.go | 10 +- util/db/repository.go | 2 - util/db/repository_legacy.go | 29 +- util/db/repository_secrets.go | 6 - util/db/repository_secrets_test.go | 90 +- util/git/client.go | 24 +- util/git/creds.go | 102 +- util/git/creds_test.go | 58 - util/github_app/repos.go | 2 +- util/gpg/gpg.go | 10 +- util/helm/client.go | 170 +- util/helm/client_test.go | 87 - util/helm/cmd.go | 40 + util/helm/mocks/Client.go | 23 - util/helm/tags.go | 42 - util/helm/tags_test.go | 44 - util/helm/testdata/redis/README.md | 2 +- .../testdata/redis/values-production.yaml | 6 +- util/helm/testdata/redis/values.yaml | 6 +- util/io/mocks/TempPaths.go | 65 - util/io/paths.go | 28 +- util/io/paths_test.go | 22 +- util/kube/kube.go | 2 +- util/kube/portforwarder.go | 3 +- util/kube/util.go | 2 +- util/kustomize/kustomize.go | 4 +- util/lua/lua.go | 26 - util/lua/lua_test.go | 34 - util/notification/expression/repo/repo.go | 2 +- util/notification/settings/legacy.go | 16 +- util/oidc/oidc.go | 2 +- util/oidc/oidc_test.go | 2 +- util/oidc/provider.go | 2 +- util/rbac/rbac.go | 2 +- util/security/application_namespaces.go | 15 - util/security/application_namespaces_test.go | 62 - util/security/rbac.go | 14 - util/security/rbac_test.go | 52 - util/session/sessionmanager.go | 48 +- util/session/sessionmanager_test.go | 134 - util/settings/accounts.go | 2 +- util/settings/settings.go | 60 +- util/webhook/webhook.go | 81 +- util/webhook/webhook_test.go | 226 +- 510 files changed, 24084 insertions(+), 84454 deletions(-) create mode 100644 argocd-cosign.pub delete mode 100644 cmd/argocd/commands/admin/initial_password.go delete mode 100644 cmd/argocd/commands/bcrypt.go delete mode 100644 cmd/argocd/commands/bcrypt_test.go delete mode 100644 controller/sync_namespace.go delete mode 100644 controller/sync_namespace_test.go delete mode 100644 docs/assets/repo-add-google-cloud-source.png delete mode 100644 docs/operator-manual/app-any-namespace.md delete mode 100644 docs/operator-manual/applicationset.yaml delete mode 100644 docs/operator-manual/applicationset/Progressive-Rollouts.md delete mode 100644 docs/operator-manual/config-management-plugins.md delete mode 100644 docs/operator-manual/deep_links.md delete mode 100755 docs/operator-manual/notifications/services/newrelic.md delete mode 100755 docs/operator-manual/notifications/services/webex.md delete mode 100644 docs/operator-manual/upgrading/2.5-2.6.md delete mode 100644 docs/proposals/2022-07-13-appset-progressive-rollout-strategy.md delete mode 100644 docs/proposals/deep-links.md delete mode 100644 docs/proposals/proxy-extensions.md rename docs/snyk/master/{ghcr.io_dexidp_dex_v2.35.3.html => ghcr.io_dexidp_dex_v2.32.0-distroless.html} (97%) rename docs/snyk/{v2.3.13/redis_6.2.8-alpine.html => master/redis_7.0.4-alpine.html} (98%) rename docs/snyk/{v2.5.7/argocd-iac-namespace-install.html => v2.2.12/argocd-iac-install.html} (82%) rename docs/snyk/{v2.6.0-rc4 => v2.2.12}/argocd-iac-namespace-install.html (82%) create mode 100644 docs/snyk/v2.2.12/argocd-test.html create mode 100644 docs/snyk/v2.2.12/ghcr.io_dexidp_dex_v2.32.0.html rename docs/snyk/{v2.4.19 => v2.2.12}/haproxy_2.0.29-alpine.html (69%) create mode 100644 docs/snyk/v2.2.12/quay.io_argoproj_argocd_v2.2.12.html rename docs/snyk/{v2.6.0-rc4/haproxy_2.6.2-alpine.html => v2.2.12/redis_6.2.7-alpine.html} (70%) delete mode 100644 docs/snyk/v2.3.13/argocd-test.html delete mode 100644 docs/snyk/v2.3.13/ghcr.io_dexidp_dex_v2.35.3.html delete mode 100644 docs/snyk/v2.3.13/quay.io_argoproj_argocd_v2.3.13.html rename docs/snyk/{v2.3.13 => v2.3.7}/argocd-iac-install.html (99%) rename docs/snyk/{v2.3.13 => v2.3.7}/argocd-iac-namespace-install.html (99%) create mode 100644 docs/snyk/v2.3.7/argocd-test.html create mode 100644 docs/snyk/v2.3.7/ghcr.io_dexidp_dex_v2.32.0.html rename docs/snyk/{v2.3.13 => v2.3.7}/haproxy_2.0.29-alpine.html (69%) rename docs/snyk/{v2.3.13 => v2.3.7}/quay.io_argoproj_argocd-applicationset_v0.4.1.html (97%) rename docs/snyk/{v2.5.7/quay.io_argoproj_argocd_v2.5.7.html => v2.3.7/quay.io_argoproj_argocd_v2.3.7.html} (72%) rename docs/snyk/{v2.5.7/haproxy_2.6.2-alpine.html => v2.3.7/redis_6.2.7-alpine.html} (70%) rename docs/snyk/{v2.6.0-rc4 => v2.4.11}/argocd-iac-install.html (97%) rename docs/snyk/{v2.4.19 => v2.4.11}/argocd-iac-namespace-install.html (98%) create mode 100644 docs/snyk/v2.4.11/argocd-test.html create mode 100644 docs/snyk/v2.4.11/ghcr.io_dexidp_dex_v2.32.0.html create mode 100644 docs/snyk/v2.4.11/haproxy_2.0.29-alpine.html rename docs/snyk/{v2.4.19/quay.io_argoproj_argocd_v2.4.19.html => v2.4.11/quay.io_argoproj_argocd_v2.4.11.html} (70%) rename docs/snyk/{master/redis_7.0.7-alpine.html => v2.4.11/redis_7.0.4-alpine.html} (98%) delete mode 100644 docs/snyk/v2.4.19/argocd-iac-install.html delete mode 100644 docs/snyk/v2.4.19/argocd-test.html delete mode 100644 docs/snyk/v2.4.19/ghcr.io_dexidp_dex_v2.35.3.html delete mode 100644 docs/snyk/v2.4.19/redis_7.0.7-alpine.html delete mode 100644 docs/snyk/v2.5.7/argocd-iac-install.html delete mode 100644 docs/snyk/v2.5.7/argocd-test.html delete mode 100644 docs/snyk/v2.5.7/ghcr.io_dexidp_dex_v2.35.3.html delete mode 100644 docs/snyk/v2.5.7/redis_7.0.7-alpine.html delete mode 100644 docs/snyk/v2.6.0-rc4/argocd-test.html delete mode 100644 docs/snyk/v2.6.0-rc4/ghcr.io_dexidp_dex_v2.35.3.html delete mode 100644 docs/snyk/v2.6.0-rc4/quay.io_argoproj_argocd_v2.6.0-rc4.html delete mode 100644 docs/snyk/v2.6.0-rc4/redis_7.0.7-alpine.html delete mode 100644 docs/user-guide/commands/argocd_account_bcrypt.md delete mode 100644 docs/user-guide/commands/argocd_admin_initial-password.md delete mode 100644 docs/user-guide/commands/argocd_cluster_set.md create mode 100644 docs/user-guide/config-management-plugins.md delete mode 100644 docs/user-guide/multiple_sources.md delete mode 100644 examples/plugins/helm/README.md delete mode 100644 examples/plugins/helm/argocd-repo-server-deployment-patch.yaml delete mode 100755 examples/plugins/helm/generate.sh delete mode 100755 examples/plugins/helm/get-parameters.sh delete mode 100644 examples/plugins/helm/kustomization.yaml delete mode 100644 examples/plugins/helm/plugin.yaml delete mode 100644 hack/gen-resources/util/sizedwaitgroup.go delete mode 100644 hack/installers/checksums/helm-v3.10.3-linux-amd64.tar.gz.sha256 delete mode 100644 hack/installers/checksums/helm-v3.10.3-linux-arm64.tar.gz.sha256 delete mode 100644 hack/installers/checksums/helm-v3.10.3-linux-ppc64le.tar.gz.sha256 delete mode 100644 hack/installers/checksums/helm-v3.10.3-linux-s390x.tar.gz.sha256 delete mode 100644 pkg/apiclient/application/forwarder_overwrite_test.go delete mode 100644 reposerver/repository/testdata/oci-dependencies/Chart.yaml delete mode 100644 resource_customizations/cluster.x-k8s.io/Cluster/testdata/error_provisioned.yaml delete mode 100644 resource_customizations/cluster.x-k8s.io/MachineHealthCheck/health.lua delete mode 100644 resource_customizations/cluster.x-k8s.io/MachineHealthCheck/health_test.yaml delete mode 100644 resource_customizations/cluster.x-k8s.io/MachineHealthCheck/testdata/degraded_expectedMachines.yaml delete mode 100644 resource_customizations/cluster.x-k8s.io/MachineHealthCheck/testdata/healthy.yaml delete mode 100644 resource_customizations/external-secrets.io/SecretStore/health.lua delete mode 100644 resource_customizations/external-secrets.io/SecretStore/health_test.yaml delete mode 100644 resource_customizations/external-secrets.io/SecretStore/testdata/degraded.yaml delete mode 100644 resource_customizations/external-secrets.io/SecretStore/testdata/healthy.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/health.lua delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/health_test.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/degraded.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/healthy.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/progressing.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/health.lua delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/health_test.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/degraded.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/healthy.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/progressing.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnTask/health.lua delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnTask/health_test.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/degraded.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/healthy.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/progressing.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/health.lua delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/health_test.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/degraded.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/healthy.yaml delete mode 100644 resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/progressing.yaml delete mode 100644 resource_customizations/serving.knative.dev/Service/health.lua delete mode 100644 resource_customizations/serving.knative.dev/Service/health_test.yaml delete mode 100644 resource_customizations/serving.knative.dev/Service/testdata/degraded.yaml delete mode 100644 resource_customizations/serving.knative.dev/Service/testdata/healthy.yaml delete mode 100644 resource_customizations/serving.knative.dev/Service/testdata/progressing.yaml delete mode 100644 resource_customizations/work.karmada.io/ClusterResourceBinding/health.lua delete mode 100644 resource_customizations/work.karmada.io/ClusterResourceBinding/health_test.yaml delete mode 100644 resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unapplied.yaml delete mode 100644 resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unhealth.yaml delete mode 100644 resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unknown.yaml delete mode 100644 resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/health.yaml delete mode 100644 resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/health_unknown.yaml delete mode 100644 resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing.yaml delete mode 100644 resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing_aggregatedStatus.yaml delete mode 100644 resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing_cluster.yaml delete mode 100644 resource_customizations/work.karmada.io/ResourceBinding/health.lua delete mode 100644 resource_customizations/work.karmada.io/ResourceBinding/health_test.yaml delete mode 100644 resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unapplied.yaml delete mode 100644 resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unhealth.yaml delete mode 100644 resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unknown.yaml delete mode 100644 resource_customizations/work.karmada.io/ResourceBinding/testdata/health.yaml delete mode 100644 resource_customizations/work.karmada.io/ResourceBinding/testdata/health_unknown.yaml delete mode 100644 resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing.yaml delete mode 100644 resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing_aggregatedStatus.yaml delete mode 100644 resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing_cluster.yaml delete mode 100644 server/deeplinks/deeplinks.go delete mode 100644 server/deeplinks/deeplinks_test.go delete mode 100644 server/extension/extension.go delete mode 100644 server/extension/extension_test.go delete mode 100644 server/extension/mocks/ApplicationGetter.go delete mode 100644 server/extension/mocks/SettingsGetter.go delete mode 100644 test/e2e/app_multiple_sources_test.go delete mode 100644 test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-deployment.yaml delete mode 100644 test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-namespace.yaml delete mode 100644 test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-svc.yaml delete mode 100644 test/e2e/testdata/guestbook-with-namespace-manifest/kustomization.yaml delete mode 100644 test/e2e/testdata/multiple-source-values/pod-1.yaml delete mode 100644 test/e2e/testdata/multiple-source-values/values.yaml delete mode 100644 test/manifests/cmp/README.md delete mode 100644 test/manifests/cmp/app.yaml delete mode 100644 test/manifests/cmp/app/subdir/sidecar.yaml delete mode 100644 test/manifests/cmp/kustomization.yaml delete mode 100644 test/manifests/cmp/plugin.yaml delete mode 100644 test/manifests/cmp/repo-patch.yaml delete mode 100644 test/manifests/cmp/secret-patch.yaml delete mode 100644 ui/src/app/shared/components/clipboard-text.tsx delete mode 100644 ui/src/app/shared/components/deep-links.tsx delete mode 100644 ui/src/app/shared/utils.test.ts create mode 100644 util/appset/appset.go delete mode 100644 util/helm/tags.go delete mode 100644 util/helm/tags_test.go delete mode 100644 util/io/mocks/TempPaths.go delete mode 100644 util/security/application_namespaces.go delete mode 100644 util/security/application_namespaces_test.go delete mode 100644 util/security/rbac.go delete mode 100644 util/security/rbac_test.go diff --git a/.gitignore b/.gitignore index 869bb876f8110..3dbfd6f8b0ed9 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,6 @@ test-results node_modules/ .kube/ ./test/cmp/*.sock -.envrc.remote # ignore built binaries cmd/argocd/argocd diff --git a/Makefile b/Makefile index 37edfbd618021..b8d02762ed8f8 100644 --- a/Makefile +++ b/Makefile @@ -64,20 +64,13 @@ else DOCKER_SRC_MOUNT="$(PWD):/go/src/github.com/argoproj/argo-cd$(VOLUME_MOUNT)" endif -# User and group IDs to map to the test container -CONTAINER_UID=$(shell id -u) -CONTAINER_GID=$(shell id -g) - -# Set SUDO to sudo to run privileged commands with sudo -SUDO?= - # Runs any command in the argocd-test-utils container in server mode # Server mode container will start with uid 0 and drop privileges during runtime define run-in-test-server - $(SUDO) docker run --rm -it \ + docker run --rm -it \ --name argocd-test-server \ - -u $(CONTAINER_UID):$(CONTAINER_GID) \ - -e USER_ID=$(CONTAINER_UID) \ + -u $(shell id -u):$(shell id -g) \ + -e USER_ID=$(shell id -u) \ -e HOME=/home/user \ -e GOPATH=/go \ -e GOCACHE=/tmp/go-build-cache \ @@ -105,9 +98,9 @@ endef # Runs any command in the argocd-test-utils container in client mode define run-in-test-client - $(SUDO) docker run --rm -it \ + docker run --rm -it \ --name argocd-test-client \ - -u $(CONTAINER_UID):$(CONTAINER_GID) \ + -u $(shell id -u):$(shell id -g) \ -e HOME=/home/user \ -e GOPATH=/go \ -e ARGOCD_E2E_K3S=$(ARGOCD_E2E_K3S) \ @@ -126,7 +119,7 @@ endef # define exec-in-test-server - $(SUDO) docker exec -it -u $(CONTAINER_UID):$(CONTAINER_GID) -e ARGOCD_E2E_RECORD=$(ARGOCD_E2E_RECORD) -e ARGOCD_E2E_K3S=$(ARGOCD_E2E_K3S) argocd-test-server $(1) + docker exec -it -u $(shell id -u):$(shell id -g) -e ARGOCD_E2E_RECORD=$(ARGOCD_E2E_RECORD) -e ARGOCD_E2E_K3S=$(ARGOCD_E2E_K3S) argocd-test-server $(1) endef PATH:=$(PATH):$(PWD)/hack @@ -251,8 +244,8 @@ release-cli: clean-debug build-ui .PHONY: test-tools-image test-tools-image: ifndef SKIP_TEST_TOOLS_IMAGE - $(SUDO) docker build --build-arg UID=$(CONTAINER_UID) -t $(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE) -f test/container/Dockerfile . - $(SUDO) docker tag $(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE) $(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE):$(TEST_TOOLS_TAG) + docker build --build-arg UID=$(shell id -u) -t $(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE) -f test/container/Dockerfile . + docker tag $(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE) $(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE):$(TEST_TOOLS_TAG) endif .PHONY: manifests-local diff --git a/OWNERS b/OWNERS index 2dc34bf6fc359..235b7e3a9f696 100644 --- a/OWNERS +++ b/OWNERS @@ -27,5 +27,3 @@ reviewers: - wanghong230 - ciiay - saumeya -- zachaller -- 34fathombelow diff --git a/README.md b/README.md index 1ed4164fd60ff..851c424e0baab 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,4 @@ -**Releases:** -[![Release Version](https://img.shields.io/github/v/release/argoproj/argo-cd?label=argo-cd)](https://github.com/argoproj/argo-cd/releases/latest) -[![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/argo-cd)](https://artifacthub.io/packages/helm/argo/argo-cd) - -**Code:** -[![Integration tests](https://github.com/argoproj/argo-cd/workflows/Integration%20tests/badge.svg?branch=master)](https://github.com/argoproj/argo-cd/actions?query=workflow%3A%22Integration+tests%22) -[![codecov](https://codecov.io/gh/argoproj/argo-cd/branch/master/graph/badge.svg)](https://codecov.io/gh/argoproj/argo-cd) -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4486/badge)](https://bestpractices.coreinfrastructure.org/projects/4486) -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fargoproj%2Fargo-cd.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fargoproj%2Fargo-cd?ref=badge_shield) - -**Social:** -[![Twitter Follow](https://img.shields.io/twitter/follow/argoproj?style=social)](https://twitter.com/argoproj) -[![Slack](https://img.shields.io/badge/slack-argoproj-brightgreen.svg?logo=slack)](https://argoproj.github.io/community/join-slack) +[![Integration tests](https://github.com/argoproj/argo-cd/workflows/Integration%20tests/badge.svg?branch=master)](https://github.com/argoproj/argo-cd/actions?query=workflow%3A%22Integration+tests%22) [![slack](https://img.shields.io/badge/slack-argoproj-brightgreen.svg?logo=slack)](https://argoproj.github.io/community/join-slack) [![codecov](https://codecov.io/gh/argoproj/argo-cd/branch/master/graph/badge.svg)](https://codecov.io/gh/argoproj/argo-cd) [![Release Version](https://img.shields.io/github/v/release/argoproj/argo-cd?label=argo-cd)](https://github.com/argoproj/argo-cd/releases/latest) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4486/badge)](https://bestpractices.coreinfrastructure.org/projects/4486) [![Twitter Follow](https://img.shields.io/twitter/follow/argoproj?style=social)](https://twitter.com/argoproj) # Argo CD - Declarative Continuous Delivery for Kubernetes diff --git a/USERS.md b/USERS.md index 426760908b1d2..d145b4123d74e 100644 --- a/USERS.md +++ b/USERS.md @@ -11,11 +11,9 @@ Currently, the following organizations are **officially** using Argo CD: 1. [Adevinta](https://www.adevinta.com/) 1. [Adfinis](https://adfinis.com) 1. [Adventure](https://jp.adventurekk.com/) -1. [AirQo](https://airqo.net/) 1. [Akuity](https://akuity.io/) 1. [Alibaba Group](https://www.alibabagroup.com/) 1. [Allianz Direct](https://www.allianzdirect.de/) -1. [Amadeus IT Group](https://amadeus.com/) 1. [Ambassador Labs](https://www.getambassador.io/) 1. [ANSTO - Australian Synchrotron](https://www.synchrotron.org.au/) 1. [Ant Group](https://www.antgroup.com/) @@ -31,21 +29,18 @@ Currently, the following organizations are **officially** using Argo CD: 1. [BigPanda](https://bigpanda.io) 1. [BioBox Analytics](https://biobox.io) 1. [BMW Group](https://www.bmwgroup.com/) -1. [PT Boer Technology (Btech)](https://btech.id/) 1. [Boozt](https://www.booztgroup.com/) 1. [Boticario](https://www.boticario.com.br/) 1. [Bulder Bank](https://bulderbank.no) 1. [Camptocamp](https://camptocamp.com) 1. [Capital One](https://www.capitalone.com) 1. [CARFAX](https://www.carfax.com) -1. [CARFAX Europe](https://www.carfax.eu) 1. [Casavo](https://casavo.com) 1. [Celonis](https://www.celonis.com/) 1. [CERN](https://home.cern/) 1. [Chargetrip](https://chargetrip.com) 1. [Chime](https://www.chime.com) 1. [Cisco ET&I](https://eti.cisco.com/) -1. [Cloud Scale](https://cloudscaleinc.com/) 1. [Cobalt](https://www.cobalt.io/) 1. [Codefresh](https://www.codefresh.io/) 1. [Codility](https://www.codility.com/) @@ -58,11 +53,8 @@ Currently, the following organizations are **officially** using Argo CD: 1. [D2iQ](https://www.d2iq.com) 1. [Datarisk](https://www.datarisk.io/) 1. [Deloitte](https://www.deloitte.com/) -1. [Deutsche Telekom AG](https://telekom.com) 1. [Devopsi - Poland Software/DevOps Consulting](https://devopsi.pl/) 1. [Devtron Labs](https://github.com/devtron-labs/devtron) -1. [Divistant](https://divistant.com) -1. [Doximity](https://www.doximity.com/) 1. [EDF Renewables](https://www.edf-re.com/) 1. [edX](https://edx.org) 1. [Elastic](https://elastic.co/) @@ -72,7 +64,6 @@ Currently, the following organizations are **officially** using Argo CD: 1. [END.](https://www.endclothing.com/) 1. [Energisme](https://energisme.com/) 1. [enigmo](https://enigmo.co.jp/) -1. [Envoy](https://envoy.com/) 1. [Faro](https://www.faro.com/) 1. [Fave](https://myfave.com) 1. [Flip](https://flip.id) @@ -83,8 +74,6 @@ Currently, the following organizations are **officially** using Argo CD: 1. [G DATA CyberDefense AG](https://www.gdata-software.com/) 1. [Garner](https://www.garnercorp.com) 1. [Generali Deutschland AG](https://www.generali.de/) -1. [Gepardec](https://gepardec.com/) -1. [GetYourGuide](https://www.getyourguide.com/) 1. [Gitpod](https://www.gitpod.io) 1. [Gllue](https://gllue.com) 1. [gloat](https://gloat.com/) @@ -106,7 +95,6 @@ Currently, the following organizations are **officially** using Argo CD: 1. [Ibotta](https://home.ibotta.com) 1. [IITS-Consulting](https://iits-consulting.de) 1. [imaware](https://imaware.health) -1. [Indeed](https://indeed.com) 1. [Index Exchange](https://www.indexexchange.com/) 1. [InsideBoard](https://www.insideboard.com) 1. [Intuit](https://www.intuit.com/) @@ -126,7 +114,6 @@ Currently, the following organizations are **officially** using Argo CD: 1. [Kurly](https://www.kurly.com/) 1. [LexisNexis](https://www.lexisnexis.com/) 1. [Lian Chu Securities](https://lczq.com) -1. [Liatrio](https://www.liatrio.com) 1. [Lightricks](https://www.lightricks.com/) 1. [LINE](https://linecorp.com/en/) 1. [Lytt](https://www.lytt.co/) @@ -139,7 +126,6 @@ Currently, the following organizations are **officially** using Argo CD: 1. [Max Kelsen](https://www.maxkelsen.com/) 1. [MeDirect](https://medirect.com.mt/) 1. [Meican](https://meican.com/) -1. [Mercedes-Benz Tech Innovation](https://www.mercedes-benz-techinnovation.com/) 1. [Metanet](http://www.metanet.co.kr/en/) 1. [MindSpore](https://mindspore.cn) 1. [Mirantis](https://mirantis.com/) @@ -154,7 +140,6 @@ Currently, the following organizations are **officially** using Argo CD: 1. [Nextdoor](https://nextdoor.com/) 1. [Nikkei](https://www.nikkei.co.jp/nikkeiinfo/en/) 1. [Nitro](https://gonitro.com) -1. [Objective](https://www.objective.com.br/) 1. [OCCMundial](https://occ.com.mx) 1. [Octadesk](https://octadesk.com) 1. [omegaUp](https://omegaUp.com) @@ -163,7 +148,6 @@ Currently, the following organizations are **officially** using Argo CD: 1. [openLooKeng](https://openlookeng.io) 1. [OpenSaaS Studio](https://opensaas.studio) 1. [Opensurvey](https://www.opensurvey.co.kr/) -1. [OpsMx](https://opsmx.io) 1. [OpsVerse](https://opsverse.io) 1. [Optoro](https://www.optoro.com/) 1. [Orbital Insight](https://orbitalinsight.com/) @@ -171,10 +155,8 @@ Currently, the following organizations are **officially** using Argo CD: 1. [Packlink](https://www.packlink.com/) 1. [Pandosearch](https://www.pandosearch.com/en/home) 1. [PagerDuty](https://www.pagerduty.com/) -1. [Patreon](https://www.patreon.com/) 1. [PayPay](https://paypay.ne.jp/) 1. [Peloton Interactive](https://www.onepeloton.com/) -1. [Pigment](https://www.gopigment.com/) 1. [Pipefy](https://www.pipefy.com/) 1. [Pismo](https://pismo.io/) 1. [Polarpoint.io](https://polarpoint.io) @@ -199,7 +181,6 @@ Currently, the following organizations are **officially** using Argo CD: 1. [Saloodo! GmbH](https://www.saloodo.com) 1. [Sap Labs](http://sap.com) 1. [Schwarz IT](https://jobs.schwarz/it-mission) -1. [SI Analytics](https://si-analytics.ai) 1. [Skit](https://skit.ai/) 1. [Skyscanner](https://www.skyscanner.net/) 1. [Smilee.io](https://smilee.io) @@ -231,7 +212,6 @@ Currently, the following organizations are **officially** using Argo CD: 1. [Toss](https://toss.im/en) 1. [Trendyol](https://www.trendyol.com/) 1. [tru.ID](https://tru.id) -1. [Trusting Social](https://trustingsocial.com/) 1. [Twilio SendGrid](https://sendgrid.com) 1. [tZERO](https://www.tzero.com/) 1. [UBIO](https://ub.io/) @@ -240,11 +220,9 @@ Currently, the following organizations are **officially** using Argo CD: 1. [Unifonic Inc](https://www.unifonic.com/) 1. [Universidad Mesoamericana](https://www.umes.edu.gt/) 1. [Viaduct](https://www.viaduct.ai/) -1. [Vinted](https://vinted.com/) 1. [Virtuo](https://www.govirtuo.com/) 1. [VISITS Technologies](https://visits.world/en) 1. [Volvo Cars](https://www.volvocars.com/) -1. [Voyager Digital](https://www.investvoyager.com/) 1. [VSHN - The DevOps Company](https://vshn.ch/) 1. [Walkbase](https://www.walkbase.com/) 1. [Webstores](https://www.webstores.nl) @@ -253,7 +231,6 @@ Currently, the following organizations are **officially** using Argo CD: 1. [WeMo Scooter](https://www.wemoscooter.com/) 1. [Whitehat Berlin](https://whitehat.berlin) by Guido Maria Serra +Fenaroli 1. [Witick](https://witick.io/) -1. [Wolffun Game](https://www.wolffungame.com/) 1. [WooliesX](https://wooliesx.com.au/) 1. [Woolworths Group](https://www.woolworthsgroup.com.au/) 1. [WSpot](https://www.wspot.com.br/) diff --git a/VERSION b/VERSION index e70b4523ae7ff..fe16b348d97f7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.6.0 +2.5.4 diff --git a/applicationset/controllers/applicationset_controller.go b/applicationset/controllers/applicationset_controller.go index 9afc278b35a6c..42b1679173b03 100644 --- a/applicationset/controllers/applicationset_controller.go +++ b/applicationset/controllers/applicationset_controller.go @@ -25,7 +25,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" @@ -70,8 +69,6 @@ type ApplicationSetReconciler struct { KubeClientset kubernetes.Interface utils.Policy utils.Renderer - - EnableProgressiveRollouts bool } // +kubebuilder:rbac:groups=argoproj.io,resources=applicationsets,verbs=get;list;watch;create;update;patch;delete @@ -137,27 +134,6 @@ func (r *ApplicationSetReconciler) Reconcile(ctx context.Context, req ctrl.Reque return ctrl.Result{RequeueAfter: ReconcileRequeueOnValidationError}, nil } - // appMap is a name->app collection of Applications in this ApplicationSet. - appMap := map[string]argov1alpha1.Application{} - // appSyncMap tracks which apps will be synced during this reconciliation. - appSyncMap := map[string]bool{} - - if r.EnableProgressiveRollouts && applicationSetInfo.Spec.Strategy != nil { - applications, err := r.getCurrentApplications(ctx, applicationSetInfo) - if err != nil { - return ctrl.Result{}, fmt.Errorf("failed to get current applications for application set: %w", err) - } - - for _, app := range applications { - appMap[app.Name] = app - } - - appSyncMap, err = r.performProgressiveRollouts(ctx, applicationSetInfo, applications, desiredApplications, appMap) - if err != nil { - return ctrl.Result{}, fmt.Errorf("failed to perform progressive rollouts reconciliation for application set: %w", err) - } - } - var validApps []argov1alpha1.Application for i := range desiredApplications { if validateErrors[i] == nil { @@ -186,26 +162,6 @@ func (r *ApplicationSetReconciler) Reconcile(ctx context.Context, req ctrl.Reque ) } - if r.EnableProgressiveRollouts { - // trigger appropriate application syncs if RollingSync strategy is enabled - if progressiveRolloutStrategyEnabled(&applicationSetInfo, "RollingSync") { - validApps, err = r.syncValidApplications(ctx, &applicationSetInfo, appSyncMap, appMap, validApps) - - if err != nil { - _ = r.setApplicationSetStatusCondition(ctx, - &applicationSetInfo, - argov1alpha1.ApplicationSetCondition{ - Type: argov1alpha1.ApplicationSetConditionErrorOccurred, - Message: err.Error(), - Reason: argov1alpha1.ApplicationSetReasonSyncApplicationError, - Status: argov1alpha1.ApplicationSetConditionStatusTrue, - }, parametersGenerated, - ) - return ctrl.Result{}, err - } - } - } - if r.Policy.Update() { err = r.createOrUpdateInCluster(ctx, applicationSetInfo, validApps) if err != nil { @@ -528,7 +484,7 @@ func (r *ApplicationSetReconciler) SetupWithManager(mgr ctrl.Manager) error { // ...and if so, return it return []string{owner.Name} }); err != nil { - return fmt.Errorf("error setting up with manager: %w", err) + return err } return ctrl.NewControllerManagedBy(mgr). @@ -572,11 +528,6 @@ func (r *ApplicationSetReconciler) createOrUpdateInCluster(ctx context.Context, // Copy only the Application/ObjectMeta fields that are significant, from the generatedApp found.Spec = generatedApp.Spec - // allow setting the Operation field to trigger a sync operation on an Application - if generatedApp.Operation != nil { - found.Operation = generatedApp.Operation - } - // Preserve specially treated argo cd annotations: // * https://github.com/argoproj/applicationset/issues/180 // * https://github.com/argoproj/argo-cd/issues/10500 @@ -616,7 +567,7 @@ func (r *ApplicationSetReconciler) createInCluster(ctx context.Context, applicat var createApps []argov1alpha1.Application current, err := r.getCurrentApplications(ctx, applicationSet) if err != nil { - return fmt.Errorf("error getting current applications: %w", err) + return err } m := make(map[string]bool) // Will holds the app names that are current in the cluster @@ -657,13 +608,13 @@ func (r *ApplicationSetReconciler) deleteInCluster(ctx context.Context, applicat // clusterList, err := argoDB.ListClusters(ctx) clusterList, err := utils.ListClusters(ctx, r.KubeClientset, applicationSet.Namespace) if err != nil { - return fmt.Errorf("error listing clusters: %w", err) + return err } // Save current applications to be able to delete the ones that are not in appList current, err := r.getCurrentApplications(ctx, applicationSet) if err != nil { - return fmt.Errorf("error getting current applications: %w", err) + return err } m := make(map[string]bool) // Will holds the app names in appList for the deletion process @@ -767,7 +718,7 @@ func (r *ApplicationSetReconciler) removeFinalizerOnInvalidDestination(ctx conte err := r.Client.Update(ctx, app, &client.UpdateOptions{}) if err != nil { - return fmt.Errorf("error updating finalizers: %w", err) + return err } } } @@ -775,523 +726,4 @@ func (r *ApplicationSetReconciler) removeFinalizerOnInvalidDestination(ctx conte return nil } -func (r *ApplicationSetReconciler) performProgressiveRollouts(ctx context.Context, appset argov1alpha1.ApplicationSet, applications []argov1alpha1.Application, desiredApplications []argov1alpha1.Application, appMap map[string]argov1alpha1.Application) (map[string]bool, error) { - - _, err := r.updateApplicationSetApplicationStatus(ctx, &appset, applications) - if err != nil { - return nil, fmt.Errorf("failed to update applicationset app status: %w", err) - } - - appDependencyList, appStepMap, err := r.buildAppDependencyList(ctx, appset, desiredApplications) - if err != nil { - return nil, fmt.Errorf("failed to build app dependency list: %w", err) - } - - appSyncMap, err := r.buildAppSyncMap(ctx, appset, appDependencyList, appMap) - if err != nil { - return nil, fmt.Errorf("failed to build app sync map: %w", err) - } - - log.Infof("appSyncMap: %+v", appSyncMap) - - _, err = r.updateApplicationSetApplicationStatusProgress(ctx, &appset, appSyncMap, appStepMap, appMap) - if err != nil { - return nil, fmt.Errorf("failed to update applicationset application status progress: %w", err) - } - - _, err = r.updateApplicationSetApplicationStatusConditions(ctx, &appset) - if err != nil { - return nil, fmt.Errorf("failed to update applicationset application status conditions: %w", err) - } - - return appSyncMap, nil -} - -// this list tracks which Applications belong to each RollingUpdate step -func (r *ApplicationSetReconciler) buildAppDependencyList(ctx context.Context, applicationSet argov1alpha1.ApplicationSet, applications []argov1alpha1.Application) ([][]string, map[string]int, error) { - - if applicationSet.Spec.Strategy == nil || applicationSet.Spec.Strategy.Type == "" || applicationSet.Spec.Strategy.Type == "AllAtOnce" { - return [][]string{}, map[string]int{}, nil - } - - steps := []argov1alpha1.ApplicationSetRolloutStep{} - if progressiveRolloutStrategyEnabled(&applicationSet, "RollingSync") { - steps = applicationSet.Spec.Strategy.RollingSync.Steps - } - - appDependencyList := make([][]string, 0) - for range steps { - appDependencyList = append(appDependencyList, make([]string, 0)) - } - - appStepMap := map[string]int{} - - // use applicationLabelSelectors to filter generated Applications into steps and status by name - for _, app := range applications { - for i, step := range steps { - - selected := true // default to true, assuming the current Application is a match for the given step matchExpression - - allNotInMatched := true // needed to support correct AND behavior between multiple NotIn MatchExpressions - notInUsed := false // since we default to allNotInMatched == true, track whether a NotIn expression was actually used - - for _, matchExpression := range step.MatchExpressions { - - if matchExpression.Operator == "In" { - if val, ok := app.Labels[matchExpression.Key]; ok { - valueMatched := labelMatchedExpression(val, matchExpression) - - if !valueMatched { // none of the matchExpression values was a match with the Application'ss labels - selected = false - break - } - } else { - selected = false // no matching label key with In means this Application will not be included in the current step - break - } - } else if matchExpression.Operator == "NotIn" { - notInUsed = true // a NotIn selector was used in this matchExpression - if val, ok := app.Labels[matchExpression.Key]; ok { - valueMatched := labelMatchedExpression(val, matchExpression) - - if !valueMatched { // none of the matchExpression values was a match with the Application's labels - allNotInMatched = false - } - } else { - allNotInMatched = false // no matching label key with NotIn means this Application may still be included in the current step - } - } else { // handle invalid operator selection - log.Warnf("skipping AppSet rollingUpdate step Application selection for %q, invalid matchExpression operator provided: %q ", applicationSet.Name, matchExpression.Operator) - selected = false - break - } - } - - if notInUsed && allNotInMatched { // check if all NotIn Expressions matched, if so exclude this Application - selected = false - } - - if selected { - appDependencyList[i] = append(appDependencyList[i], app.Name) - if val, ok := appStepMap[app.Name]; ok { - log.Warnf("AppSet '%v' has a invalid matchExpression that selects Application '%v' label twice, in steps %v and %v", applicationSet.Name, app.Name, val+1, i+1) - } else { - appStepMap[app.Name] = i - } - } - } - } - - return appDependencyList, appStepMap, nil -} - -func labelMatchedExpression(val string, matchExpression argov1alpha1.ApplicationMatchExpression) bool { - valueMatched := false - for _, value := range matchExpression.Values { - if val == value { - valueMatched = true - break - } - } - return valueMatched -} - -// this map is used to determine which stage of Applications are ready to be updated in the reconciler loop -func (r *ApplicationSetReconciler) buildAppSyncMap(ctx context.Context, applicationSet argov1alpha1.ApplicationSet, appDependencyList [][]string, appMap map[string]argov1alpha1.Application) (map[string]bool, error) { - appSyncMap := map[string]bool{} - syncEnabled := true - - // healthy stages and the first non-healthy stage should have sync enabled - // every stage after should have sync disabled - - for i := range appDependencyList { - // set the syncEnabled boolean for every Application in the current step - for _, appName := range appDependencyList[i] { - appSyncMap[appName] = syncEnabled - } - - // detect if we need to halt before progressing to the next step - for _, appName := range appDependencyList[i] { - - idx := findApplicationStatusIndex(applicationSet.Status.ApplicationStatus, appName) - if idx == -1 { - // no Application status found, likely because the Application is being newly created - syncEnabled = false - break - } - - appStatus := applicationSet.Status.ApplicationStatus[idx] - - if app, ok := appMap[appName]; ok { - - syncEnabled = appSyncEnabledForNextStep(&applicationSet, app, appStatus) - if !syncEnabled { - break - } - } else { - // application name not found in the list of applications managed by this ApplicationSet, maybe because it's being deleted - syncEnabled = false - break - } - } - } - - return appSyncMap, nil -} - -func appSyncEnabledForNextStep(appset *argov1alpha1.ApplicationSet, app argov1alpha1.Application, appStatus argov1alpha1.ApplicationSetApplicationStatus) bool { - - if progressiveRolloutStrategyEnabled(appset, "RollingSync") { - // we still need to complete the current step if the Application is not yet Healthy or there are still pending Application changes - return isApplicationHealthy(app) && appStatus.Status == "Healthy" - } - - return true -} - -func progressiveRolloutStrategyEnabled(appset *argov1alpha1.ApplicationSet, strategyType string) bool { - if appset.Spec.Strategy == nil || appset.Spec.Strategy.Type != strategyType { - return false - } - - if strategyType == "RollingSync" && appset.Spec.Strategy.RollingSync == nil { - return false - } - - return true -} - -func isApplicationHealthy(app argov1alpha1.Application) bool { - healthStatusString, syncStatusString, operationPhaseString := statusStrings(app) - - if healthStatusString == "Healthy" && syncStatusString != "OutOfSync" && (operationPhaseString == "Succeeded" || operationPhaseString == "") { - return true - } - return false -} - -func statusStrings(app argov1alpha1.Application) (string, string, string) { - healthStatusString := string(app.Status.Health.Status) - syncStatusString := string(app.Status.Sync.Status) - operationPhaseString := "" - if app.Status.OperationState != nil { - operationPhaseString = string(app.Status.OperationState.Phase) - } - - return healthStatusString, syncStatusString, operationPhaseString -} - -// check the status of each Application's status and promote Applications to the next status if needed -func (r *ApplicationSetReconciler) updateApplicationSetApplicationStatus(ctx context.Context, applicationSet *argov1alpha1.ApplicationSet, applications []argov1alpha1.Application) ([]argov1alpha1.ApplicationSetApplicationStatus, error) { - - now := metav1.Now() - appStatuses := make([]argov1alpha1.ApplicationSetApplicationStatus, 0, len(applications)) - - for _, app := range applications { - - healthStatusString, syncStatusString, operationPhaseString := statusStrings(app) - - idx := findApplicationStatusIndex(applicationSet.Status.ApplicationStatus, app.Name) - - if idx == -1 { - // AppStatus not found, set default status of "Waiting" - appStatuses = append(appStatuses, argov1alpha1.ApplicationSetApplicationStatus{ - Application: app.Name, - LastTransitionTime: &now, - Message: "No Application status found, defaulting status to Waiting.", - Status: "Waiting", - }) - break - } - - // we have an existing AppStatus - currentAppStatus := applicationSet.Status.ApplicationStatus[idx] - - appOutdated := false - if progressiveRolloutStrategyEnabled(applicationSet, "RollingSync") { - appOutdated = syncStatusString == "OutOfSync" - } - - if appOutdated && currentAppStatus.Status != "Waiting" && currentAppStatus.Status != "Pending" { - log.Infof("Application %v is outdated, updating its ApplicationSet status to Waiting", app.Name) - currentAppStatus.LastTransitionTime = &now - currentAppStatus.Status = "Waiting" - currentAppStatus.Message = "Application has pending changes, setting status to Waiting." - } - - if currentAppStatus.Status == "Pending" { - if healthStatusString == "Progressing" || operationPhaseString == "Running" { - log.Infof("Application %v has entered Progressing status, updating its ApplicationSet status to Progressing", app.Name) - currentAppStatus.LastTransitionTime = &now - currentAppStatus.Status = "Progressing" - currentAppStatus.Message = "Application resource became Progressing, updating status from Pending to Progressing." - } - } - - if currentAppStatus.Status == "Waiting" && isApplicationHealthy(app) { - log.Infof("Application %v is already synced and healthy, updating its ApplicationSet status to Healthy", app.Name) - currentAppStatus.LastTransitionTime = &now - currentAppStatus.Status = healthStatusString - currentAppStatus.Message = "Application resource is already Healthy, updating status from Waiting to Healthy." - } - - if currentAppStatus.Status == "Progressing" && isApplicationHealthy(app) { - log.Infof("Application %v has completed Progressing status, updating its ApplicationSet status to Healthy", app.Name) - currentAppStatus.LastTransitionTime = &now - currentAppStatus.Status = healthStatusString - currentAppStatus.Message = "Application resource became Healthy, updating status from Progressing to Healthy." - } - - appStatuses = append(appStatuses, currentAppStatus) - } - - err := r.setAppSetApplicationStatus(ctx, applicationSet, appStatuses) - if err != nil { - return nil, fmt.Errorf("failed to set AppSet application statuses: %w", err) - } - - return appStatuses, nil -} - -// check Applications that are in Waiting status and promote them to Pending if needed -func (r *ApplicationSetReconciler) updateApplicationSetApplicationStatusProgress(ctx context.Context, applicationSet *argov1alpha1.ApplicationSet, appSyncMap map[string]bool, appStepMap map[string]int, appMap map[string]argov1alpha1.Application) ([]argov1alpha1.ApplicationSetApplicationStatus, error) { - now := metav1.Now() - - appStatuses := make([]argov1alpha1.ApplicationSetApplicationStatus, 0, len(applicationSet.Status.ApplicationStatus)) - - // if we have no RollingUpdate steps, clear out the existing ApplicationStatus entries - if applicationSet.Spec.Strategy != nil && applicationSet.Spec.Strategy.Type != "" && applicationSet.Spec.Strategy.Type != "AllAtOnce" { - updateCountMap := []int{} - totalCountMap := []int{} - - length := 0 - if progressiveRolloutStrategyEnabled(applicationSet, "RollingSync") { - length = len(applicationSet.Spec.Strategy.RollingSync.Steps) - } - for s := 0; s < length; s++ { - updateCountMap = append(updateCountMap, 0) - totalCountMap = append(totalCountMap, 0) - } - - // populate updateCountMap with counts of existing Pending and Progressing Applications - for _, appStatus := range applicationSet.Status.ApplicationStatus { - totalCountMap[appStepMap[appStatus.Application]] += 1 - - if progressiveRolloutStrategyEnabled(applicationSet, "RollingSync") { - if appStatus.Status == "Pending" || appStatus.Status == "Progressing" { - updateCountMap[appStepMap[appStatus.Application]] += 1 - } - } - } - - for _, appStatus := range applicationSet.Status.ApplicationStatus { - - maxUpdateAllowed := true - maxUpdate := &intstr.IntOrString{} - if progressiveRolloutStrategyEnabled(applicationSet, "RollingSync") { - maxUpdate = applicationSet.Spec.Strategy.RollingSync.Steps[appStepMap[appStatus.Application]].MaxUpdate - } - - // by default allow all applications to update if maxUpdate is unset - if maxUpdate != nil { - maxUpdateVal, err := intstr.GetScaledValueFromIntOrPercent(maxUpdate, totalCountMap[appStepMap[appStatus.Application]], false) - if err != nil { - log.Warnf("AppSet '%v' has a invalid maxUpdate value '%+v', ignoring maxUpdate logic for this step: %v", applicationSet.Name, maxUpdate, err) - } - - // ensure that percentage values greater than 0% always result in at least 1 Application being selected - if maxUpdate.Type == intstr.String && maxUpdate.StrVal != "0%" && maxUpdateVal < 1 { - maxUpdateVal = 1 - } - - if updateCountMap[appStepMap[appStatus.Application]] >= maxUpdateVal { - maxUpdateAllowed = false - log.Infof("Application %v is not allowed to update yet, %v/%v Applications already updating in step %v in AppSet %v", appStatus.Application, updateCountMap[appStepMap[appStatus.Application]], maxUpdateVal, appStepMap[appStatus.Application]+1, applicationSet.Name) - } - - } - - if appStatus.Status == "Waiting" && appSyncMap[appStatus.Application] && maxUpdateAllowed { - log.Infof("Application %v moved to Pending status, watching for the Application to start Progressing", appStatus.Application) - appStatus.LastTransitionTime = &now - appStatus.Status = "Pending" - appStatus.Message = "Application moved to Pending status, watching for the Application resource to start Progressing." - - updateCountMap[appStepMap[appStatus.Application]] += 1 - } - - appStatuses = append(appStatuses, appStatus) - } - } - - err := r.setAppSetApplicationStatus(ctx, applicationSet, appStatuses) - if err != nil { - return nil, fmt.Errorf("failed to set AppSet app status: %w", err) - } - - return appStatuses, nil -} - -func (r *ApplicationSetReconciler) updateApplicationSetApplicationStatusConditions(ctx context.Context, applicationSet *argov1alpha1.ApplicationSet) ([]argov1alpha1.ApplicationSetCondition, error) { - - appSetProgressing := false - for _, appStatus := range applicationSet.Status.ApplicationStatus { - if appStatus.Status != "Healthy" { - appSetProgressing = true - break - } - } - - appSetConditionProgressing := false - for _, appSetCondition := range applicationSet.Status.Conditions { - if appSetCondition.Type == argov1alpha1.ApplicationSetConditionRolloutProgressing && appSetCondition.Status == argov1alpha1.ApplicationSetConditionStatusTrue { - appSetConditionProgressing = true - break - } - } - - if appSetProgressing && !appSetConditionProgressing { - _ = r.setApplicationSetStatusCondition(ctx, - applicationSet, - argov1alpha1.ApplicationSetCondition{ - Type: argov1alpha1.ApplicationSetConditionRolloutProgressing, - Message: "ApplicationSet Rollout Rollout started", - Reason: argov1alpha1.ApplicationSetReasonApplicationSetModified, - Status: argov1alpha1.ApplicationSetConditionStatusTrue, - }, false, - ) - } else if !appSetProgressing && appSetConditionProgressing { - _ = r.setApplicationSetStatusCondition(ctx, - applicationSet, - argov1alpha1.ApplicationSetCondition{ - Type: argov1alpha1.ApplicationSetConditionRolloutProgressing, - Message: "ApplicationSet Rollout Rollout complete", - Reason: argov1alpha1.ApplicationSetReasonApplicationSetRolloutComplete, - Status: argov1alpha1.ApplicationSetConditionStatusFalse, - }, false, - ) - } - - return applicationSet.Status.Conditions, nil -} - -func findApplicationStatusIndex(appStatuses []argov1alpha1.ApplicationSetApplicationStatus, application string) int { - for i := range appStatuses { - if appStatuses[i].Application == application { - return i - } - } - return -1 -} - -// setApplicationSetApplicationStatus updates the ApplicatonSet's status field -// with any new/changed Application statuses. -func (r *ApplicationSetReconciler) setAppSetApplicationStatus(ctx context.Context, applicationSet *argov1alpha1.ApplicationSet, applicationStatuses []argov1alpha1.ApplicationSetApplicationStatus) error { - needToUpdateStatus := false - for i := range applicationStatuses { - appStatus := applicationStatuses[i] - idx := findApplicationStatusIndex(applicationSet.Status.ApplicationStatus, appStatus.Application) - if idx == -1 { - needToUpdateStatus = true - break - } - currentStatus := applicationSet.Status.ApplicationStatus[idx] - if currentStatus.Message != appStatus.Message || currentStatus.Status != appStatus.Status { - needToUpdateStatus = true - break - } - } - - if needToUpdateStatus { - // fetch updated Application Set object before updating it - namespacedName := types.NamespacedName{Namespace: applicationSet.Namespace, Name: applicationSet.Name} - 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) - } - - for i := range applicationStatuses { - applicationSet.Status.SetApplicationStatus(applicationStatuses[i]) - } - - // Update the newly fetched object with new set of ApplicationStatus - err := r.Client.Status().Update(ctx, applicationSet) - if err != nil { - - log.Errorf("unable to set application set status: %v", err) - return fmt.Errorf("unable to set application set status: %v", 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 nil -} - -func (r *ApplicationSetReconciler) syncValidApplications(ctx context.Context, applicationSet *argov1alpha1.ApplicationSet, appSyncMap map[string]bool, appMap map[string]argov1alpha1.Application, validApps []argov1alpha1.Application) ([]argov1alpha1.Application, error) { - rolloutApps := []argov1alpha1.Application{} - for i := range validApps { - pruneEnabled := false - - // ensure that Applications generated with RollingSync do not have an automated sync policy, since the AppSet controller will handle triggering the sync operation instead - if validApps[i].Spec.SyncPolicy != nil && validApps[i].Spec.SyncPolicy.Automated != nil { - pruneEnabled = validApps[i].Spec.SyncPolicy.Automated.Prune - validApps[i].Spec.SyncPolicy.Automated = nil - } - - appSetStatusPending := false - idx := findApplicationStatusIndex(applicationSet.Status.ApplicationStatus, validApps[i].Name) - if idx > -1 && applicationSet.Status.ApplicationStatus[idx].Status == "Pending" { - // only trigger a sync for Applications that are in Pending status, since this is governed by maxUpdate - appSetStatusPending = true - } - - // check appSyncMap to determine which Applications are ready to be updated and which should be skipped - if appSyncMap[validApps[i].Name] && appMap[validApps[i].Name].Status.Sync.Status == "OutOfSync" && appSetStatusPending { - log.Infof("triggering sync for application: %v, prune enabled: %v", validApps[i].Name, pruneEnabled) - validApps[i], _ = syncApplication(validApps[i], pruneEnabled) - } - rolloutApps = append(rolloutApps, validApps[i]) - } - return rolloutApps, nil -} - -// used by the RollingSync Progressive Rollout strategy to trigger a sync of a particular Application resource -func syncApplication(application argov1alpha1.Application, prune bool) (argov1alpha1.Application, error) { - - operation := argov1alpha1.Operation{ - InitiatedBy: argov1alpha1.OperationInitiator{ - Username: "applicationset-controller", - Automated: true, - }, - Info: []*argov1alpha1.Info{ - { - Name: "Reason", - Value: "ApplicationSet RollingSync triggered a sync of this Application resource.", - }, - }, - Sync: &argov1alpha1.SyncOperation{}, - } - - if application.Spec.SyncPolicy != nil { - if application.Spec.SyncPolicy.Retry != nil { - operation.Retry = *application.Spec.SyncPolicy.Retry - } - if application.Spec.SyncPolicy.SyncOptions != nil { - operation.Sync.SyncOptions = application.Spec.SyncPolicy.SyncOptions - } - operation.Sync.Prune = prune - } - application.Operation = &operation - - return application, nil -} - var _ handler.EventHandler = &clusterSecretEventHandler{} diff --git a/applicationset/controllers/applicationset_controller_test.go b/applicationset/controllers/applicationset_controller_test.go index 38b25e8eac4e6..bc581b09cbf21 100644 --- a/applicationset/controllers/applicationset_controller_test.go +++ b/applicationset/controllers/applicationset_controller_test.go @@ -17,7 +17,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/intstr" kubefake "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" @@ -27,13 +26,10 @@ import ( "github.com/argoproj/argo-cd/v2/applicationset/generators" "github.com/argoproj/argo-cd/v2/applicationset/utils" - "github.com/argoproj/gitops-engine/pkg/health" - "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" argov1alpha1 "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" ) @@ -687,7 +683,7 @@ func TestCreateOrUpdateInCluster(t *testing.T) { Template: argov1alpha1.ApplicationSetTemplate{ Spec: argov1alpha1.ApplicationSpec{ Project: "project", - Source: &argov1alpha1.ApplicationSource{Path: "path", TargetRevision: "revision", RepoURL: "repoURL"}, + Source: argov1alpha1.ApplicationSource{Path: "path", TargetRevision: "revision", RepoURL: "repoURL"}, Destination: argov1alpha1.ApplicationDestination{Server: "server", Namespace: "namespace"}, }, }, @@ -724,7 +720,7 @@ func TestCreateOrUpdateInCluster(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "project", - Source: &argov1alpha1.ApplicationSource{Path: "path", TargetRevision: "revision", RepoURL: "repoURL"}, + Source: argov1alpha1.ApplicationSource{Path: "path", TargetRevision: "revision", RepoURL: "repoURL"}, Destination: argov1alpha1.ApplicationDestination{Server: "server", Namespace: "namespace"}, }, }, @@ -744,7 +740,7 @@ func TestCreateOrUpdateInCluster(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "project", - Source: &argov1alpha1.ApplicationSource{Path: "path", TargetRevision: "revision", RepoURL: "repoURL"}, + Source: argov1alpha1.ApplicationSource{Path: "path", TargetRevision: "revision", RepoURL: "repoURL"}, Destination: argov1alpha1.ApplicationDestination{Server: "server", Namespace: "namespace"}, }, Status: argov1alpha1.ApplicationStatus{ @@ -921,7 +917,7 @@ func TestRemoveFinalizerOnInvalidDestination_FinalizerTypes(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "project", - Source: &argov1alpha1.ApplicationSource{Path: "path", TargetRevision: "revision", RepoURL: "repoURL"}, + Source: argov1alpha1.ApplicationSource{Path: "path", TargetRevision: "revision", RepoURL: "repoURL"}, // Destination is always invalid, for this test: Destination: argov1alpha1.ApplicationDestination{Name: "my-cluster", Namespace: "namespace"}, }, @@ -1083,7 +1079,7 @@ func TestRemoveFinalizerOnInvalidDestination_DestinationTypes(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "project", - Source: &argov1alpha1.ApplicationSource{Path: "path", TargetRevision: "revision", RepoURL: "repoURL"}, + Source: argov1alpha1.ApplicationSource{Path: "path", TargetRevision: "revision", RepoURL: "repoURL"}, Destination: c.destinationField, }, } @@ -1592,7 +1588,7 @@ func TestValidateGeneratedApplications(t *testing.T) { ObjectMeta: metav1.ObjectMeta{}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://url", Path: "/", TargetRevision: "HEAD", @@ -1615,7 +1611,7 @@ func TestValidateGeneratedApplications(t *testing.T) { ObjectMeta: metav1.ObjectMeta{}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://url", Path: "/", TargetRevision: "HEAD", @@ -1639,7 +1635,7 @@ func TestValidateGeneratedApplications(t *testing.T) { ObjectMeta: metav1.ObjectMeta{}, Spec: argov1alpha1.ApplicationSpec{ Project: "DOES-NOT-EXIST", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://url", Path: "/", TargetRevision: "HEAD", @@ -1662,7 +1658,7 @@ func TestValidateGeneratedApplications(t *testing.T) { ObjectMeta: metav1.ObjectMeta{}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://url", Path: "/", TargetRevision: "HEAD", @@ -1685,7 +1681,7 @@ func TestValidateGeneratedApplications(t *testing.T) { ObjectMeta: metav1.ObjectMeta{}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://url", Path: "/", TargetRevision: "HEAD", @@ -1814,7 +1810,7 @@ func TestReconcilerValidationErrorBehaviour(t *testing.T) { Namespace: "argocd", }, Spec: argov1alpha1.ApplicationSpec{ - Source: &argov1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argocd-example-apps", Path: "guestbook"}, + Source: argov1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argocd-example-apps", Path: "guestbook"}, Project: "default", Destination: argov1alpha1.ApplicationDestination{Server: "{{.url}}"}, }, @@ -1928,2704 +1924,3 @@ func TestSetApplicationSetStatusCondition(t *testing.T) { assert.Len(t, appSet.Status.Conditions, 3) } - -// 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 argov1alpha1.ApplicationSetTemplate - expectedApp []argov1alpha1.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", - "labels": []string{"label1"}}}, - template: argov1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: argov1alpha1.ApplicationSetTemplateMeta{ - Name: "AppSet-{{.branch}}-{{.number}}", - Labels: map[string]string{ - "app1": "{{index .labels 0}}", - }, - }, - Spec: argov1alpha1.ApplicationSpec{ - Source: &argov1alpha1.ApplicationSource{ - RepoURL: "https://testurl/testRepo", - TargetRevision: "{{.head_short_sha}}", - }, - Destination: argov1alpha1.ApplicationDestination{ - Server: "https://kubernetes.default.svc", - Namespace: "AppSet-{{.branch_slug}}-{{.head_sha}}", - }, - }, - }, - expectedApp: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "AppSet-branch1-1", - Labels: map[string]string{ - "app1": "label1", - }, - }, - 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 := argov1alpha1.ApplicationSetGenerator{ - PullRequest: &argov1alpha1.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), - Generators: map[string]generators.Generator{ - "PullRequest": &generatorMock, - }, - Renderer: &utils.Render{}, - KubeClientset: kubefake.NewSimpleClientset(), - } - - gotApp, _, _ := appSetReconciler.generateApplications(argov1alpha1.ApplicationSet{ - Spec: argov1alpha1.ApplicationSetSpec{ - GoTemplate: true, - Generators: []argov1alpha1.ApplicationSetGenerator{{ - PullRequest: &argov1alpha1.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 := argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - err = argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - defaultProject := argov1alpha1.AppProject{ - ObjectMeta: metav1.ObjectMeta{Name: "default", Namespace: "argocd"}, - Spec: argov1alpha1.AppProjectSpec{SourceRepos: []string{"*"}, Destinations: []argov1alpha1.ApplicationDestination{{Namespace: "*", Server: "https://kubernetes.default.svc"}}}, - } - myCluster := argov1alpha1.Cluster{ - Server: "https://kubernetes.default.svc", - Name: "my-cluster", - } - - kubeclientset := kubefake.NewSimpleClientset() - argoDBMock := dbmocks.ArgoDB{} - argoDBMock.On("GetCluster", mock.Anything, "https://kubernetes.default.svc").Return(&myCluster, nil) - argoObjs := []runtime.Object{&defaultProject} - - for _, c := range []struct { - name string - policyName string - allowedUpdate bool - allowedDelete bool - }{ - { - name: "Apps are allowed to update and delete", - policyName: "sync", - allowedUpdate: true, - allowedDelete: true, - }, - { - name: "Apps are not allowed to update and delete", - policyName: "create-only", - allowedUpdate: false, - allowedDelete: false, - }, - { - name: "Apps are allowed to update, not allowed to delete", - policyName: "create-update", - allowedUpdate: true, - allowedDelete: false, - }, - { - name: "Apps are allowed to delete, not allowed to update", - policyName: "create-delete", - allowedUpdate: false, - allowedDelete: true, - }, - } { - t.Run(c.name, func(t *testing.T) { - policy := utils.Policies[c.policyName] - assert.NotNil(t, policy) - - appSet := argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - GoTemplate: true, - Generators: []argov1alpha1.ApplicationSetGenerator{ - { - List: &argov1alpha1.ListGenerator{ - Elements: []apiextensionsv1.JSON{ - { - Raw: []byte(`{"name": "my-app"}`), - }, - }, - }, - }, - }, - Template: argov1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: argov1alpha1.ApplicationSetTemplateMeta{ - Name: "{{.name}}", - Namespace: "argocd", - Annotations: map[string]string{ - "key": "value", - }, - }, - Spec: argov1alpha1.ApplicationSpec{ - Source: &argov1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argocd-example-apps", Path: "guestbook"}, - Project: "default", - Destination: argov1alpha1.ApplicationDestination{Server: "https://kubernetes.default.svc"}, - }, - }, - }, - } - - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appSet).Build() - - r := ApplicationSetReconciler{ - Client: client, - Scheme: scheme, - Renderer: &utils.Render{}, - Recorder: record.NewFakeRecorder(10), - Generators: map[string]generators.Generator{ - "List": generators.NewListGenerator(), - }, - ArgoDB: &argoDBMock, - ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), - KubeClientset: kubeclientset, - Policy: policy, - } - - req := ctrl.Request{ - NamespacedName: types.NamespacedName{ - Namespace: "argocd", - Name: "name", - }, - } - - // Check if Application is created - res, err := r.Reconcile(context.Background(), req) - assert.Nil(t, err) - assert.True(t, res.RequeueAfter == 0) - - var app argov1alpha1.Application - err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "my-app"}, &app) - assert.NoError(t, err) - assert.Equal(t, app.Annotations["key"], "value") - - // Check if Application is updated - app.Annotations["key"] = "edited" - err = r.Client.Update(context.TODO(), &app) - assert.NoError(t, err) - - res, err = r.Reconcile(context.Background(), req) - assert.Nil(t, err) - assert.True(t, res.RequeueAfter == 0) - - err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "my-app"}, &app) - assert.NoError(t, err) - - if c.allowedUpdate { - assert.Equal(t, app.Annotations["key"], "value") - } else { - assert.Equal(t, app.Annotations["key"], "edited") - } - - // Check if Application is deleted - err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "name"}, &appSet) - assert.NoError(t, err) - appSet.Spec.Generators[0] = argov1alpha1.ApplicationSetGenerator{ - List: &argov1alpha1.ListGenerator{ - Elements: []apiextensionsv1.JSON{}, - }, - } - err = r.Client.Update(context.TODO(), &appSet) - assert.NoError(t, err) - - res, err = r.Reconcile(context.Background(), req) - assert.Nil(t, err) - assert.True(t, res.RequeueAfter == 0) - - err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "my-app"}, &app) - assert.NoError(t, err) - if c.allowedDelete { - assert.NotNil(t, app.DeletionTimestamp) - } else { - assert.Nil(t, app.DeletionTimestamp) - } - }) - } -} - -func TestSetApplicationSetApplicationStatus(t *testing.T) { - scheme := runtime.NewScheme() - err := argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - err = argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - appSet := argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Generators: []argov1alpha1.ApplicationSetGenerator{ - {List: &argov1alpha1.ListGenerator{ - Elements: []apiextensionsv1.JSON{{ - Raw: []byte(`{"cluster": "my-cluster","url": "https://kubernetes.default.svc"}`), - }}, - }}, - }, - Template: argov1alpha1.ApplicationSetTemplate{}, - }, - } - - appStatuses := []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "my-application", - LastTransitionTime: &metav1.Time{}, - Message: "testing SetApplicationSetApplicationStatus to Healthy", - Status: "Healthy", - }, - } - - kubeclientset := kubefake.NewSimpleClientset([]runtime.Object{}...) - argoDBMock := dbmocks.ArgoDB{} - argoObjs := []runtime.Object{} - - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appSet).Build() - - r := ApplicationSetReconciler{ - Client: client, - Scheme: scheme, - Renderer: &utils.Render{}, - Recorder: record.NewFakeRecorder(1), - Generators: map[string]generators.Generator{ - "List": generators.NewListGenerator(), - }, - ArgoDB: &argoDBMock, - ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), - KubeClientset: kubeclientset, - } - - err = r.setAppSetApplicationStatus(context.TODO(), &appSet, appStatuses) - assert.Nil(t, err) - - assert.Len(t, appSet.Status.ApplicationStatus, 1) -} - -func TestBuildAppDependencyList(t *testing.T) { - - scheme := runtime.NewScheme() - err := argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - err = argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - client := fake.NewClientBuilder().WithScheme(scheme).Build() - - for _, cc := range []struct { - name string - appSet argov1alpha1.ApplicationSet - apps []argov1alpha1.Application - expectedList [][]string - expectedStepMap map[string]int - }{ - { - name: "handles an empty set of applications and no strategy", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{}, - }, - apps: []argov1alpha1.Application{}, - expectedList: [][]string{}, - expectedStepMap: map[string]int{}, - }, - { - name: "handles an empty set of applications and ignores AllAtOnce strategy", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "AllAtOnce", - }, - }, - }, - apps: []argov1alpha1.Application{}, - expectedList: [][]string{}, - expectedStepMap: map[string]int{}, - }, - { - name: "handles an empty set of applications with good 'In' selectors", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "In", - Values: []string{ - "dev", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{}, - expectedList: [][]string{ - {}, - }, - expectedStepMap: map[string]int{}, - }, - { - name: "handles selecting 1 application with 1 'In' selector", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "In", - Values: []string{ - "dev", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-dev", - Labels: map[string]string{ - "env": "dev", - }, - }, - }, - }, - expectedList: [][]string{ - {"app-dev"}, - }, - expectedStepMap: map[string]int{ - "app-dev": 0, - }, - }, - { - name: "handles 'In' selectors that select no applications", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "In", - Values: []string{ - "dev", - }, - }, - }, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "In", - Values: []string{ - "qa", - }, - }, - }, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "In", - Values: []string{ - "prod", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-qa", - Labels: map[string]string{ - "env": "qa", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-prod", - Labels: map[string]string{ - "env": "prod", - }, - }, - }, - }, - expectedList: [][]string{ - {}, - {"app-qa"}, - {"app-prod"}, - }, - expectedStepMap: map[string]int{ - "app-qa": 1, - "app-prod": 2, - }, - }, - { - name: "multiple 'In' selectors in the same matchExpression only select Applications that match all selectors", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "region", - Operator: "In", - Values: []string{ - "us-east-2", - }, - }, - { - Key: "env", - Operator: "In", - Values: []string{ - "qa", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-qa1", - Labels: map[string]string{ - "env": "qa", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-qa2", - Labels: map[string]string{ - "env": "qa", - "region": "us-east-2", - }, - }, - }, - }, - expectedList: [][]string{ - {"app-qa2"}, - }, - expectedStepMap: map[string]int{ - "app-qa2": 0, - }, - }, - { - name: "multiple values in the same 'In' matchExpression can match on any value", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "In", - Values: []string{ - "qa", - "prod", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-dev", - Labels: map[string]string{ - "env": "dev", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-qa", - Labels: map[string]string{ - "env": "qa", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-prod", - Labels: map[string]string{ - "env": "prod", - "region": "us-east-2", - }, - }, - }, - }, - expectedList: [][]string{ - {"app-qa", "app-prod"}, - }, - expectedStepMap: map[string]int{ - "app-qa": 0, - "app-prod": 0, - }, - }, - { - name: "handles an empty set of applications with good 'NotIn' selectors", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "In", - Values: []string{ - "dev", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{}, - expectedList: [][]string{ - {}, - }, - expectedStepMap: map[string]int{}, - }, - { - name: "selects 1 application with 1 'NotIn' selector", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "NotIn", - Values: []string{ - "qa", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-dev", - Labels: map[string]string{ - "env": "dev", - }, - }, - }, - }, - expectedList: [][]string{ - {"app-dev"}, - }, - expectedStepMap: map[string]int{ - "app-dev": 0, - }, - }, - { - name: "'NotIn' selectors that select no applications", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "NotIn", - Values: []string{ - "dev", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-qa", - Labels: map[string]string{ - "env": "qa", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-prod", - Labels: map[string]string{ - "env": "prod", - }, - }, - }, - }, - expectedList: [][]string{ - {"app-qa", "app-prod"}, - }, - expectedStepMap: map[string]int{ - "app-qa": 0, - "app-prod": 0, - }, - }, - { - name: "multiple 'NotIn' selectors only match Applications with all labels", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "region", - Operator: "NotIn", - Values: []string{ - "us-east-2", - }, - }, - { - Key: "env", - Operator: "NotIn", - Values: []string{ - "qa", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-qa1", - Labels: map[string]string{ - "env": "qa", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-qa2", - Labels: map[string]string{ - "env": "qa", - "region": "us-east-2", - }, - }, - }, - }, - expectedList: [][]string{ - {"app-qa1"}, - }, - expectedStepMap: map[string]int{ - "app-qa1": 0, - }, - }, - { - name: "multiple values in the same 'NotIn' matchExpression exclude a match from any value", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "NotIn", - Values: []string{ - "qa", - "prod", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-dev", - Labels: map[string]string{ - "env": "dev", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-qa", - Labels: map[string]string{ - "env": "qa", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-prod", - Labels: map[string]string{ - "env": "prod", - "region": "us-east-2", - }, - }, - }, - }, - expectedList: [][]string{ - {"app-dev"}, - }, - expectedStepMap: map[string]int{ - "app-dev": 0, - }, - }, - { - name: "in a mix of 'In' and 'NotIn' selectors, 'NotIn' takes precedence", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{ - { - Key: "env", - Operator: "In", - Values: []string{ - "qa", - "prod", - }, - }, - { - Key: "region", - Operator: "NotIn", - Values: []string{ - "us-west-2", - }, - }, - }, - }, - }, - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-dev", - Labels: map[string]string{ - "env": "dev", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-qa1", - Labels: map[string]string{ - "env": "qa", - "region": "us-west-2", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app-qa2", - Labels: map[string]string{ - "env": "qa", - "region": "us-east-2", - }, - }, - }, - }, - expectedList: [][]string{ - {"app-qa2"}, - }, - expectedStepMap: map[string]int{ - "app-qa2": 0, - }, - }, - } { - - t.Run(cc.name, func(t *testing.T) { - - kubeclientset := kubefake.NewSimpleClientset([]runtime.Object{}...) - argoDBMock := dbmocks.ArgoDB{} - argoObjs := []runtime.Object{} - - r := ApplicationSetReconciler{ - Client: client, - Scheme: scheme, - Recorder: record.NewFakeRecorder(1), - Generators: map[string]generators.Generator{}, - ArgoDB: &argoDBMock, - ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), - KubeClientset: kubeclientset, - } - - appDependencyList, appStepMap, err := r.buildAppDependencyList(context.TODO(), cc.appSet, cc.apps) - assert.Equal(t, err, nil, "expected no errors, but errors occured") - assert.Equal(t, cc.expectedList, appDependencyList, "expected appDependencyList did not match actual") - assert.Equal(t, cc.expectedStepMap, appStepMap, "expected appStepMap did not match actual") - }) - } -} - -func TestBuildAppSyncMap(t *testing.T) { - - scheme := runtime.NewScheme() - err := argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - err = argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - client := fake.NewClientBuilder().WithScheme(scheme).Build() - - for _, cc := range []struct { - name string - appSet argov1alpha1.ApplicationSet - appMap map[string]argov1alpha1.Application - appDependencyList [][]string - expectedMap map[string]bool - }{ - { - name: "handles an empty app dependency list", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - }, - appDependencyList: [][]string{}, - expectedMap: map[string]bool{}, - }, - { - name: "handles two applications with no statuses", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - }, - appDependencyList: [][]string{ - {"app1"}, - {"app2"}, - }, - expectedMap: map[string]bool{ - "app1": true, - "app2": false, - }, - }, - { - name: "handles applications after an empty selection", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - }, - appDependencyList: [][]string{ - {}, - {"app1", "app2"}, - }, - expectedMap: map[string]bool{ - "app1": true, - "app2": true, - }, - }, - { - name: "handles RollingSync applications that are healthy and have no changes", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Status: "Healthy", - }, - { - Application: "app2", - Status: "Healthy", - }, - }, - }, - }, - appMap: map[string]argov1alpha1.Application{ - "app1": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - "app2": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app2", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - }, - appDependencyList: [][]string{ - {"app1"}, - {"app2"}, - }, - expectedMap: map[string]bool{ - "app1": true, - "app2": true, - }, - }, - { - name: "blocks RollingSync applications that are healthy and have no changes, but are still pending", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Status: "Pending", - }, - { - Application: "app2", - Status: "Healthy", - }, - }, - }, - }, - appMap: map[string]argov1alpha1.Application{ - "app1": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - "app2": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app2", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - }, - appDependencyList: [][]string{ - {"app1"}, - {"app2"}, - }, - expectedMap: map[string]bool{ - "app1": true, - "app2": false, - }, - }, - { - name: "handles RollingSync applications that are up to date and healthy, but still syncing", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Status: "Progressing", - }, - { - Application: "app2", - Status: "Progressing", - }, - }, - }, - }, - appMap: map[string]argov1alpha1.Application{ - "app1": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationRunning, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - "app2": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app2", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationRunning, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - }, - appDependencyList: [][]string{ - {"app1"}, - {"app2"}, - }, - expectedMap: map[string]bool{ - "app1": true, - "app2": false, - }, - }, - { - name: "handles RollingSync applications that are up to date and synced, but degraded", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Status: "Progressing", - }, - { - Application: "app2", - Status: "Progressing", - }, - }, - }, - }, - appMap: map[string]argov1alpha1.Application{ - "app1": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusDegraded, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationRunning, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - "app2": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app2", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusDegraded, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationRunning, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - }, - appDependencyList: [][]string{ - {"app1"}, - {"app2"}, - }, - expectedMap: map[string]bool{ - "app1": true, - "app2": false, - }, - }, - { - name: "handles RollingSync applications that are OutOfSync and healthy", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Status: "Healthy", - }, - { - Application: "app2", - Status: "Healthy", - }, - }, - }, - }, - appDependencyList: [][]string{ - {"app1"}, - {"app2"}, - }, - appMap: map[string]argov1alpha1.Application{ - "app1": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeOutOfSync, - }, - }, - }, - "app2": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app2", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeOutOfSync, - }, - }, - }, - }, - expectedMap: map[string]bool{ - "app1": true, - "app2": false, - }, - }, - { - name: "handles a lot of applications", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Status: "Healthy", - }, - { - Application: "app2", - Status: "Healthy", - }, - { - Application: "app3", - Status: "Healthy", - }, - { - Application: "app4", - Status: "Healthy", - }, - { - Application: "app5", - Status: "Healthy", - }, - { - Application: "app7", - Status: "Healthy", - }, - }, - }, - }, - appMap: map[string]argov1alpha1.Application{ - "app1": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - "app2": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app2", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - "app3": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app3", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - "app5": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app5", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - "app6": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app6", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusDegraded, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - }, - appDependencyList: [][]string{ - {"app1", "app2", "app3"}, - {"app4", "app5", "app6"}, - {"app7", "app8", "app9"}, - }, - expectedMap: map[string]bool{ - "app1": true, - "app2": true, - "app3": true, - "app4": true, - "app5": true, - "app6": true, - "app7": false, - "app8": false, - "app9": false, - }, - }, - } { - - t.Run(cc.name, func(t *testing.T) { - - kubeclientset := kubefake.NewSimpleClientset([]runtime.Object{}...) - argoDBMock := dbmocks.ArgoDB{} - argoObjs := []runtime.Object{} - - r := ApplicationSetReconciler{ - Client: client, - Scheme: scheme, - Recorder: record.NewFakeRecorder(1), - Generators: map[string]generators.Generator{}, - ArgoDB: &argoDBMock, - ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), - KubeClientset: kubeclientset, - } - - appSyncMap, err := r.buildAppSyncMap(context.TODO(), cc.appSet, cc.appDependencyList, cc.appMap) - assert.Equal(t, err, nil, "expected no errors, but errors occured") - assert.Equal(t, cc.expectedMap, appSyncMap, "expected appSyncMap did not match actual") - }) - } -} - -func TestUpdateApplicationSetApplicationStatus(t *testing.T) { - - scheme := runtime.NewScheme() - err := argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - err = argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - for _, cc := range []struct { - name string - appSet argov1alpha1.ApplicationSet - apps []argov1alpha1.Application - expectedAppStatus []argov1alpha1.ApplicationSetApplicationStatus - }{ - { - name: "handles a nil list of statuses and no applications", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - }, - apps: []argov1alpha1.Application{}, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{}, - }, - { - name: "handles a nil list of statuses with a healthy application", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "No Application status found, defaulting status to Waiting.", - Status: "Waiting", - }, - }, - }, - { - name: "handles an empty list of statuses with a healthy application", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{}, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "No Application status found, defaulting status to Waiting.", - Status: "Waiting", - }, - }, - }, - { - name: "progresses an OutOfSync RollingSync application to waiting", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "", - Status: "Healthy", - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeOutOfSync, - }, - }, - }, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application has pending changes, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - { - name: "progresses a pending progressing application to progressing", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "", - Status: "Pending", - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusProgressing, - }, - }, - }, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application resource became Progressing, updating status from Pending to Progressing.", - Status: "Progressing", - }, - }, - }, - { - name: "progresses a pending syncing application to progressing", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "", - Status: "Pending", - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationRunning, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application resource became Progressing, updating status from Pending to Progressing.", - Status: "Progressing", - }, - }, - }, - { - name: "progresses a progressing application to healthy", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "", - Status: "Progressing", - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application resource became Healthy, updating status from Progressing to Healthy.", - Status: "Healthy", - }, - }, - }, - { - name: "progresses a waiting healthy application to healthy", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{}, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "", - Status: "Waiting", - }, - }, - }, - }, - apps: []argov1alpha1.Application{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Health: argov1alpha1.HealthStatus{ - Status: health.HealthStatusHealthy, - }, - OperationState: &argov1alpha1.OperationState{ - Phase: common.OperationSucceeded, - }, - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeSynced, - }, - }, - }, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application resource is already Healthy, updating status from Waiting to Healthy.", - Status: "Healthy", - }, - }, - }, - } { - - t.Run(cc.name, func(t *testing.T) { - - kubeclientset := kubefake.NewSimpleClientset([]runtime.Object{}...) - argoDBMock := dbmocks.ArgoDB{} - argoObjs := []runtime.Object{} - - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&cc.appSet).Build() - - r := ApplicationSetReconciler{ - Client: client, - Scheme: scheme, - Recorder: record.NewFakeRecorder(1), - Generators: map[string]generators.Generator{}, - ArgoDB: &argoDBMock, - ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), - KubeClientset: kubeclientset, - } - - appStatuses, err := r.updateApplicationSetApplicationStatus(context.TODO(), &cc.appSet, cc.apps) - - // opt out of testing the LastTransitionTime is accurate - for i := range appStatuses { - appStatuses[i].LastTransitionTime = nil - } - - assert.Equal(t, err, nil, "expected no errors, but errors occured") - assert.Equal(t, cc.expectedAppStatus, appStatuses, "expected appStatuses did not match actual") - }) - } -} - -func TestUpdateApplicationSetApplicationStatusProgress(t *testing.T) { - - scheme := runtime.NewScheme() - err := argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - err = argov1alpha1.AddToScheme(scheme) - assert.Nil(t, err) - - for _, cc := range []struct { - name string - appSet argov1alpha1.ApplicationSet - appSyncMap map[string]bool - appStepMap map[string]int - appMap map[string]argov1alpha1.Application - expectedAppStatus []argov1alpha1.ApplicationSetApplicationStatus - }{ - { - name: "handles an empty appSync and appStepMap", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - }, - }, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{}, - }, - }, - appSyncMap: map[string]bool{}, - appStepMap: map[string]int{}, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{}, - }, - { - name: "handles an empty strategy", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{}, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{}, - }, - }, - appSyncMap: map[string]bool{}, - appStepMap: map[string]int{}, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{}, - }, - { - name: "handles an empty applicationset strategy", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{}, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{}, - }, - }, - appSyncMap: map[string]bool{}, - appStepMap: map[string]int{}, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{}, - }, - { - name: "handles an appSyncMap with no existing statuses", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{}, - }, - }, - appSyncMap: map[string]bool{ - "app1": true, - "app2": false, - }, - appStepMap: map[string]int{ - "app1": 0, - "app2": 1, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{}, - }, - { - name: "handles updating a RollingSync status from Waiting to Pending", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - }, - }, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - }, - appSyncMap: map[string]bool{ - "app1": true, - }, - appStepMap: map[string]int{ - "app1": 0, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - LastTransitionTime: nil, - Message: "Application moved to Pending status, watching for the Application resource to start Progressing.", - Status: "Pending", - }, - }, - }, - { - name: "does not update a RollingSync status if appSyncMap is false", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - }, - }, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - }, - appSyncMap: map[string]bool{ - "app1": false, - }, - appStepMap: map[string]int{ - "app1": 0, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - LastTransitionTime: nil, - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - { - name: "does not update a status if status is not pending", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - }, - }, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application Pending status timed out while waiting to become Progressing, reset status to Healthy.", - Status: "Healthy", - }, - }, - }, - }, - appSyncMap: map[string]bool{ - "app1": true, - }, - appStepMap: map[string]int{ - "app1": 0, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - LastTransitionTime: nil, - Message: "Application Pending status timed out while waiting to become Progressing, reset status to Healthy.", - Status: "Healthy", - }, - }, - }, - { - name: "does not update a status if maxUpdate has already been reached with RollingSync", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - MaxUpdate: &intstr.IntOrString{ - Type: intstr.Int, - IntVal: 3, - }, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - }, - }, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application resource became Progressing, updating status from Pending to Progressing.", - Status: "Progressing", - }, - { - Application: "app2", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app3", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app4", - Message: "Application moved to Pending status, watching for the Application resource to start Progressing.", - Status: "Pending", - }, - }, - }, - }, - appSyncMap: map[string]bool{ - "app1": true, - "app2": true, - "app3": true, - "app4": true, - }, - appStepMap: map[string]int{ - "app1": 0, - "app2": 0, - "app3": 0, - "app4": 0, - }, - appMap: map[string]argov1alpha1.Application{ - "app1": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app1", - }, - Status: argov1alpha1.ApplicationStatus{ - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeOutOfSync, - }, - }, - }, - "app2": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app2", - }, - Status: argov1alpha1.ApplicationStatus{ - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeOutOfSync, - }, - }, - }, - "app3": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app3", - }, - Status: argov1alpha1.ApplicationStatus{ - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeOutOfSync, - }, - }, - }, - "app4": { - ObjectMeta: metav1.ObjectMeta{ - Name: "app4", - }, - Status: argov1alpha1.ApplicationStatus{ - Sync: argov1alpha1.SyncStatus{ - Status: argov1alpha1.SyncStatusCodeOutOfSync, - }, - }, - }, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - LastTransitionTime: nil, - Message: "Application resource became Progressing, updating status from Pending to Progressing.", - Status: "Progressing", - }, - { - Application: "app2", - LastTransitionTime: nil, - Message: "Application moved to Pending status, watching for the Application resource to start Progressing.", - Status: "Pending", - }, - { - Application: "app3", - LastTransitionTime: nil, - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app4", - LastTransitionTime: nil, - Message: "Application moved to Pending status, watching for the Application resource to start Progressing.", - Status: "Pending", - }, - }, - }, - { - name: "rounds down for maxUpdate set to percentage string", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - MaxUpdate: &intstr.IntOrString{ - Type: intstr.String, - StrVal: "50%", - }, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - }, - }, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app2", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app3", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - }, - appSyncMap: map[string]bool{ - "app1": true, - "app2": true, - "app3": true, - }, - appStepMap: map[string]int{ - "app1": 0, - "app2": 0, - "app3": 0, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - LastTransitionTime: nil, - Message: "Application moved to Pending status, watching for the Application resource to start Progressing.", - Status: "Pending", - }, - { - Application: "app2", - LastTransitionTime: nil, - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app3", - LastTransitionTime: nil, - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - { - name: "does not update any applications with maxUpdate set to 0", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - MaxUpdate: &intstr.IntOrString{ - Type: intstr.Int, - IntVal: 0, - }, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - }, - }, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app2", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app3", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - }, - appSyncMap: map[string]bool{ - "app1": true, - "app2": true, - "app3": true, - }, - appStepMap: map[string]int{ - "app1": 0, - "app2": 0, - "app3": 0, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - LastTransitionTime: nil, - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app2", - LastTransitionTime: nil, - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app3", - LastTransitionTime: nil, - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - { - name: "updates all applications with maxUpdate set to 100%", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - MaxUpdate: &intstr.IntOrString{ - Type: intstr.String, - StrVal: "100%", - }, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - }, - }, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app2", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app3", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - }, - appSyncMap: map[string]bool{ - "app1": true, - "app2": true, - "app3": true, - }, - appStepMap: map[string]int{ - "app1": 0, - "app2": 0, - "app3": 0, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - LastTransitionTime: nil, - Message: "Application moved to Pending status, watching for the Application resource to start Progressing.", - Status: "Pending", - }, - { - Application: "app2", - LastTransitionTime: nil, - Message: "Application moved to Pending status, watching for the Application resource to start Progressing.", - Status: "Pending", - }, - { - Application: "app3", - LastTransitionTime: nil, - Message: "Application moved to Pending status, watching for the Application resource to start Progressing.", - Status: "Pending", - }, - }, - }, - { - name: "updates at least 1 application with maxUpdate >0%", - appSet: argov1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", - }, - Spec: argov1alpha1.ApplicationSetSpec{ - Strategy: &argov1alpha1.ApplicationSetStrategy{ - Type: "RollingSync", - RollingSync: &argov1alpha1.ApplicationSetRolloutStrategy{ - Steps: []argov1alpha1.ApplicationSetRolloutStep{ - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - MaxUpdate: &intstr.IntOrString{ - Type: intstr.String, - StrVal: "1%", - }, - }, - { - MatchExpressions: []argov1alpha1.ApplicationMatchExpression{}, - }, - }, - }, - }, - }, - Status: argov1alpha1.ApplicationSetStatus{ - ApplicationStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app2", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app3", - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - }, - appSyncMap: map[string]bool{ - "app1": true, - "app2": true, - "app3": true, - }, - appStepMap: map[string]int{ - "app1": 0, - "app2": 0, - "app3": 0, - }, - expectedAppStatus: []argov1alpha1.ApplicationSetApplicationStatus{ - { - Application: "app1", - LastTransitionTime: nil, - Message: "Application moved to Pending status, watching for the Application resource to start Progressing.", - Status: "Pending", - }, - { - Application: "app2", - LastTransitionTime: nil, - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - { - Application: "app3", - LastTransitionTime: nil, - Message: "Application is out of date with the current AppSet generation, setting status to Waiting.", - Status: "Waiting", - }, - }, - }, - } { - - t.Run(cc.name, func(t *testing.T) { - - kubeclientset := kubefake.NewSimpleClientset([]runtime.Object{}...) - argoDBMock := dbmocks.ArgoDB{} - argoObjs := []runtime.Object{} - - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&cc.appSet).Build() - - r := ApplicationSetReconciler{ - Client: client, - Scheme: scheme, - Recorder: record.NewFakeRecorder(1), - Generators: map[string]generators.Generator{}, - ArgoDB: &argoDBMock, - ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), - KubeClientset: kubeclientset, - } - - appStatuses, err := r.updateApplicationSetApplicationStatusProgress(context.TODO(), &cc.appSet, cc.appSyncMap, cc.appStepMap, cc.appMap) - - // opt out of testing the LastTransitionTime is accurate - for i := range appStatuses { - appStatuses[i].LastTransitionTime = nil - } - - assert.Equal(t, err, nil, "expected no errors, but errors occured") - assert.Equal(t, cc.expectedAppStatus, appStatuses, "expected appStatuses did not match actual") - }) - } -} diff --git a/applicationset/examples/pull-request-generator/pull-request-example.yaml b/applicationset/examples/pull-request-generator/pull-request-example.yaml index 98f66ae095e6d..0d0580af2cab0 100644 --- a/applicationset/examples/pull-request-generator/pull-request-example.yaml +++ b/applicationset/examples/pull-request-generator/pull-request-example.yaml @@ -23,8 +23,6 @@ spec: template: metadata: name: 'myapp-{{ .branch }}-{{ .number }}' - labels: - key1: '{{ index .labels 0 }}' spec: source: repoURL: 'https://github.com/myorg/myrepo.git' diff --git a/applicationset/generators/cluster.go b/applicationset/generators/cluster.go index d91ee3126279a..3616f66afcf2d 100644 --- a/applicationset/generators/cluster.go +++ b/applicationset/generators/cluster.go @@ -170,7 +170,7 @@ func appendTemplatedValues(clusterValues map[string]string, params map[string]in result, err := replaceTemplatedString(value, params, appSet) if err != nil { - return fmt.Errorf("error replacing templated String: %w", err) + return err } if appSet.Spec.GoTemplate { diff --git a/applicationset/generators/generator_spec_processor.go b/applicationset/generators/generator_spec_processor.go index 4e08816e3e0c0..b244bfc5f5b30 100644 --- a/applicationset/generators/generator_spec_processor.go +++ b/applicationset/generators/generator_spec_processor.go @@ -1,7 +1,6 @@ package generators import ( - "fmt" "encoding/json" "reflect" @@ -29,7 +28,7 @@ type TransformResult struct { func Transform(requestedGenerator argoprojiov1alpha1.ApplicationSetGenerator, allGenerators map[string]Generator, baseTemplate argoprojiov1alpha1.ApplicationSetTemplate, appSet *argoprojiov1alpha1.ApplicationSet, genParams map[string]interface{}) ([]TransformResult, error) { selector, err := metav1.LabelSelectorAsSelector(requestedGenerator.Selector) if err != nil { - return nil, fmt.Errorf("error parsing label selector: %w", err) + return nil, err } res := []TransformResult{} diff --git a/applicationset/generators/git.go b/applicationset/generators/git.go index 7fd6d75fd6912..3b80ddc5f949f 100644 --- a/applicationset/generators/git.go +++ b/applicationset/generators/git.go @@ -85,7 +85,6 @@ func (g *GitGenerator) generateParamsForGitDirectories(appSetGenerator *argoproj "total": len(allPaths), "repoURL": appSetGenerator.Git.RepoURL, "revision": appSetGenerator.Git.Revision, - "pathParamPrefix": appSetGenerator.Git.PathParamPrefix, }).Info("applications result from the repo service") requestedApps := g.filterApps(appSetGenerator.Git.Directories, allPaths) @@ -122,7 +121,7 @@ func (g *GitGenerator) generateParamsForGitFiles(appSetGenerator *argoprojiov1al for _, path := range allPaths { // A JSON / YAML file path can contain multiple sets of parameters (ie it is an array) - paramsArray, err := g.generateParamsFromGitFile(path, allFiles[path], useGoTemplate, appSetGenerator.Git.PathParamPrefix) + paramsArray, err := g.generateParamsFromGitFile(path, allFiles[path], useGoTemplate) if err != nil { return nil, fmt.Errorf("unable to process file '%s': %v", path, err) } @@ -134,7 +133,7 @@ func (g *GitGenerator) generateParamsForGitFiles(appSetGenerator *argoprojiov1al return res, nil } -func (g *GitGenerator) generateParamsFromGitFile(filePath string, fileContent []byte, useGoTemplate bool, pathParamPrefix string) ([]map[string]interface{}, error) { +func (g *GitGenerator) generateParamsFromGitFile(filePath string, fileContent []byte, useGoTemplate bool) ([]map[string]interface{}, error) { objectsFound := []map[string]interface{}{} // First, we attempt to parse as an array @@ -168,11 +167,7 @@ func (g *GitGenerator) generateParamsFromGitFile(filePath string, fileContent [] paramPath["basenameNormalized"] = utils.SanitizeName(path.Base(paramPath["path"].(string))) paramPath["filenameNormalized"] = utils.SanitizeName(path.Base(paramPath["filename"].(string))) paramPath["segments"] = strings.Split(paramPath["path"].(string), "/") - if pathParamPrefix != "" { - params[pathParamPrefix] = map[string]interface{}{"path": paramPath} - } else { - params["path"] = paramPath - } + params["path"] = paramPath } else { flat, err := flatten.Flatten(objectFound, "", flatten.DotStyle) if err != nil { @@ -181,18 +176,14 @@ func (g *GitGenerator) generateParamsFromGitFile(filePath string, fileContent [] for k, v := range flat { params[k] = fmt.Sprintf("%v", v) } - pathParamName := "path" - if pathParamPrefix != "" { - pathParamName = pathParamPrefix+"."+pathParamName - } - params[pathParamName] = path.Dir(filePath) - params[pathParamName+".basename"] = path.Base(params[pathParamName].(string)) - params[pathParamName+".filename"] = path.Base(filePath) - params[pathParamName+".basenameNormalized"] = utils.SanitizeName(path.Base(params[pathParamName].(string))) - params[pathParamName+".filenameNormalized"] = utils.SanitizeName(path.Base(params[pathParamName+".filename"].(string))) - for k, v := range strings.Split(params[pathParamName].(string), "/") { + params["path"] = path.Dir(filePath) + params["path.basename"] = path.Base(params["path"].(string)) + params["path.filename"] = path.Base(filePath) + params["path.basenameNormalized"] = utils.SanitizeName(path.Base(params["path"].(string))) + params["path.filenameNormalized"] = utils.SanitizeName(path.Base(params["path.filename"].(string))) + for k, v := range strings.Split(params["path"].(string), "/") { if len(v) > 0 { - params[pathParamName+"["+strconv.Itoa(k)+"]"] = v + params["path["+strconv.Itoa(k)+"]"] = v } } } @@ -201,6 +192,7 @@ func (g *GitGenerator) generateParamsFromGitFile(filePath string, fileContent [] } return res, nil + } func (g *GitGenerator) filterApps(Directories []argoprojiov1alpha1.GitDirectoryGeneratorItem, allPaths []string) []string { @@ -231,7 +223,9 @@ func (g *GitGenerator) filterApps(Directories []argoprojiov1alpha1.GitDirectoryG return res } -func (g *GitGenerator) generateParamsFromApps(requestedApps []string, appSetGenerator *argoprojiov1alpha1.ApplicationSetGenerator, useGoTemplate bool) []map[string]interface{} { +func (g *GitGenerator) generateParamsFromApps(requestedApps []string, _ *argoprojiov1alpha1.ApplicationSetGenerator, useGoTemplate bool) []map[string]interface{} { + // TODO: At some point, the applicationSetGenerator param should be used + res := make([]map[string]interface{}, len(requestedApps)) for i, a := range requestedApps { @@ -243,22 +237,14 @@ func (g *GitGenerator) generateParamsFromApps(requestedApps []string, appSetGene paramPath["basename"] = path.Base(a) paramPath["basenameNormalized"] = utils.SanitizeName(path.Base(a)) paramPath["segments"] = strings.Split(paramPath["path"].(string), "/") - if appSetGenerator.Git.PathParamPrefix != "" { - params[appSetGenerator.Git.PathParamPrefix] = map[string]interface{}{"path": paramPath} - } else { - params["path"] = paramPath - } + params["path"] = paramPath } else { - pathParamName := "path" - if appSetGenerator.Git.PathParamPrefix != "" { - pathParamName = appSetGenerator.Git.PathParamPrefix+"."+pathParamName - } - params[pathParamName] = a - params[pathParamName+".basename"] = path.Base(a) - params[pathParamName+".basenameNormalized"] = utils.SanitizeName(path.Base(a)) - for k, v := range strings.Split(params[pathParamName].(string), "/") { + params["path"] = a + params["path.basename"] = path.Base(a) + params["path.basenameNormalized"] = utils.SanitizeName(path.Base(a)) + for k, v := range strings.Split(params["path"].(string), "/") { if len(v) > 0 { - params[pathParamName+"["+strconv.Itoa(k)+"]"] = v + params["path["+strconv.Itoa(k)+"]"] = v } } } diff --git a/applicationset/generators/git_test.go b/applicationset/generators/git_test.go index 96cfe08404d81..5385c8f800592 100644 --- a/applicationset/generators/git_test.go +++ b/applicationset/generators/git_test.go @@ -51,7 +51,7 @@ func Test_generateParamsFromGitFile(t *testing.T) { params, err := (*GitGenerator)(nil).generateParamsFromGitFile("path/dir/file_name.yaml", []byte(` foo: bar: baz -`), false, "") +`), false) if err != nil { t.Fatal(err) } @@ -69,33 +69,11 @@ foo: }, params) } -func Test_generatePrefixedParamsFromGitFile(t *testing.T) { - params, err := (*GitGenerator)(nil).generateParamsFromGitFile("path/dir/file_name.yaml", []byte(` -foo: - bar: baz -`), false, "myRepo") - if err != nil { - t.Fatal(err) - } - assert.Equal(t, []map[string]interface{}{ - { - "foo.bar": "baz", - "myRepo.path": "path/dir", - "myRepo.path.basename": "dir", - "myRepo.path.filename": "file_name.yaml", - "myRepo.path.basenameNormalized": "dir", - "myRepo.path.filenameNormalized": "file-name.yaml", - "myRepo.path[0]": "path", - "myRepo.path[1]": "dir", - }, - }, params) -} - func Test_generateParamsFromGitFileGoTemplate(t *testing.T) { params, err := (*GitGenerator)(nil).generateParamsFromGitFile("path/dir/file_name.yaml", []byte(` foo: bar: baz -`), true, "") +`), true) if err != nil { t.Fatal(err) } @@ -119,46 +97,15 @@ foo: }, params) } -func Test_generatePrefixedParamsFromGitFileGoTemplate(t *testing.T) { - params, err := (*GitGenerator)(nil).generateParamsFromGitFile("path/dir/file_name.yaml", []byte(` -foo: - bar: baz -`), true, "myRepo") - if err != nil { - t.Fatal(err) - } - assert.Equal(t, []map[string]interface{}{ - { - "foo": map[string]interface{}{ - "bar": "baz", - }, - "myRepo": map[string]interface{}{ - "path": map[string]interface{}{ - "path": "path/dir", - "basename": "dir", - "filename": "file_name.yaml", - "basenameNormalized": "dir", - "filenameNormalized": "file-name.yaml", - "segments": []string{ - "path", - "dir", - }, - }, - }, - }, - }, params) -} - func TestGitGenerateParamsFromDirectories(t *testing.T) { cases := []struct { - name string - directories []argoprojiov1alpha1.GitDirectoryGeneratorItem - pathParamPrefix string - repoApps []string - repoError error - expected []map[string]interface{} - expectedError error + name string + directories []argoprojiov1alpha1.GitDirectoryGeneratorItem + repoApps []string + repoError error + expected []map[string]interface{} + expectedError error }{ { name: "happy flow - created apps", @@ -177,24 +124,6 @@ func TestGitGenerateParamsFromDirectories(t *testing.T) { }, expectedError: nil, }, - { - name: "It prefixes path parameters with PathParamPrefix", - directories: []argoprojiov1alpha1.GitDirectoryGeneratorItem{{Path: "*"}}, - pathParamPrefix: "myRepo", - repoApps: []string{ - "app1", - "app2", - "app_3", - "p1/app4", - }, - repoError: nil, - expected: []map[string]interface{}{ - {"myRepo.path": "app1", "myRepo.path.basename": "app1", "myRepo.path.basenameNormalized": "app1", "myRepo.path[0]": "app1"}, - {"myRepo.path": "app2", "myRepo.path.basename": "app2", "myRepo.path.basenameNormalized": "app2", "myRepo.path[0]": "app2"}, - {"myRepo.path": "app_3", "myRepo.path.basename": "app_3", "myRepo.path.basenameNormalized": "app-3", "myRepo.path[0]": "app_3"}, - }, - expectedError: nil, - }, { name: "It filters application according to the paths", directories: []argoprojiov1alpha1.GitDirectoryGeneratorItem{{Path: "p1/*"}, {Path: "p1/*/*"}}, @@ -283,10 +212,9 @@ func TestGitGenerateParamsFromDirectories(t *testing.T) { Spec: argoprojiov1alpha1.ApplicationSetSpec{ Generators: []argoprojiov1alpha1.ApplicationSetGenerator{{ Git: &argoprojiov1alpha1.GitGenerator{ - RepoURL: "RepoURL", - Revision: "Revision", - Directories: testCaseCopy.directories, - PathParamPrefix: testCaseCopy.pathParamPrefix, + RepoURL: "RepoURL", + Revision: "Revision", + Directories: testCaseCopy.directories, }, }}, }, @@ -309,13 +237,12 @@ func TestGitGenerateParamsFromDirectories(t *testing.T) { func TestGitGenerateParamsFromDirectoriesGoTemplate(t *testing.T) { cases := []struct { - name string - directories []argoprojiov1alpha1.GitDirectoryGeneratorItem - pathParamPrefix string - repoApps []string - repoError error - expected []map[string]interface{} - expectedError error + name string + directories []argoprojiov1alpha1.GitDirectoryGeneratorItem + repoApps []string + repoError error + expected []map[string]interface{} + expectedError error }{ { name: "happy flow - created apps", @@ -361,57 +288,6 @@ func TestGitGenerateParamsFromDirectoriesGoTemplate(t *testing.T) { }, expectedError: nil, }, - { - name: "It prefixes path parameters with PathParamPrefix", - directories: []argoprojiov1alpha1.GitDirectoryGeneratorItem{{Path: "*"}}, - pathParamPrefix: "myRepo", - repoApps: []string{ - "app1", - "app2", - "app_3", - "p1/app4", - }, - repoError: nil, - expected: []map[string]interface{}{ - { - "myRepo": map[string]interface{}{ - "path": map[string]interface{}{ - "path": "app1", - "basename": "app1", - "basenameNormalized": "app1", - "segments": []string{ - "app1", - }, - }, - }, - }, - { - "myRepo": map[string]interface{}{ - "path": map[string]interface{}{ - "path": "app2", - "basename": "app2", - "basenameNormalized": "app2", - "segments": []string{ - "app2", - }, - }, - }, - }, - { - "myRepo": map[string]interface{}{ - "path": map[string]interface{}{ - "path": "app_3", - "basename": "app_3", - "basenameNormalized": "app-3", - "segments": []string{ - "app_3", - }, - }, - }, - }, - }, - expectedError: nil, - }, { name: "It filters application according to the paths", directories: []argoprojiov1alpha1.GitDirectoryGeneratorItem{{Path: "p1/*"}, {Path: "p1/*/*"}}, @@ -579,10 +455,9 @@ func TestGitGenerateParamsFromDirectoriesGoTemplate(t *testing.T) { GoTemplate: true, Generators: []argoprojiov1alpha1.ApplicationSetGenerator{{ Git: &argoprojiov1alpha1.GitGenerator{ - RepoURL: "RepoURL", - Revision: "Revision", - Directories: testCaseCopy.directories, - PathParamPrefix: testCaseCopy.pathParamPrefix, + RepoURL: "RepoURL", + Revision: "Revision", + Directories: testCaseCopy.directories, }, }}, }, diff --git a/applicationset/generators/matrix.go b/applicationset/generators/matrix.go index eadd18b83d5f9..66e84e7169aba 100644 --- a/applicationset/generators/matrix.go +++ b/applicationset/generators/matrix.go @@ -144,10 +144,9 @@ func (m *MatrixGenerator) GetRequeueAfter(appSetGenerator *argoprojiov1alpha1.Ap for _, r := range appSetGenerator.Matrix.Generators { base := &argoprojiov1alpha1.ApplicationSetGenerator{ - List: r.List, - Clusters: r.Clusters, - Git: r.Git, - PullRequest: r.PullRequest, + List: r.List, + Clusters: r.Clusters, + Git: r.Git, } generators := GetRelevantGenerators(base, m.supportedGenerators) diff --git a/applicationset/generators/matrix_test.go b/applicationset/generators/matrix_test.go index 1d79c452f6dce..3fa86a67d36bc 100644 --- a/applicationset/generators/matrix_test.go +++ b/applicationset/generators/matrix_test.go @@ -399,8 +399,6 @@ func TestMatrixGetRequeueAfter(t *testing.T) { Elements: []apiextensionsv1.JSON{{Raw: []byte(`{"cluster": "Cluster","url": "Url"}`)}}, } - pullRequestGenerator := &argoprojiov1alpha1.PullRequestGenerator{} - testCases := []struct { name string baseGenerators []argoprojiov1alpha1.ApplicationSetNestedGenerator @@ -433,31 +431,6 @@ func TestMatrixGetRequeueAfter(t *testing.T) { gitGetRequeueAfter: time.Duration(1), expected: time.Duration(1), }, - { - name: "returns the minimal time for pull request", - baseGenerators: []argoprojiov1alpha1.ApplicationSetNestedGenerator{ - { - Git: gitGenerator, - }, - { - PullRequest: pullRequestGenerator, - }, - }, - gitGetRequeueAfter: time.Duration(15 * time.Second), - expected: time.Duration(15 * time.Second), - }, - { - name: "returns the default time if no requeueAfterSeconds is provided", - baseGenerators: []argoprojiov1alpha1.ApplicationSetNestedGenerator{ - { - Git: gitGenerator, - }, - { - PullRequest: pullRequestGenerator, - }, - }, - expected: time.Duration(30 * time.Minute), - }, } for _, testCase := range testCases { @@ -468,18 +441,16 @@ func TestMatrixGetRequeueAfter(t *testing.T) { for _, g := range testCaseCopy.baseGenerators { gitGeneratorSpec := argoprojiov1alpha1.ApplicationSetGenerator{ - Git: g.Git, - List: g.List, - PullRequest: g.PullRequest, + Git: g.Git, + List: g.List, } mock.On("GetRequeueAfter", &gitGeneratorSpec).Return(testCaseCopy.gitGetRequeueAfter, nil) } var matrixGenerator = NewMatrixGenerator( map[string]Generator{ - "Git": mock, - "List": &ListGenerator{}, - "PullRequest": &PullRequestGenerator{}, + "Git": mock, + "List": &ListGenerator{}, }, ) diff --git a/applicationset/generators/pull_request.go b/applicationset/generators/pull_request.go index db6c80c6c0f5c..287a00be1ae81 100644 --- a/applicationset/generators/pull_request.go +++ b/applicationset/generators/pull_request.go @@ -90,19 +90,13 @@ func (g *PullRequestGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha shortSHALength = len(pull.HeadSHA) } - paramMap := map[string]interface{}{ + params = append(params, map[string]interface{}{ "number": strconv.Itoa(pull.Number), "branch": pull.Branch, "branch_slug": slug.Make(pull.Branch), "head_sha": pull.HeadSHA, "head_short_sha": pull.HeadSHA[:shortSHALength], - } - - // PR lables will only be supported for Go Template appsets, since fasttemplate will be deprecated. - if applicationSetInfo != nil && applicationSetInfo.Spec.GoTemplate { - paramMap["labels"] = pull.Labels - } - params = append(params, paramMap) + }) } return params, nil } diff --git a/applicationset/generators/pull_request_test.go b/applicationset/generators/pull_request_test.go index caad198670302..ef969376d9719 100644 --- a/applicationset/generators/pull_request_test.go +++ b/applicationset/generators/pull_request_test.go @@ -17,10 +17,9 @@ import ( func TestPullRequestGithubGenerateParams(t *testing.T) { ctx := context.Background() cases := []struct { - selectFunc func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) - expected []map[string]interface{} - expectedErr error - applicationSet argoprojiov1alpha1.ApplicationSet + selectFunc func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) + expected []map[string]interface{} + expectedErr error }{ { selectFunc: func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) { @@ -108,71 +107,6 @@ func TestPullRequestGithubGenerateParams(t *testing.T) { expected: nil, expectedErr: fmt.Errorf("error listing repos: fake error"), }, - { - selectFunc: func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) { - return pullrequest.NewFakeService( - ctx, - []*pullrequest.PullRequest{ - &pullrequest.PullRequest{ - Number: 1, - Branch: "branch1", - HeadSHA: "089d92cbf9ff857a39e6feccd32798ca700fb958", - Labels: []string{"preview"}, - }, - }, - nil, - ) - }, - expected: []map[string]interface{}{ - { - "number": "1", - "branch": "branch1", - "branch_slug": "branch1", - "head_sha": "089d92cbf9ff857a39e6feccd32798ca700fb958", - "head_short_sha": "089d92cb", - "labels": []string{"preview"}, - }, - }, - expectedErr: nil, - applicationSet: argoprojiov1alpha1.ApplicationSet{ - Spec: argoprojiov1alpha1.ApplicationSetSpec{ - // Application set is using Go Template. - GoTemplate: true, - }, - }, - }, - { - selectFunc: func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) { - return pullrequest.NewFakeService( - ctx, - []*pullrequest.PullRequest{ - &pullrequest.PullRequest{ - Number: 1, - Branch: "branch1", - HeadSHA: "089d92cbf9ff857a39e6feccd32798ca700fb958", - Labels: []string{"preview"}, - }, - }, - nil, - ) - }, - expected: []map[string]interface{}{ - { - "number": "1", - "branch": "branch1", - "branch_slug": "branch1", - "head_sha": "089d92cbf9ff857a39e6feccd32798ca700fb958", - "head_short_sha": "089d92cb", - }, - }, - expectedErr: nil, - applicationSet: argoprojiov1alpha1.ApplicationSet{ - Spec: argoprojiov1alpha1.ApplicationSetSpec{ - // Application set is using fasttemplate. - GoTemplate: false, - }, - }, - }, } for _, c := range cases { @@ -183,7 +117,7 @@ func TestPullRequestGithubGenerateParams(t *testing.T) { PullRequest: &argoprojiov1alpha1.PullRequestGenerator{}, } - got, gotErr := gen.GenerateParams(&generatorConfig, &c.applicationSet) + got, gotErr := gen.GenerateParams(&generatorConfig, nil) assert.Equal(t, c.expectedErr, gotErr) assert.ElementsMatch(t, c.expected, got) } diff --git a/applicationset/services/internal/github_app/client.go b/applicationset/services/internal/github_app/client.go index bad6e828aa5c6..841396a2dc28f 100644 --- a/applicationset/services/internal/github_app/client.go +++ b/applicationset/services/internal/github_app/client.go @@ -20,12 +20,10 @@ func Client(g github_app_auth.Authentication, url string) (*github.Client, error url = g.EnterpriseBaseURL } var client *github.Client + httpClient := http.Client{Transport: rt} if url == "" { - httpClient := http.Client{Transport: rt} client = github.NewClient(&httpClient) } else { - rt.BaseURL = url - httpClient := http.Client{Transport: rt} client, err = github.NewEnterpriseClient(url, url, &httpClient) if err != nil { return nil, fmt.Errorf("failed to create github enterprise client: %w", err) diff --git a/applicationset/services/pull_request/bitbucket_server.go b/applicationset/services/pull_request/bitbucket_server.go index 72cd6dd7e1900..eb1bfd1f51494 100644 --- a/applicationset/services/pull_request/bitbucket_server.go +++ b/applicationset/services/pull_request/bitbucket_server.go @@ -69,7 +69,6 @@ func (b *BitbucketService) List(_ context.Context) ([]*PullRequest, error) { Number: pull.ID, Branch: pull.FromRef.DisplayID, // ID: refs/heads/main DisplayID: main HeadSHA: pull.FromRef.LatestCommit, // This is not defined in the official docs, but works in practice - Labels: []string{}, // Not supported by library }) } diff --git a/applicationset/services/pull_request/bitbucket_server_test.go b/applicationset/services/pull_request/bitbucket_server_test.go index 0204d2aefa8d4..30586609ec81b 100644 --- a/applicationset/services/pull_request/bitbucket_server_test.go +++ b/applicationset/services/pull_request/bitbucket_server_test.go @@ -122,19 +122,16 @@ func TestListPullRequestPagination(t *testing.T) { Number: 101, Branch: "feature-101", HeadSHA: "ab3cf2e4d1517c83e720d2585b9402dbef71f992", - Labels: []string{}, }, *pullRequests[0]) assert.Equal(t, PullRequest{ Number: 102, Branch: "feature-102", HeadSHA: "bb3cf2e4d1517c83e720d2585b9402dbef71f992", - Labels: []string{}, }, *pullRequests[1]) assert.Equal(t, PullRequest{ Number: 200, Branch: "feature-200", HeadSHA: "cb3cf2e4d1517c83e720d2585b9402dbef71f992", - Labels: []string{}, }, *pullRequests[2]) } @@ -287,13 +284,11 @@ func TestListPullRequestBranchMatch(t *testing.T) { Number: 101, Branch: "feature-101", HeadSHA: "ab3cf2e4d1517c83e720d2585b9402dbef71f992", - Labels: []string{}, }, *pullRequests[0]) assert.Equal(t, PullRequest{ Number: 102, Branch: "feature-102", HeadSHA: "bb3cf2e4d1517c83e720d2585b9402dbef71f992", - Labels: []string{}, }, *pullRequests[1]) regexp = `.*2$` @@ -310,7 +305,6 @@ func TestListPullRequestBranchMatch(t *testing.T) { Number: 102, Branch: "feature-102", HeadSHA: "bb3cf2e4d1517c83e720d2585b9402dbef71f992", - Labels: []string{}, }, *pullRequests[0]) regexp = `[\d{2}` diff --git a/applicationset/services/pull_request/gitea.go b/applicationset/services/pull_request/gitea.go index f913fb35580f5..44d6bb04bc7c9 100644 --- a/applicationset/services/pull_request/gitea.go +++ b/applicationset/services/pull_request/gitea.go @@ -57,17 +57,7 @@ func (g *GiteaService) List(ctx context.Context) ([]*PullRequest, error) { Number: int(pr.Index), Branch: pr.Head.Ref, HeadSHA: pr.Head.Sha, - Labels: getGiteaPRLabelNames(pr.Labels), }) } return list, nil } - -// Get the Gitea pull request label names. -func getGiteaPRLabelNames(giteaLabels []*gitea.Label) []string { - var labelNames []string - for _, giteaLabel := range giteaLabels { - labelNames = append(labelNames, giteaLabel.Name) - } - return labelNames -} diff --git a/applicationset/services/pull_request/gitea_test.go b/applicationset/services/pull_request/gitea_test.go index 9d5ff25748234..9d03a98b84bfc 100644 --- a/applicationset/services/pull_request/gitea_test.go +++ b/applicationset/services/pull_request/gitea_test.go @@ -8,7 +8,6 @@ import ( "net/http/httptest" "testing" - "code.gitea.io/sdk/gitea" "github.com/stretchr/testify/assert" ) @@ -258,32 +257,3 @@ func TestGiteaList(t *testing.T) { assert.Equal(t, prs[0].Branch, "test") assert.Equal(t, prs[0].HeadSHA, "7bbaf62d92ddfafd9cc8b340c619abaec32bc09f") } - -func TestGetGiteaPRLabelNames(t *testing.T) { - Tests := []struct { - Name string - PullLabels []*gitea.Label - ExpectedResult []string - }{ - { - Name: "PR has labels", - PullLabels: []*gitea.Label{ - &gitea.Label{Name: "label1"}, - &gitea.Label{Name: "label2"}, - &gitea.Label{Name: "label3"}, - }, - ExpectedResult: []string{"label1", "label2", "label3"}, - }, - { - Name: "PR does not have labels", - PullLabels: []*gitea.Label{}, - ExpectedResult: nil, - }, - } - for _, test := range Tests { - t.Run(test.Name, func(t *testing.T) { - labels := getGiteaPRLabelNames(test.PullLabels) - assert.Equal(t, test.ExpectedResult, labels) - }) - } -} diff --git a/applicationset/services/pull_request/github.go b/applicationset/services/pull_request/github.go index a40588ec3d367..011f1f2b71430 100644 --- a/applicationset/services/pull_request/github.go +++ b/applicationset/services/pull_request/github.go @@ -68,7 +68,6 @@ func (g *GithubService) List(ctx context.Context) ([]*PullRequest, error) { Number: *pull.Number, Branch: *pull.Head.Ref, HeadSHA: *pull.Head.SHA, - Labels: getGithubPRLabelNames(pull.Labels), }) } if resp.NextPage == 0 { @@ -98,12 +97,3 @@ func containLabels(expectedLabels []string, gotLabels []*github.Label) bool { } return true } - -// Get the Github pull request label names. -func getGithubPRLabelNames(gitHubLabels []*github.Label) []string { - var labelNames []string - for _, gitHubLabel := range gitHubLabels { - labelNames = append(labelNames, *gitHubLabel.Name) - } - return labelNames -} diff --git a/applicationset/services/pull_request/github_test.go b/applicationset/services/pull_request/github_test.go index 4c89404c09a6a..20bbc6b4c6b02 100644 --- a/applicationset/services/pull_request/github_test.go +++ b/applicationset/services/pull_request/github_test.go @@ -4,7 +4,6 @@ import ( "testing" "github.com/google/go-github/v35/github" - "github.com/stretchr/testify/assert" ) func toPtr(s string) *string { @@ -58,32 +57,3 @@ func TestContainLabels(t *testing.T) { }) } } - -func TestGetGitHubPRLabelNames(t *testing.T) { - Tests := []struct { - Name string - PullLabels []*github.Label - ExpectedResult []string - }{ - { - Name: "PR has labels", - PullLabels: []*github.Label{ - &github.Label{Name: toPtr("label1")}, - &github.Label{Name: toPtr("label2")}, - &github.Label{Name: toPtr("label3")}, - }, - ExpectedResult: []string{"label1", "label2", "label3"}, - }, - { - Name: "PR does not have labels", - PullLabels: []*github.Label{}, - ExpectedResult: nil, - }, - } - for _, test := range Tests { - t.Run(test.Name, func(t *testing.T) { - labels := getGithubPRLabelNames(test.PullLabels) - assert.Equal(t, test.ExpectedResult, labels) - }) - } -} diff --git a/applicationset/services/pull_request/gitlab.go b/applicationset/services/pull_request/gitlab.go index 39f6250aae0e8..7d3b1138d7b8e 100644 --- a/applicationset/services/pull_request/gitlab.go +++ b/applicationset/services/pull_request/gitlab.go @@ -72,7 +72,6 @@ func (g *GitLabService) List(ctx context.Context) ([]*PullRequest, error) { Number: mr.IID, Branch: mr.SourceBranch, HeadSHA: mr.SHA, - Labels: mr.Labels, }) } if resp.NextPage == 0 { diff --git a/applicationset/services/pull_request/interface.go b/applicationset/services/pull_request/interface.go index f81dc35e41435..c55fa5ef38cbf 100644 --- a/applicationset/services/pull_request/interface.go +++ b/applicationset/services/pull_request/interface.go @@ -12,8 +12,6 @@ type PullRequest struct { Branch string // HeadSHA is the SHA of the HEAD from which the pull request originated. HeadSHA string - // Labels of the pull request. - Labels []string } type PullRequestService interface { diff --git a/applicationset/services/repo_service.go b/applicationset/services/repo_service.go index 571f497433de8..046e54ab77f06 100644 --- a/applicationset/services/repo_service.go +++ b/applicationset/services/repo_service.go @@ -85,12 +85,12 @@ func (a *argoCDService) GetDirectories(ctx context.Context, repoURL string, revi gitRepoClient, err := git.NewClient(repo.Repo, repo.GetGitCreds(a.storecreds), repo.IsInsecure(), repo.IsLFSEnabled(), repo.Proxy) if err != nil { - return nil, fmt.Errorf("error creating a new git client: %w", err) + return nil, err } err = checkoutRepo(gitRepoClient, revision, a.submoduleEnabled) if err != nil { - return nil, fmt.Errorf("error while checking out repo: %w", err) + return nil, err } filteredPaths := []string{} @@ -99,7 +99,7 @@ func (a *argoCDService) GetDirectories(ctx context.Context, repoURL string, revi if err := filepath.Walk(repoRoot, func(path string, info os.FileInfo, fnErr error) error { if fnErr != nil { - return fmt.Errorf("error walking the file tree: %w", fnErr) + return fnErr } if !info.IsDir() { // Skip files: directories only return nil @@ -112,7 +112,7 @@ func (a *argoCDService) GetDirectories(ctx context.Context, repoURL string, revi relativePath, err := filepath.Rel(repoRoot, path) if err != nil { - return fmt.Errorf("error constructing relative repo path: %w", err) + return err } if relativePath == "." { // Exclude '.' from results diff --git a/applicationset/services/scm_provider/gitea.go b/applicationset/services/scm_provider/gitea.go index d00916051ed05..971e92497b497 100644 --- a/applicationset/services/scm_provider/gitea.go +++ b/applicationset/services/scm_provider/gitea.go @@ -35,7 +35,7 @@ func NewGiteaProvider(ctx context.Context, owner, token, url string, allBranches } client, err := gitea.NewClient(url, gitea.SetToken(token), gitea.SetHTTPClient(httpClient)) if err != nil { - return nil, fmt.Errorf("error creating a new gitea client: %w", err) + return nil, err } return &GiteaProvider{ client: client, diff --git a/applicationset/utils/createOrUpdate.go b/applicationset/utils/createOrUpdate.go index a9775eb7994c5..e8799950dd414 100644 --- a/applicationset/utils/createOrUpdate.go +++ b/applicationset/utils/createOrUpdate.go @@ -88,7 +88,7 @@ func CreateOrUpdate(ctx context.Context, c client.Client, obj client.Object, f c // mutate wraps a MutateFn and applies validation to its result func mutate(f controllerutil.MutateFn, key client.ObjectKey, obj client.Object) error { if err := f(); err != nil { - return fmt.Errorf("error while wrapping using MutateFn: %w", err) + return err } if newKey := client.ObjectKeyFromObject(obj); key != newKey { return fmt.Errorf("MutateFn cannot mutate object name and/or object namespace") diff --git a/applicationset/utils/policy.go b/applicationset/utils/policy.go index 926a50926cd05..8a7376ccaa866 100644 --- a/applicationset/utils/policy.go +++ b/applicationset/utils/policy.go @@ -11,7 +11,6 @@ var Policies = map[string]Policy{ "sync": &SyncPolicy{}, "create-only": &CreateOnlyPolicy{}, "create-update": &CreateUpdatePolicy{}, - "create-delete": &CreateDeletePolicy{}, } type SyncPolicy struct{} @@ -43,13 +42,3 @@ func (p *CreateOnlyPolicy) Update() bool { func (p *CreateOnlyPolicy) Delete() bool { return false } - -type CreateDeletePolicy struct{} - -func (p *CreateDeletePolicy) Update() bool { - return false -} - -func (p *CreateDeletePolicy) Delete() bool { - return true -} diff --git a/applicationset/utils/utils.go b/applicationset/utils/utils.go index 254478ee45c7f..f729b6afb6274 100644 --- a/applicationset/utils/utils.go +++ b/applicationset/utils/utils.go @@ -12,7 +12,7 @@ import ( "text/template" "unsafe" - "github.com/Masterminds/sprig/v3" + "github.com/Masterminds/sprig" "github.com/valyala/fasttemplate" log "github.com/sirupsen/logrus" diff --git a/applicationset/utils/utils_test.go b/applicationset/utils/utils_test.go index af36c18a39dbb..38c6aee2bf1f1 100644 --- a/applicationset/utils/utils_test.go +++ b/applicationset/utils/utils_test.go @@ -41,7 +41,7 @@ func TestRenderTemplateParams(t *testing.T) { Namespace: "default", }, Spec: argoappsv1.ApplicationSpec{ - Source: &argoappsv1.ApplicationSource{ + Source: argoappsv1.ApplicationSource{ Path: "", RepoURL: "", TargetRevision: "", @@ -220,7 +220,7 @@ func TestRenderTemplateParamsGoTemplate(t *testing.T) { Namespace: "default", }, Spec: argoappsv1.ApplicationSpec{ - Source: &argoappsv1.ApplicationSource{ + Source: argoappsv1.ApplicationSource{ Path: "", RepoURL: "", TargetRevision: "", @@ -511,7 +511,7 @@ func TestRenderTemplateParamsFinalizers(t *testing.T) { emptyApplication := &argoappsv1.Application{ Spec: argoappsv1.ApplicationSpec{ - Source: &argoappsv1.ApplicationSource{ + Source: argoappsv1.ApplicationSource{ Path: "", RepoURL: "", TargetRevision: "", diff --git a/argocd-cosign.pub b/argocd-cosign.pub new file mode 100644 index 0000000000000..bd14342b9c1b4 --- /dev/null +++ b/argocd-cosign.pub @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEesHEB7vX5Y2RxXypjMy1nI1z7iRG +JI9/gt/sYqzpsa65aaNP4npM43DDxoIy/MQBo9s/mxGxmA+8UXeDpVC9vw== +-----END PUBLIC KEY----- diff --git a/assets/swagger.json b/assets/swagger.json index bd38517972ded..77ab16396628f 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -735,42 +735,6 @@ } } }, - "/api/v1/applications/{name}/links": { - "get": { - "tags": [ - "ApplicationService" - ], - "summary": "ListLinks returns the list of all application deep links", - "operationId": "ApplicationService_ListLinks", - "parameters": [ - { - "type": "string", - "name": "name", - "in": "path", - "required": true - }, - { - "type": "string", - "name": "namespace", - "in": "query" - } - ], - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/applicationLinksResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - } - } - }, "/api/v1/applications/{name}/logs": { "get": { "tags": [ @@ -1421,67 +1385,6 @@ } } }, - "/api/v1/applications/{name}/resource/links": { - "get": { - "tags": [ - "ApplicationService" - ], - "summary": "ListResourceLinks returns the list of all resource deep links", - "operationId": "ApplicationService_ListResourceLinks", - "parameters": [ - { - "type": "string", - "name": "name", - "in": "path", - "required": true - }, - { - "type": "string", - "name": "namespace", - "in": "query" - }, - { - "type": "string", - "name": "resourceName", - "in": "query" - }, - { - "type": "string", - "name": "version", - "in": "query" - }, - { - "type": "string", - "name": "group", - "in": "query" - }, - { - "type": "string", - "name": "kind", - "in": "query" - }, - { - "type": "string", - "name": "appNamespace", - "in": "query" - } - ], - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/applicationLinksResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - } - } - }, "/api/v1/applications/{name}/revisions/{revision}/metadata": { "get": { "tags": [ @@ -2657,37 +2560,6 @@ } } }, - "/api/v1/projects/{name}/links": { - "get": { - "tags": [ - "ProjectService" - ], - "summary": "ListLinks returns all deep links for the particular project", - "operationId": "ProjectService_ListLinks", - "parameters": [ - { - "type": "string", - "name": "name", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/applicationLinksResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - } - } - }, "/api/v1/projects/{name}/syncwindows": { "get": { "tags": [ @@ -3424,12 +3296,6 @@ "description": "Reference between project and repository that allow you automatically to be added as item inside SourceRepos project entity.", "name": "project", "in": "query" - }, - { - "type": "string", - "description": "Google Cloud Platform service account key.", - "name": "gcpServiceAccountKey", - "in": "query" } ], "responses": { @@ -4034,34 +3900,6 @@ } } }, - "applicationLinkInfo": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "iconClass": { - "type": "string" - }, - "title": { - "type": "string" - }, - "url": { - "type": "string" - } - } - }, - "applicationLinksResponse": { - "type": "object", - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/applicationLinkInfo" - } - } - } - }, "applicationLogEntry": { "type": "object", "properties": { @@ -4362,24 +4200,6 @@ "type": "object", "title": "Generic (empty) response for GPG public key CRUD requests" }, - "intstrIntOrString": { - "description": "+protobuf=true\n+protobuf.options.(gogoproto.goproto_stringer)=false\n+k8s:openapi-gen=true", - "type": "object", - "title": "IntOrString is a type that can hold an int32 or a string. When used in\nJSON or YAML marshalling and unmarshalling, it produces or consumes the\ninner type. This allows you to have, for example, a JSON field that can\naccept a name or number.\nTODO: Rename to Int32OrString", - "properties": { - "intVal": { - "type": "integer", - "format": "int32" - }, - "strVal": { - "type": "string" - }, - "type": { - "type": "string", - "format": "int64" - } - } - }, "notificationService": { "type": "object", "properties": { @@ -4688,65 +4508,6 @@ } } }, - "repositoryParameterAnnouncement": { - "type": "object", - "properties": { - "array": { - "description": "array is the default value of the parameter if the parameter is an array.", - "type": "array", - "items": { - "type": "string" - } - }, - "collectionType": { - "description": "collectionType is the type of value this parameter holds - either a single value (a string) or a collection\n(array or map). If collectionType is set, only the field with that type will be used. If collectionType is not\nset, `string` is the default. If collectionType is set to an invalid value, a validation error is thrown.", - "type": "string" - }, - "itemType": { - "description": "itemType determines the primitive data type represented by the parameter. Parameters are always encoded as\nstrings, but this field lets them be interpreted as other primitive types.", - "type": "string" - }, - "map": { - "description": "map is the default value of the parameter if the parameter is a map.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "name": { - "description": "name is the name identifying a parameter.", - "type": "string" - }, - "required": { - "description": "required defines if this given parameter is mandatory.", - "type": "boolean" - }, - "string": { - "description": "string is the default value of the parameter if the parameter is a string.", - "type": "string" - }, - "title": { - "description": "title is a human-readable text of the parameter name.", - "type": "string" - }, - "tooltip": { - "description": "tooltip is a human-readable description of the parameter.", - "type": "string" - } - } - }, - "repositoryPluginAppSpec": { - "type": "object", - "title": "PluginAppSpec contains details about a plugin-type Application", - "properties": { - "parametersAnnouncement": { - "type": "array", - "items": { - "$ref": "#/definitions/repositoryParameterAnnouncement" - } - } - } - }, "repositoryRefs": { "type": "object", "title": "A subset of the repository's named refs", @@ -4793,9 +4554,6 @@ "kustomize": { "$ref": "#/definitions/repositoryKustomizeAppSpec" }, - "plugin": { - "$ref": "#/definitions/repositoryPluginAppSpec" - }, "type": { "type": "string" } @@ -5618,23 +5376,6 @@ } } }, - "v1alpha1ApplicationMatchExpression": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "operator": { - "type": "string" - }, - "values": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, "v1alpha1ApplicationSet": { "type": "object", "title": "ApplicationSet is a set of Application resources\n+genclient\n+genclient:noStatus\n+k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n+kubebuilder:resource:path=applicationsets,shortName=appset;appsets\n+kubebuilder:subresource:status", @@ -5650,27 +5391,6 @@ } } }, - "v1alpha1ApplicationSetApplicationStatus": { - "type": "object", - "title": "ApplicationSetApplicationStatus contains details about each Application managed by the ApplicationSet", - "properties": { - "application": { - "type": "string", - "title": "Application contains the name of the Application resource" - }, - "lastTransitionTime": { - "$ref": "#/definitions/v1Time" - }, - "message": { - "type": "string", - "title": "Message contains human-readable message indicating details about the status" - }, - "status": { - "type": "string", - "title": "Status contains the AppSet's perceived status of the managed Application resource: (Waiting, Pending, Progressing, Healthy)" - } - } - }, "v1alpha1ApplicationSetCondition": { "type": "object", "title": "ApplicationSetCondition contains details about an applicationset condition, which is usally an error or warning", @@ -5777,31 +5497,6 @@ } } }, - "v1alpha1ApplicationSetRolloutStep": { - "type": "object", - "properties": { - "matchExpressions": { - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha1ApplicationMatchExpression" - } - }, - "maxUpdate": { - "$ref": "#/definitions/intstrIntOrString" - } - } - }, - "v1alpha1ApplicationSetRolloutStrategy": { - "type": "object", - "properties": { - "steps": { - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha1ApplicationSetRolloutStep" - } - } - } - }, "v1alpha1ApplicationSetSpec": { "description": "ApplicationSetSpec represents a class of application set state.", "type": "object", @@ -5815,9 +5510,6 @@ "goTemplate": { "type": "boolean" }, - "strategy": { - "$ref": "#/definitions/v1alpha1ApplicationSetStrategy" - }, "syncPolicy": { "$ref": "#/definitions/v1alpha1ApplicationSetSyncPolicy" }, @@ -5830,12 +5522,6 @@ "type": "object", "title": "ApplicationSetStatus defines the observed state of ApplicationSet", "properties": { - "applicationStatus": { - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha1ApplicationSetApplicationStatus" - } - }, "conditions": { "type": "array", "title": "INSERT ADDITIONAL STATUS FIELD - define observed state of cluster\nImportant: Run \"make\" to regenerate code after modifying this file", @@ -5845,18 +5531,6 @@ } } }, - "v1alpha1ApplicationSetStrategy": { - "description": "ApplicationSetStrategy configures how generated Applications are updated in sequence.", - "type": "object", - "properties": { - "rollingSync": { - "$ref": "#/definitions/v1alpha1ApplicationSetRolloutStrategy" - }, - "type": { - "type": "string" - } - } - }, "v1alpha1ApplicationSetSyncPolicy": { "description": "ApplicationSetSyncPolicy configures how generated Applications will relate to their\nApplicationSet.", "type": "object", @@ -5933,10 +5607,6 @@ "plugin": { "$ref": "#/definitions/v1alpha1ApplicationSourcePlugin" }, - "ref": { - "description": "Ref is reference to another source within sources field. This field will not be used if used with a `source` tag.", - "type": "string" - }, "repoURL": { "type": "string", "title": "RepoURL is the URL to the repository (Git or Helm) that contains the application manifests" @@ -6105,39 +5775,6 @@ }, "name": { "type": "string" - }, - "parameters": { - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha1ApplicationSourcePluginParameter" - } - } - } - }, - "v1alpha1ApplicationSourcePluginParameter": { - "type": "object", - "properties": { - "array": { - "description": "Array is the value of an array type parameter.", - "type": "array", - "items": { - "type": "string" - } - }, - "map": { - "description": "Map is the value of a map type parameter.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "name": { - "description": "Name is the name identifying a parameter.", - "type": "string" - }, - "string": { - "description": "String_ is the value of a string type parameter.", - "type": "string" } } }, @@ -6174,13 +5811,6 @@ "source": { "$ref": "#/definitions/v1alpha1ApplicationSource" }, - "sources": { - "type": "array", - "title": "Sources is a reference to the location of the application's manifests or chart", - "items": { - "$ref": "#/definitions/v1alpha1ApplicationSource" - } - }, "syncPolicy": { "$ref": "#/definitions/v1alpha1SyncPolicy" } @@ -6231,13 +5861,6 @@ "type": "string", "title": "SourceType specifies the type of this application" }, - "sourceTypes": { - "type": "array", - "title": "SourceTypes specifies the type of the sources included in the application", - "items": { - "type": "string" - } - }, "summary": { "$ref": "#/definitions/v1alpha1ApplicationSummary" }, @@ -6535,13 +6158,6 @@ }, "source": { "$ref": "#/definitions/v1alpha1ApplicationSource" - }, - "sources": { - "type": "array", - "title": "Sources is a reference to the application's multiple sources used for comparison", - "items": { - "$ref": "#/definitions/v1alpha1ApplicationSource" - } } } }, @@ -6676,9 +6292,6 @@ "$ref": "#/definitions/v1alpha1GitFileGeneratorItem" } }, - "pathParamPrefix": { - "type": "string" - }, "repoURL": { "type": "string" }, @@ -6934,23 +6547,6 @@ } } }, - "v1alpha1ManagedNamespaceMetadata": { - "type": "object", - "properties": { - "annotations": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - }, "v1alpha1MatrixGenerator": { "description": "MatrixGenerator generates the cartesian product of two sets of parameters. The parameters are defined by two nested\ngenerators.", "type": "object", @@ -7304,10 +6900,6 @@ "type": "boolean", "title": "EnableOCI specifies whether helm-oci support should be enabled for this repo" }, - "gcpServiceAccountKey": { - "type": "string", - "title": "GCPServiceAccountKey specifies the service account key in JSON format to be used for getting credentials to Google Cloud Source repos" - }, "githubAppEnterpriseBaseUrl": { "type": "string", "title": "GithubAppEnterpriseBaseURL specifies the GitHub API URL for GitHub app authentication. If empty will default to https://api.github.com" @@ -7330,10 +6922,6 @@ "type": "string", "title": "Password for authenticating at the repo server" }, - "proxy": { - "type": "string", - "title": "Proxy specifies the HTTP/HTTPS proxy used to access repos at the repo server" - }, "sshPrivateKey": { "type": "string", "title": "SSHPrivateKey contains the private key data for authenticating at the repo server using SSH (only Git repos)" @@ -7390,10 +6978,6 @@ "type": "boolean", "title": "EnableOCI specifies whether helm-oci support should be enabled for this repo" }, - "gcpServiceAccountKey": { - "type": "string", - "title": "GCPServiceAccountKey specifies the service account key in JSON format to be used for getting credentials to Google Cloud Source repos" - }, "githubAppEnterpriseBaseUrl": { "type": "string", "title": "GithubAppEnterpriseBaseURL specifies the base URL of GitHub Enterprise installation. If empty will default to https://api.github.com" @@ -7884,22 +7468,8 @@ "type": "string", "title": "Revision holds the revision the sync was performed against" }, - "revisions": { - "type": "array", - "title": "Revisions holds the revision of each source in sources field the sync was performed against", - "items": { - "type": "string" - } - }, "source": { "$ref": "#/definitions/v1alpha1ApplicationSource" - }, - "sources": { - "type": "array", - "title": "Sources is a reference to the application sources used for the sync operation", - "items": { - "$ref": "#/definitions/v1alpha1ApplicationSource" - } } } }, @@ -7915,8 +7485,8 @@ "$ref": "#/definitions/v1Time" }, "message": { - "description": "Message contains the message associated with the revision, most likely the commit message.", - "type": "string" + "type": "string", + "title": "Message contains the message associated with the revision, most likely the commit message.\nThe message is truncated to the first newline or 64 characters (which ever comes first)" }, "signatureInfo": { "description": "SignatureInfo contains a hint on the signer if the revision was signed with GPG, and signature verification is enabled.", @@ -8200,23 +7770,9 @@ "description": "Revision is the revision (Git) or chart version (Helm) which to sync the application to\nIf omitted, will use the revision specified in app spec.", "type": "string" }, - "revisions": { - "description": "Revisions is the list of revision (Git) or chart version (Helm) which to sync each source in sources field for the application to\nIf omitted, will use the revision specified in app spec.", - "type": "array", - "items": { - "type": "string" - } - }, "source": { "$ref": "#/definitions/v1alpha1ApplicationSource" }, - "sources": { - "type": "array", - "title": "Sources overrides the source definition set in the application.\nThis is typically set in a Rollback operation and is nil during a Sync operation", - "items": { - "$ref": "#/definitions/v1alpha1ApplicationSource" - } - }, "syncOptions": { "type": "array", "title": "SyncOptions provide per-sync sync-options, e.g. Validate=false", @@ -8262,22 +7818,8 @@ "type": "string", "title": "Revision holds the revision this sync operation was performed to" }, - "revisions": { - "type": "array", - "title": "Revisions holds the revision this sync operation was performed for respective indexed source in sources field", - "items": { - "type": "string" - } - }, "source": { "$ref": "#/definitions/v1alpha1ApplicationSource" - }, - "sources": { - "type": "array", - "title": "Source records the application source information of the sync, used for comparing auto-sync", - "items": { - "$ref": "#/definitions/v1alpha1ApplicationSource" - } } } }, @@ -8288,9 +7830,6 @@ "automated": { "$ref": "#/definitions/v1alpha1SyncPolicyAutomated" }, - "managedNamespaceMetadata": { - "$ref": "#/definitions/v1alpha1ManagedNamespaceMetadata" - }, "retry": { "$ref": "#/definitions/v1alpha1RetryStrategy" }, @@ -8332,13 +7871,6 @@ "type": "string", "title": "Revision contains information about the revision the comparison has been performed to" }, - "revisions": { - "type": "array", - "title": "Revisions contains information about the revisions of multiple sources the comparison has been performed to", - "items": { - "type": "string" - } - }, "status": { "type": "string", "title": "Status is the sync state of the comparison" diff --git a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go index fa64a0f680940..d099308212f7f 100644 --- a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go +++ b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go @@ -39,24 +39,23 @@ import ( argosettings "github.com/argoproj/argo-cd/v2/util/settings" ) -// TODO: load this using Cobra. +// TODO: load this using Cobra. https://github.com/argoproj/argo-cd/issues/10157 func getSubmoduleEnabled() bool { return env.ParseBoolFromEnv(common.EnvGitSubmoduleEnabled, true) } func NewCommand() *cobra.Command { var ( - clientConfig clientcmd.ClientConfig - metricsAddr string - probeBindAddr string - webhookAddr string - enableLeaderElection bool - namespace string - argocdRepoServer string - policy string - debugLog bool - dryRun bool - enableProgressiveRollouts bool + clientConfig clientcmd.ClientConfig + metricsAddr string + probeBindAddr string + webhookAddr string + enableLeaderElection bool + namespace string + argocdRepoServer string + policy string + debugLog bool + dryRun bool ) scheme := runtime.NewScheme() _ = clientgoscheme.AddToScheme(scheme) @@ -90,7 +89,7 @@ func NewCommand() *cobra.Command { policyObj, exists := utils.Policies[policy] if !exists { - log.Info("Policy value can be: sync, create-only, create-update, create-delete") + log.Info("Policy value can be: sync, create-only, create-update") os.Exit(1) } @@ -169,16 +168,15 @@ func NewCommand() *cobra.Command { go func() { errors.CheckError(askPassServer.Run(askpass.SocketPath)) }() if err = (&controllers.ApplicationSetReconciler{ - Generators: topLevelGenerators, - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("applicationset-controller"), - Renderer: &utils.Render{}, - Policy: policyObj, - ArgoAppClientset: appSetConfig, - KubeClientset: k8sClient, - ArgoDB: argoCDDB, - EnableProgressiveRollouts: enableProgressiveRollouts, + Generators: topLevelGenerators, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Recorder: mgr.GetEventRecorderFor("applicationset-controller"), + Renderer: &utils.Render{}, + Policy: policyObj, + ArgoAppClientset: appSetConfig, + KubeClientset: k8sClient, + ArgoDB: argoCDDB, }).SetupWithManager(mgr); err != nil { log.Error(err, "unable to create controller", "controller", "ApplicationSet") os.Exit(1) @@ -197,17 +195,16 @@ func NewCommand() *cobra.Command { command.Flags().StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.") command.Flags().StringVar(&probeBindAddr, "probe-addr", ":8081", "The address the probe endpoint binds to.") command.Flags().StringVar(&webhookAddr, "webhook-addr", ":7000", "The address the webhook endpoint binds to.") - command.Flags().BoolVar(&enableLeaderElection, "enable-leader-election", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_LEADER_ELECTION", false), + command.Flags().BoolVar(&enableLeaderElection, "enable-leader-election", false, "Enable leader election for controller manager. "+ "Enabling this will ensure there is only one active controller manager.") - command.Flags().StringVar(&namespace, "namespace", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACE", ""), "Argo CD repo namespace (default: argocd)") - command.Flags().StringVar(&argocdRepoServer, "argocd-repo-server", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER", common.DefaultRepoServerAddr), "Argo CD repo server address") - command.Flags().StringVar(&policy, "policy", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_POLICY", "sync"), "Modify how application is synced between the generator and the cluster. Default is 'sync' (create & update & delete), options: 'create-only', 'create-update' (no deletion), 'create-delete' (no update)") - command.Flags().BoolVar(&debugLog, "debug", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG", false), "Print debug logs. Takes precedence over loglevel") - command.Flags().StringVar(&cmdutil.LogFormat, "logformat", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT", "text"), "Set the logging format. One of: text|json") - command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL", "info"), "Set the logging level. One of: debug|info|warn|error") - command.Flags().BoolVar(&dryRun, "dry-run", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_DRY_RUN", false), "Enable dry run mode") - command.Flags().BoolVar(&enableProgressiveRollouts, "enable-progressive-rollouts", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_PROGRESSIVE_ROLLOUTS", false), "Enable use of the experimental progressive rollouts feature.") + command.Flags().StringVar(&namespace, "namespace", "", "Argo CD repo namespace (default: argocd)") + command.Flags().StringVar(&argocdRepoServer, "argocd-repo-server", "argocd-repo-server:8081", "Argo CD repo server address") + command.Flags().StringVar(&policy, "policy", "sync", "Modify how application is synced between the generator and the cluster. Default is 'sync' (create & update & delete), options: 'create-only', 'create-update' (no deletion)") + command.Flags().BoolVar(&debugLog, "debug", false, "Print debug logs. Takes precedence over loglevel") + command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json") + command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") + command.Flags().BoolVar(&dryRun, "dry-run", false, "Enable dry run mode") return &command } diff --git a/cmd/argocd-server/commands/argocd_server.go b/cmd/argocd-server/commands/argocd_server.go index df417e71f5e3e..55827a67d99b0 100644 --- a/cmd/argocd-server/commands/argocd_server.go +++ b/cmd/argocd-server/commands/argocd_server.go @@ -71,7 +71,6 @@ func NewCommand() *cobra.Command { dexServerStrictTLS bool staticAssetsDir string applicationNamespaces []string - enableProxyExtension bool ) var command = &cobra.Command{ Use: cliName, @@ -185,7 +184,6 @@ func NewCommand() *cobra.Command { RedisClient: redisClient, StaticAssetsDir: staticAssetsDir, ApplicationNamespaces: applicationNamespaces, - EnableProxyExtension: enableProxyExtension, } stats.RegisterStackDumper() @@ -237,7 +235,6 @@ func NewCommand() *cobra.Command { command.Flags().BoolVar(&dexServerPlaintext, "dex-server-plaintext", env.ParseBoolFromEnv("ARGOCD_SERVER_DEX_SERVER_PLAINTEXT", false), "Use a plaintext client (non-TLS) to connect to dex server") 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") tlsConfigCustomizerSrc = tls.AddTLSFlagsToCmd(command) cacheSrc = servercache.AddCacheFlagsToCmd(command, func(client *redis.Client) { redisClient = client diff --git a/cmd/argocd/commands/account.go b/cmd/argocd/commands/account.go index 948687efb377e..33beaf840b2c2 100644 --- a/cmd/argocd/commands/account.go +++ b/cmd/argocd/commands/account.go @@ -44,7 +44,6 @@ func NewAccountCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command { command.AddCommand(NewAccountGenerateTokenCommand(clientOpts)) command.AddCommand(NewAccountGetCommand(clientOpts)) command.AddCommand(NewAccountDeleteTokenCommand(clientOpts)) - command.AddCommand(NewBcryptCmd()) return command } diff --git a/cmd/argocd/commands/admin/admin.go b/cmd/argocd/commands/admin/admin.go index 90bbe7e65241e..d7d27c0c62d7f 100644 --- a/cmd/argocd/commands/admin/admin.go +++ b/cmd/argocd/commands/admin/admin.go @@ -56,7 +56,6 @@ func NewAdminCommand() *cobra.Command { command.AddCommand(NewExportCommand()) command.AddCommand(NewDashboardCommand()) command.AddCommand(NewNotificationsCommand()) - command.AddCommand(NewInitialPasswordCommand()) command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json") command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") diff --git a/cmd/argocd/commands/admin/app.go b/cmd/argocd/commands/admin/app.go index e2e2103e75439..0fa8d3631fee8 100644 --- a/cmd/argocd/commands/admin/app.go +++ b/cmd/argocd/commands/admin/app.go @@ -292,11 +292,11 @@ func saveToFile(err error, outputFormat string, result reconcileResults, outputP switch outputFormat { case "yaml": if data, err = yaml.Marshal(result); err != nil { - return fmt.Errorf("error marshalling yaml: %w", err) + return err } case "json": if data, err = json.Marshal(result); err != nil { - return fmt.Errorf("error marshalling json: %w", err) + return err } default: return fmt.Errorf("format %s is not supported", outputFormat) @@ -401,12 +401,7 @@ func reconcileApplications( return nil, err } - sources := make([]v1alpha1.ApplicationSource, 0) - revisions := make([]string, 0) - sources = append(sources, app.Spec.GetSource()) - revisions = append(revisions, app.Spec.GetSource().TargetRevision) - - res := appStateManager.CompareAppState(&app, proj, revisions, sources, false, false, nil, false) + res := appStateManager.CompareAppState(&app, proj, app.Spec.Source.TargetRevision, app.Spec.Source, false, false, nil) items = append(items, appReconcileResult{ Name: app.Name, Conditions: app.Status.Conditions, diff --git a/cmd/argocd/commands/admin/app_test.go b/cmd/argocd/commands/admin/app_test.go index 0cad2485e6696..dbb0bd245915d 100644 --- a/cmd/argocd/commands/admin/app_test.go +++ b/cmd/argocd/commands/admin/app_test.go @@ -80,7 +80,6 @@ func TestGetReconcileResults_Refresh(t *testing.T) { Namespace: "default", }, Spec: v1alpha1.ApplicationSpec{ - Source: &v1alpha1.ApplicationSource{}, Project: "default", Destination: v1alpha1.ApplicationDestination{ Server: v1alpha1.KubernetesInternalAPIServerAddr, diff --git a/cmd/argocd/commands/admin/cluster.go b/cmd/argocd/commands/admin/cluster.go index ce59d5401c63b..291bc3964380e 100644 --- a/cmd/argocd/commands/admin/cluster.go +++ b/cmd/argocd/commands/admin/cluster.go @@ -221,11 +221,11 @@ func printStatsSummary(clusters []ClusterWithInfo) { func runClusterNamespacesCommand(ctx context.Context, clientConfig clientcmd.ClientConfig, action func(appClient *versioned.Clientset, argoDB db.ArgoDB, clusters map[string][]string) error) error { clientCfg, err := clientConfig.ClientConfig() if err != nil { - return fmt.Errorf("error while creating client config: %w", err) + return err } namespace, _, err := clientConfig.Namespace() if err != nil { - return fmt.Errorf("error while getting namespace from client config: %w", err) + return err } kubeClient := kubernetes.NewForConfigOrDie(clientCfg) @@ -235,16 +235,17 @@ func runClusterNamespacesCommand(ctx context.Context, clientConfig clientcmd.Cli argoDB := db.NewDB(namespace, settingsMgr, kubeClient) clustersList, err := argoDB.ListClusters(ctx) if err != nil { - return fmt.Errorf("error listing clusters: %w", err) + return err } appItems, err := appClient.ArgoprojV1alpha1().Applications(namespace).List(ctx, v1.ListOptions{}) if err != nil { - return fmt.Errorf("error listing application: %w", err) + return err } apps := appItems.Items for i, app := range apps { - if err := argo.ValidateDestination(ctx, &app.Spec.Destination, argoDB); err != nil { - return fmt.Errorf("error validating application destination: %w", err) + err := argo.ValidateDestination(ctx, &app.Spec.Destination, argoDB) + if err != nil { + return err } apps[i] = app } @@ -265,7 +266,9 @@ func runClusterNamespacesCommand(ctx context.Context, clientConfig clientcmd.Cli } } } else { - nsSet[app.Spec.Destination.Namespace] = true + if app.Spec.Destination.Server == cluster.Server { + nsSet[app.Spec.Destination.Namespace] = true + } } } var namespaces []string @@ -346,14 +349,15 @@ func NewClusterEnableNamespacedMode() *cobra.Command { cluster, err := argoDB.GetCluster(ctx, server) if err != nil { - return fmt.Errorf("error getting cluster from server: %w", err) + return err } cluster.Namespaces = namespaces cluster.ClusterResources = clusterResources fmt.Printf("Setting cluster %s namespaces to %v...", server, namespaces) if !dryRun { - if _, err = argoDB.UpdateCluster(ctx, cluster); err != nil { - return fmt.Errorf("error updating cluster: %w", err) + _, err = argoDB.UpdateCluster(ctx, cluster) + if err != nil { + return err } fmt.Println("done") } else { @@ -401,7 +405,7 @@ func NewClusterDisableNamespacedMode() *cobra.Command { cluster, err := argoDB.GetCluster(ctx, server) if err != nil { - return fmt.Errorf("error getting cluster from server: %w", err) + return err } if len(cluster.Namespaces) == 0 { @@ -411,8 +415,9 @@ func NewClusterDisableNamespacedMode() *cobra.Command { cluster.Namespaces = nil fmt.Printf("Disabling namespaced mode for cluster %s...", server) if !dryRun { - if _, err = argoDB.UpdateCluster(ctx, cluster); err != nil { - return fmt.Errorf("error updating cluster: %w", err) + _, err = argoDB.UpdateCluster(ctx, cluster) + if err != nil { + return err } fmt.Println("done") } else { diff --git a/cmd/argocd/commands/admin/generatespec_utils.go b/cmd/argocd/commands/admin/generatespec_utils.go index 1a7eb8c99a694..d5d8b7c8444c2 100644 --- a/cmd/argocd/commands/admin/generatespec_utils.go +++ b/cmd/argocd/commands/admin/generatespec_utils.go @@ -43,7 +43,7 @@ func PrintResources(output string, out io.Writer, resources ...interface{}) erro } filteredResource, err := omitFields(resource) if err != nil { - return fmt.Errorf("error omitting filtered fields from the resource: %w", err) + return err } resources[i] = filteredResource } @@ -56,14 +56,14 @@ func PrintResources(output string, out io.Writer, resources ...interface{}) erro case "json": jsonBytes, err := json.MarshalIndent(obj, "", " ") if err != nil { - return fmt.Errorf("error marshaling json: %w", err) + return err } _, _ = fmt.Fprintln(out, string(jsonBytes)) case "yaml": yamlBytes, err := yaml.Marshal(obj) if err != nil { - return fmt.Errorf("error marshaling yaml: %w", err) + return err } // marshaled YAML already ends with the new line character _, _ = fmt.Fprint(out, string(yamlBytes)) diff --git a/cmd/argocd/commands/admin/initial_password.go b/cmd/argocd/commands/admin/initial_password.go deleted file mode 100644 index a130ee875ae60..0000000000000 --- a/cmd/argocd/commands/admin/initial_password.go +++ /dev/null @@ -1,46 +0,0 @@ -package admin - -import ( - "context" - "fmt" - - "github.com/spf13/cobra" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/clientcmd" - - "github.com/argoproj/argo-cd/v2/util/cli" - "github.com/argoproj/argo-cd/v2/util/errors" -) - -const initialPasswordSecretName = "argocd-initial-admin-secret" - -// NewInitialPasswordCommand defines a new command to retrieve Argo CD initial password. -func NewInitialPasswordCommand() *cobra.Command { - var ( - clientConfig clientcmd.ClientConfig - ) - var command = cobra.Command{ - Use: "initial-password", - Short: "Prints initial password to log in to Argo CD for the first time", - Run: func(c *cobra.Command, args []string) { - - config, err := clientConfig.ClientConfig() - errors.CheckError(err) - namespace, _, err := clientConfig.Namespace() - errors.CheckError(err) - - kubeClientset := kubernetes.NewForConfigOrDie(config) - secret, err := kubeClientset.CoreV1().Secrets(namespace).Get(context.Background(), initialPasswordSecretName, v1.GetOptions{}) - errors.CheckError(err) - - if initialPass, ok := secret.Data["password"]; ok { - fmt.Println(string(initialPass)) - fmt.Println("\n This password must be only used for first time login. We strongly recommend you update the password using `argocd account update-password`.") - } - }, - } - clientConfig = cli.AddKubectlFlagsToCmd(&command) - - return &command -} diff --git a/cmd/argocd/commands/admin/project.go b/cmd/argocd/commands/admin/project.go index 1364607cebfa8..f45831ba73f9a 100644 --- a/cmd/argocd/commands/admin/project.go +++ b/cmd/argocd/commands/admin/project.go @@ -106,13 +106,13 @@ func saveProject(ctx context.Context, updated v1alpha1.AppProject, orig v1alpha1 errors.CheckError(err) live, err := kube.ToUnstructured(&orig) if err != nil { - return fmt.Errorf("error converting project to unstructured: %w", err) + return err } _ = cli.PrintDiff(updated.Name, target, live) if !dryRun { _, err = projectsIf.Update(ctx, &updated, v1.UpdateOptions{}) if err != nil { - return fmt.Errorf("error while updating project: %w", err) + return err } } return nil @@ -188,7 +188,7 @@ func NewUpdatePolicyRuleCommand() *cobra.Command { func updateProjects(ctx context.Context, projIf appclient.AppProjectInterface, projectGlob string, rolePattern string, action string, modification func(string, string) string, dryRun bool) error { projects, err := projIf.List(ctx, v1.ListOptions{}) if err != nil { - return fmt.Errorf("error listing the projects: %w", err) + return err } for _, proj := range projects.Items { if !globMatch(projectGlob, proj.Name) { @@ -225,7 +225,7 @@ func updateProjects(ctx context.Context, projIf appclient.AppProjectInterface, p if updated { err = saveProject(ctx, proj, *origProj, projIf, dryRun) if err != nil { - return fmt.Errorf("error saving the project: %w", err) + return err } } } diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index b2a4c6f13933b..5d4a83e1e938b 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -150,7 +150,7 @@ func NewApplicationCreateCommand(clientOpts *argocdclient.ClientOptions) *cobra. c.HelpFunc()(c, args) os.Exit(1) } - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } if appNamespace != "" { @@ -294,7 +294,7 @@ func NewApplicationGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Com }) errors.CheckError(err) - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } @@ -440,16 +440,15 @@ func NewApplicationLogsCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co } func printAppSummaryTable(app *argoappv1.Application, appURL string, windows *argoappv1.SyncWindows) { - source := app.Spec.GetSource() fmt.Printf(printOpFmtStr, "Name:", app.QualifiedName()) fmt.Printf(printOpFmtStr, "Project:", app.Spec.GetProject()) fmt.Printf(printOpFmtStr, "Server:", getServer(app)) fmt.Printf(printOpFmtStr, "Namespace:", app.Spec.Destination.Namespace) fmt.Printf(printOpFmtStr, "URL:", appURL) - fmt.Printf(printOpFmtStr, "Repo:", source.RepoURL) - fmt.Printf(printOpFmtStr, "Target:", source.TargetRevision) - fmt.Printf(printOpFmtStr, "Path:", source.Path) - printAppSourceDetails(&source) + fmt.Printf(printOpFmtStr, "Repo:", app.Spec.Source.RepoURL) + fmt.Printf(printOpFmtStr, "Target:", app.Spec.Source.TargetRevision) + fmt.Printf(printOpFmtStr, "Path:", app.Spec.Source.Path) + printAppSourceDetails(&app.Spec.Source) var wds []string var status string var allow, deny, inactiveAllows bool @@ -503,11 +502,11 @@ func printAppSummaryTable(app *argoappv1.Application, appURL string, windows *ar syncStatusStr := string(app.Status.Sync.Status) switch app.Status.Sync.Status { case argoappv1.SyncStatusCodeSynced: - syncStatusStr += fmt.Sprintf(" to %s", app.Spec.GetSource().TargetRevision) + syncStatusStr += fmt.Sprintf(" to %s", app.Spec.Source.TargetRevision) case argoappv1.SyncStatusCodeOutOfSync: - syncStatusStr += fmt.Sprintf(" from %s", app.Spec.GetSource().TargetRevision) + syncStatusStr += fmt.Sprintf(" from %s", app.Spec.Source.TargetRevision) } - if !git.IsCommitSHA(app.Spec.GetSource().TargetRevision) && !git.IsTruncatedCommitSHA(app.Spec.GetSource().TargetRevision) && len(app.Status.Sync.Revision) > 7 { + if !git.IsCommitSHA(app.Spec.Source.TargetRevision) && !git.IsTruncatedCommitSHA(app.Spec.Source.TargetRevision) && len(app.Status.Sync.Revision) > 7 { syncStatusStr += fmt.Sprintf(" (%s)", app.Status.Sync.Revision[0:7]) } fmt.Printf(printOpFmtStr, "Sync Status:", syncStatusStr) @@ -576,8 +575,8 @@ func truncateString(str string, num int) string { // printParams prints parameters and overrides func printParams(app *argoappv1.Application) { - if app.Spec.GetSource().Helm != nil { - printHelmParams(app.Spec.GetSource().Helm) + if app.Spec.Source.Helm != nil { + printHelmParams(app.Spec.Source.Helm) } } @@ -625,7 +624,7 @@ func NewApplicationSetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Com app, err := appIf.Get(ctx, &applicationpkg.ApplicationQuery{Name: &appName, AppNamespace: &appNs}) errors.CheckError(err) - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } @@ -693,12 +692,11 @@ func NewApplicationUnsetCommand(clientOpts *argocdclient.ClientOptions) *cobra.C app, err := appIf.Get(ctx, &applicationpkg.ApplicationQuery{Name: &appName, AppNamespace: &appNs}) errors.CheckError(err) - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } - source := app.Spec.GetSource() - updated, nothingToUnset := unset(&source, opts) + updated, nothingToUnset := unset(&app.Spec.Source, opts) if nothingToUnset { c.HelpFunc()(c, args) os.Exit(1) @@ -844,19 +842,18 @@ func getLocalObjects(ctx context.Context, app *argoappv1.Application, local, loc func getLocalObjectsString(ctx context.Context, app *argoappv1.Application, local, localRepoRoot, appLabelKey, kubeVersion string, apiVersions []string, kustomizeOptions *argoappv1.KustomizeOptions, configManagementPlugins []*argoappv1.ConfigManagementPlugin, trackingMethod string) []string { - source := app.Spec.GetSource() - res, err := repository.GenerateManifests(ctx, local, localRepoRoot, source.TargetRevision, &repoapiclient.ManifestRequest{ - Repo: &argoappv1.Repository{Repo: source.RepoURL}, + res, err := repository.GenerateManifests(ctx, local, localRepoRoot, app.Spec.Source.TargetRevision, &repoapiclient.ManifestRequest{ + Repo: &argoappv1.Repository{Repo: app.Spec.Source.RepoURL}, AppLabelKey: appLabelKey, AppName: app.Name, Namespace: app.Spec.Destination.Namespace, - ApplicationSource: &source, + ApplicationSource: &app.Spec.Source, KustomizeOptions: kustomizeOptions, KubeVersion: kubeVersion, ApiVersions: apiVersions, Plugins: configManagementPlugins, TrackingMethod: trackingMethod, - }, true, &git.NoopCredsStore{}, resource.MustParse("0"), nil) + }, true, &git.NoopCredsStore{}, resource.MustParse("0")) errors.CheckError(err) return res.Manifests @@ -933,7 +930,7 @@ func NewApplicationDiffCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co }) errors.CheckError(err) - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } @@ -1250,7 +1247,7 @@ func printApplicationTable(apps []argoappv1.Application, output *string) { formatConditionsSummary(app), } if *output == "wide" { - vals = append(vals, app.Spec.GetSource().RepoURL, app.Spec.GetSource().Path, app.Spec.GetSource().TargetRevision) + vals = append(vals, app.Spec.Source.RepoURL, app.Spec.Source.Path, app.Spec.Source.TargetRevision) } _, _ = fmt.Fprintf(w, fmtStr, vals...) } @@ -1303,7 +1300,7 @@ func NewApplicationListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co } var appsWithDeprecatedPlugins []string for _, app := range appList { - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { appsWithDeprecatedPlugins = append(appsWithDeprecatedPlugins, app.Name) } } @@ -1376,7 +1373,6 @@ const ( resourceFieldCount = 3 resourceFieldNamespaceDelimiter = "/" resourceFieldNameWithNamespaceCount = 2 - resourceExcludeIndicator = "!" ) // resource is GROUP:KIND:NAMESPACE/NAME or GROUP:KIND:NAME @@ -1401,12 +1397,6 @@ func parseSelectedResources(resources []string) ([]*argoappv1.SyncOperationResou } for _, resource := range resources { - isExcluded := false - // check if the resource flag starts with a '!' - if strings.HasPrefix(resource, resourceExcludeIndicator) { - resource = strings.TrimPrefix(resource, resourceExcludeIndicator) - isExcluded = true - } fields := strings.Split(resource, resourceFieldDelimiter) if len(fields) != resourceFieldCount { return nil, fmt.Errorf("Resource should have GROUP%sKIND%sNAME, but instead got: %s", resourceFieldDelimiter, resourceFieldDelimiter, resource) @@ -1420,7 +1410,6 @@ func parseSelectedResources(resources []string) ([]*argoappv1.SyncOperationResou Kind: fields[1], Name: name, Namespace: namespace, - Exclude: isExcluded, }) } return selectedResources, nil @@ -1455,16 +1444,6 @@ func NewApplicationWaitCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co # Wait for multiple apps argocd app wait my-app other-app - # Wait for apps by resource - # Resource should be formatted as GROUP:KIND:NAME. If no GROUP is specified then :KIND:NAME. - argocd app wait my-app --resource :Service:my-service - argocd app wait my-app --resource argoproj.io:Rollout:my-rollout - argocd app wait my-app --resource '!apps:Deployment:my-service' - argocd app wait my-app --resource apps:Deployment:my-service --resource :Service:my-service - argocd app wait my-app --resource '!*:Service:*' - # Specify namespace if the application has resources with the same name in different namespaces - argocd app wait my-app --resource argoproj.io:Rollout:my-namespace/my-rollout - # Wait for apps by label, in this example we waiting for apps that are children of another app (aka app-of-apps) argocd app wait -l app.kubernetes.io/instance=my-app argocd app wait -l app.kubernetes.io/instance!=my-app @@ -1503,7 +1482,7 @@ func NewApplicationWaitCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co command.Flags().BoolVar(&watch.suspended, "suspended", false, "Wait for suspended") command.Flags().BoolVar(&watch.degraded, "degraded", false, "Wait for degraded") command.Flags().StringVarP(&selector, "selector", "l", "", "Wait for apps by label. Supports '=', '==', '!=', in, notin, exists & not exists. Matching apps must satisfy all of the specified label constraints.") - command.Flags().StringArrayVar(&resources, "resource", []string{}, fmt.Sprintf("Sync only specific resources as GROUP%[1]sKIND%[1]sNAME or %[2]sGROUP%[1]sKIND%[1]sNAME. Fields may be blank and '*' can be used. This option may be specified repeatedly", resourceFieldDelimiter, resourceExcludeIndicator)) + command.Flags().StringArrayVar(&resources, "resource", []string{}, fmt.Sprintf("Sync only specific resources as GROUP%sKIND%sNAME. Fields may be blank. This option may be specified repeatedly", resourceFieldDelimiter, resourceFieldDelimiter)) command.Flags().BoolVar(&watch.operation, "operation", false, "Wait for pending operations") command.Flags().UintVar(&timeout, "timeout", defaultCheckTimeoutSeconds, "Time out after this many seconds") return command @@ -1563,9 +1542,6 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co # Resource should be formatted as GROUP:KIND:NAME. If no GROUP is specified then :KIND:NAME argocd app sync my-app --resource :Service:my-service argocd app sync my-app --resource argoproj.io:Rollout:my-rollout - argocd app sync my-app --resource '!apps:Deployment:my-service' - argocd app sync my-app --resource apps:Deployment:my-service --resource :Service:my-service - argocd app sync my-app --resource '!*:Service:*' # Specify namespace if the application has resources with the same name in different namespaces argocd app sync my-app --resource argoproj.io:Rollout:my-namespace/my-rollout`, Run: func(c *cobra.Command, args []string) { @@ -1649,28 +1625,14 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co var localObjsStrings []string diffOption := &DifferenceOption{} - - app, err := appIf.Get(ctx, &applicationpkg.ApplicationQuery{ - Name: &appName, - AppNamespace: &appNs, - }) - errors.CheckError(err) - - if app.Spec.HasMultipleSources() { - log.Fatal("argocd cli does not work on multi-source app") - return - } - - // filters out only those resources that needs to be synced - filteredResources := filterAppResources(app, selectedResources) - - // if resources are provided and no app resources match, then return error - if len(resources) > 0 && len(filteredResources) == 0 { - log.Fatalf("No matching app resources found for resource filter: %v", strings.Join(resources, ", ")) - } - if local != "" { - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + app, err := appIf.Get(ctx, &applicationpkg.ApplicationQuery{ + Name: &appName, + AppNamespace: &appNs, + }) + errors.CheckError(err) + + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } @@ -1719,7 +1681,7 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co AppNamespace: &appNs, DryRun: &dryRun, Revision: &revision, - Resources: filteredResources, + Resources: selectedResources, Prune: &prune, Manifests: localObjsStrings, Infos: getInfos(infos), @@ -1747,7 +1709,13 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co } } if diffChanges { - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + app, err := appIf.Get(ctx, &applicationpkg.ApplicationQuery{ + Name: &appName, + AppNamespace: &appNs, + }) + errors.CheckError(err) + + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } @@ -1799,7 +1767,7 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co command.Flags().BoolVar(&dryRun, "dry-run", false, "Preview apply without affecting cluster") command.Flags().BoolVar(&prune, "prune", false, "Allow deleting unexpected resources") command.Flags().StringVar(&revision, "revision", "", "Sync to a specific revision. Preserves parameter overrides") - command.Flags().StringArrayVar(&resources, "resource", []string{}, fmt.Sprintf("Sync only specific resources as GROUP%[1]sKIND%[1]sNAME or %[2]sGROUP%[1]sKIND%[1]sNAME. Fields may be blank and '*' can be used. This option may be specified repeatedly", resourceFieldDelimiter, resourceExcludeIndicator)) + command.Flags().StringArrayVar(&resources, "resource", []string{}, fmt.Sprintf("Sync only specific resources as GROUP%sKIND%sNAME. Fields may be blank. This option may be specified repeatedly", resourceFieldDelimiter, resourceFieldDelimiter)) command.Flags().StringVarP(&selector, "selector", "l", "", "Sync apps that match this label. Supports '=', '==', '!=', in, notin, exists & not exists. Matching apps must satisfy all of the specified label constraints.") command.Flags().StringArrayVar(&labels, "label", []string{}, "Sync only specific resources with a label. This option may be specified repeatedly.") command.Flags().UintVar(&timeout, "timeout", defaultCheckTimeoutSeconds, "Time out after this many seconds") @@ -1924,9 +1892,15 @@ func getResourceStates(app *argoappv1.Application, selectedResources []*argoappv } // filter out not selected resources if len(selectedResources) > 0 { + r := []argoappv1.SyncOperationResource{} + for _, res := range selectedResources { + if res != nil { + r = append(r, *res) + } + } for i := len(states) - 1; i >= 0; i-- { res := states[i] - if !argo.IncludeResource(res.Name, res.Namespace, schema.GroupVersionKind{Group: res.Group, Kind: res.Kind}, selectedResources) { + if !argo.ContainsSyncResource(res.Name, res.Namespace, schema.GroupVersionKind{Group: res.Group, Kind: res.Kind}, r) { states = append(states[:i], states[i+1:]...) } } @@ -1934,26 +1908,6 @@ func getResourceStates(app *argoappv1.Application, selectedResources []*argoappv return states } -// filterAppResources selects the app resources that match atleast one of the resource filters. -func filterAppResources(app *argoappv1.Application, selectedResources []*argoappv1.SyncOperationResource) []*argoappv1.SyncOperationResource { - var filteredResources []*argoappv1.SyncOperationResource - if app != nil && len(selectedResources) > 0 { - for i := range app.Status.Resources { - appResource := app.Status.Resources[i] - if (argo.IncludeResource(appResource.Name, appResource.Namespace, - schema.GroupVersionKind{Group: appResource.Group, Kind: appResource.Kind}, selectedResources)) { - filteredResources = append(filteredResources, &argoappv1.SyncOperationResource{ - Group: appResource.Group, - Kind: appResource.Kind, - Name: appResource.Name, - Namespace: appResource.Namespace, - }) - } - } - } - return filteredResources -} - func groupResourceStates(app *argoappv1.Application, selectedResources []*argoappv1.SyncOperationResource) map[string]*resourceState { resStates := make(map[string]*resourceState) for _, result := range getResourceStates(app, selectedResources) { @@ -2133,9 +2087,8 @@ func setParameterOverrides(app *argoappv1.Application, parameters []string) { if len(parameters) == 0 { return } - source := app.Spec.GetSource() var sourceType argoappv1.ApplicationSourceType - if st, _ := source.ExplicitType(); st != nil { + if st, _ := app.Spec.Source.ExplicitType(); st != nil { sourceType = *st } else if app.Status.SourceType != "" { sourceType = app.Status.SourceType @@ -2147,8 +2100,8 @@ func setParameterOverrides(app *argoappv1.Application, parameters []string) { switch sourceType { case argoappv1.ApplicationSourceTypeHelm: - if source.Helm == nil { - source.Helm = &argoappv1.ApplicationSourceHelm{} + if app.Spec.Source.Helm == nil { + app.Spec.Source.Helm = &argoappv1.ApplicationSourceHelm{} } for _, p := range parameters { newParam, err := argoappv1.NewHelmParameter(p, false) @@ -2156,7 +2109,7 @@ func setParameterOverrides(app *argoappv1.Application, parameters []string) { log.Error(err) continue } - source.Helm.AddParameter(*newParam) + app.Spec.Source.Helm.AddParameter(*newParam) } default: log.Fatalf("Parameters can only be set against Helm applications") @@ -2208,7 +2161,7 @@ func NewApplicationHistoryCommand(clientOpts *argocdclient.ClientOptions) *cobra }) errors.CheckError(err) - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } @@ -2272,7 +2225,7 @@ func NewApplicationRollbackCommand(clientOpts *argocdclient.ClientOptions) *cobr }) errors.CheckError(err) - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } @@ -2359,7 +2312,7 @@ func NewApplicationManifestsCommand(clientOpts *argocdclient.ClientOptions) *cob app, err := appIf.Get(context.Background(), &applicationpkg.ApplicationQuery{Name: &appName}) errors.CheckError(err) - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } @@ -2462,7 +2415,7 @@ func NewApplicationEditCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co }) errors.CheckError(err) - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.Warnf(argocommon.ConfigMapPluginCLIDeprecationWarning) } @@ -2474,12 +2427,12 @@ func NewApplicationEditCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co cli.InteractiveEdit(fmt.Sprintf("%s-*-edit.yaml", appName), appData, func(input []byte) error { input, err = yaml.YAMLToJSON(input) if err != nil { - return fmt.Errorf("error converting YAML to JSON: %w", err) + return err } updatedSpec := argoappv1.ApplicationSpec{} err = json.Unmarshal(input, &updatedSpec) if err != nil { - return fmt.Errorf("error unmarshaling input into application spec: %w", err) + return err } var appOpts cmdutil.AppOptions @@ -2491,9 +2444,9 @@ func NewApplicationEditCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co AppNamespace: &appNs, }) if err != nil { - return fmt.Errorf("failed to update application spec: %w", err) + return fmt.Errorf("Failed to update application spec:\n%v", err) } - return nil + return err }) }, } diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go index 104495cb541d0..1d3d3d6134ac4 100644 --- a/cmd/argocd/commands/app_test.go +++ b/cmd/argocd/commands/app_test.go @@ -498,7 +498,7 @@ func TestPrintAppSummaryTable(t *testing.T) { }, Project: "default", Destination: v1alpha1.ApplicationDestination{Server: "local", Namespace: "argocd"}, - Source: &v1alpha1.ApplicationSource{ + Source: v1alpha1.ApplicationSource{ RepoURL: "test", TargetRevision: "master", Path: "/test", @@ -604,7 +604,7 @@ func TestPrintParams(t *testing.T) { output, _ := captureOutput(func() error { app := &v1alpha1.Application{ Spec: v1alpha1.ApplicationSpec{ - Source: &v1alpha1.ApplicationSource{ + Source: v1alpha1.ApplicationSource{ Helm: &v1alpha1.ApplicationSourceHelm{ Parameters: []v1alpha1.HelmParameter{ { @@ -904,220 +904,11 @@ func Test_unset_nothingToUnset(t *testing.T) { } } -func TestFilterAppResources(t *testing.T) { - // App resources - var ( - appReplicaSet1 = v1alpha1.ResourceStatus{ - Group: "apps", - Kind: "ReplicaSet", - Namespace: "default", - Name: "replicaSet-name1", - } - appReplicaSet2 = v1alpha1.ResourceStatus{ - Group: "apps", - Kind: "ReplicaSet", - Namespace: "default", - Name: "replicaSet-name2", - } - appJob = v1alpha1.ResourceStatus{ - Group: "batch", - Kind: "Job", - Namespace: "default", - Name: "job-name", - } - appService1 = v1alpha1.ResourceStatus{ - Group: "", - Kind: "Service", - Namespace: "default", - Name: "service-name1", - } - appService2 = v1alpha1.ResourceStatus{ - Group: "", - Kind: "Service", - Namespace: "default", - Name: "service-name2", - } - appDeployment = v1alpha1.ResourceStatus{ - Group: "apps", - Kind: "Deployment", - Namespace: "default", - Name: "deployment-name", - } - ) - app := v1alpha1.Application{ - Status: v1alpha1.ApplicationStatus{ - Resources: []v1alpha1.ResourceStatus{ - appReplicaSet1, appReplicaSet2, appJob, appService1, appService2, appDeployment}, - }, - } - // Resource filters - var ( - blankValues = argoappv1.SyncOperationResource{ - Group: "", - Kind: "", - Name: "", - Namespace: "", - Exclude: false} - // *:*:* - includeAllResources = argoappv1.SyncOperationResource{ - Group: "*", - Kind: "*", - Name: "*", - Namespace: "", - Exclude: false} - // !*:*:* - excludeAllResources = argoappv1.SyncOperationResource{ - Group: "*", - Kind: "*", - Name: "*", - Namespace: "", - Exclude: true} - // *:Service:* - includeAllServiceResources = argoappv1.SyncOperationResource{ - Group: "*", - Kind: "Service", - Name: "*", - Namespace: "", - Exclude: false} - // !*:Service:* - excludeAllServiceResources = argoappv1.SyncOperationResource{ - Group: "*", - Kind: "Service", - Name: "*", - Namespace: "", - Exclude: true} - // apps:ReplicaSet:replicaSet-name1 - includeReplicaSet1Resource = argoappv1.SyncOperationResource{ - Group: "apps", - Kind: "ReplicaSet", - Name: "replicaSet-name1", - Namespace: "", - Exclude: false} - // !apps:ReplicaSet:replicaSet-name2 - excludeReplicaSet2Resource = argoappv1.SyncOperationResource{ - Group: "apps", - Kind: "ReplicaSet", - Name: "replicaSet-name2", - Namespace: "", - Exclude: true} - ) - - // Filtered resources - var ( - replicaSet1 = v1alpha1.SyncOperationResource{ - Group: "apps", - Kind: "ReplicaSet", - Namespace: "default", - Name: "replicaSet-name1", - } - replicaSet2 = v1alpha1.SyncOperationResource{ - Group: "apps", - Kind: "ReplicaSet", - Namespace: "default", - Name: "replicaSet-name2", - } - job = v1alpha1.SyncOperationResource{ - Group: "batch", - Kind: "Job", - Namespace: "default", - Name: "job-name", - } - service1 = v1alpha1.SyncOperationResource{ - Group: "", - Kind: "Service", - Namespace: "default", - Name: "service-name1", - } - service2 = v1alpha1.SyncOperationResource{ - Group: "", - Kind: "Service", - Namespace: "default", - Name: "service-name2", - } - deployment = v1alpha1.SyncOperationResource{ - Group: "apps", - Kind: "Deployment", - Namespace: "default", - Name: "deployment-name", - } - ) - tests := []struct { - testName string - selectedResources []*argoappv1.SyncOperationResource - expectedResult []*argoappv1.SyncOperationResource - }{ - //--resource apps:ReplicaSet:replicaSet-name1 --resource *:Service:* - {testName: "Include ReplicaSet replicaSet-name1 resouce and all service resources", - selectedResources: []*argoappv1.SyncOperationResource{&includeAllServiceResources, &includeReplicaSet1Resource}, - expectedResult: []*argoappv1.SyncOperationResource{&replicaSet1, &service1, &service2}, - }, - //--resource apps:ReplicaSet:replicaSet-name1 --resource !*:Service:* - {testName: "Include ReplicaSet replicaSet-name1 resouce and exclude all service resources", - selectedResources: []*argoappv1.SyncOperationResource{&excludeAllServiceResources, &includeReplicaSet1Resource}, - expectedResult: []*argoappv1.SyncOperationResource{&replicaSet1, &replicaSet2, &job, &deployment}, - }, - // --resource !apps:ReplicaSet:replicaSet-name2 --resource !*:Service:* - {testName: "Exclude ReplicaSet replicaSet-name2 resouce and all service resources", - selectedResources: []*argoappv1.SyncOperationResource{&excludeReplicaSet2Resource, &excludeAllServiceResources}, - expectedResult: []*argoappv1.SyncOperationResource{&replicaSet1, &replicaSet2, &job, &service1, &service2, &deployment}, - }, - // --resource !apps:ReplicaSet:replicaSet-name2 - {testName: "Exclude ReplicaSet replicaSet-name2 resouce", - selectedResources: []*argoappv1.SyncOperationResource{&excludeReplicaSet2Resource}, - expectedResult: []*argoappv1.SyncOperationResource{&replicaSet1, &job, &service1, &service2, &deployment}, - }, - // --resource apps:ReplicaSet:replicaSet-name1 - {testName: "Include ReplicaSet replicaSet-name1 resouce", - selectedResources: []*argoappv1.SyncOperationResource{&includeReplicaSet1Resource}, - expectedResult: []*argoappv1.SyncOperationResource{&replicaSet1}, - }, - // --resource !*:Service:* - {testName: "Exclude Service resouces", - selectedResources: []*argoappv1.SyncOperationResource{&excludeAllServiceResources}, - expectedResult: []*argoappv1.SyncOperationResource{&replicaSet1, &replicaSet2, &job, &deployment}, - }, - // --resource *:Service:* - {testName: "Include Service resouces", - selectedResources: []*argoappv1.SyncOperationResource{&includeAllServiceResources}, - expectedResult: []*argoappv1.SyncOperationResource{&service1, &service2}, - }, - // --resource !*:*:* - {testName: "Exclude all resouces", - selectedResources: []*argoappv1.SyncOperationResource{&excludeAllResources}, - expectedResult: nil, - }, - // --resource *:*:* - {testName: "Include all resouces", - selectedResources: []*argoappv1.SyncOperationResource{&includeAllResources}, - expectedResult: []*argoappv1.SyncOperationResource{&replicaSet1, &replicaSet2, &job, &service1, &service2, &deployment}, - }, - {testName: "No Filters", - selectedResources: []*argoappv1.SyncOperationResource{&blankValues}, - expectedResult: nil, - }, - {testName: "Empty Filter", - selectedResources: []*argoappv1.SyncOperationResource{}, - expectedResult: nil, - }, - } - - for _, test := range tests { - t.Run(test.testName, func(t *testing.T) { - filteredResources := filterAppResources(&app, test.selectedResources) - assert.Equal(t, test.expectedResult, filteredResources) - }) - } -} - func TestParseSelectedResources(t *testing.T) { - resources := []string{"v1alpha:Application:test", - "v1alpha:Application:namespace/test", - "!v1alpha:Application:test", - "apps:Deployment:default/test", - "!*:*:*"} + resources := []string{"v1alpha:Application:test", "v1alpha:Application:namespace/test"} operationResources, err := parseSelectedResources(resources) assert.NoError(t, err) - assert.Len(t, operationResources, 5) + assert.Len(t, operationResources, 2) assert.Equal(t, *operationResources[0], v1alpha1.SyncOperationResource{ Namespace: "", Name: "test", @@ -1130,27 +921,6 @@ func TestParseSelectedResources(t *testing.T) { Kind: "Application", Group: "v1alpha", }) - assert.Equal(t, *operationResources[2], v1alpha1.SyncOperationResource{ - Namespace: "", - Name: "test", - Kind: "Application", - Group: "v1alpha", - Exclude: true, - }) - assert.Equal(t, *operationResources[3], v1alpha1.SyncOperationResource{ - Namespace: "default", - Name: "test", - Kind: "Deployment", - Group: "apps", - Exclude: false, - }) - assert.Equal(t, *operationResources[4], v1alpha1.SyncOperationResource{ - Namespace: "", - Name: "*", - Kind: "*", - Group: "*", - Exclude: true, - }) } func TestParseSelectedResourcesIncorrect(t *testing.T) { @@ -1215,7 +985,7 @@ func TestPrintApplicationTableWide(t *testing.T) { Server: "http://localhost:8080", Namespace: "default", }, - Source: &v1alpha1.ApplicationSource{ + Source: v1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps", Path: "guestbook", TargetRevision: "123", @@ -1491,7 +1261,7 @@ func testApp(name, project string, labels map[string]string, annotations map[str Finalizers: finalizers, }, Spec: argoappv1.ApplicationSpec{ - Source: &argoappv1.ApplicationSource{ + Source: argoappv1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", }, Project: project, diff --git a/cmd/argocd/commands/applicationset.go b/cmd/argocd/commands/applicationset.go index 678d5699b9d19..5fa3809fe95d5 100644 --- a/cmd/argocd/commands/applicationset.go +++ b/cmd/argocd/commands/applicationset.go @@ -95,7 +95,7 @@ func NewApplicationSetGetCommand(clientOpts *argocdclient.ClientOptions) *cobra. fmt.Println() } if showParams { - printHelmParams(appSet.Spec.Template.Spec.GetSource().Helm) + printHelmParams(appSet.Spec.Template.Spec.Source.Helm) } default: errors.CheckError(fmt.Errorf("unknown output format: %s", output)) @@ -317,7 +317,7 @@ func printApplicationSetTable(apps []arogappsetv1.ApplicationSet, output *string conditions, } if *output == "wide" { - vals = append(vals, app.Spec.Template.Spec.GetSource().RepoURL, app.Spec.Template.Spec.GetSource().Path, app.Spec.Template.Spec.GetSource().TargetRevision) + vals = append(vals, app.Spec.Template.Spec.Source.RepoURL, app.Spec.Template.Spec.Source.Path, app.Spec.Template.Spec.Source.TargetRevision) } _, _ = fmt.Fprintf(w, fmtStr, vals...) } @@ -333,15 +333,14 @@ func getServerForAppSet(appSet *arogappsetv1.ApplicationSet) string { } func printAppSetSummaryTable(appSet *arogappsetv1.ApplicationSet) { - source := appSet.Spec.Template.Spec.GetSource() fmt.Printf(printOpFmtStr, "Name:", appSet.Name) fmt.Printf(printOpFmtStr, "Project:", appSet.Spec.Template.Spec.GetProject()) fmt.Printf(printOpFmtStr, "Server:", getServerForAppSet(appSet)) fmt.Printf(printOpFmtStr, "Namespace:", appSet.Spec.Template.Spec.Destination.Namespace) - fmt.Printf(printOpFmtStr, "Repo:", source.RepoURL) - fmt.Printf(printOpFmtStr, "Target:", source.TargetRevision) - fmt.Printf(printOpFmtStr, "Path:", source.Path) - printAppSourceDetails(&source) + fmt.Printf(printOpFmtStr, "Repo:", appSet.Spec.Template.Spec.Source.RepoURL) + fmt.Printf(printOpFmtStr, "Target:", appSet.Spec.Template.Spec.Source.TargetRevision) + fmt.Printf(printOpFmtStr, "Path:", appSet.Spec.Template.Spec.Source.Path) + printAppSourceDetails(&appSet.Spec.Template.Spec.Source) var syncPolicy string if appSet.Spec.SyncPolicy != nil && appSet.Spec.Template.Spec.SyncPolicy.Automated != nil { diff --git a/cmd/argocd/commands/bcrypt.go b/cmd/argocd/commands/bcrypt.go deleted file mode 100644 index 2aaf94fe9450d..0000000000000 --- a/cmd/argocd/commands/bcrypt.go +++ /dev/null @@ -1,36 +0,0 @@ -package commands - -import ( - "fmt" - "log" - - "github.com/spf13/cobra" - "golang.org/x/crypto/bcrypt" -) - -// bcryptCmd represents the bcrypt command -func NewBcryptCmd() *cobra.Command { - var ( - password string - ) - var bcryptCmd = &cobra.Command{ - Use: "bcrypt", - Short: "Generate bcrypt hash for the admin password", - Run: func(cmd *cobra.Command, args []string) { - bytePassword := []byte(password) - // Hashing the password - hash, err := bcrypt.GenerateFromPassword(bytePassword, bcrypt.DefaultCost) - if err != nil { - log.Fatalf("Failed to genarate bcrypt hash: %v", err) - } - fmt.Fprint(cmd.OutOrStdout(), string(hash)) - }, - } - - bcryptCmd.Flags().StringVar(&password, "password", "", "Password for which bcrypt hash is generated") - err := bcryptCmd.MarkFlagRequired("password") - if err != nil { - return nil - } - return bcryptCmd -} diff --git a/cmd/argocd/commands/bcrypt_test.go b/cmd/argocd/commands/bcrypt_test.go deleted file mode 100644 index c5949977a1425..0000000000000 --- a/cmd/argocd/commands/bcrypt_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package commands - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/assert" - "golang.org/x/crypto/bcrypt" -) - -func TestGeneratePassword(t *testing.T) { - bcryptCmd := NewBcryptCmd() - bcryptCmd.SetArgs([]string{"--password", "abc"}) - output := new(bytes.Buffer) - bcryptCmd.SetOutput(output) - err := bcryptCmd.Execute() - if err != nil { - return - } - err = bcrypt.CompareHashAndPassword(output.Bytes(), []byte("abc")) - assert.NoError(t, err) -} diff --git a/cmd/argocd/commands/cluster.go b/cmd/argocd/commands/cluster.go index fa8a50d05c25f..ef37ec25aa211 100644 --- a/cmd/argocd/commands/cluster.go +++ b/cmd/argocd/commands/cluster.go @@ -27,17 +27,6 @@ import ( "github.com/argoproj/argo-cd/v2/util/text/label" ) -const ( - // type of the cluster ID is 'name' - clusterIdTypeName = "name" - // cluster field is 'name' - clusterFieldName = "name" - // cluster field is 'namespaces' - clusterFieldNamespaces = "namespaces" - // indicates managing all namespaces - allNamespaces = "*" -) - // NewClusterCommand returns a new instance of an `argocd cluster` command func NewClusterCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clientcmd.PathOptions) *cobra.Command { var command = &cobra.Command{ @@ -58,10 +47,7 @@ func NewClusterCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clientc # Remove a target cluster context from ArgoCD argocd cluster rm example-cluster - - # Set a target cluster context from ArgoCD - argocd cluster set CLUSTER_NAME --name new-cluster-name --namespace '*' - argocd cluster set CLUSTER_NAME --name new-cluster-name --namespace namespace-one --namespace namespace-two`, +`, } command.AddCommand(NewClusterAddCommand(clientOpts, pathOpts)) @@ -69,7 +55,6 @@ func NewClusterCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clientc command.AddCommand(NewClusterListCommand(clientOpts)) command.AddCommand(NewClusterRemoveCommand(clientOpts, pathOpts)) command.AddCommand(NewClusterRotateAuthCommand(clientOpts)) - command.AddCommand(NewClusterSetCommand(clientOpts)) return command } @@ -200,72 +185,6 @@ func getRestConfig(pathOpts *clientcmd.PathOptions, ctxName string) (*rest.Confi return conf, nil } -// NewClusterSetCommand returns a new instance of an `argocd cluster set` command -func NewClusterSetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command { - var ( - clusterOptions cmdutil.ClusterOptions - clusterName string - ) - var command = &cobra.Command{ - Use: "set NAME", - Short: "Set cluster information", - Example: ` # Set cluster information - argocd cluster set CLUSTER_NAME --name new-cluster-name --namespace '*' - argocd cluster set CLUSTER_NAME --name new-cluster-name --namespace namespace-one --namespace namespace-two`, - Run: func(c *cobra.Command, args []string) { - ctx := c.Context() - if len(args) != 1 { - c.HelpFunc()(c, args) - os.Exit(1) - } - // name of the cluster whose fields have to be updated. - clusterName = args[0] - conn, clusterIf := headless.NewClientOrDie(clientOpts, c).NewClusterClientOrDie() - defer io.Close(conn) - // checks the fields that needs to be updated - updatedFields := checkFieldsToUpdate(clusterOptions) - namespaces := clusterOptions.Namespaces - // check if all namespaces have to be considered - if len(namespaces) == 1 && strings.EqualFold(namespaces[0], allNamespaces) { - namespaces[0] = "" - } - if updatedFields != nil { - clusterUpdateRequest := clusterpkg.ClusterUpdateRequest{ - Cluster: &argoappv1.Cluster{ - Name: clusterOptions.Name, - Namespaces: namespaces, - }, - UpdatedFields: updatedFields, - Id: &clusterpkg.ClusterID{ - Type: clusterIdTypeName, - Value: clusterName, - }, - } - _, err := clusterIf.Update(ctx, &clusterUpdateRequest) - errors.CheckError(err) - fmt.Printf("Cluster '%s' updated.\n", clusterName) - } else { - fmt.Print("Specify the cluster field to be updated.\n") - } - }, - } - command.Flags().StringVar(&clusterOptions.Name, "name", "", "Overwrite the cluster name") - command.Flags().StringArrayVar(&clusterOptions.Namespaces, "namespace", nil, "List of namespaces which are allowed to manage. Specify '*' to manage all namespaces") - return command -} - -// checkFieldsToUpdate returns the fields that needs to be updated -func checkFieldsToUpdate(clusterOptions cmdutil.ClusterOptions) []string { - var updatedFields []string - if clusterOptions.Name != "" { - updatedFields = append(updatedFields, clusterFieldName) - } - if clusterOptions.Namespaces != nil { - updatedFields = append(updatedFields, clusterFieldNamespaces) - } - return updatedFields -} - // NewClusterGetCommand returns a new instance of an `argocd cluster get` command func NewClusterGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command { var ( diff --git a/cmd/argocd/commands/common.go b/cmd/argocd/commands/common.go index b7529f768a69a..e88c033fe0b9a 100644 --- a/cmd/argocd/commands/common.go +++ b/cmd/argocd/commands/common.go @@ -22,13 +22,13 @@ func PrintResource(resource interface{}, output string) error { case "json": jsonBytes, err := json.MarshalIndent(resource, "", " ") if err != nil { - return fmt.Errorf("unable to marshal resource to json: %w", err) + return err } fmt.Println(string(jsonBytes)) case "yaml": yamlBytes, err := yaml.Marshal(resource) if err != nil { - return fmt.Errorf("unable to marshal resource to yaml: %w", err) + return err } fmt.Print(string(yamlBytes)) default: @@ -56,13 +56,13 @@ func PrintResourceList(resources interface{}, output string, single bool) error case "json": jsonBytes, err := json.MarshalIndent(resources, "", " ") if err != nil { - return fmt.Errorf("unable to marshal resources to json: %w", err) + return err } fmt.Println(string(jsonBytes)) case "yaml": yamlBytes, err := yaml.Marshal(resources) if err != nil { - return fmt.Errorf("unable to marshal resources to yaml: %w", err) + return err } fmt.Print(string(yamlBytes)) default: diff --git a/cmd/argocd/commands/completion.go b/cmd/argocd/commands/completion.go index 5e587283375ac..3a698146f4e1c 100644 --- a/cmd/argocd/commands/completion.go +++ b/cmd/argocd/commands/completion.go @@ -146,7 +146,6 @@ __argocd_custom_func() { ;; argocd_cluster_get | \ argocd_cluster_rm | \ - argocd_cluster_set | \ argocd_login | \ argocd_cluster_add) __argocd_list_servers diff --git a/cmd/argocd/commands/headless/headless.go b/cmd/argocd/commands/headless/headless.go index ba72cd5bd2072..5b9a715c1d20b 100644 --- a/cmd/argocd/commands/headless/headless.go +++ b/cmd/argocd/commands/headless/headless.go @@ -202,18 +202,17 @@ func StartLocalServer(ctx context.Context, clientOpts *apiclient.ClientOptions, } appstateCache := appstatecache.NewCache(cache.NewCache(&forwardCacheClient{namespace: namespace, context: ctxStr}), 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}, - 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, + Insecure: true, + ListenHost: *address, + RepoClientset: &forwardRepoClientset{namespace: namespace, context: ctxStr}, }) srv.Init(ctx) diff --git a/cmd/argocd/commands/login.go b/cmd/argocd/commands/login.go index 2fc2ce3b32199..92c24b787cd39 100644 --- a/cmd/argocd/commands/login.go +++ b/cmd/argocd/commands/login.go @@ -12,7 +12,7 @@ import ( "strings" "time" - "github.com/coreos/go-oidc/v3/oidc" + "github.com/coreos/go-oidc" "github.com/golang-jwt/jwt/v4" log "github.com/sirupsen/logrus" "github.com/skratchdot/open-golang/open" diff --git a/cmd/argocd/commands/project.go b/cmd/argocd/commands/project.go index be29249613f4c..785fa5aa24c69 100644 --- a/cmd/argocd/commands/project.go +++ b/cmd/argocd/commands/project.go @@ -863,23 +863,23 @@ func NewProjectEditCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comman cli.InteractiveEdit(fmt.Sprintf("%s-*-edit.yaml", projName), projData, func(input []byte) error { input, err = yaml.YAMLToJSON(input) if err != nil { - return fmt.Errorf("error converting YAML to JSON: %w", err) + return err } updatedSpec := v1alpha1.AppProjectSpec{} err = json.Unmarshal(input, &updatedSpec) if err != nil { - return fmt.Errorf("error unmarshaling input into application spec: %w", err) + return err } proj, err := projIf.Get(ctx, &projectpkg.ProjectQuery{Name: projName}) if err != nil { - return fmt.Errorf("could not get project by project name: %w", err) + return err } proj.Spec = updatedSpec _, err = projIf.Update(ctx, &projectpkg.ProjectUpdateRequest{Project: proj}) if err != nil { - return fmt.Errorf("failed to update project:\n%w", err) + return fmt.Errorf("Failed to update project:\n%v", err) } - return nil + return err }) }, } diff --git a/cmd/argocd/commands/relogin.go b/cmd/argocd/commands/relogin.go index b4c1ef7fe9b81..bb1e9e20ed06e 100644 --- a/cmd/argocd/commands/relogin.go +++ b/cmd/argocd/commands/relogin.go @@ -4,7 +4,7 @@ import ( "fmt" "os" - "github.com/coreos/go-oidc/v3/oidc" + "github.com/coreos/go-oidc" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" diff --git a/cmd/argocd/commands/repo.go b/cmd/argocd/commands/repo.go index 1a540951c2231..4332a24a73c90 100644 --- a/cmd/argocd/commands/repo.go +++ b/cmd/argocd/commands/repo.go @@ -70,9 +70,6 @@ func NewRepoAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command { # Add a private Git repository on GitHub Enterprise via GitHub App argocd repo add https://ghe.example.com/repos/repo --github-app-id 1 --github-app-installation-id 2 --github-app-private-key-path test.private-key.pem --github-app-enterprise-base-url https://ghe.example.com/api/v3 - - # Add a private Git repository on Google Cloud Sources via GCP service account credentials - argocd repo add https://source.developers.google.com/p/my-google-cloud-project/r/my-repo --gcp-service-account-key-path service-account-key.json ` var command = &cobra.Command{ @@ -138,17 +135,6 @@ func NewRepoAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command { } } - if repoOpts.GCPServiceAccountKeyPath != "" { - if git.IsHTTPSURL(repoOpts.Repo.Repo) { - gcpServiceAccountKey, err := os.ReadFile(repoOpts.GCPServiceAccountKeyPath) - errors.CheckError(err) - repoOpts.Repo.GCPServiceAccountKey = string(gcpServiceAccountKey) - } else { - err := fmt.Errorf("--gcp-service-account-key-path is only supported for HTTPS repositories") - errors.CheckError(err) - } - } - // Set repository connection properties only when creating repository, not // when creating repository credentials. // InsecureIgnoreHostKey is deprecated and only here for backwards compat @@ -198,7 +184,6 @@ func NewRepoAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command { GithubAppEnterpriseBaseUrl: repoOpts.Repo.GitHubAppEnterpriseBaseURL, Proxy: repoOpts.Proxy, Project: repoOpts.Repo.Project, - GcpServiceAccountKey: repoOpts.Repo.GCPServiceAccountKey, } _, err := repoIf.ValidateAccess(ctx, &repoAccessReq) errors.CheckError(err) diff --git a/cmd/argocd/commands/repocreds.go b/cmd/argocd/commands/repocreds.go index 43b2e6f191570..bfc4aa50679f0 100644 --- a/cmd/argocd/commands/repocreds.go +++ b/cmd/argocd/commands/repocreds.go @@ -39,13 +39,12 @@ func NewRepoCredsCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command // NewRepoCredsAddCommand returns a new instance of an `argocd repocreds add` command func NewRepoCredsAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command { var ( - repo appsv1.RepoCreds - upsert bool - sshPrivateKeyPath string - tlsClientCertPath string - tlsClientCertKeyPath string - githubAppPrivateKeyPath string - gcpServiceAccountKeyPath string + repo appsv1.RepoCreds + upsert bool + sshPrivateKeyPath string + tlsClientCertPath string + tlsClientCertKeyPath string + githubAppPrivateKeyPath string ) // For better readability and easier formatting @@ -63,9 +62,6 @@ func NewRepoCredsAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comma # Add credentials with helm oci registry so that these oci registry urls do not need to be added as repos individually. argocd repocreds add localhost:5000/myrepo --enable-oci --type helm - - # Add credentials with GCP credentials for all repositories under https://source.developers.google.com/p/my-google-cloud-project/r/ - argocd repocreds add https://source.developers.google.com/p/my-google-cloud-project/r/ --gcp-service-account-key-path service-account-key.json ` var command = &cobra.Command{ @@ -131,18 +127,6 @@ func NewRepoCredsAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comma } } - // Specifying gcpServiceAccountKeyPath is only valid for HTTPS repositories - if gcpServiceAccountKeyPath != "" { - if git.IsHTTPSURL(repo.URL) { - gcpServiceAccountKey, err := os.ReadFile(gcpServiceAccountKeyPath) - errors.CheckError(err) - repo.GCPServiceAccountKey = string(gcpServiceAccountKey) - } else { - err := fmt.Errorf("--gcp-service-account-key-path is only supported for HTTPS repositories") - errors.CheckError(err) - } - } - conn, repoIf := headless.NewClientOrDie(clientOpts, c).NewRepoCredsClientOrDie() defer io.Close(conn) @@ -174,7 +158,6 @@ func NewRepoCredsAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comma command.Flags().BoolVar(&upsert, "upsert", false, "Override an existing repository with the same name even if the spec differs") command.Flags().BoolVar(&repo.EnableOCI, "enable-oci", false, "Specifies whether helm-oci support should be enabled for this repo") command.Flags().StringVar(&repo.Type, "type", common.DefaultRepoType, "type of the repository, \"git\" or \"helm\"") - command.Flags().StringVar(&gcpServiceAccountKeyPath, "gcp-service-account-key-path", "", "service account key for the Google Cloud Platform") return command } diff --git a/cmd/argocd/commands/root.go b/cmd/argocd/commands/root.go index 91ffde5997b3a..8c397e8ee6cfa 100644 --- a/cmd/argocd/commands/root.go +++ b/cmd/argocd/commands/root.go @@ -41,7 +41,7 @@ func NewCommand() *cobra.Command { } command.AddCommand(NewCompletionCommand()) - command.AddCommand(initialize.InitCommand(NewVersionCmd(&clientOpts, nil))) + command.AddCommand(initialize.InitCommand(NewVersionCmd(&clientOpts))) command.AddCommand(initialize.InitCommand(NewClusterCommand(&clientOpts, pathOpts))) command.AddCommand(initialize.InitCommand(NewApplicationCommand(&clientOpts))) command.AddCommand(initialize.InitCommand(NewAppSetCommand(&clientOpts))) diff --git a/cmd/argocd/commands/version.go b/cmd/argocd/commands/version.go index 8f3d5b1abfe11..595599933622d 100644 --- a/cmd/argocd/commands/version.go +++ b/cmd/argocd/commands/version.go @@ -17,7 +17,7 @@ import ( ) // NewVersionCmd returns a new `version` command to be used as a sub-command to root -func NewVersionCmd(clientOpts *argocdclient.ClientOptions, serverVersion *version.VersionMessage) *cobra.Command { +func NewVersionCmd(clientOpts *argocdclient.ClientOptions) *cobra.Command { var ( short bool client bool @@ -54,12 +54,7 @@ func NewVersionCmd(clientOpts *argocdclient.ClientOptions, serverVersion *versio } if !client { - var sv *version.VersionMessage - if serverVersion == nil { - sv = getServerVersion(ctx, clientOpts, cmd) - } else { - sv = serverVersion - } + sv := getServerVersion(ctx, clientOpts, cmd) if short { v["server"] = map[string]string{"argocd-server": sv.Version} @@ -73,13 +68,8 @@ func NewVersionCmd(clientOpts *argocdclient.ClientOptions, serverVersion *versio case "wide", "short", "": fmt.Fprint(cmd.OutOrStdout(), printClientVersion(&cv, short || (output == "short"))) if !client { - var sv *version.VersionMessage - if serverVersion == nil { - sv = getServerVersion(ctx, clientOpts, cmd) - } else { - sv = serverVersion - } - fmt.Fprint(cmd.OutOrStdout(), printServerVersion(sv, short || (output == "short"))) + sv := getServerVersion(ctx, clientOpts, cmd) + printServerVersion(sv, short || (output == "short")) } default: log.Fatalf("unknown output format: %s", output) @@ -119,45 +109,44 @@ func printClientVersion(version *common.Version, short bool) string { return output } -func printServerVersion(version *version.VersionMessage, short bool) string { - output := fmt.Sprintf("%s: %s\n", "argocd-server", version.Version) +func printServerVersion(version *version.VersionMessage, short bool) { + fmt.Printf("%s: %s\n", "argocd-server", version.Version) if short { - return output + return } if version.BuildDate != "" { - output += fmt.Sprintf(" BuildDate: %s\n", version.BuildDate) + fmt.Printf(" BuildDate: %s\n", version.BuildDate) } if version.GitCommit != "" { - output += fmt.Sprintf(" GitCommit: %s\n", version.GitCommit) + fmt.Printf(" GitCommit: %s\n", version.GitCommit) } if version.GitTreeState != "" { - output += fmt.Sprintf(" GitTreeState: %s\n", version.GitTreeState) + fmt.Printf(" GitTreeState: %s\n", version.GitTreeState) } if version.GitTag != "" { - output += fmt.Sprintf(" GitTag: %s\n", version.GitTag) + fmt.Printf(" GitTag: %s\n", version.GitTag) } if version.GoVersion != "" { - output += fmt.Sprintf(" GoVersion: %s\n", version.GoVersion) + fmt.Printf(" GoVersion: %s\n", version.GoVersion) } if version.Compiler != "" { - output += fmt.Sprintf(" Compiler: %s\n", version.Compiler) + fmt.Printf(" Compiler: %s\n", version.Compiler) } if version.Platform != "" { - output += fmt.Sprintf(" Platform: %s\n", version.Platform) + fmt.Printf(" Platform: %s\n", version.Platform) } if version.KustomizeVersion != "" { - output += fmt.Sprintf(" Kustomize Version: %s\n", version.KustomizeVersion) + fmt.Printf(" Kustomize Version: %s\n", version.KustomizeVersion) } if version.HelmVersion != "" { - output += fmt.Sprintf(" Helm Version: %s\n", version.HelmVersion) + fmt.Printf(" Helm Version: %s\n", version.HelmVersion) } if version.KubectlVersion != "" { - output += fmt.Sprintf(" Kubectl Version: %s\n", version.KubectlVersion) + fmt.Printf(" Kubectl Version: %s\n", version.KubectlVersion) } if version.JsonnetVersion != "" { - output += fmt.Sprintf(" Jsonnet Version: %s\n", version.JsonnetVersion) + fmt.Printf(" Jsonnet Version: %s\n", version.JsonnetVersion) } - return output } diff --git a/cmd/argocd/commands/version_test.go b/cmd/argocd/commands/version_test.go index 88aa689b48669..26a2d549362f4 100644 --- a/cmd/argocd/commands/version_test.go +++ b/cmd/argocd/commands/version_test.go @@ -5,13 +5,12 @@ import ( "testing" argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient" - "github.com/argoproj/argo-cd/v2/pkg/apiclient/version" "github.com/stretchr/testify/assert" ) -func TestShortVersionClient(t *testing.T) { +func TestShortVersion(t *testing.T) { buf := new(bytes.Buffer) - cmd := NewVersionCmd(&argocdclient.ClientOptions{}, nil) + cmd := NewVersionCmd(&argocdclient.ClientOptions{}) cmd.SetOutput(buf) cmd.SetArgs([]string{"version", "--short", "--client"}) err := cmd.Execute() @@ -21,17 +20,3 @@ func TestShortVersionClient(t *testing.T) { output := buf.String() assert.Equal(t, output, "argocd: v99.99.99+unknown\n") } - -func TestShortVersion(t *testing.T) { - serverVersion := &version.VersionMessage{Version: "v99.99.99+unknown"} - buf := new(bytes.Buffer) - cmd := NewVersionCmd(&argocdclient.ClientOptions{}, serverVersion) - cmd.SetOutput(buf) - cmd.SetArgs([]string{"argocd", "version", "--short"}) - err := cmd.Execute() - if err != nil { - t.Fatal("Failed to execute short version command") - } - output := buf.String() - assert.Equal(t, output, "argocd: v99.99.99+unknown\nargocd-server: v99.99.99+unknown\n") -} diff --git a/cmd/util/app.go b/cmd/util/app.go index e80950533b054..baa7238665c12 100644 --- a/cmd/util/app.go +++ b/cmd/util/app.go @@ -138,26 +138,22 @@ func SetAppSpecOptions(flags *pflag.FlagSet, spec *argoappv1.ApplicationSpec, ap } flags.Visit(func(f *pflag.Flag) { visited++ - source := spec.GetSourcePtr() - if source == nil { - source = &argoappv1.ApplicationSource{} - } switch f.Name { case "repo": - source.RepoURL = appOpts.repoURL + spec.Source.RepoURL = appOpts.repoURL case "path": - source.Path = appOpts.appPath + spec.Source.Path = appOpts.appPath case "helm-chart": - source.Chart = appOpts.chart + spec.Source.Chart = appOpts.chart case "revision": - source.TargetRevision = appOpts.revision + spec.Source.TargetRevision = appOpts.revision case "revision-history-limit": i := int64(appOpts.revisionHistoryLimit) spec.RevisionHistoryLimit = &i case "values": - setHelmOpt(source, helmOpts{valueFiles: appOpts.valuesFiles}) + setHelmOpt(&spec.Source, helmOpts{valueFiles: appOpts.valuesFiles}) case "ignore-missing-value-files": - setHelmOpt(source, helmOpts{ignoreMissingValueFiles: appOpts.ignoreMissingValueFiles}) + setHelmOpt(&spec.Source, helmOpts{ignoreMissingValueFiles: appOpts.ignoreMissingValueFiles}) case "values-literal-file": var data []byte @@ -169,41 +165,41 @@ func SetAppSpecOptions(flags *pflag.FlagSet, spec *argoappv1.ApplicationSpec, ap data, err = config.ReadRemoteFile(appOpts.values) } errors.CheckError(err) - setHelmOpt(source, helmOpts{values: string(data)}) + setHelmOpt(&spec.Source, helmOpts{values: string(data)}) case "release-name": - setHelmOpt(source, helmOpts{releaseName: appOpts.releaseName}) + setHelmOpt(&spec.Source, helmOpts{releaseName: appOpts.releaseName}) case "helm-version": - setHelmOpt(source, helmOpts{version: appOpts.helmVersion}) + setHelmOpt(&spec.Source, helmOpts{version: appOpts.helmVersion}) case "helm-pass-credentials": - setHelmOpt(source, helmOpts{passCredentials: appOpts.helmPassCredentials}) + setHelmOpt(&spec.Source, helmOpts{passCredentials: appOpts.helmPassCredentials}) case "helm-set": - setHelmOpt(source, helmOpts{helmSets: appOpts.helmSets}) + setHelmOpt(&spec.Source, helmOpts{helmSets: appOpts.helmSets}) case "helm-set-string": - setHelmOpt(source, helmOpts{helmSetStrings: appOpts.helmSetStrings}) + setHelmOpt(&spec.Source, helmOpts{helmSetStrings: appOpts.helmSetStrings}) case "helm-set-file": - setHelmOpt(source, helmOpts{helmSetFiles: appOpts.helmSetFiles}) + setHelmOpt(&spec.Source, helmOpts{helmSetFiles: appOpts.helmSetFiles}) case "helm-skip-crds": - setHelmOpt(source, helmOpts{skipCrds: appOpts.helmSkipCrds}) + setHelmOpt(&spec.Source, helmOpts{skipCrds: appOpts.helmSkipCrds}) case "directory-recurse": - if source.Directory != nil { - source.Directory.Recurse = appOpts.directoryRecurse + if spec.Source.Directory != nil { + spec.Source.Directory.Recurse = appOpts.directoryRecurse } else { - source.Directory = &argoappv1.ApplicationSourceDirectory{Recurse: appOpts.directoryRecurse} + spec.Source.Directory = &argoappv1.ApplicationSourceDirectory{Recurse: appOpts.directoryRecurse} } case "directory-exclude": - if source.Directory != nil { - source.Directory.Exclude = appOpts.directoryExclude + if spec.Source.Directory != nil { + spec.Source.Directory.Exclude = appOpts.directoryExclude } else { - source.Directory = &argoappv1.ApplicationSourceDirectory{Exclude: appOpts.directoryExclude} + spec.Source.Directory = &argoappv1.ApplicationSourceDirectory{Exclude: appOpts.directoryExclude} } case "directory-include": - if source.Directory != nil { - source.Directory.Include = appOpts.directoryInclude + if spec.Source.Directory != nil { + spec.Source.Directory.Include = appOpts.directoryInclude } else { - source.Directory = &argoappv1.ApplicationSourceDirectory{Include: appOpts.directoryInclude} + spec.Source.Directory = &argoappv1.ApplicationSourceDirectory{Include: appOpts.directoryInclude} } case "config-management-plugin": - source.Plugin = &argoappv1.ApplicationSourcePlugin{Name: appOpts.configManagementPlugin} + spec.Source.Plugin = &argoappv1.ApplicationSourcePlugin{Name: appOpts.configManagementPlugin} case "dest-name": spec.Destination.Name = appOpts.destName case "dest-server": @@ -213,37 +209,37 @@ func SetAppSpecOptions(flags *pflag.FlagSet, spec *argoappv1.ApplicationSpec, ap case "project": spec.Project = appOpts.project case "nameprefix": - setKustomizeOpt(source, kustomizeOpts{namePrefix: appOpts.namePrefix}) + setKustomizeOpt(&spec.Source, kustomizeOpts{namePrefix: appOpts.namePrefix}) case "namesuffix": - setKustomizeOpt(source, kustomizeOpts{nameSuffix: appOpts.nameSuffix}) + setKustomizeOpt(&spec.Source, kustomizeOpts{nameSuffix: appOpts.nameSuffix}) case "kustomize-image": - setKustomizeOpt(source, kustomizeOpts{images: appOpts.kustomizeImages}) + setKustomizeOpt(&spec.Source, kustomizeOpts{images: appOpts.kustomizeImages}) case "kustomize-version": - setKustomizeOpt(source, kustomizeOpts{version: appOpts.kustomizeVersion}) + setKustomizeOpt(&spec.Source, kustomizeOpts{version: appOpts.kustomizeVersion}) case "kustomize-common-label": parsedLabels, err := label.Parse(appOpts.kustomizeCommonLabels) errors.CheckError(err) - setKustomizeOpt(source, kustomizeOpts{commonLabels: parsedLabels}) + setKustomizeOpt(&spec.Source, kustomizeOpts{commonLabels: parsedLabels}) case "kustomize-common-annotation": parsedAnnotations, err := label.Parse(appOpts.kustomizeCommonAnnotations) errors.CheckError(err) - setKustomizeOpt(source, kustomizeOpts{commonAnnotations: parsedAnnotations}) + setKustomizeOpt(&spec.Source, kustomizeOpts{commonAnnotations: parsedAnnotations}) case "kustomize-force-common-label": - setKustomizeOpt(source, kustomizeOpts{forceCommonLabels: appOpts.kustomizeForceCommonLabels}) + setKustomizeOpt(&spec.Source, kustomizeOpts{forceCommonLabels: appOpts.kustomizeForceCommonLabels}) case "kustomize-force-common-annotation": - setKustomizeOpt(source, kustomizeOpts{forceCommonAnnotations: appOpts.kustomizeForceCommonAnnotations}) + setKustomizeOpt(&spec.Source, kustomizeOpts{forceCommonAnnotations: appOpts.kustomizeForceCommonAnnotations}) case "jsonnet-tla-str": - setJsonnetOpt(source, appOpts.jsonnetTlaStr, false) + setJsonnetOpt(&spec.Source, appOpts.jsonnetTlaStr, false) case "jsonnet-tla-code": - setJsonnetOpt(source, appOpts.jsonnetTlaCode, true) + setJsonnetOpt(&spec.Source, appOpts.jsonnetTlaCode, true) case "jsonnet-ext-var-str": - setJsonnetOptExtVar(source, appOpts.jsonnetExtVarStr, false) + setJsonnetOptExtVar(&spec.Source, appOpts.jsonnetExtVarStr, false) case "jsonnet-ext-var-code": - setJsonnetOptExtVar(source, appOpts.jsonnetExtVarCode, true) + setJsonnetOptExtVar(&spec.Source, appOpts.jsonnetExtVarCode, true) case "jsonnet-libs": - setJsonnetOptLibs(source, appOpts.jsonnetLibs) + setJsonnetOptLibs(&spec.Source, appOpts.jsonnetLibs) case "plugin-env": - setPluginOptEnvs(source, appOpts.pluginEnvs) + setPluginOptEnvs(&spec.Source, appOpts.pluginEnvs) case "sync-policy": switch appOpts.syncPolicy { case "none": @@ -300,7 +296,6 @@ func SetAppSpecOptions(flags *pflag.FlagSet, spec *argoappv1.ApplicationSpec, ap log.Fatalf("Invalid sync-retry-limit [%d]", appOpts.retryLimit) } } - spec.Source = source }) if flags.Changed("auto-prune") { if spec.SyncPolicy == nil || spec.SyncPolicy.Automated == nil { @@ -478,9 +473,8 @@ func SetParameterOverrides(app *argoappv1.Application, parameters []string) { if len(parameters) == 0 { return } - source := app.Spec.GetSource() var sourceType argoappv1.ApplicationSourceType - if st, _ := source.ExplicitType(); st != nil { + if st, _ := app.Spec.Source.ExplicitType(); st != nil { sourceType = *st } else if app.Status.SourceType != "" { sourceType = app.Status.SourceType @@ -492,8 +486,8 @@ func SetParameterOverrides(app *argoappv1.Application, parameters []string) { switch sourceType { case argoappv1.ApplicationSourceTypeHelm: - if source.Helm == nil { - source.Helm = &argoappv1.ApplicationSourceHelm{} + if app.Spec.Source.Helm == nil { + app.Spec.Source.Helm = &argoappv1.ApplicationSourceHelm{} } for _, p := range parameters { newParam, err := argoappv1.NewHelmParameter(p, false) @@ -501,7 +495,7 @@ func SetParameterOverrides(app *argoappv1.Application, parameters []string) { log.Error(err) continue } - source.Helm.AddParameter(*newParam) + app.Spec.Source.Helm.AddParameter(*newParam) } default: log.Fatalf("Parameters can only be set against Helm applications") @@ -586,9 +580,6 @@ func constructAppsBaseOnName(appName string, labels, annotations, args []string, Name: appName, Namespace: appNs, }, - Spec: argoappv1.ApplicationSpec{ - Source: &argoappv1.ApplicationSource{}, - }, } SetAppSpecOptions(flags, &app.Spec, &appOpts) SetParameterOverrides(app, appOpts.Parameters) diff --git a/cmd/util/app_test.go b/cmd/util/app_test.go index 2e8ddc9e0fee7..cc59599c51fa5 100644 --- a/cmd/util/app_test.go +++ b/cmd/util/app_test.go @@ -149,9 +149,7 @@ func (f *appOptionsFixture) SetFlag(key, value string) error { func newAppOptionsFixture() *appOptionsFixture { fixture := &appOptionsFixture{ - spec: &v1alpha1.ApplicationSpec{ - Source: &v1alpha1.ApplicationSource{}, - }, + spec: &v1alpha1.ApplicationSpec{}, command: &cobra.Command{}, options: &AppOptions{}, } diff --git a/cmd/util/applicationset.go b/cmd/util/applicationset.go index 97e40cedcdac2..20c22f2cdbebf 100644 --- a/cmd/util/applicationset.go +++ b/cmd/util/applicationset.go @@ -40,7 +40,7 @@ func readAppsetFromURI(fileURL string, appset *[]*argoprojiov1alpha1.Application yml, err := readFilePayload() if err != nil { - return fmt.Errorf("error reading file payload: %w", err) + return err } return readAppset(yml, appset) @@ -49,18 +49,18 @@ func readAppsetFromURI(fileURL string, appset *[]*argoprojiov1alpha1.Application func readAppset(yml []byte, appsets *[]*argoprojiov1alpha1.ApplicationSet) error { yamls, err := kube.SplitYAMLToString(yml) if err != nil { - return fmt.Errorf("error splitting YAML to string: %w", err) + return err } for _, yml := range yamls { var appset argoprojiov1alpha1.ApplicationSet err = config.Unmarshal([]byte(yml), &appset) if err != nil { - return fmt.Errorf("error unmarshalling appset: %w", err) + return err } *appsets = append(*appsets, &appset) } - return fmt.Errorf("error reading app set: %w", err) + return err } diff --git a/cmd/util/project.go b/cmd/util/project.go index 12e875492baa9..ff6f6c60338a3 100644 --- a/cmd/util/project.go +++ b/cmd/util/project.go @@ -138,7 +138,7 @@ func readProjFromURI(fileURL string, proj *v1alpha1.AppProject) error { } else { err = config.UnmarshalRemoteFile(fileURL, &proj) } - return fmt.Errorf("error reading proj from uri: %w", err) + return err } func SetProjSpecOptions(flags *pflag.FlagSet, spec *v1alpha1.AppProjectSpec, projOpts *ProjectOpts) int { diff --git a/cmd/util/repo.go b/cmd/util/repo.go index 87023c3a97206..138891c369bfc 100644 --- a/cmd/util/repo.go +++ b/cmd/util/repo.go @@ -22,7 +22,6 @@ type RepoOptions struct { GithubAppPrivateKeyPath string GitHubAppEnterpriseBaseURL string Proxy string - GCPServiceAccountKeyPath string } func AddRepoFlags(command *cobra.Command, opts *RepoOptions) { @@ -43,5 +42,4 @@ func AddRepoFlags(command *cobra.Command, opts *RepoOptions) { command.Flags().StringVar(&opts.GithubAppPrivateKeyPath, "github-app-private-key-path", "", "private key of the GitHub Application") command.Flags().StringVar(&opts.GitHubAppEnterpriseBaseURL, "github-app-enterprise-base-url", "", "base url to use when using GitHub Enterprise (e.g. https://ghe.example.com/api/v3") command.Flags().StringVar(&opts.Proxy, "proxy", "", "use proxy to access repository") - command.Flags().StringVar(&opts.GCPServiceAccountKeyPath, "gcp-service-account-key-path", "", "service account key for the Google Cloud Platform") } diff --git a/cmpserver/apiclient/plugin.pb.go b/cmpserver/apiclient/plugin.pb.go index 4c08ac2511edc..ecc28da7c4b71 100644 --- a/cmpserver/apiclient/plugin.pb.go +++ b/cmpserver/apiclient/plugin.pb.go @@ -6,7 +6,6 @@ package apiclient import ( context "context" fmt "fmt" - apiclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -363,55 +362,6 @@ func (m *RepositoryResponse) GetIsSupported() bool { return false } -// ParametersAnnouncementResponse contains a list of announcements. This list represents all the parameters which a CMP -// is able to accept. -type ParametersAnnouncementResponse struct { - ParameterAnnouncements []*apiclient.ParameterAnnouncement `protobuf:"bytes,1,rep,name=parameterAnnouncements,proto3" json:"parameterAnnouncements,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ParametersAnnouncementResponse) Reset() { *m = ParametersAnnouncementResponse{} } -func (m *ParametersAnnouncementResponse) String() string { return proto.CompactTextString(m) } -func (*ParametersAnnouncementResponse) ProtoMessage() {} -func (*ParametersAnnouncementResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b21875a7079a06ed, []int{5} -} -func (m *ParametersAnnouncementResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ParametersAnnouncementResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ParametersAnnouncementResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ParametersAnnouncementResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ParametersAnnouncementResponse.Merge(m, src) -} -func (m *ParametersAnnouncementResponse) XXX_Size() int { - return m.Size() -} -func (m *ParametersAnnouncementResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ParametersAnnouncementResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ParametersAnnouncementResponse proto.InternalMessageInfo - -func (m *ParametersAnnouncementResponse) GetParameterAnnouncements() []*apiclient.ParameterAnnouncement { - if m != nil { - return m.ParameterAnnouncements - } - return nil -} - type File struct { Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -423,7 +373,7 @@ func (m *File) Reset() { *m = File{} } func (m *File) String() string { return proto.CompactTextString(m) } func (*File) ProtoMessage() {} func (*File) Descriptor() ([]byte, []int) { - return fileDescriptor_b21875a7079a06ed, []int{6} + return fileDescriptor_b21875a7079a06ed, []int{5} } func (m *File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -465,49 +415,44 @@ func init() { proto.RegisterType((*EnvEntry)(nil), "plugin.EnvEntry") proto.RegisterType((*ManifestResponse)(nil), "plugin.ManifestResponse") proto.RegisterType((*RepositoryResponse)(nil), "plugin.RepositoryResponse") - proto.RegisterType((*ParametersAnnouncementResponse)(nil), "plugin.ParametersAnnouncementResponse") proto.RegisterType((*File)(nil), "plugin.File") } func init() { proto.RegisterFile("cmpserver/plugin/plugin.proto", fileDescriptor_b21875a7079a06ed) } var fileDescriptor_b21875a7079a06ed = []byte{ - // 558 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x54, 0xc1, 0x6e, 0xd3, 0x4c, - 0x10, 0xae, 0x9b, 0xb4, 0x4d, 0x26, 0x95, 0xfe, 0x68, 0xf5, 0x0b, 0x4c, 0xd4, 0x86, 0xe0, 0x03, - 0xca, 0x85, 0x44, 0x32, 0x88, 0x1b, 0x12, 0x2d, 0x2a, 0xad, 0x40, 0x41, 0xd1, 0x96, 0x0b, 0xdc, - 0xb6, 0xce, 0x24, 0x59, 0x6a, 0xef, 0x2e, 0xeb, 0xb5, 0xa5, 0xc0, 0x85, 0xf7, 0xe0, 0x01, 0x78, - 0x15, 0x8e, 0x3c, 0x02, 0xca, 0x93, 0x20, 0xaf, 0xed, 0xd8, 0xa2, 0x6d, 0x38, 0x79, 0xe6, 0x9b, - 0x99, 0x6f, 0xbf, 0x9d, 0x99, 0x35, 0x1c, 0x07, 0x91, 0x8a, 0x51, 0xa7, 0xa8, 0xc7, 0x2a, 0x4c, - 0x16, 0x5c, 0x14, 0x9f, 0x91, 0xd2, 0xd2, 0x48, 0xb2, 0x9f, 0x7b, 0xbd, 0xb3, 0x05, 0x37, 0xcb, - 0xe4, 0x6a, 0x14, 0xc8, 0x68, 0xcc, 0xf4, 0x42, 0x2a, 0x2d, 0x3f, 0x59, 0xe3, 0x49, 0x30, 0x1b, - 0xa7, 0xfe, 0x58, 0xa3, 0x92, 0x05, 0x8d, 0x35, 0xb9, 0x91, 0x7a, 0x55, 0x33, 0x73, 0x3a, 0xef, - 0x9b, 0x03, 0xdd, 0x13, 0xa5, 0x2e, 0x8d, 0x46, 0x16, 0x51, 0xfc, 0x9c, 0x60, 0x6c, 0xc8, 0x0b, - 0x68, 0x45, 0x68, 0xd8, 0x8c, 0x19, 0xe6, 0x3a, 0x03, 0x67, 0xd8, 0xf1, 0x1f, 0x8e, 0x0a, 0x11, - 0x13, 0x26, 0xf8, 0x1c, 0x63, 0x53, 0xa4, 0x4e, 0x8a, 0xb4, 0x8b, 0x1d, 0xba, 0x29, 0x21, 0x1e, - 0x34, 0xe7, 0x3c, 0x44, 0x77, 0xd7, 0x96, 0x1e, 0x96, 0xa5, 0xaf, 0x79, 0x88, 0x17, 0x3b, 0xd4, - 0xc6, 0x4e, 0xdb, 0x70, 0xa0, 0x73, 0x0a, 0xef, 0x87, 0x03, 0xf7, 0xef, 0xa0, 0x25, 0x2e, 0x1c, - 0x30, 0xa5, 0xde, 0xb1, 0x08, 0xad, 0x90, 0x36, 0x2d, 0x5d, 0xd2, 0x07, 0x60, 0x4a, 0x51, 0x0c, - 0xa7, 0xcc, 0x2c, 0xed, 0x51, 0x6d, 0x5a, 0x43, 0x48, 0x0f, 0x5a, 0xc1, 0x12, 0x83, 0xeb, 0x38, - 0x89, 0xdc, 0x86, 0x8d, 0x6e, 0x7c, 0x42, 0xa0, 0x19, 0xf3, 0x2f, 0xe8, 0x36, 0x07, 0xce, 0xb0, - 0x41, 0xad, 0x4d, 0x3c, 0x68, 0xa0, 0x48, 0xdd, 0xbd, 0x41, 0x63, 0xd8, 0xf1, 0xbb, 0xa5, 0xe6, - 0x33, 0x91, 0x9e, 0x09, 0xa3, 0x57, 0x34, 0x0b, 0x7a, 0xcf, 0xa0, 0x55, 0x02, 0x19, 0x87, 0xa8, - 0x64, 0x59, 0x9b, 0xfc, 0x0f, 0x7b, 0x29, 0x0b, 0x13, 0x2c, 0xe4, 0xe4, 0x8e, 0x37, 0x85, 0x6e, - 0x75, 0xbd, 0x58, 0x49, 0x11, 0x23, 0x39, 0x82, 0x76, 0x54, 0x60, 0xb1, 0xeb, 0x0c, 0x1a, 0xc3, - 0x36, 0xad, 0x80, 0xec, 0x6e, 0xb1, 0x4c, 0x74, 0x80, 0xef, 0x57, 0xaa, 0x24, 0xab, 0x21, 0xde, - 0x73, 0x20, 0x74, 0x33, 0xc8, 0x0d, 0xe7, 0x00, 0x3a, 0x3c, 0xbe, 0x4c, 0x94, 0x92, 0xda, 0xe0, - 0xcc, 0x0a, 0x6b, 0xd1, 0x3a, 0xe4, 0x7d, 0x85, 0xfe, 0x94, 0x69, 0x16, 0xa1, 0x41, 0x1d, 0x9f, - 0x08, 0x21, 0x13, 0x11, 0x60, 0x84, 0xa2, 0xd2, 0xf5, 0x01, 0xee, 0xa9, 0x32, 0xa3, 0x9e, 0x90, - 0x8b, 0xec, 0xf8, 0x8f, 0x46, 0xb5, 0x0d, 0x9a, 0xde, 0x96, 0x49, 0xef, 0x20, 0xf0, 0x8e, 0xa0, - 0x99, 0x6d, 0x40, 0xd6, 0xa4, 0x60, 0x99, 0x88, 0x6b, 0x2b, 0xf0, 0x90, 0xe6, 0x8e, 0xff, 0x7d, - 0x17, 0x8e, 0x5f, 0x49, 0x31, 0xe7, 0x8b, 0x09, 0x13, 0x6c, 0x61, 0x6b, 0xa6, 0x76, 0x06, 0x97, - 0xa8, 0x53, 0x1e, 0x20, 0x79, 0x03, 0xdd, 0x73, 0x14, 0xa8, 0x99, 0xc1, 0xb2, 0x9d, 0xc4, 0x2d, - 0xe7, 0xf4, 0xf7, 0x0a, 0xf7, 0xdc, 0x9b, 0x0b, 0x9b, 0x5f, 0xd1, 0xdb, 0x19, 0x3a, 0xe4, 0x2d, - 0xfc, 0x37, 0x61, 0x26, 0x58, 0x56, 0x5d, 0xdc, 0x42, 0xd5, 0x2b, 0x23, 0x37, 0x7b, 0x6e, 0xc9, - 0x18, 0x3c, 0x38, 0x47, 0x73, 0x7b, 0x63, 0xb7, 0xd0, 0x3e, 0x2e, 0x23, 0xdb, 0x47, 0x92, 0x1d, - 0x71, 0xfa, 0xf2, 0xe7, 0xba, 0xef, 0xfc, 0x5a, 0xf7, 0x9d, 0xdf, 0xeb, 0xbe, 0xf3, 0xd1, 0xff, - 0xc7, 0xd3, 0xaf, 0x7e, 0x20, 0x4c, 0xf1, 0x20, 0xe4, 0x28, 0xcc, 0xd5, 0xbe, 0x7d, 0xee, 0x4f, - 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x33, 0x34, 0xb3, 0x95, 0x5e, 0x04, 0x00, 0x00, + // 483 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0xd1, 0x8e, 0x12, 0x3d, + 0x14, 0xa6, 0x3f, 0xec, 0x2e, 0x1c, 0x36, 0xf9, 0x49, 0x63, 0xe2, 0x84, 0xec, 0x22, 0x99, 0x2b, + 0x6e, 0x84, 0x04, 0x8d, 0x77, 0x26, 0xba, 0x66, 0x75, 0xa3, 0xc1, 0x90, 0xe2, 0x95, 0x77, 0xdd, + 0x72, 0x80, 0xba, 0x33, 0x6d, 0x6d, 0x3b, 0x93, 0xe0, 0x95, 0x6f, 0xe3, 0x2b, 0xf8, 0x08, 0x5e, + 0xfa, 0x08, 0x86, 0x27, 0x31, 0x53, 0x66, 0x18, 0xe2, 0x46, 0xaf, 0x38, 0xdf, 0x77, 0xce, 0xf9, + 0xf8, 0xbe, 0x4e, 0x0b, 0x97, 0x22, 0x35, 0x0e, 0x6d, 0x8e, 0x76, 0x62, 0x92, 0x6c, 0x2d, 0x55, + 0xf9, 0x33, 0x36, 0x56, 0x7b, 0x4d, 0x4f, 0xf7, 0x28, 0xfe, 0x4a, 0xa0, 0xf7, 0xd2, 0x98, 0x85, + 0xb7, 0xc8, 0x53, 0x86, 0x9f, 0x33, 0x74, 0x9e, 0x3e, 0x87, 0x76, 0x8a, 0x9e, 0x2f, 0xb9, 0xe7, + 0x11, 0x19, 0x92, 0x51, 0x77, 0xfa, 0x68, 0x5c, 0x6e, 0xcf, 0xb8, 0x92, 0x2b, 0x74, 0xbe, 0x1c, + 0x9d, 0x95, 0x63, 0x37, 0x0d, 0x76, 0x58, 0xa1, 0x31, 0xb4, 0x56, 0x32, 0xc1, 0xe8, 0xbf, 0xb0, + 0x7a, 0x5e, 0xad, 0xbe, 0x96, 0x09, 0xde, 0x34, 0x58, 0xe8, 0x5d, 0x75, 0xe0, 0xcc, 0xee, 0x25, + 0xe2, 0x6f, 0x04, 0x1e, 0xfe, 0x45, 0x96, 0x46, 0x70, 0xc6, 0x8d, 0x79, 0xcf, 0x53, 0x0c, 0x46, + 0x3a, 0xac, 0x82, 0x74, 0x00, 0xc0, 0x8d, 0x61, 0x98, 0xcc, 0xb9, 0xdf, 0x84, 0xbf, 0xea, 0xb0, + 0x23, 0x86, 0xf6, 0xa1, 0x2d, 0x36, 0x28, 0xee, 0x5c, 0x96, 0x46, 0xcd, 0xd0, 0x3d, 0x60, 0x4a, + 0xa1, 0xe5, 0xe4, 0x17, 0x8c, 0x5a, 0x43, 0x32, 0x6a, 0xb2, 0x50, 0xd3, 0x18, 0x9a, 0xa8, 0xf2, + 0xe8, 0x64, 0xd8, 0x1c, 0x75, 0xa7, 0xbd, 0xca, 0xf3, 0xb5, 0xca, 0xaf, 0x95, 0xb7, 0x5b, 0x56, + 0x34, 0xe3, 0xa7, 0xd0, 0xae, 0x88, 0x42, 0x43, 0xd5, 0xb6, 0x42, 0x4d, 0x1f, 0xc0, 0x49, 0xce, + 0x93, 0x0c, 0x4b, 0x3b, 0x7b, 0x10, 0xcf, 0xa1, 0x57, 0xc7, 0x73, 0x46, 0x2b, 0x87, 0xf4, 0x02, + 0x3a, 0x69, 0xc9, 0xb9, 0x88, 0x0c, 0x9b, 0xa3, 0x0e, 0xab, 0x89, 0x22, 0x9b, 0xd3, 0x99, 0x15, + 0xf8, 0x61, 0x6b, 0x2a, 0xb1, 0x23, 0x26, 0x7e, 0x06, 0x94, 0xa1, 0xd1, 0x4e, 0x7a, 0x6d, 0xb7, + 0x07, 0xcd, 0x21, 0x74, 0xa5, 0x5b, 0x64, 0xc6, 0x68, 0xeb, 0x71, 0x19, 0x8c, 0xb5, 0xd9, 0x31, + 0x15, 0x5f, 0x40, 0xab, 0xf8, 0x08, 0x85, 0x4f, 0xb1, 0xc9, 0xd4, 0x5d, 0x98, 0x39, 0x67, 0x7b, + 0x30, 0xfd, 0x4e, 0xe0, 0xf2, 0x95, 0x56, 0x2b, 0xb9, 0x9e, 0x71, 0xc5, 0xd7, 0x98, 0xa2, 0xf2, + 0xf3, 0x70, 0x0c, 0x0b, 0xb4, 0xb9, 0x14, 0x48, 0xdf, 0x42, 0xef, 0x0d, 0x2a, 0xb4, 0xdc, 0x63, + 0x95, 0x88, 0x46, 0xd5, 0x51, 0xfd, 0x79, 0x8b, 0xfa, 0xd1, 0xfd, 0x3b, 0xb3, 0x77, 0x1a, 0x37, + 0x46, 0x84, 0xbe, 0x83, 0xff, 0x67, 0xdc, 0x8b, 0x4d, 0x1d, 0xe4, 0x1f, 0x52, 0xfd, 0xaa, 0x73, + 0x3f, 0x76, 0x21, 0x76, 0xf5, 0xe2, 0xc7, 0x6e, 0x40, 0x7e, 0xee, 0x06, 0xe4, 0xd7, 0x6e, 0x40, + 0x3e, 0x4e, 0xd7, 0xd2, 0x6f, 0xb2, 0xdb, 0xb1, 0xd0, 0xe9, 0x84, 0xdb, 0xb5, 0x36, 0x56, 0x7f, + 0x0a, 0xc5, 0x63, 0xb1, 0x9c, 0xe4, 0xd3, 0x49, 0xfd, 0x32, 0xb8, 0x91, 0x22, 0x91, 0xa8, 0xfc, + 0xed, 0x69, 0x78, 0x16, 0x4f, 0x7e, 0x07, 0x00, 0x00, 0xff, 0xff, 0x83, 0x01, 0x5e, 0x48, 0x37, + 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -527,8 +472,6 @@ type ConfigManagementPluginServiceClient interface { GenerateManifest(ctx context.Context, opts ...grpc.CallOption) (ConfigManagementPluginService_GenerateManifestClient, error) // MatchRepository returns whether or not the given application is supported by the plugin MatchRepository(ctx context.Context, opts ...grpc.CallOption) (ConfigManagementPluginService_MatchRepositoryClient, error) - // GetParametersAnnouncement gets a list of parameter announcements for the given app - GetParametersAnnouncement(ctx context.Context, opts ...grpc.CallOption) (ConfigManagementPluginService_GetParametersAnnouncementClient, error) } type configManagementPluginServiceClient struct { @@ -607,40 +550,6 @@ func (x *configManagementPluginServiceMatchRepositoryClient) CloseAndRecv() (*Re return m, nil } -func (c *configManagementPluginServiceClient) GetParametersAnnouncement(ctx context.Context, opts ...grpc.CallOption) (ConfigManagementPluginService_GetParametersAnnouncementClient, error) { - stream, err := c.cc.NewStream(ctx, &_ConfigManagementPluginService_serviceDesc.Streams[2], "/plugin.ConfigManagementPluginService/GetParametersAnnouncement", opts...) - if err != nil { - return nil, err - } - x := &configManagementPluginServiceGetParametersAnnouncementClient{stream} - return x, nil -} - -type ConfigManagementPluginService_GetParametersAnnouncementClient interface { - Send(*AppStreamRequest) error - CloseAndRecv() (*ParametersAnnouncementResponse, error) - grpc.ClientStream -} - -type configManagementPluginServiceGetParametersAnnouncementClient struct { - grpc.ClientStream -} - -func (x *configManagementPluginServiceGetParametersAnnouncementClient) Send(m *AppStreamRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *configManagementPluginServiceGetParametersAnnouncementClient) CloseAndRecv() (*ParametersAnnouncementResponse, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(ParametersAnnouncementResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - // ConfigManagementPluginServiceServer is the server API for ConfigManagementPluginService service. type ConfigManagementPluginServiceServer interface { // GenerateManifests receive a stream containing a tgz archive with all required files necessary @@ -648,8 +557,6 @@ type ConfigManagementPluginServiceServer interface { GenerateManifest(ConfigManagementPluginService_GenerateManifestServer) error // MatchRepository returns whether or not the given application is supported by the plugin MatchRepository(ConfigManagementPluginService_MatchRepositoryServer) error - // GetParametersAnnouncement gets a list of parameter announcements for the given app - GetParametersAnnouncement(ConfigManagementPluginService_GetParametersAnnouncementServer) error } // UnimplementedConfigManagementPluginServiceServer can be embedded to have forward compatible implementations. @@ -662,9 +569,6 @@ func (*UnimplementedConfigManagementPluginServiceServer) GenerateManifest(srv Co func (*UnimplementedConfigManagementPluginServiceServer) MatchRepository(srv ConfigManagementPluginService_MatchRepositoryServer) error { return status.Errorf(codes.Unimplemented, "method MatchRepository not implemented") } -func (*UnimplementedConfigManagementPluginServiceServer) GetParametersAnnouncement(srv ConfigManagementPluginService_GetParametersAnnouncementServer) error { - return status.Errorf(codes.Unimplemented, "method GetParametersAnnouncement not implemented") -} func RegisterConfigManagementPluginServiceServer(s *grpc.Server, srv ConfigManagementPluginServiceServer) { s.RegisterService(&_ConfigManagementPluginService_serviceDesc, srv) @@ -722,32 +626,6 @@ func (x *configManagementPluginServiceMatchRepositoryServer) Recv() (*AppStreamR return m, nil } -func _ConfigManagementPluginService_GetParametersAnnouncement_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ConfigManagementPluginServiceServer).GetParametersAnnouncement(&configManagementPluginServiceGetParametersAnnouncementServer{stream}) -} - -type ConfigManagementPluginService_GetParametersAnnouncementServer interface { - SendAndClose(*ParametersAnnouncementResponse) error - Recv() (*AppStreamRequest, error) - grpc.ServerStream -} - -type configManagementPluginServiceGetParametersAnnouncementServer struct { - grpc.ServerStream -} - -func (x *configManagementPluginServiceGetParametersAnnouncementServer) SendAndClose(m *ParametersAnnouncementResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *configManagementPluginServiceGetParametersAnnouncementServer) Recv() (*AppStreamRequest, error) { - m := new(AppStreamRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - var _ConfigManagementPluginService_serviceDesc = grpc.ServiceDesc{ ServiceName: "plugin.ConfigManagementPluginService", HandlerType: (*ConfigManagementPluginServiceServer)(nil), @@ -763,11 +641,6 @@ var _ConfigManagementPluginService_serviceDesc = grpc.ServiceDesc{ Handler: _ConfigManagementPluginService_MatchRepository_Handler, ClientStreams: true, }, - { - StreamName: "GetParametersAnnouncement", - Handler: _ConfigManagementPluginService_GetParametersAnnouncement_Handler, - ClientStreams: true, - }, }, Metadata: "cmpserver/plugin/plugin.proto", } @@ -1038,47 +911,6 @@ func (m *RepositoryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ParametersAnnouncementResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ParametersAnnouncementResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ParametersAnnouncementResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ParameterAnnouncements) > 0 { - for iNdEx := len(m.ParameterAnnouncements) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ParameterAnnouncements[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPlugin(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *File) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1253,24 +1085,6 @@ func (m *RepositoryResponse) Size() (n int) { return n } -func (m *ParametersAnnouncementResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ParameterAnnouncements) > 0 { - for _, e := range m.ParameterAnnouncements { - l = e.Size() - n += 1 + l + sovPlugin(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func (m *File) Size() (n int) { if m == nil { return 0 @@ -1915,91 +1729,6 @@ func (m *RepositoryResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *ParametersAnnouncementResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPlugin - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ParametersAnnouncementResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ParametersAnnouncementResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ParameterAnnouncements", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPlugin - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPlugin - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPlugin - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ParameterAnnouncements = append(m.ParameterAnnouncements, &apiclient.ParameterAnnouncement{}) - if err := m.ParameterAnnouncements[len(m.ParameterAnnouncements)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipPlugin(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthPlugin - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *File) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/cmpserver/plugin/config.go b/cmpserver/plugin/config.go index 9f05043240c83..0c6a68f5151ca 100644 --- a/cmpserver/plugin/config.go +++ b/cmpserver/plugin/config.go @@ -7,7 +7,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/argoproj/argo-cd/v2/common" - "github.com/argoproj/argo-cd/v2/reposerver/apiclient" configUtil "github.com/argoproj/argo-cd/v2/util/config" ) @@ -22,11 +21,10 @@ type PluginConfig struct { } type PluginConfigSpec struct { - Version string `json:"version"` - Init Command `json:"init,omitempty"` - Generate Command `json:"generate"` - Discover Discover `json:"discover"` - Parameters Parameters `yaml:"parameters"` + Version string `json:"version"` + Init Command `json:"init,omitempty"` + Generate Command `json:"generate"` + Discover Discover `json:"discover"` } //Discover holds find and fileName @@ -47,17 +45,6 @@ type Find struct { Glob string `json:"glob"` } -// Parameters holds static and dynamic configurations -type Parameters struct { - Static []*apiclient.ParameterAnnouncement `yaml:"static"` - Dynamic Command `yaml:"dynamic"` -} - -// Dynamic hold the dynamic announcements for CMP's -type Dynamic struct { - Command -} - func ReadPluginConfig(filePath string) (*PluginConfig, error) { path := fmt.Sprintf("%s/%s", strings.TrimRight(filePath, "/"), common.PluginConfigFileName) diff --git a/cmpserver/plugin/plugin.go b/cmpserver/plugin/plugin.go index 5ac87d4ed5274..7ade241b9f069 100644 --- a/cmpserver/plugin/plugin.go +++ b/cmpserver/plugin/plugin.go @@ -3,7 +3,6 @@ package plugin import ( "bytes" "context" - "encoding/json" "errors" "fmt" "os" @@ -14,9 +13,7 @@ import ( "github.com/argoproj/pkg/rand" - "github.com/argoproj/argo-cd/v2/cmpserver/apiclient" "github.com/argoproj/argo-cd/v2/common" - repoclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient" "github.com/argoproj/argo-cd/v2/util/buffered_context" "github.com/argoproj/argo-cd/v2/util/cmp" "github.com/argoproj/argo-cd/v2/util/io/files" @@ -24,6 +21,8 @@ import ( "github.com/argoproj/gitops-engine/pkg/utils/kube" "github.com/mattn/go-zglob" log "github.com/sirupsen/logrus" + + "github.com/argoproj/argo-cd/v2/cmpserver/apiclient" ) // cmpTimeoutBuffer is the amount of time before the request deadline to timeout server-side work. It makes sure there's @@ -46,14 +45,15 @@ func NewService(initConstants CMPServerInitConstants) *Service { } } -func (s *Service) Init(workDir string) error { +func (s *Service) Init() error { + workDir := common.GetCMPWorkDir() err := os.RemoveAll(workDir) if err != nil { - return fmt.Errorf("error removing workdir %q: %w", workDir, err) + return fmt.Errorf("error removing workdir %q: %s", workDir, err) } err = os.MkdirAll(workDir, 0700) if err != nil { - return fmt.Errorf("error creating workdir %q: %w", workDir, err) + return fmt.Errorf("error creating workdir %q: %s", workDir, err) } return nil } @@ -143,50 +143,24 @@ func environ(envVars []*apiclient.EnvEntry) []string { return environ } -// getTempDirMustCleanup creates a temporary directory and returns a cleanup function. -func getTempDirMustCleanup(baseDir string) (workDir string, cleanup func(), err error) { - workDir, err = files.CreateTempDir(baseDir) - if err != nil { - return "", nil, fmt.Errorf("error creating temp dir: %w", err) - } - cleanup = func() { - if err := os.RemoveAll(workDir); err != nil { - log.WithFields(map[string]interface{}{ - common.SecurityField: common.SecurityHigh, - common.SecurityCWEField: 459, - }).Errorf("Failed to clean up temp directory: %s", err) - } - } - return workDir, cleanup, nil -} - -type Stream interface { - Recv() (*apiclient.AppStreamRequest, error) - Context() context.Context -} - -type GenerateManifestStream interface { - Stream - SendAndClose(response *apiclient.ManifestResponse) error -} - // GenerateManifest runs generate command from plugin config file and returns generated manifest files func (s *Service) GenerateManifest(stream apiclient.ConfigManagementPluginService_GenerateManifestServer) error { - return s.generateManifestGeneric(stream) -} - -func (s *Service) generateManifestGeneric(stream GenerateManifestStream) error { ctx, cancel := buffered_context.WithEarlierDeadline(stream.Context(), cmpTimeoutBuffer) defer cancel() - workDir, cleanup, err := getTempDirMustCleanup(common.GetCMPWorkDir()) + workDir, err := files.CreateTempDir(common.GetCMPWorkDir()) if err != nil { - return fmt.Errorf("error creating workdir for manifest generation: %w", err) + return fmt.Errorf("error creating temp dir: %s", err) } - defer cleanup() + defer func() { + if err := os.RemoveAll(workDir); err != nil { + // we panic here as the workDir may contain sensitive information + panic(fmt.Sprintf("error removing generate manifest workdir: %s", err)) + } + }() metadata, err := cmp.ReceiveRepoStream(ctx, stream, workDir) if err != nil { - return fmt.Errorf("generate manifest error receiving stream: %w", err) + return fmt.Errorf("generate manifest error receiving stream: %s", err) } appPath := filepath.Clean(filepath.Join(workDir, metadata.AppRelPath)) @@ -195,11 +169,11 @@ func (s *Service) generateManifestGeneric(stream GenerateManifestStream) error { } response, err := s.generateManifest(ctx, appPath, metadata.GetEnv()) if err != nil { - return fmt.Errorf("error generating manifests: %w", err) + return fmt.Errorf("error generating manifests: %s", err) } err = stream.SendAndClose(response) if err != nil { - return fmt.Errorf("error sending manifest response: %w", err) + return fmt.Errorf("error sending manifest response: %s", err) } return nil } @@ -242,46 +216,42 @@ func (s *Service) generateManifest(ctx context.Context, appDir string, envEntrie }, err } -type MatchRepositoryStream interface { - Stream - SendAndClose(response *apiclient.RepositoryResponse) error -} - // MatchRepository receives the application stream and checks whether // its repository type is supported by the config management plugin // server. -// The checks are implemented in the following order: -// 1. If spec.Discover.FileName is provided it finds for a name match in Applications files -// 2. If spec.Discover.Find.Glob is provided if finds for a glob match in Applications files -// 3. Otherwise it runs the spec.Discover.Find.Command +//The checks are implemented in the following order: +// 1. If spec.Discover.FileName is provided it finds for a name match in Applications files +// 2. If spec.Discover.Find.Glob is provided if finds for a glob match in Applications files +// 3. Otherwise it runs the spec.Discover.Find.Command func (s *Service) MatchRepository(stream apiclient.ConfigManagementPluginService_MatchRepositoryServer) error { - return s.matchRepositoryGeneric(stream) -} - -func (s *Service) matchRepositoryGeneric(stream MatchRepositoryStream) error { bufferedCtx, cancel := buffered_context.WithEarlierDeadline(stream.Context(), cmpTimeoutBuffer) defer cancel() - workDir, cleanup, err := getTempDirMustCleanup(common.GetCMPWorkDir()) + workDir, err := files.CreateTempDir(common.GetCMPWorkDir()) if err != nil { - return fmt.Errorf("error creating workdir for repository matching: %w", err) + return fmt.Errorf("error creating match repository workdir: %s", err) } - defer cleanup() + defer func() { + if err := os.RemoveAll(workDir); err != nil { + // we panic here as the workDir may contain sensitive information + panic(fmt.Sprintf("error removing match repository workdir: %s", err)) + } + }() metadata, err := cmp.ReceiveRepoStream(bufferedCtx, stream, workDir) if err != nil { - return fmt.Errorf("match repository error receiving stream: %w", err) + return fmt.Errorf("match repository error receiving stream: %s", err) } isSupported, err := s.matchRepository(bufferedCtx, workDir, metadata.GetEnv()) if err != nil { - return fmt.Errorf("match repository error: %w", err) + return fmt.Errorf("match repository error: %s", err) } repoResponse := &apiclient.RepositoryResponse{IsSupported: isSupported} err = stream.SendAndClose(repoResponse) if err != nil { - return fmt.Errorf("error sending match repository response: %w", err) + return fmt.Errorf("error sending match repository response: %s", err) } return nil } @@ -293,7 +263,7 @@ func (s *Service) matchRepository(ctx context.Context, workdir string, envEntrie pattern := filepath.Join(workdir, config.Spec.Discover.FileName) matches, err := filepath.Glob(pattern) if err != nil { - e := fmt.Errorf("error finding filename match for pattern %q: %w", pattern, err) + e := fmt.Errorf("error finding filename match for pattern %q: %s", pattern, err) log.Debug(e) return false, e } @@ -307,7 +277,7 @@ func (s *Service) matchRepository(ctx context.Context, workdir string, envEntrie // https://github.com/golang/go/issues/11862 matches, err := zglob.Glob(pattern) if err != nil { - e := fmt.Errorf("error finding glob match for pattern %q: %w", pattern, err) + e := fmt.Errorf("error finding glob match for pattern %q: %s", pattern, err) log.Debug(e) return false, e } @@ -323,7 +293,7 @@ func (s *Service) matchRepository(ctx context.Context, workdir string, envEntrie find, err := runCommand(ctx, config.Spec.Discover.Find.Command, workdir, env) if err != nil { - return false, fmt.Errorf("error running find command: %w", err) + return false, fmt.Errorf("error running find command: %s", err) } if find != "" { @@ -331,66 +301,3 @@ func (s *Service) matchRepository(ctx context.Context, workdir string, envEntrie } return false, nil } - -// ParametersAnnouncementStream defines an interface able to send/receive a stream of parameter announcements. -type ParametersAnnouncementStream interface { - Stream - SendAndClose(response *apiclient.ParametersAnnouncementResponse) error -} - -// GetParametersAnnouncement gets parameter announcements for a given Application and repo contents. -func (s *Service) GetParametersAnnouncement(stream apiclient.ConfigManagementPluginService_GetParametersAnnouncementServer) error { - bufferedCtx, cancel := buffered_context.WithEarlierDeadline(stream.Context(), cmpTimeoutBuffer) - defer cancel() - - workDir, cleanup, err := getTempDirMustCleanup(common.GetCMPWorkDir()) - if err != nil { - return fmt.Errorf("error creating workdir for generating parameter announcements: %w", err) - } - defer cleanup() - - metadata, err := cmp.ReceiveRepoStream(bufferedCtx, stream, workDir) - if err != nil { - return fmt.Errorf("parameters announcement error receiving stream: %w", err) - } - appPath := filepath.Clean(filepath.Join(workDir, metadata.AppRelPath)) - if !strings.HasPrefix(appPath, workDir) { - return fmt.Errorf("illegal appPath: out of workDir bound") - } - - repoResponse, err := getParametersAnnouncement(bufferedCtx, appPath, s.initConstants.PluginConfig.Spec.Parameters.Static, s.initConstants.PluginConfig.Spec.Parameters.Dynamic) - if err != nil { - return fmt.Errorf("get parameters announcement error: %w", err) - } - - err = stream.SendAndClose(repoResponse) - if err != nil { - return fmt.Errorf("error sending parameters announcement response: %w", err) - } - return nil -} - -func getParametersAnnouncement(ctx context.Context, appDir string, announcements []*repoclient.ParameterAnnouncement, command Command) (*apiclient.ParametersAnnouncementResponse, error) { - augmentedAnnouncements := announcements - - if len(command.Command) > 0 { - stdout, err := runCommand(ctx, command, appDir, os.Environ()) - if err != nil { - return nil, fmt.Errorf("error executing dynamic parameter output command: %w", err) - } - - var dynamicParamAnnouncements []*repoclient.ParameterAnnouncement - err = json.Unmarshal([]byte(stdout), &dynamicParamAnnouncements) - if err != nil { - return nil, fmt.Errorf("error unmarshaling dynamic parameter output into ParametersAnnouncementResponse: %w", err) - } - - // dynamic goes first, because static should take precedence by being later. - augmentedAnnouncements = append(dynamicParamAnnouncements, announcements...) - } - - repoResponse := &apiclient.ParametersAnnouncementResponse{ - ParameterAnnouncements: augmentedAnnouncements, - } - return repoResponse, nil -} diff --git a/cmpserver/plugin/plugin.proto b/cmpserver/plugin/plugin.proto index b6dc23232e8a1..ce4452d638eed 100644 --- a/cmpserver/plugin/plugin.proto +++ b/cmpserver/plugin/plugin.proto @@ -3,8 +3,6 @@ option go_package = "github.com/argoproj/argo-cd/v2/cmpserver/apiclient"; package plugin; -import "github.com/argoproj/argo-cd/v2/reposerver/repository/repository.proto"; - // AppStreamRequest is the request object used to send the application's // files over a stream. message AppStreamRequest { @@ -46,12 +44,6 @@ message RepositoryResponse { bool isSupported = 1; } -// ParametersAnnouncementResponse contains a list of announcements. This list represents all the parameters which a CMP -// is able to accept. -message ParametersAnnouncementResponse { - repeated repository.ParameterAnnouncement parameterAnnouncements = 1; -} - message File { bytes chunk = 1; } @@ -66,8 +58,4 @@ service ConfigManagementPluginService { // MatchRepository returns whether or not the given application is supported by the plugin rpc MatchRepository(stream AppStreamRequest) returns (RepositoryResponse) { } - - // GetParametersAnnouncement gets a list of parameter announcements for the given app - rpc GetParametersAnnouncement(stream AppStreamRequest) returns (ParametersAnnouncementResponse) { - } } diff --git a/cmpserver/plugin/plugin_test.go b/cmpserver/plugin/plugin_test.go index c14de4ccf6328..66744c1c717f5 100644 --- a/cmpserver/plugin/plugin_test.go +++ b/cmpserver/plugin/plugin_test.go @@ -1,27 +1,17 @@ package plugin import ( - "bytes" "context" - "fmt" - "io" - "os" - "path" "path/filepath" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "google.golang.org/grpc/metadata" - "gopkg.in/yaml.v2" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/argoproj/argo-cd/v2/cmpserver/apiclient" - repoclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient" "github.com/argoproj/argo-cd/v2/test" - "github.com/argoproj/argo-cd/v2/util/cmp" - "github.com/argoproj/argo-cd/v2/util/tgzstream" ) func newService(configFilePath string) (*Service, error) { @@ -40,11 +30,6 @@ func newService(configFilePath string) (*Service, error) { return service, nil } -func (s *Service) WithGenerateCommand(command Command) *Service { - s.initConstants.PluginConfig.Spec.Generate = command - return s -} - type pluginOpt func(*CMPServerInitConstants) func withDiscover(d Discover) pluginOpt { @@ -119,19 +104,6 @@ func TestMatchRepository(t *testing.T) { assert.NoError(t, err) assert.False(t, match) }) - t.Run("will not match a pattern with a syntax error", func(t *testing.T) { - // given - d := Discover{ - FileName: "[", - } - f := setup(t, withDiscover(d)) - - // when - _, err := f.service.matchRepository(context.Background(), f.path, f.env) - - // then - assert.ErrorContains(t, err, "syntax error") - }) t.Run("will match plugin by glob", func(t *testing.T) { // given d := Discover{ @@ -164,21 +136,6 @@ func TestMatchRepository(t *testing.T) { assert.NoError(t, err) assert.False(t, match) }) - t.Run("will throw an error for a bad pattern", func(t *testing.T) { - // given - d := Discover{ - Find: Find{ - Glob: "does-not-exist", - }, - } - f := setup(t, withDiscover(d)) - - // when - _, err := f.service.matchRepository(context.Background(), f.path, f.env) - - // then - assert.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 d := Discover{ @@ -281,49 +238,17 @@ func Test_Negative_ConfigFile_DoesnotExist(t *testing.T) { func TestGenerateManifest(t *testing.T) { configFilePath := "./testdata/kustomize/config" - - t.Run("successful generate", func(t *testing.T) { - service, err := newService(configFilePath) - require.NoError(t, err) - - res1, err := service.generateManifest(context.Background(), "testdata/kustomize", nil) - require.NoError(t, err) - require.NotNil(t, res1) - - expectedOutput := "{\"apiVersion\":\"v1\",\"data\":{\"foo\":\"bar\"},\"kind\":\"ConfigMap\",\"metadata\":{\"name\":\"my-map\"}}" - if res1 != nil { - require.Equal(t, expectedOutput, res1.Manifests[0]) - } - }) - t.Run("bad generate command", func(t *testing.T) { - service, err := newService(configFilePath) - require.NoError(t, err) - service.WithGenerateCommand(Command{Command: []string{"bad-command"}}) - - res, err := service.generateManifest(context.Background(), "testdata/kustomize", nil) - assert.ErrorContains(t, err, "executable file not found") - assert.Nil(t, res.Manifests) - }) - t.Run("bad yaml output", func(t *testing.T) { - service, err := newService(configFilePath) - require.NoError(t, err) - 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") - assert.Nil(t, res.Manifests) - }) -} - -func TestGenerateManifest_deadline_exceeded(t *testing.T) { - configFilePath := "./testdata/kustomize/config" service, err := newService(configFilePath) require.NoError(t, err) - expiredCtx, cancel := context.WithTimeout(context.Background(), time.Second*0) - defer cancel() - _, err = service.generateManifest(expiredCtx, "", nil) - assert.ErrorContains(t, err, "context deadline exceeded") + res1, err := service.generateManifest(context.Background(), "", nil) + require.NoError(t, err) + require.NotNil(t, res1) + + expectedOutput := "{\"apiVersion\":\"v1\",\"data\":{\"foo\":\"bar\"},\"kind\":\"ConfigMap\",\"metadata\":{\"name\":\"my-map\"}}" + if res1 != nil { + require.Equal(t, expectedOutput, res1.Manifests[0]) + } } // TestRunCommandContextTimeout makes sure the command dies at timeout rather than sleeping past the timeout. @@ -341,388 +266,3 @@ func TestRunCommandContextTimeout(t *testing.T) { assert.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") -} - -func Test_getParametersAnnouncement_empty_command(t *testing.T) { - staticYAML := ` -- name: static-a -- name: static-b -` - static := &[]*repoclient.ParameterAnnouncement{} - err := yaml.Unmarshal([]byte(staticYAML), static) - require.NoError(t, err) - command := Command{ - Command: []string{"echo"}, - Args: []string{`[]`}, - } - res, err := getParametersAnnouncement(context.Background(), "", *static, command) - require.NoError(t, err) - assert.Equal(t, []*repoclient.ParameterAnnouncement{{Name: "static-a"}, {Name: "static-b"}}, res.ParameterAnnouncements) -} - -func Test_getParametersAnnouncement_no_command(t *testing.T) { - staticYAML := ` -- name: static-a -- name: static-b -` - static := &[]*repoclient.ParameterAnnouncement{} - err := yaml.Unmarshal([]byte(staticYAML), static) - require.NoError(t, err) - command := Command{} - res, err := getParametersAnnouncement(context.Background(), "", *static, command) - require.NoError(t, err) - assert.Equal(t, []*repoclient.ParameterAnnouncement{{Name: "static-a"}, {Name: "static-b"}}, res.ParameterAnnouncements) -} - -func Test_getParametersAnnouncement_static_and_dynamic(t *testing.T) { - staticYAML := ` -- name: static-a -- name: static-b -` - static := &[]*repoclient.ParameterAnnouncement{} - err := yaml.Unmarshal([]byte(staticYAML), static) - require.NoError(t, err) - command := Command{ - Command: []string{"echo"}, - Args: []string{`[{"name": "dynamic-a"}, {"name": "dynamic-b"}]`}, - } - res, err := getParametersAnnouncement(context.Background(), "", *static, command) - require.NoError(t, err) - expected := []*repoclient.ParameterAnnouncement{ - {Name: "dynamic-a"}, - {Name: "dynamic-b"}, - {Name: "static-a"}, - {Name: "static-b"}, - } - assert.Equal(t, expected, res.ParameterAnnouncements) -} - -func Test_getParametersAnnouncement_invalid_json(t *testing.T) { - command := Command{ - Command: []string{"echo"}, - Args: []string{`[`}, - } - _, err := getParametersAnnouncement(context.Background(), "", []*repoclient.ParameterAnnouncement{}, command) - assert.Error(t, err) - assert.Contains(t, err.Error(), "unexpected end of JSON input") -} - -func Test_getParametersAnnouncement_bad_command(t *testing.T) { - command := Command{ - Command: []string{"exit"}, - Args: []string{"1"}, - } - _, err := getParametersAnnouncement(context.Background(), "", []*repoclient.ParameterAnnouncement{}, command) - assert.Error(t, err) - assert.Contains(t, err.Error(), "error executing dynamic parameter output command") -} - -func Test_getTempDirMustCleanup(t *testing.T) { - tempDir := t.TempDir() - - // Induce a directory create error to verify error handling. - err := os.Chmod(tempDir, 0000) - require.NoError(t, err) - _, _, err = getTempDirMustCleanup(path.Join(tempDir, "test")) - assert.ErrorContains(t, err, "error creating temp dir") - - err = os.Chmod(tempDir, 0700) - require.NoError(t, err) - workDir, cleanup, err := getTempDirMustCleanup(tempDir) - require.NoError(t, err) - require.DirExists(t, workDir) - cleanup() - assert.NoDirExists(t, workDir) -} - -func TestService_Init(t *testing.T) { - // Set up a base directory containing a test directory and a test file. - tempDir := t.TempDir() - workDir := path.Join(tempDir, "workDir") - err := os.MkdirAll(workDir, 0700) - require.NoError(t, err) - testfile := path.Join(workDir, "testfile") - file, err := os.Create(testfile) - require.NoError(t, err) - err = file.Close() - require.NoError(t, err) - - // Make the base directory read-only so Init's cleanup fails. - err = os.Chmod(tempDir, 0000) - 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") - - // Make the base directory writable so Init's cleanup succeeds. - err = os.Chmod(tempDir, 0700) - require.NoError(t, err) - err = s.Init(workDir) - assert.NoError(t, err) - assert.DirExists(t, workDir) - assert.NoFileExists(t, testfile) -} - -func TestEnviron(t *testing.T) { - t.Run("empty environ", func(t *testing.T) { - env := environ([]*apiclient.EnvEntry{}) - assert.Nil(t, env) - }) - t.Run("env vars with empty names or values", func(t *testing.T) { - env := environ([]*apiclient.EnvEntry{ - {Value: "test"}, - {Name: "test"}, - }) - assert.Nil(t, env) - }) - t.Run("proper env vars", func(t *testing.T) { - env := environ([]*apiclient.EnvEntry{ - {Name: "name1", Value: "value1"}, - {Name: "name2", Value: "value2"}, - }) - assert.Equal(t, []string{"name1=value1", "name2=value2"}, env) - }) -} - -type MockGenerateManifestStream struct { - metadataSent bool - fileSent bool - metadataRequest *apiclient.AppStreamRequest - fileRequest *apiclient.AppStreamRequest - response *apiclient.ManifestResponse -} - -func NewMockGenerateManifestStream(repoPath, appPath string, env []string) (*MockGenerateManifestStream, error) { - tgz, mr, err := cmp.GetCompressedRepoAndMetadata(repoPath, appPath, env, nil, nil) - if err != nil { - return nil, err - } - defer tgzstream.CloseAndDelete(tgz) - - tgzBuffer := bytes.NewBuffer(nil) - _, err = io.Copy(tgzBuffer, tgz) - if err != nil { - return nil, fmt.Errorf("failed to copy manifest targz to a byte buffer: %w", err) - } - - return &MockGenerateManifestStream{ - metadataRequest: mr, - fileRequest: cmp.AppFileRequest(tgzBuffer.Bytes()), - }, nil -} - -func (m *MockGenerateManifestStream) SendAndClose(response *apiclient.ManifestResponse) error { - m.response = response - return nil -} - -func (m *MockGenerateManifestStream) Recv() (*apiclient.AppStreamRequest, error) { - if !m.metadataSent { - m.metadataSent = true - return m.metadataRequest, nil - } - - if !m.fileSent { - m.fileSent = true - return m.fileRequest, nil - } - return nil, io.EOF -} - -func (m *MockGenerateManifestStream) Context() context.Context { - return context.Background() -} - -func TestService_GenerateManifest(t *testing.T) { - configFilePath := "./testdata/kustomize/config" - service, err := newService(configFilePath) - require.NoError(t, err) - - t.Run("successful generate", func(t *testing.T) { - s, err := NewMockGenerateManifestStream("./testdata/kustomize", "./testdata/kustomize", nil) - require.NoError(t, err) - err = service.generateManifestGeneric(s) - require.NoError(t, err) - require.NotNil(t, s.response) - assert.Equal(t, []string{"{\"apiVersion\":\"v1\",\"data\":{\"foo\":\"bar\"},\"kind\":\"ConfigMap\",\"metadata\":{\"name\":\"my-map\"}}"}, s.response.Manifests) - }) - - t.Run("out-of-bounds app path", func(t *testing.T) { - s, err := NewMockGenerateManifestStream("./testdata/kustomize", "./testdata/kustomize", nil) - require.NoError(t, err) - // set a malicious app path on the metadata - s.metadataRequest.Request.(*apiclient.AppStreamRequest_Metadata).Metadata.AppRelPath = "../out-of-bounds" - err = service.generateManifestGeneric(s) - require.ErrorContains(t, err, "illegal appPath") - assert.Nil(t, s.response) - }) -} - -type MockMatchRepositoryStream struct { - metadataSent bool - fileSent bool - metadataRequest *apiclient.AppStreamRequest - fileRequest *apiclient.AppStreamRequest - response *apiclient.RepositoryResponse -} - -func NewMockMatchRepositoryStream(repoPath, appPath string, env []string) (*MockMatchRepositoryStream, error) { - tgz, mr, err := cmp.GetCompressedRepoAndMetadata(repoPath, appPath, env, nil, nil) - if err != nil { - return nil, err - } - defer tgzstream.CloseAndDelete(tgz) - - tgzBuffer := bytes.NewBuffer(nil) - _, err = io.Copy(tgzBuffer, tgz) - if err != nil { - return nil, fmt.Errorf("failed to copy manifest targz to a byte buffer: %w", err) - } - - return &MockMatchRepositoryStream{ - metadataRequest: mr, - fileRequest: cmp.AppFileRequest(tgzBuffer.Bytes()), - }, nil -} - -func (m *MockMatchRepositoryStream) SendAndClose(response *apiclient.RepositoryResponse) error { - m.response = response - return nil -} - -func (m *MockMatchRepositoryStream) Recv() (*apiclient.AppStreamRequest, error) { - if !m.metadataSent { - m.metadataSent = true - return m.metadataRequest, nil - } - - if !m.fileSent { - m.fileSent = true - return m.fileRequest, nil - } - return nil, io.EOF -} - -func (m *MockMatchRepositoryStream) Context() context.Context { - return context.Background() -} - -func TestService_MatchRepository(t *testing.T) { - configFilePath := "./testdata/kustomize/config" - service, err := newService(configFilePath) - require.NoError(t, err) - - t.Run("supported app", func(t *testing.T) { - s, err := NewMockMatchRepositoryStream("./testdata/kustomize", "./testdata/kustomize", nil) - require.NoError(t, err) - err = service.matchRepositoryGeneric(s) - require.NoError(t, err) - require.NotNil(t, s.response) - assert.True(t, s.response.IsSupported) - }) - - t.Run("unsupported app", func(t *testing.T) { - s, err := NewMockMatchRepositoryStream("./testdata/ksonnet", "./testdata/ksonnet", nil) - require.NoError(t, err) - err = service.matchRepositoryGeneric(s) - require.NoError(t, err) - require.NotNil(t, s.response) - assert.False(t, s.response.IsSupported) - }) -} - -type MockParametersAnnouncementStream struct { - metadataSent bool - fileSent bool - metadataRequest *apiclient.AppStreamRequest - fileRequest *apiclient.AppStreamRequest - response *apiclient.ParametersAnnouncementResponse -} - -func NewMockParametersAnnouncementStream(repoPath, appPath string, env []string) (*MockParametersAnnouncementStream, error) { - tgz, mr, err := cmp.GetCompressedRepoAndMetadata(repoPath, appPath, env, nil, nil) - if err != nil { - return nil, err - } - defer tgzstream.CloseAndDelete(tgz) - - tgzBuffer := bytes.NewBuffer(nil) - _, err = io.Copy(tgzBuffer, tgz) - if err != nil { - return nil, fmt.Errorf("failed to copy manifest targz to a byte buffer: %w", err) - } - - return &MockParametersAnnouncementStream{ - metadataRequest: mr, - fileRequest: cmp.AppFileRequest(tgzBuffer.Bytes()), - }, nil -} - -func (m *MockParametersAnnouncementStream) SendAndClose(response *apiclient.ParametersAnnouncementResponse) error { - m.response = response - return nil -} - -func (m *MockParametersAnnouncementStream) Recv() (*apiclient.AppStreamRequest, error) { - if !m.metadataSent { - m.metadataSent = true - return m.metadataRequest, nil - } - - if !m.fileSent { - m.fileSent = true - return m.fileRequest, nil - } - return nil, io.EOF -} - -func (m *MockParametersAnnouncementStream) SetHeader(metadata.MD) error { - return nil -} - -func (m *MockParametersAnnouncementStream) SendHeader(metadata.MD) error { - return nil -} - -func (m *MockParametersAnnouncementStream) SetTrailer(metadata.MD) {} - -func (m *MockParametersAnnouncementStream) Context() context.Context { - return context.Background() -} - -func (m *MockParametersAnnouncementStream) SendMsg(interface{}) error { - return nil -} - -func (m *MockParametersAnnouncementStream) RecvMsg(interface{}) error { - return nil -} - -func TestService_GetParametersAnnouncement(t *testing.T) { - configFilePath := "./testdata/kustomize/config" - service, err := newService(configFilePath) - require.NoError(t, err) - - t.Run("successful response", func(t *testing.T) { - s, err := NewMockParametersAnnouncementStream("./testdata/kustomize", "./testdata/kustomize", nil) - require.NoError(t, err) - err = service.GetParametersAnnouncement(s) - require.NoError(t, err) - require.NotNil(t, s.response) - require.Len(t, s.response.ParameterAnnouncements, 1) - assert.Equal(t, repoclient.ParameterAnnouncement{Name: "test-param", String_: "test-value"}, *s.response.ParameterAnnouncements[0]) - }) - t.Run("out of bounds app", func(t *testing.T) { - s, err := NewMockParametersAnnouncementStream("./testdata/kustomize", "./testdata/kustomize", nil) - require.NoError(t, err) - // set a malicious app path on the metadata - s.metadataRequest.Request.(*apiclient.AppStreamRequest_Metadata).Metadata.AppRelPath = "../out-of-bounds" - err = service.GetParametersAnnouncement(s) - require.ErrorContains(t, err, "illegal appPath") - require.Nil(t, s.response) - }) -} diff --git a/cmpserver/plugin/testdata/kustomize/config/plugin.yaml b/cmpserver/plugin/testdata/kustomize/config/plugin.yaml index addc30c7b4c21..b6b7a154a7aee 100644 --- a/cmpserver/plugin/testdata/kustomize/config/plugin.yaml +++ b/cmpserver/plugin/testdata/kustomize/config/plugin.yaml @@ -7,12 +7,8 @@ spec: init: command: [kustomize, version] generate: - command: [sh, -c, "kustomize build"] + command: [sh, -c, "cd testdata/kustomize && kustomize build"] discover: find: command: [sh, -c, find . -name kustomization.yaml] - glob: "**/kustomization.yaml" - parameters: - static: - - name: test-param - string: test-value + glob: "**/*/kustomization.yaml" diff --git a/cmpserver/server.go b/cmpserver/server.go index bbb493f6b1d66..f66da10605695 100644 --- a/cmpserver/server.go +++ b/cmpserver/server.go @@ -108,7 +108,7 @@ func (a *ArgoCDCMPServer) CreateGRPC() (*grpc.Server, error) { return true, nil })) pluginService := plugin.NewService(a.initConstants) - err := pluginService.Init(common.GetCMPWorkDir()) + err := pluginService.Init() if err != nil { return nil, fmt.Errorf("error initializing plugin service: %s", err) } diff --git a/controller/appcontroller.go b/controller/appcontroller.go index 58d0f0aa74bf5..55c2abc9cc47e 100644 --- a/controller/appcontroller.go +++ b/controller/appcontroller.go @@ -415,32 +415,33 @@ func isKnownOrphanedResourceExclusion(key kube.ResourceKey, proj *appv1.AppProje func (ctrl *ApplicationController) getResourceTree(a *appv1.Application, managedResources []*appv1.ResourceDiff) (*appv1.ApplicationTree, error) { nodes := make([]appv1.ResourceNode, 0) + proj, err := ctrl.getAppProj(a) if err != nil { - return nil, fmt.Errorf("failed to get project: %w", err) + return nil, err } - orphanedNodesMap := make(map[kube.ResourceKey]appv1.ResourceNode) warnOrphaned := true if proj.Spec.OrphanedResources != nil { orphanedNodesMap, err = ctrl.stateCache.GetNamespaceTopLevelResources(a.Spec.Destination.Server, a.Spec.Destination.Namespace) if err != nil { - return nil, fmt.Errorf("failed to get namespace top-level resources: %w", err) + return nil, err } warnOrphaned = proj.Spec.OrphanedResources.IsWarn() } + for i := range managedResources { managedResource := managedResources[i] delete(orphanedNodesMap, kube.NewResourceKey(managedResource.Group, managedResource.Kind, managedResource.Namespace, managedResource.Name)) var live = &unstructured.Unstructured{} err := json.Unmarshal([]byte(managedResource.LiveState), &live) if err != nil { - return nil, fmt.Errorf("failed to unmarshal live state of managed resources: %w", err) + return nil, err } var target = &unstructured.Unstructured{} err = json.Unmarshal([]byte(managedResource.TargetState), &target) if err != nil { - return nil, fmt.Errorf("failed to unmarshal target state of managed resources: %w", err) + return nil, err } if live == nil { @@ -456,11 +457,7 @@ func (ctrl *ApplicationController) getResourceTree(a *appv1.Application, managed } else { err := ctrl.stateCache.IterateHierarchy(a.Spec.Destination.Server, kube.GetResourceKey(live), func(child appv1.ResourceNode, appName string) bool { permitted, _ := proj.IsResourcePermitted(schema.GroupKind{Group: child.ResourceRef.Group, Kind: child.ResourceRef.Kind}, child.Namespace, a.Spec.Destination, func(project string) ([]*appv1.Cluster, error) { - clusters, err := ctrl.db.GetProjectClusters(context.TODO(), project) - if err != nil { - return nil, fmt.Errorf("failed to get project clusters: %w", err) - } - return clusters, nil + return ctrl.db.GetProjectClusters(context.TODO(), project) }) if !permitted { return false @@ -469,7 +466,7 @@ func (ctrl *ApplicationController) getResourceTree(a *appv1.Application, managed return true }) if err != nil { - return nil, fmt.Errorf("failed to iterate resource hierarchy: %w", err) + return nil, err } } } @@ -518,7 +515,7 @@ func (ctrl *ApplicationController) getResourceTree(a *appv1.Application, managed hosts, err := ctrl.getAppHosts(a, nodes) if err != nil { - return nil, fmt.Errorf("failed to get app hosts: %w", err) + return nil, err } return &appv1.ApplicationTree{Nodes: nodes, OrphanedNodes: orphanedNodes, Hosts: hosts}, nil } @@ -754,7 +751,6 @@ func (ctrl *ApplicationController) Run(ctx context.Context, statusProcessors int // needs to be the qualified name of the application, i.e. /. func (ctrl *ApplicationController) requestAppRefresh(appName string, compareWith *CompareWith, after *time.Duration) { key := ctrl.toAppKey(appName) - if compareWith != nil && after != nil { ctrl.appComparisonTypeRefreshQueue.AddAfter(fmt.Sprintf("%s/%d", key, compareWith), *after) } else { @@ -911,7 +907,7 @@ func (ctrl *ApplicationController) processProjectQueueItem() (processNext bool) func (ctrl *ApplicationController) finalizeProjectDeletion(proj *appv1.AppProject) error { apps, err := ctrl.appLister.Applications(ctrl.namespace).List(labels.Everything()) if err != nil { - return fmt.Errorf("error listing applications: %w", err) + return err } appsCount := 0 for i := range apps { @@ -1081,7 +1077,7 @@ func (ctrl *ApplicationController) finalizeApplicationDeletion(app *appv1.Applic func (ctrl *ApplicationController) removeCascadeFinalizer(app *appv1.Application) error { _, err := ctrl.getAppProj(app) if err != nil { - return fmt.Errorf("error getting project: %w", err) + return err } app.UnSetCascadedDeletion() var patch []byte @@ -1260,12 +1256,12 @@ func (ctrl *ApplicationController) setOperationState(app *appv1.Application, sta } patchJSON, err := json.Marshal(patch) if err != nil { - return fmt.Errorf("error marshaling json: %w", err) + return err } if app.Status.OperationState != nil && app.Status.OperationState.FinishedAt != nil && state.FinishedAt == nil { patchJSON, err = jsonpatch.MergeMergePatches(patchJSON, []byte(`{"status": {"operationState": {"finishedAt": null}}}`)) if err != nil { - return fmt.Errorf("error merging operation state patch: %w", err) + return err } } @@ -1276,7 +1272,7 @@ func (ctrl *ApplicationController) setOperationState(app *appv1.Application, sta if apierr.IsNotFound(err) { return nil } - return fmt.Errorf("error patching application with operation state: %w", err) + return err } log.Infof("updated '%s' operation (phase: %s)", app.QualifiedName(), state.Phase) if state.Phase.Completed() { @@ -1317,6 +1313,7 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo } ctrl.appRefreshQueue.Done(appKey) }() + obj, exists, err := ctrl.appInformer.GetIndexer().GetByKey(appKey.(string)) if err != nil { log.Errorf("Failed to get application '%s' from informer index: %+v", appKey, err) @@ -1337,9 +1334,9 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo if !needRefresh { return } + app := origApp.DeepCopy() logCtx := log.WithFields(log.Fields{"application": app.QualifiedName()}) - startTime := time.Now() defer func() { reconcileDuration := time.Since(startTime) @@ -1360,7 +1357,7 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo } else { var tree *appv1.ApplicationTree if tree, err = ctrl.getResourceTree(app, managedResources); err == nil { - app.Status.Summary = tree.GetSummary(app) + app.Status.Summary = tree.GetSummary() if err := ctrl.cache.SetAppResourcesTree(app.InstanceName(ctrl.namespace), tree); err != nil { logCtx.Errorf("Failed to cache resources tree: %v", err) return @@ -1392,38 +1389,15 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo localManifests = opState.Operation.Sync.Manifests } - revisions := make([]string, 0) - sources := make([]appv1.ApplicationSource, 0) - - hasMultipleSources := app.Spec.HasMultipleSources() - - // If we have multiple sources, we use all the sources under `sources` field and ignore source under `source` field. - // else we use the source under the source field. - if hasMultipleSources { - for _, source := range app.Spec.Sources { - // We do not perform any filtering of duplicate sources. - // Argo CD will apply and update the resources generated from the sources automatically - // based on the order in which manifests were generated - sources = append(sources, source) - revisions = append(revisions, source.TargetRevision) - } - if comparisonLevel == CompareWithRecent { - revisions = app.Status.Sync.Revisions - } - } else { - revision := app.Spec.GetSource().TargetRevision - if comparisonLevel == CompareWithRecent { - revision = app.Status.Sync.Revision - } - revisions = append(revisions, revision) - sources = append(sources, app.Spec.GetSource()) + revision := app.Spec.Source.TargetRevision + if comparisonLevel == CompareWithRecent { + revision = app.Status.Sync.Revision } - now := metav1.Now() - compareResult := ctrl.appStateManager.CompareAppState(app, project, revisions, sources, + now := metav1.Now() + compareResult := ctrl.appStateManager.CompareAppState(app, project, revision, app.Spec.Source, refreshType == appv1.RefreshTypeHard, - comparisonLevel == CompareWithLatestForceResolve, localManifests, hasMultipleSources) - + comparisonLevel == CompareWithLatestForceResolve, localManifests) for k, v := range compareResult.timings { logCtx = logCtx.WithField(k, v.Milliseconds()) } @@ -1434,7 +1408,7 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo if err != nil { logCtx.Errorf("Failed to cache app resources: %v", err) } else { - app.Status.Summary = tree.GetSummary(app) + app.Status.Summary = tree.GetSummary() } if project.Spec.SyncWindows.Matches(app).CanSync(false) { @@ -1464,7 +1438,6 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo return resourceStatusKey(app.Status.Resources[i]) < resourceStatusKey(app.Status.Resources[j]) }) app.Status.SourceType = compareResult.appSourceType - app.Status.SourceTypes = compareResult.appSourceTypes ctrl.persistAppStatus(origApp, &app.Status) return } @@ -1490,34 +1463,27 @@ func (ctrl *ApplicationController) needRefreshAppStatus(app *appv1.Application, // user requested app refresh. refreshType = requestedType reason = fmt.Sprintf("%s refresh requested", refreshType) - } else { - if app.Spec.HasMultipleSources() { - if (len(app.Spec.Sources) != len(app.Status.Sync.ComparedTo.Sources)) || !reflect.DeepEqual(app.Spec.Sources, app.Status.Sync.ComparedTo.Sources) { - reason = "atleast one of the spec.sources differs" - compareWith = CompareWithLatestForceResolve - } - } else if !app.Spec.Source.Equals(app.Status.Sync.ComparedTo.Source) { - reason = "spec.source differs" - compareWith = CompareWithLatestForceResolve - } else if hardExpired || softExpired { - // The commented line below mysteriously crashes if app.Status.ReconciledAt is nil - // reason = fmt.Sprintf("comparison expired. reconciledAt: %v, expiry: %v", app.Status.ReconciledAt, statusRefreshTimeout) - //TODO: find existing Golang bug or create a new one - reconciledAtStr := "never" - if app.Status.ReconciledAt != nil { - reconciledAtStr = app.Status.ReconciledAt.String() - } - reason = fmt.Sprintf("comparison expired, requesting refresh. reconciledAt: %v, expiry: %v", reconciledAtStr, statusRefreshTimeout) - if hardExpired { - reason = fmt.Sprintf("comparison expired, requesting hard refresh. reconciledAt: %v, expiry: %v", reconciledAtStr, statusHardRefreshTimeout) - refreshType = appv1.RefreshTypeHard - } - } else if !app.Spec.Destination.Equals(app.Status.Sync.ComparedTo.Destination) { - reason = "spec.destination differs" - } else if requested, level := ctrl.isRefreshRequested(app.QualifiedName()); requested { - compareWith = level - reason = "controller refresh requested" - } + } else if !app.Spec.Source.Equals(app.Status.Sync.ComparedTo.Source) { + reason = "spec.source differs" + compareWith = CompareWithLatestForceResolve + } else if hardExpired || softExpired { + // The commented line below mysteriously crashes if app.Status.ReconciledAt is nil + // reason = fmt.Sprintf("comparison expired. reconciledAt: %v, expiry: %v", app.Status.ReconciledAt, statusRefreshTimeout) + //TODO: find existing Golang bug or create a new one + reconciledAtStr := "never" + if app.Status.ReconciledAt != nil { + reconciledAtStr = app.Status.ReconciledAt.String() + } + reason = fmt.Sprintf("comparison expired, requesting refresh. reconciledAt: %v, expiry: %v", reconciledAtStr, statusRefreshTimeout) + if hardExpired { + reason = fmt.Sprintf("comparison expired, requesting hard refresh. reconciledAt: %v, expiry: %v", reconciledAtStr, statusHardRefreshTimeout) + refreshType = appv1.RefreshTypeHard + } + } else if !app.Spec.Destination.Equals(app.Status.Sync.ComparedTo.Destination) { + reason = "spec.destination differs" + } else if requested, level := ctrl.isRefreshRequested(app.QualifiedName()); requested { + compareWith = level + reason = "controller refresh requested" } if reason != "" { @@ -1554,9 +1520,7 @@ func (ctrl *ApplicationController) refreshAppConditions(app *appv1.Application) func (ctrl *ApplicationController) normalizeApplication(orig, app *appv1.Application) { logCtx := log.WithFields(log.Fields{"application": app.QualifiedName()}) app.Spec = *argo.NormalizeApplicationSpec(&app.Spec) - patch, modified, err := diff.CreateTwoWayMergePatch(orig, app, appv1.Application{}) - if err != nil { logCtx.Errorf("error constructing app spec patch: %v", err) } else if modified { @@ -1600,6 +1564,7 @@ func (ctrl *ApplicationController) persistAppStatus(orig *appv1.Application, new logCtx.Infof("No status changes. Skipping patch") return } + logCtx.Debugf("patch: %s", string(patch)) appClient := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(orig.Namespace) _, err = appClient.Patch(context.Background(), orig.Name, types.MergePatchType, patch, metav1.PatchOptions{}) if err != nil { @@ -1615,7 +1580,6 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus * return nil } logCtx := log.WithFields(log.Fields{"application": app.QualifiedName()}) - if app.Operation != nil { logCtx.Infof("Skipping auto-sync: another operation is in progress") return nil @@ -1647,15 +1611,13 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus * } desiredCommitSHA := syncStatus.Revision - desiredCommitSHAsMS := syncStatus.Revisions - alreadyAttempted, attemptPhase := alreadyAttemptedSync(app, desiredCommitSHA, desiredCommitSHAsMS, app.Spec.HasMultipleSources()) + alreadyAttempted, attemptPhase := alreadyAttemptedSync(app, desiredCommitSHA) selfHeal := app.Spec.SyncPolicy.Automated.SelfHeal op := appv1.Operation{ Sync: &appv1.SyncOperation{ Revision: desiredCommitSHA, Prune: app.Spec.SyncPolicy.Automated.Prune, SyncOptions: app.Spec.SyncPolicy.SyncOptions, - Revisions: desiredCommitSHAsMS, }, InitiatedBy: appv1.OperationInitiator{Automated: true}, Retry: appv1.RetryStrategy{Limit: 5}, @@ -1707,6 +1669,7 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus * return &appv1.ApplicationCondition{Type: appv1.ApplicationConditionSyncError, Message: message} } } + appIf := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace) _, err := argo.SetAppOperation(appIf, app.Name, &op) if err != nil { @@ -1721,41 +1684,20 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus * // alreadyAttemptedSync returns whether or not the most recent sync was performed against the // commitSHA and with the same app source config which are currently set in the app -func alreadyAttemptedSync(app *appv1.Application, commitSHA string, commitSHAsMS []string, hasMultipleSources bool) (bool, synccommon.OperationPhase) { +func alreadyAttemptedSync(app *appv1.Application, commitSHA string) (bool, synccommon.OperationPhase) { if app.Status.OperationState == nil || app.Status.OperationState.Operation.Sync == nil || app.Status.OperationState.SyncResult == nil { return false, "" } - if hasMultipleSources { - if !reflect.DeepEqual(app.Status.OperationState.SyncResult.Revisions, commitSHAsMS) { - return false, "" - } - } else { - if app.Status.OperationState.SyncResult.Revision != commitSHA { - return false, "" - } - } - - if hasMultipleSources { - // Ignore differences in target revision, since we already just verified commitSHAs are equal, - // and we do not want to trigger auto-sync due to things like HEAD != master - specSources := app.Spec.Sources.DeepCopy() - syncSources := app.Status.OperationState.SyncResult.Sources.DeepCopy() - for _, source := range specSources { - source.TargetRevision = "" - } - for _, source := range syncSources { - source.TargetRevision = "" - } - return reflect.DeepEqual(app.Spec.Sources, app.Status.OperationState.SyncResult.Sources), app.Status.OperationState.Phase - } else { - // Ignore differences in target revision, since we already just verified commitSHAs are equal, - // and we do not want to trigger auto-sync due to things like HEAD != master - specSource := app.Spec.Source.DeepCopy() - specSource.TargetRevision = "" - syncResSource := app.Status.OperationState.SyncResult.Source.DeepCopy() - syncResSource.TargetRevision = "" - return reflect.DeepEqual(app.Spec.GetSource(), app.Status.OperationState.SyncResult.Source), app.Status.OperationState.Phase + if app.Status.OperationState.SyncResult.Revision != commitSHA { + return false, "" } + // Ignore differences in target revision, since we already just verified commitSHAs are equal, + // and we do not want to trigger auto-sync due to things like HEAD != master + specSource := app.Spec.Source.DeepCopy() + specSource.TargetRevision = "" + syncResSource := app.Status.OperationState.SyncResult.Source.DeepCopy() + syncResSource.TargetRevision = "" + return reflect.DeepEqual(app.Spec.Source, app.Status.OperationState.SyncResult.Source), app.Status.OperationState.Phase } func (ctrl *ApplicationController) shouldSelfHeal(app *appv1.Application) (bool, time.Duration) { diff --git a/controller/appcontroller_test.go b/controller/appcontroller_test.go index fff4c7f37db5c..037af67ef715f 100644 --- a/controller/appcontroller_test.go +++ b/controller/appcontroller_test.go @@ -865,7 +865,7 @@ func TestNeedRefreshAppStatus(t *testing.T) { app.Status.Sync = argoappv1.SyncStatus{ Status: argoappv1.SyncStatusCodeSynced, ComparedTo: argoappv1.ComparedTo{ - Source: app.Spec.GetSource(), + Source: app.Spec.Source, Destination: app.Spec.Destination, }, } @@ -909,7 +909,7 @@ func TestNeedRefreshAppStatus(t *testing.T) { app.Status.Sync = argoappv1.SyncStatus{ Status: argoappv1.SyncStatusCodeSynced, ComparedTo: argoappv1.ComparedTo{ - Source: app.Spec.GetSource(), + Source: app.Spec.Source, Destination: app.Spec.Destination, }, } @@ -1012,7 +1012,7 @@ func TestUpdateReconciledAt(t *testing.T) { app := newFakeApp() reconciledAt := metav1.NewTime(time.Now().Add(-1 * time.Second)) app.Status = argoappv1.ApplicationStatus{ReconciledAt: &reconciledAt} - app.Status.Sync = argoappv1.SyncStatus{ComparedTo: argoappv1.ComparedTo{Source: app.Spec.GetSource(), Destination: app.Spec.Destination}} + app.Status.Sync = argoappv1.SyncStatus{ComparedTo: argoappv1.ComparedTo{Source: app.Spec.Source, Destination: app.Spec.Destination}} ctrl := newFakeController(&fakeData{ apps: []runtime.Object{app, &defaultProj}, manifestResponse: &apiclient.ManifestResponse{ diff --git a/controller/cache/cache.go b/controller/cache/cache.go index 23cde35a5bd19..3f4086cb0965e 100644 --- a/controller/cache/cache.go +++ b/controller/cache/cache.go @@ -220,10 +220,10 @@ func asResourceNode(r *clustercache.Resource) appv1.ResourceNode { gv = schema.GroupVersion{} } parentRefs := make([]appv1.ResourceRef, len(r.OwnerRefs)) - for i, ownerRef := range r.OwnerRefs { + for _, ownerRef := range r.OwnerRefs { ownerGvk := schema.FromAPIVersionAndKind(ownerRef.APIVersion, ownerRef.Kind) ownerKey := kube.NewResourceKey(ownerGvk.Group, ownerRef.Kind, r.Ref.Namespace, ownerRef.Name) - parentRefs[i] = appv1.ResourceRef{Name: ownerRef.Name, Kind: ownerKey.Kind, Namespace: r.Ref.Namespace, Group: ownerKey.Group, UID: string(ownerRef.UID)} + parentRefs[0] = appv1.ResourceRef{Name: ownerRef.Name, Kind: ownerKey.Kind, Namespace: r.Ref.Namespace, Group: ownerKey.Group, UID: string(ownerRef.UID)} } var resHealth *appv1.HealthStatus resourceInfo := resInfo(r) @@ -382,18 +382,13 @@ func (c *liveStateCache) getCluster(server string) (clustercache.ClusterCache, e cluster, err := c.db.GetCluster(context.Background(), server) if err != nil { - return nil, fmt.Errorf("error getting cluster: %w", err) + return nil, err } if !c.canHandleCluster(cluster) { return nil, fmt.Errorf("controller is configured to ignore cluster %s", cluster.Server) } - resourceCustomLabels, err := c.settingsMgr.GetResourceCustomLabels() - if err != nil { - return nil, fmt.Errorf("error getting custom label: %w", err) - } - clusterCacheOpts := []clustercache.UpdateSettingsFunc{ clustercache.SetListSemaphore(semaphore.NewWeighted(clusterCacheListSemaphoreSize)), clustercache.SetListPageSize(clusterCacheListPageSize), @@ -405,7 +400,7 @@ func (c *liveStateCache) getCluster(server string) (clustercache.ClusterCache, e clustercache.SetClusterResources(cluster.ClusterResources), clustercache.SetPopulateResourceInfoHandler(func(un *unstructured.Unstructured, isRoot bool) (interface{}, bool) { res := &ResourceInfo{} - populateNodeInfo(un, res, resourceCustomLabels) + populateNodeInfo(un, res) c.lock.RLock() cacheSettings := c.cacheSettings c.lock.RUnlock() @@ -461,11 +456,11 @@ func (c *liveStateCache) getCluster(server string) (clustercache.ClusterCache, e func (c *liveStateCache) getSyncedCluster(server string) (clustercache.ClusterCache, error) { clusterCache, err := c.getCluster(server) if err != nil { - return nil, fmt.Errorf("error getting cluster: %w", err) + return nil, err } err = clusterCache.EnsureSynced() if err != nil { - return nil, fmt.Errorf("error synchronizing cache state : %w", err) + return nil, err } return clusterCache, nil } @@ -599,7 +594,7 @@ func (c *liveStateCache) watchSettings(ctx context.Context) { func (c *liveStateCache) Init() error { cacheSettings, err := c.loadCacheSettings() if err != nil { - return fmt.Errorf("error loading cache settings: %w", err) + return err } c.cacheSettings = *cacheSettings return nil diff --git a/controller/cache/cache_test.go b/controller/cache/cache_test.go index 9d1fad82b0279..dcff97edb2157 100644 --- a/controller/cache/cache_test.go +++ b/controller/cache/cache_test.go @@ -6,12 +6,11 @@ import ( "net/url" "testing" - "github.com/stretchr/testify/assert" - "k8s.io/api/core/v1" apierr "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" + "github.com/stretchr/testify/assert" + "github.com/argoproj/gitops-engine/pkg/cache" "github.com/argoproj/gitops-engine/pkg/cache/mocks" "github.com/stretchr/testify/mock" @@ -154,51 +153,3 @@ func TestIsRetryableError(t *testing.T) { assert.True(t, isRetryableError(connectionReset)) }) } - -func Test_asResourceNode_owner_refs(t *testing.T) { - resNode := asResourceNode(&cache.Resource{ - ResourceVersion: "", - Ref: v1.ObjectReference{ - APIVersion: "v1", - }, - OwnerRefs: []metav1.OwnerReference{ - { - APIVersion: "v1", - Kind: "ConfigMap", - Name: "cm-1", - }, - { - APIVersion: "v1", - Kind: "ConfigMap", - Name: "cm-2", - }, - }, - CreationTimestamp: nil, - Info: nil, - Resource: nil, - }) - expected := appv1.ResourceNode{ - ResourceRef: appv1.ResourceRef{ - Version: "v1", - }, - ParentRefs: []appv1.ResourceRef{ - { - Group: "", - Kind: "ConfigMap", - Name: "cm-1", - }, - { - Group: "", - Kind: "ConfigMap", - Name: "cm-2", - }, - }, - Info: nil, - NetworkingInfo: nil, - ResourceVersion: "", - Images: nil, - Health: nil, - CreatedAt: nil, - } - assert.Equal(t, expected, resNode) -} diff --git a/controller/cache/info.go b/controller/cache/info.go index 3cc7980ad8e12..a6e5e419a3942 100644 --- a/controller/cache/info.go +++ b/controller/cache/info.go @@ -19,21 +19,12 @@ import ( "github.com/argoproj/argo-cd/v2/util/resource" ) -func populateNodeInfo(un *unstructured.Unstructured, res *ResourceInfo, customLabels []string) { +func populateNodeInfo(un *unstructured.Unstructured, res *ResourceInfo) { gvk := un.GroupVersionKind() revision := resource.GetRevision(un) if revision > 0 { res.Info = append(res.Info, v1alpha1.InfoItem{Name: "Revision", Value: fmt.Sprintf("Rev:%v", revision)}) } - if len(customLabels) > 0 { - if labels := un.GetLabels(); labels != nil { - for _, customLabel := range customLabels { - if value, ok := labels[customLabel]; ok { - res.Info = append(res.Info, v1alpha1.InfoItem{Name: customLabel, Value: value}) - } - } - } - } switch gvk.Group { case "": switch gvk.Kind { diff --git a/controller/cache/info_test.go b/controller/cache/info_test.go index 6c9977876bae0..a4b6f31477de0 100644 --- a/controller/cache/info_test.go +++ b/controller/cache/info_test.go @@ -271,7 +271,7 @@ func TestGetPodInfo(t *testing.T) { `) info := &ResourceInfo{} - populateNodeInfo(pod, info, []string{}) + populateNodeInfo(pod, info) assert.Equal(t, []v1alpha1.InfoItem{ {Name: "Node", Value: "minikube"}, {Name: "Containers", Value: "0/1"}, @@ -302,7 +302,7 @@ status: `) info := &ResourceInfo{} - populateNodeInfo(node, info, []string{}) + populateNodeInfo(node, info) assert.Equal(t, &NodeInfo{ Name: "minikube", Capacity: v1.ResourceList{v1.ResourceMemory: resource.MustParse("6091320Ki"), v1.ResourceCPU: resource.MustParse("6")}, @@ -312,7 +312,7 @@ status: func TestGetServiceInfo(t *testing.T) { info := &ResourceInfo{} - populateNodeInfo(testService, info, []string{}) + populateNodeInfo(testService, info) assert.Equal(t, 0, len(info.Info)) assert.Equal(t, &v1alpha1.ResourceNetworkingInfo{ TargetLabels: map[string]string{"app": "guestbook"}, @@ -322,7 +322,7 @@ func TestGetServiceInfo(t *testing.T) { func TestGetLinkAnnotatedServiceInfo(t *testing.T) { info := &ResourceInfo{} - populateNodeInfo(testLinkAnnotatedService, info, []string{}) + populateNodeInfo(testLinkAnnotatedService, info) assert.Equal(t, 0, len(info.Info)) assert.Equal(t, &v1alpha1.ResourceNetworkingInfo{ TargetLabels: map[string]string{"app": "guestbook"}, @@ -333,7 +333,7 @@ func TestGetLinkAnnotatedServiceInfo(t *testing.T) { func TestGetIstioVirtualServiceInfo(t *testing.T) { info := &ResourceInfo{} - populateNodeInfo(testIstioVirtualService, info, []string{}) + populateNodeInfo(testIstioVirtualService, info) assert.Equal(t, 0, len(info.Info)) require.NotNil(t, info.NetworkingInfo) require.NotNil(t, info.NetworkingInfo.TargetRefs) @@ -363,7 +363,7 @@ func TestGetIngressInfo(t *testing.T) { } for _, tc := range tests { info := &ResourceInfo{} - populateNodeInfo(tc.Ingress, info, []string{}) + populateNodeInfo(tc.Ingress, info) assert.Equal(t, 0, len(info.Info)) sort.Slice(info.NetworkingInfo.TargetRefs, func(i, j int) bool { return strings.Compare(info.NetworkingInfo.TargetRefs[j].Name, info.NetworkingInfo.TargetRefs[i].Name) < 0 @@ -388,7 +388,7 @@ func TestGetIngressInfo(t *testing.T) { func TestGetLinkAnnotatedIngressInfo(t *testing.T) { info := &ResourceInfo{} - populateNodeInfo(testLinkAnnotatedIngress, info, []string{}) + populateNodeInfo(testLinkAnnotatedIngress, info) assert.Equal(t, 0, len(info.Info)) sort.Slice(info.NetworkingInfo.TargetRefs, func(i, j int) bool { return strings.Compare(info.NetworkingInfo.TargetRefs[j].Name, info.NetworkingInfo.TargetRefs[i].Name) < 0 @@ -412,7 +412,7 @@ func TestGetLinkAnnotatedIngressInfo(t *testing.T) { func TestGetIngressInfoWildCardPath(t *testing.T) { info := &ResourceInfo{} - populateNodeInfo(testIngressWildCardPath, info, []string{}) + populateNodeInfo(testIngressWildCardPath, info) assert.Equal(t, 0, len(info.Info)) sort.Slice(info.NetworkingInfo.TargetRefs, func(i, j int) bool { return strings.Compare(info.NetworkingInfo.TargetRefs[j].Name, info.NetworkingInfo.TargetRefs[i].Name) < 0 @@ -436,7 +436,7 @@ func TestGetIngressInfoWildCardPath(t *testing.T) { func TestGetIngressInfoWithoutTls(t *testing.T) { info := &ResourceInfo{} - populateNodeInfo(testIngressWithoutTls, info, []string{}) + populateNodeInfo(testIngressWithoutTls, info) assert.Equal(t, 0, len(info.Info)) sort.Slice(info.NetworkingInfo.TargetRefs, func(i, j int) bool { return strings.Compare(info.NetworkingInfo.TargetRefs[j].Name, info.NetworkingInfo.TargetRefs[i].Name) < 0 @@ -481,7 +481,7 @@ func TestGetIngressInfoWithHost(t *testing.T) { - ip: 107.178.210.11`) info := &ResourceInfo{} - populateNodeInfo(ingress, info, []string{}) + populateNodeInfo(ingress, info) assert.Equal(t, &v1alpha1.ResourceNetworkingInfo{ Ingress: []v1.LoadBalancerIngress{{IP: "107.178.210.11"}}, @@ -514,7 +514,7 @@ func TestGetIngressInfoNoHost(t *testing.T) { `) info := &ResourceInfo{} - populateNodeInfo(ingress, info, []string{}) + populateNodeInfo(ingress, info) assert.Equal(t, &v1alpha1.ResourceNetworkingInfo{ TargetRefs: []v1alpha1.ResourceRef{{ @@ -549,7 +549,7 @@ func TestExternalUrlWithSubPath(t *testing.T) { - ip: 107.178.210.11`) info := &ResourceInfo{} - populateNodeInfo(ingress, info, []string{}) + populateNodeInfo(ingress, info) expectedExternalUrls := []string{"https://107.178.210.11/my/sub/path/"} assert.Equal(t, expectedExternalUrls, info.NetworkingInfo.ExternalURLs) @@ -585,7 +585,7 @@ func TestExternalUrlWithMultipleSubPaths(t *testing.T) { - ip: 107.178.210.11`) info := &ResourceInfo{} - populateNodeInfo(ingress, info, []string{}) + populateNodeInfo(ingress, info) expectedExternalUrls := []string{"https://helm-guestbook.com/my/sub/path/", "https://helm-guestbook.com/my/sub/path/2", "https://helm-guestbook.com"} actualURLs := info.NetworkingInfo.ExternalURLs @@ -615,7 +615,7 @@ func TestExternalUrlWithNoSubPath(t *testing.T) { - ip: 107.178.210.11`) info := &ResourceInfo{} - populateNodeInfo(ingress, info, []string{}) + populateNodeInfo(ingress, info) expectedExternalUrls := []string{"https://107.178.210.11"} assert.Equal(t, expectedExternalUrls, info.NetworkingInfo.ExternalURLs) @@ -643,54 +643,8 @@ func TestExternalUrlWithNetworkingApi(t *testing.T) { - ip: 107.178.210.11`) info := &ResourceInfo{} - populateNodeInfo(ingress, info, []string{}) + populateNodeInfo(ingress, info) expectedExternalUrls := []string{"https://107.178.210.11"} assert.Equal(t, expectedExternalUrls, info.NetworkingInfo.ExternalURLs) } - -func TestCustomLabel(t *testing.T) { - configmap := strToUnstructured(` - apiVersion: v1 - kind: ConfigMap - metadata: - name: cm`) - - info := &ResourceInfo{} - populateNodeInfo(configmap, info, []string{"my-label"}) - - assert.Equal(t, 0, len(info.Info)) - - configmap = strToUnstructured(` - apiVersion: v1 - kind: ConfigMap - metadata: - name: cm - labels: - my-label: value`) - - info = &ResourceInfo{} - populateNodeInfo(configmap, info, []string{"my-label", "other-label"}) - - assert.Equal(t, 1, len(info.Info)) - assert.Equal(t, "my-label", info.Info[0].Name) - assert.Equal(t, "value", info.Info[0].Value) - - configmap = strToUnstructured(` - apiVersion: v1 - kind: ConfigMap - metadata: - name: cm - labels: - my-label: value - other-label: value2`) - - info = &ResourceInfo{} - populateNodeInfo(configmap, info, []string{"my-label", "other-label"}) - - assert.Equal(t, 2, len(info.Info)) - assert.Equal(t, "my-label", info.Info[0].Name) - assert.Equal(t, "value", info.Info[0].Value) - assert.Equal(t, "other-label", info.Info[1].Name) - assert.Equal(t, "value2", info.Info[1].Value) -} diff --git a/controller/clusterinfoupdater.go b/controller/clusterinfoupdater.go index 04ec12dec5040..111f74497604a 100644 --- a/controller/clusterinfoupdater.go +++ b/controller/clusterinfoupdater.go @@ -3,7 +3,7 @@ package controller import ( "context" "time" - "fmt" + "github.com/argoproj/gitops-engine/pkg/cache" "github.com/argoproj/gitops-engine/pkg/utils/kube" log "github.com/sirupsen/logrus" @@ -93,7 +93,7 @@ func (c *clusterInfoUpdater) updateClusters() { func (c *clusterInfoUpdater) updateClusterInfo(cluster appv1.Cluster, info *cache.ClusterInfo) error { apps, err := c.appLister.List(labels.Everything()) if err != nil { - return fmt.Errorf("error while fetching the apps list: %w", err) + return err } var appCount int64 for _, a := range apps { @@ -117,7 +117,7 @@ func (c *clusterInfoUpdater) updateClusterInfo(cluster appv1.Cluster, info *cach } if info != nil { clusterInfo.ServerVersion = info.K8SVersion - clusterInfo.APIVersions = argo.APIResourcesToStrings(info.APIResources, true) + clusterInfo.APIVersions = argo.APIResourcesToStrings(info.APIResources, false) if info.LastCacheSyncTime == nil { clusterInfo.ConnectionState.Status = appv1.ConnectionStatusUnknown } else if info.SyncError == nil { diff --git a/controller/health.go b/controller/health.go index 34a1ea07a0132..ddd57e6fbb9f7 100644 --- a/controller/health.go +++ b/controller/health.go @@ -41,30 +41,27 @@ func setApplicationHealth(resources []managedResource, statuses []appv1.Resource savedErr = err } } + if healthStatus != nil { + if persistResourceHealth { + resHealth := appv1.HealthStatus{Status: healthStatus.Status, Message: healthStatus.Message} + statuses[i].Health = &resHealth + } else { + statuses[i].Health = nil + } - if healthStatus == nil { - continue - } - - if persistResourceHealth { - resHealth := appv1.HealthStatus{Status: healthStatus.Status, Message: healthStatus.Message} - statuses[i].Health = &resHealth - } else { - statuses[i].Health = nil - } - - // Is health status is missing but resource has not built-in/custom health check then it should not affect parent app health - if _, hasOverride := healthOverrides[lua.GetConfigMapKey(gvk)]; healthStatus.Status == health.HealthStatusMissing && !hasOverride && health.GetHealthCheckFunc(gvk) == nil { - continue - } + // Is health status is missing but resource has not built-in/custom health check then it should not affect parent app health + if _, hasOverride := healthOverrides[lua.GetConfigMapKey(gvk)]; healthStatus.Status == health.HealthStatusMissing && !hasOverride && health.GetHealthCheckFunc(gvk) == nil { + continue + } - // Missing or Unknown health status of child Argo CD app should not affect parent - if res.Kind == application.ApplicationKind && res.Group == application.Group && (healthStatus.Status == health.HealthStatusMissing || healthStatus.Status == health.HealthStatusUnknown) { - continue - } + // Missing or Unknown health status of child Argo CD app should not affect parent + if res.Kind == application.ApplicationKind && res.Group == application.Group && (healthStatus.Status == health.HealthStatusMissing || healthStatus.Status == health.HealthStatusUnknown) { + continue + } - if health.IsWorse(appHealth.Status, healthStatus.Status) { - appHealth.Status = healthStatus.Status + if health.IsWorse(appHealth.Status, healthStatus.Status) { + appHealth.Status = healthStatus.Status + } } } if persistResourceHealth { diff --git a/controller/metrics/metrics.go b/controller/metrics/metrics.go index 3cd9837ff7036..dbb4bfd8dcace 100644 --- a/controller/metrics/metrics.go +++ b/controller/metrics/metrics.go @@ -13,7 +13,7 @@ import ( "github.com/argoproj/gitops-engine/pkg/health" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/robfig/cron/v3" + "github.com/robfig/cron" log "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/labels" @@ -193,10 +193,7 @@ func NewMetricsServer(addr string, appLister applister.ApplicationLister, appFil redisRequestCounter: redisRequestCounter, redisRequestHistogram: redisRequestHistogram, hostname: hostname, - // This cron is used to expire the metrics cache. - // Currently clearing the metrics cache is logging and deleting from the map - // so there is no possibility of panic, but we will add a chain to keep robfig/cron v1 behavior. - cron: cron.New(cron.WithChain(cron.Recover(cron.PrintfLogger(log.StandardLogger())))), + cron: cron.New(), }, nil } @@ -284,7 +281,7 @@ func (m *MetricsServer) SetExpiration(cacheExpiration time.Duration) error { return errors.New("Expiration is already set") } - _, err := m.cron.AddFunc(fmt.Sprintf("@every %s", cacheExpiration), func() { + err := m.cron.AddFunc(fmt.Sprintf("@every %s", cacheExpiration), func() { log.Infof("Reset Prometheus metrics based on existing expiration '%v'", cacheExpiration) m.syncCounter.Reset() m.kubectlExecCounter.Reset() @@ -381,7 +378,7 @@ func (c *appCollector) collectApps(ch chan<- prometheus.Metric, app *argoappv1.A healthStatus = health.HealthStatusUnknown } - addGauge(descAppInfo, 1, git.NormalizeGitURL(app.Spec.GetSource().RepoURL), app.Spec.Destination.Server, app.Spec.Destination.Namespace, string(syncStatus), string(healthStatus), operation) + addGauge(descAppInfo, 1, git.NormalizeGitURL(app.Spec.Source.RepoURL), app.Spec.Destination.Server, app.Spec.Destination.Namespace, string(syncStatus), string(healthStatus), operation) if len(c.appLabels) > 0 { labelValues := []string{} diff --git a/controller/state.go b/controller/state.go index b9eb784e89023..8ee6012630458 100644 --- a/controller/state.go +++ b/controller/state.go @@ -62,7 +62,7 @@ type managedResource struct { // AppStateManager defines methods which allow to compare application spec and actual application state. type AppStateManager interface { - CompareAppState(app *v1alpha1.Application, project *appv1.AppProject, revisions []string, sources []v1alpha1.ApplicationSource, noCache bool, noRevisionCache bool, localObjects []string, hasMultipleSources bool) *comparisonResult + CompareAppState(app *v1alpha1.Application, project *appv1.AppProject, revision string, source v1alpha1.ApplicationSource, noCache bool, noRevisionCache bool, localObjects []string) *comparisonResult SyncAppState(app *v1alpha1.Application, state *v1alpha1.OperationState) } @@ -75,8 +75,6 @@ type comparisonResult struct { reconciliationResult sync.ReconciliationResult diffConfig argodiff.DiffConfig appSourceType v1alpha1.ApplicationSourceType - // appSourceTypes stores the SourceType for each application source under sources field - appSourceTypes []v1alpha1.ApplicationSourceType // timings maps phases of comparison to the duration it took to complete (for statistical purposes) timings map[string]time.Duration diffResultList *diff.DiffResultList @@ -107,8 +105,7 @@ type appStateManager struct { persistResourceHealth bool } -func (m *appStateManager) getRepoObjs(app *v1alpha1.Application, sources []v1alpha1.ApplicationSource, appLabelKey string, revisions []string, noCache, noRevisionCache, verifySignature bool, proj *v1alpha1.AppProject) ([]*unstructured.Unstructured, map[*v1alpha1.ApplicationSource]*apiclient.ManifestResponse, error) { - +func (m *appStateManager) getRepoObjs(app *v1alpha1.Application, source v1alpha1.ApplicationSource, appLabelKey, revision string, noCache, noRevisionCache, verifySignature bool, proj *v1alpha1.AppProject) ([]*unstructured.Unstructured, *apiclient.ManifestResponse, error) { ts := stats.NewTimingStats() helmRepos, err := m.db.ListHelmRepositories(context.Background()) if err != nil { @@ -118,7 +115,11 @@ func (m *appStateManager) getRepoObjs(app *v1alpha1.Application, sources []v1alp if err != nil { return nil, nil, err } - + ts.AddCheckpoint("helm_ms") + repo, err := m.db.GetRepository(context.Background(), source.RepoURL) + if err != nil { + return nil, nil, err + } ts.AddCheckpoint("repo_ms") helmRepositoryCredentials, err := m.db.GetAllHelmRepositoryCredentials(context.Background()) if err != nil { @@ -128,6 +129,15 @@ func (m *appStateManager) getRepoObjs(app *v1alpha1.Application, sources []v1alp if err != nil { return nil, nil, err } + conn, repoClient, err := m.repoClientset.NewRepoServerClient() + if err != nil { + return nil, nil, err + } + defer io.Close(conn) + + if revision == "" { + revision = source.TargetRevision + } plugins, err := m.settingsMgr.GetConfigManagementPlugins() if err != nil { @@ -148,87 +158,48 @@ func (m *appStateManager) getRepoObjs(app *v1alpha1.Application, sources []v1alp return nil, nil, err } - helmOptions, err := m.settingsMgr.GetHelmSettings() + kustomizeOptions, err := kustomizeSettings.GetOptions(app.Spec.Source) if err != nil { return nil, nil, err } + helmOptions, err := m.settingsMgr.GetHelmSettings() + if err != nil { + return nil, nil, err + } ts.AddCheckpoint("build_options_ms") serverVersion, apiResources, err := m.liveStateCache.GetVersionsInfo(app.Spec.Destination.Server) if err != nil { return nil, nil, err } - conn, repoClient, err := m.repoClientset.NewRepoServerClient() + ts.AddCheckpoint("version_ms") + manifestInfo, err := repoClient.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ + Repo: repo, + Repos: permittedHelmRepos, + Revision: revision, + NoCache: noCache, + NoRevisionCache: noRevisionCache, + AppLabelKey: appLabelKey, + AppName: app.InstanceName(m.namespace), + Namespace: app.Spec.Destination.Namespace, + ApplicationSource: &source, + Plugins: tools, + KustomizeOptions: kustomizeOptions, + KubeVersion: serverVersion, + ApiVersions: argo.APIResourcesToStrings(apiResources, true), + VerifySignature: verifySignature, + HelmRepoCreds: permittedHelmCredentials, + TrackingMethod: string(argo.GetTrackingMethod(m.settingsMgr)), + EnabledSourceTypes: enabledSourceTypes, + HelmOptions: helmOptions, + }) if err != nil { return nil, nil, err } - defer io.Close(conn) - - manifestInfoMap := make(map[*v1alpha1.ApplicationSource]*apiclient.ManifestResponse) - targetObjs := make([]*unstructured.Unstructured, 0) + targetObjs, err := unmarshalManifests(manifestInfo.Manifests) - // Store the map of all sources having ref field into a map for applications with sources field - refSources, err := argo.GetRefSources(context.Background(), app.Spec, m.db) if err != nil { - return nil, nil, fmt.Errorf("failed to get ref sources: %v", err) - } - - for i, source := range sources { - if len(revisions) < len(sources) || revisions[i] == "" { - revisions[i] = source.TargetRevision - } - ts.AddCheckpoint("helm_ms") - repo, err := m.db.GetRepository(context.Background(), source.RepoURL) - if err != nil { - return nil, nil, err - } - kustomizeOptions, err := kustomizeSettings.GetOptions(source) - if err != nil { - return nil, nil, err - } - - ts.AddCheckpoint("version_ms") - log.Debugf("Generating Manifest for source %s revision %s", source, revisions[i]) - manifestInfo, err := repoClient.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ - Repo: repo, - Repos: permittedHelmRepos, - Revision: revisions[i], - NoCache: noCache, - NoRevisionCache: noRevisionCache, - AppLabelKey: appLabelKey, - AppName: app.InstanceName(m.namespace), - Namespace: app.Spec.Destination.Namespace, - ApplicationSource: &source, - Plugins: tools, - KustomizeOptions: kustomizeOptions, - KubeVersion: serverVersion, - ApiVersions: argo.APIResourcesToStrings(apiResources, true), - VerifySignature: verifySignature, - HelmRepoCreds: permittedHelmCredentials, - TrackingMethod: string(argo.GetTrackingMethod(m.settingsMgr)), - EnabledSourceTypes: enabledSourceTypes, - HelmOptions: helmOptions, - HasMultipleSources: app.Spec.HasMultipleSources(), - RefSources: refSources, - }) - if err != nil { - return nil, nil, err - } - - // GenerateManifest can return empty ManifestResponse without error if app has multiple sources - // and if any of the source does not have path and chart field not specified. - // In that scenario, we continue to the next source - if app.Spec.HasMultipleSources() && len(manifestInfo.Manifests) == 0 { - continue - } - - targetObj, err := unmarshalManifests(manifestInfo.Manifests) - - if err != nil { - return nil, nil, err - } - targetObjs = append(targetObjs, targetObj...) - manifestInfoMap[&source] = manifestInfo + return nil, nil, err } ts.AddCheckpoint("unmarshal_ms") @@ -238,7 +209,7 @@ func (m *appStateManager) getRepoObjs(app *v1alpha1.Application, sources []v1alp } logCtx = logCtx.WithField("time_ms", time.Since(ts.StartTime).Milliseconds()) logCtx.Info("getRepoObjs stats") - return targetObjs, manifestInfoMap, nil + return targetObjs, manifestInfo, nil } func unmarshalManifests(manifests []string) ([]*unstructured.Unstructured, error) { @@ -354,7 +325,7 @@ func verifyGnuPGSignature(revision string, project *appv1.AppProject, manifestIn // CompareAppState compares application git state to the live app state, using the specified // revision and supplied source. If revision or overrides are empty, then compares against // revision and overrides in the app spec. -func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *appv1.AppProject, revisions []string, sources []v1alpha1.ApplicationSource, noCache bool, noRevisionCache bool, localManifests []string, hasMultipleSources bool) *comparisonResult { +func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *appv1.AppProject, revision string, source v1alpha1.ApplicationSource, noCache bool, noRevisionCache bool, localManifests []string) *comparisonResult { ts := stats.NewTimingStats() appLabelKey, resourceOverrides, resFilter, err := m.getComparisonSettings() @@ -362,24 +333,12 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap // return unknown comparison result if basic comparison settings cannot be loaded if err != nil { - if hasMultipleSources { - return &comparisonResult{ - syncStatus: &v1alpha1.SyncStatus{ - ComparedTo: appv1.ComparedTo{Destination: app.Spec.Destination, Sources: sources}, - Status: appv1.SyncStatusCodeUnknown, - Revisions: revisions, - }, - healthStatus: &appv1.HealthStatus{Status: health.HealthStatusUnknown}, - } - } else { - return &comparisonResult{ - syncStatus: &v1alpha1.SyncStatus{ - ComparedTo: appv1.ComparedTo{Source: sources[0], Destination: app.Spec.Destination}, - Status: appv1.SyncStatusCodeUnknown, - Revision: revisions[0], - }, - healthStatus: &appv1.HealthStatus{Status: health.HealthStatusUnknown}, - } + return &comparisonResult{ + syncStatus: &v1alpha1.SyncStatus{ + ComparedTo: appv1.ComparedTo{Source: source, Destination: app.Spec.Destination}, + Status: appv1.SyncStatusCodeUnknown, + }, + healthStatus: &appv1.HealthStatus{Status: health.HealthStatusUnknown}, } } @@ -397,21 +356,11 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap logCtx.Infof("Comparing app state (cluster: %s, namespace: %s)", app.Spec.Destination.Server, app.Spec.Destination.Namespace) var targetObjs []*unstructured.Unstructured + var manifestInfo *apiclient.ManifestResponse now := metav1.Now() - var manifestInfoMap map[*v1alpha1.ApplicationSource]*apiclient.ManifestResponse - if len(localManifests) == 0 { - // If the length of revisions is not same as the length of sources, - // we take the revisions from the sources directly for all the sources. - if len(revisions) != len(sources) { - revisions = make([]string, 0) - for _, source := range sources { - revisions = append(revisions, source.TargetRevision) - } - } - - targetObjs, manifestInfoMap, err = m.getRepoObjs(app, sources, appLabelKey, revisions, noCache, noRevisionCache, verifySignature, project) + targetObjs, manifestInfo, err = m.getRepoObjs(app, source, appLabelKey, revision, noCache, noRevisionCache, verifySignature, project) if err != nil { targetObjs = make([]*unstructured.Unstructured, 0) conditions = append(conditions, v1alpha1.ApplicationCondition{Type: v1alpha1.ApplicationConditionComparisonError, Message: err.Error(), LastTransitionTime: &now}) @@ -433,10 +382,7 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap failedToLoadObjs = true } } - // empty out manifestInfoMap - for as := range manifestInfoMap { - delete(manifestInfoMap, as) - } + manifestInfo = nil } ts.AddCheckpoint("git_ms") @@ -470,7 +416,6 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap conditions = append(conditions, v1alpha1.ApplicationCondition{Type: v1alpha1.ApplicationConditionComparisonError, Message: err.Error(), LastTransitionTime: &now}) failedToLoadObjs = true } - logCtx.Debugf("Retrieved lived manifests") // filter out all resources which are not permitted in the application project @@ -514,16 +459,10 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap log.Warnf("Could not get compare options from ConfigMap (assuming defaults): %v", err) compareOptions = settings.GetDefaultDiffOptions() } - manifestRevisions := make([]string, 0) - - for _, manifestInfo := range manifestInfoMap { - manifestRevisions = append(manifestRevisions, manifestInfo.Revision) - } // restore comparison using cached diff result if previous comparison was performed for the same revision - revisionChanged := len(manifestInfoMap) != len(sources) || !reflect.DeepEqual(app.Status.Sync.Revisions, manifestRevisions) - specChanged := !reflect.DeepEqual(app.Status.Sync.ComparedTo, appv1.ComparedTo{Source: app.Spec.GetSource(), Destination: app.Spec.Destination, Sources: sources}) - + revisionChanged := manifestInfo == nil || app.Status.Sync.Revision != manifestInfo.Revision + specChanged := !reflect.DeepEqual(app.Status.Sync.ComparedTo, appv1.ComparedTo{Source: app.Spec.Source, Destination: app.Spec.Destination}) _, refreshRequested := app.IsRefreshRequested() noCache = noCache || refreshRequested || app.Status.Expired(m.statusRefreshTimeout) || specChanged || revisionChanged @@ -652,32 +591,16 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap if failedToLoadObjs { syncCode = v1alpha1.SyncStatusCodeUnknown } - var revision string - - if !hasMultipleSources && len(manifestRevisions) > 0 { - revision = manifestRevisions[0] + syncStatus := v1alpha1.SyncStatus{ + ComparedTo: appv1.ComparedTo{ + Source: source, + Destination: app.Spec.Destination, + }, + Status: syncCode, } - var syncStatus v1alpha1.SyncStatus - if hasMultipleSources { - syncStatus = v1alpha1.SyncStatus{ - ComparedTo: appv1.ComparedTo{ - Destination: app.Spec.Destination, - Sources: sources, - }, - Status: syncCode, - Revisions: manifestRevisions, - } - } else { - syncStatus = v1alpha1.SyncStatus{ - ComparedTo: appv1.ComparedTo{ - Destination: app.Spec.Destination, - Source: app.Spec.GetSource(), - }, - Status: syncCode, - Revision: revision, - } + if manifestInfo != nil { + syncStatus.Revision = manifestInfo.Revision } - ts.AddCheckpoint("sync_ms") healthStatus, err := setApplicationHealth(managedResources, resourceSummaries, resourceOverrides, app, m.persistResourceHealth) @@ -688,10 +611,8 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap // Git has already performed the signature verification via its GPG interface, and the result is available // in the manifest info received from the repository server. We now need to form our opinion about the result // and stop processing if we do not agree about the outcome. - for _, manifestInfo := range manifestInfoMap { - if gpg.IsGPGEnabled() && verifySignature && manifestInfo != nil { - conditions = append(conditions, verifyGnuPGSignature(manifestInfo.Revision, project, manifestInfo)...) - } + if gpg.IsGPGEnabled() && verifySignature && manifestInfo != nil { + conditions = append(conditions, verifyGnuPGSignature(revision, project, manifestInfo)...) } compRes := comparisonResult{ @@ -703,18 +624,9 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap diffConfig: diffConfig, diffResultList: diffResults, } - - if hasMultipleSources { - for _, manifestInfo := range manifestInfoMap { - compRes.appSourceTypes = append(compRes.appSourceTypes, appv1.ApplicationSourceType(manifestInfo.SourceType)) - } - } else { - for _, manifestInfo := range manifestInfoMap { - compRes.appSourceType = v1alpha1.ApplicationSourceType(manifestInfo.SourceType) - break - } + if manifestInfo != nil { + compRes.appSourceType = v1alpha1.ApplicationSourceType(manifestInfo.SourceType) } - app.Status.SetConditions(conditions, map[appv1.ApplicationConditionType]bool{ appv1.ApplicationConditionComparisonError: true, appv1.ApplicationConditionSharedResourceWarning: true, @@ -726,29 +638,18 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap return &compRes } -func (m *appStateManager) persistRevisionHistory(app *v1alpha1.Application, revision string, source v1alpha1.ApplicationSource, revisions []string, sources []v1alpha1.ApplicationSource, hasMultipleSources bool, startedAt metav1.Time) error { +func (m *appStateManager) persistRevisionHistory(app *v1alpha1.Application, revision string, source v1alpha1.ApplicationSource, startedAt metav1.Time) error { var nextID int64 if len(app.Status.History) > 0 { nextID = app.Status.History.LastRevisionHistory().ID + 1 } - - if hasMultipleSources { - app.Status.History = append(app.Status.History, v1alpha1.RevisionHistory{ - DeployedAt: metav1.NewTime(time.Now().UTC()), - DeployStartedAt: &startedAt, - ID: nextID, - Sources: sources, - Revisions: revisions, - }) - } else { - app.Status.History = append(app.Status.History, v1alpha1.RevisionHistory{ - Revision: revision, - DeployedAt: metav1.NewTime(time.Now().UTC()), - DeployStartedAt: &startedAt, - ID: nextID, - Source: source, - }) - } + app.Status.History = append(app.Status.History, v1alpha1.RevisionHistory{ + Revision: revision, + DeployedAt: metav1.NewTime(time.Now().UTC()), + DeployStartedAt: &startedAt, + ID: nextID, + Source: source, + }) app.Status.History = app.Status.History.Trunc(app.Spec.GetRevisionHistoryLimit()) @@ -758,7 +659,7 @@ func (m *appStateManager) persistRevisionHistory(app *v1alpha1.Application, revi }, }) if err != nil { - return fmt.Errorf("error marshaling revision history patch: %w", err) + return err } _, err = m.appclientset.ArgoprojV1alpha1().Applications(app.Namespace).Patch(context.Background(), app.Name, types.MergePatchType, patch, metav1.PatchOptions{}) return err diff --git a/controller/state_test.go b/controller/state_test.go index 8883464267538..7d577ea1cb82d 100644 --- a/controller/state_test.go +++ b/controller/state_test.go @@ -38,11 +38,7 @@ func TestCompareAppStateEmpty(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -65,11 +61,7 @@ func TestCompareAppStateMissing(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeOutOfSync, compRes.syncStatus.Status) @@ -96,11 +88,7 @@ func TestCompareAppStateExtra(t *testing.T) { }, } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeOutOfSync, compRes.syncStatus.Status) assert.Equal(t, 1, len(compRes.resources)) @@ -126,11 +114,7 @@ func TestCompareAppStateHook(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) assert.Equal(t, 0, len(compRes.resources)) @@ -157,11 +141,7 @@ func TestCompareAppStateSkipHook(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) assert.Equal(t, 1, len(compRes.resources)) @@ -187,11 +167,7 @@ func TestCompareAppStateCompareOptionIgnoreExtraneous(t *testing.T) { } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -219,11 +195,7 @@ func TestCompareAppStateExtraHook(t *testing.T) { }, } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -266,11 +238,7 @@ func TestCompareAppStateDuplicatedNamespacedResources(t *testing.T) { }, } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.Equal(t, 1, len(app.Status.Conditions)) @@ -321,11 +289,7 @@ func TestSetHealth(t *testing.T) { }, }) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.Equal(t, health.HealthStatusHealthy, compRes.healthStatus.Status) } @@ -357,11 +321,7 @@ func TestSetHealthSelfReferencedApp(t *testing.T) { }, }) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.Equal(t, health.HealthStatusHealthy, compRes.healthStatus.Status) } @@ -431,11 +391,7 @@ func TestReturnUnknownComparisonStateOnSettingLoadError(t *testing.T) { }, }) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.Equal(t, health.HealthStatusUnknown, compRes.healthStatus.Status) assert.Equal(t, argoappv1.SyncStatusCodeUnknown, compRes.syncStatus.Status) @@ -482,7 +438,7 @@ func Test_appStateManager_persistRevisionHistory(t *testing.T) { app.Spec.RevisionHistoryLimit = &i } addHistory := func() { - err := manager.persistRevisionHistory(app, "my-revision", argoappv1.ApplicationSource{}, []string{}, []argoappv1.ApplicationSource{}, false, metav1.Time{}) + err := manager.persistRevisionHistory(app, "my-revision", argoappv1.ApplicationSource{}, metav1.Time{}) assert.NoError(t, err) } addHistory() @@ -518,7 +474,7 @@ func Test_appStateManager_persistRevisionHistory(t *testing.T) { assert.Len(t, app.Status.History, 9) metav1NowTime := metav1.NewTime(time.Now()) - err := manager.persistRevisionHistory(app, "my-revision", argoappv1.ApplicationSource{}, []string{}, []argoappv1.ApplicationSource{}, false, metav1NowTime) + err := manager.persistRevisionHistory(app, "my-revision", argoappv1.ApplicationSource{}, metav1NowTime) assert.NoError(t, err) assert.Equal(t, app.Status.History.LastRevisionHistory().DeployStartedAt, &metav1NowTime) } @@ -572,11 +528,7 @@ func TestSignedResponseNoSignatureRequired(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -598,11 +550,7 @@ func TestSignedResponseNoSignatureRequired(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -631,11 +579,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "") - compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, "", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -657,11 +601,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "abc123") - compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, "abc123", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -683,11 +623,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "abc123") - compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, "abc123", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -709,11 +645,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "abc123") - compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, "abc123", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -738,11 +670,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { ctrl := newFakeController(&data) testProj := signedProj testProj.Spec.SignatureKeys[0].KeyID = "4AEE18F83AFDEB24" - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "abc123") - compRes := ctrl.appStateManager.CompareAppState(app, &testProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &testProj, "abc123", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -767,11 +695,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { // it doesn't matter for our test whether local manifests are valid localManifests := []string{"foobar"} ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "abc123") - compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, localManifests, false) + compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, "abc123", app.Spec.Source, false, false, localManifests) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeUnknown, compRes.syncStatus.Status) @@ -796,11 +720,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured), } ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "abc123") - compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, nil, false) + compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, "abc123", app.Spec.Source, false, false, nil) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) @@ -809,7 +729,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { assert.Len(t, app.Status.Conditions, 0) } - // Signature required and local manifests supplied and GPG subsystem is disabled - sync + // Signature required and local manifests supplied and GPG subystem is disabled - sync { app := newFakeApp() data := fakeData{ @@ -825,11 +745,7 @@ func TestSignedResponseSignatureRequired(t *testing.T) { // it doesn't matter for our test whether local manifests are valid localManifests := []string{""} ctrl := newFakeController(&data) - sources := make([]argoappv1.ApplicationSource, 0) - sources = append(sources, app.Spec.GetSource()) - revisions := make([]string, 0) - revisions = append(revisions, "abc123") - compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, revisions, sources, false, false, localManifests, false) + compRes := ctrl.appStateManager.CompareAppState(app, &signedProj, "abc123", app.Spec.Source, false, false, localManifests) assert.NotNil(t, compRes) assert.NotNil(t, compRes.syncStatus) assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status) diff --git a/controller/sync.go b/controller/sync.go index 65e86851ee364..5f597495cee0a 100644 --- a/controller/sync.go +++ b/controller/sync.go @@ -9,8 +9,6 @@ import ( "sync/atomic" "time" - cdcommon "github.com/argoproj/argo-cd/v2/common" - "github.com/argoproj/gitops-engine/pkg/sync" "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/argoproj/gitops-engine/pkg/utils/kube" @@ -22,6 +20,7 @@ import ( "k8s.io/apimachinery/pkg/util/managedfields" "k8s.io/kubectl/pkg/util/openapi" + cdcommon "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/controller/metrics" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" listersv1alpha1 "github.com/argoproj/argo-cd/v2/pkg/client/listers/application/v1alpha1" @@ -66,8 +65,6 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha var syncOp v1alpha1.SyncOperation var syncRes *v1alpha1.SyncOperationResult var source v1alpha1.ApplicationSource - var sources []v1alpha1.ApplicationSource - revisions := make([]string, 0) if state.Operation.Sync == nil { state.Phase = common.OperationFailed @@ -85,53 +82,31 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha return } - if syncOp.Source == nil || (syncOp.Sources != nil && len(syncOp.Sources) > 0) { - // normal sync case (where source is taken from app.spec.sources) - if app.Spec.HasMultipleSources() { - sources = app.Spec.Sources - } else { - // normal sync case (where source is taken from app.spec.source) - source = app.Spec.GetSource() - sources = make([]v1alpha1.ApplicationSource, 0) - } + if syncOp.Source == nil { + // normal sync case (where source is taken from app.spec.source) + source = app.Spec.Source } else { // rollback case - if app.Spec.HasMultipleSources() { - sources = state.Operation.Sync.Sources - } else { - source = *state.Operation.Sync.Source - sources = make([]v1alpha1.ApplicationSource, 0) - } + source = *state.Operation.Sync.Source } if state.SyncResult != nil { syncRes = state.SyncResult revision = state.SyncResult.Revision - revisions = append(revisions, state.SyncResult.Revisions...) } else { syncRes = &v1alpha1.SyncOperationResult{} // status.operationState.syncResult.source. must be set properly since auto-sync relies // on this information to decide if it should sync (if source is different than the last // sync attempt) - if app.Spec.HasMultipleSources() { - syncRes.Sources = sources - } else { - syncRes.Source = source - } + syncRes.Source = source state.SyncResult = syncRes } - // if we get here, it means we did not remember a commit SHA which we should be syncing to. - // This typically indicates we are just about to begin a brand new sync/rollback operation. - // Take the value in the requested operation. We will resolve this to a SHA later. - if app.Spec.HasMultipleSources() { - if len(revisions) != len(sources) { - revisions = syncOp.Revisions - } - } else { - if revision == "" { - revision = syncOp.Revision - } + if revision == "" { + // if we get here, it means we did not remember a commit SHA which we should be syncing to. + // This typically indicates we are just about to begin a brand new sync/rollback operation. + // Take the value in the requested operation. We will resolve this to a SHA later. + revision = syncOp.Revision } proj, err := argo.GetAppProject(app, listersv1alpha1.NewAppProjectLister(m.projInformer.GetIndexer()), m.namespace, m.settingsMgr, m.db, context.TODO()) @@ -141,23 +116,10 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha return } - if app.Spec.HasMultipleSources() { - revisions = syncRes.Revisions - } else { - revisions = append(revisions, revision) - } - - if !app.Spec.HasMultipleSources() { - sources = []v1alpha1.ApplicationSource{source} - revisions = []string{revision} - } - - compareResult := m.CompareAppState(app, proj, revisions, sources, false, true, syncOp.Manifests, app.Spec.HasMultipleSources()) + compareResult := m.CompareAppState(app, proj, revision, source, false, true, syncOp.Manifests) // We now have a concrete commit SHA. Save this in the sync result revision so that we remember // what we should be syncing to when resuming operations. - syncRes.Revision = compareResult.syncStatus.Revision - syncRes.Revisions = compareResult.syncStatus.Revisions // If there are any comparison or spec errors error conditions do not perform the operation if errConditions := app.Status.GetConditions(map[v1alpha1.ApplicationConditionType]bool{ @@ -250,7 +212,14 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha } trackingMethod := argo.GetTrackingMethod(m.settingsMgr) - opts := []sync.SyncOpt{ + syncCtx, cleanup, err := sync.NewSyncContext( + compareResult.syncStatus.Revision, + reconciliationResult, + restConfig, + rawConfig, + m.kubectl, + app.Spec.Destination.Namespace, + openAPISchema, sync.WithLogr(logutils.NewLogrusLogger(logEntry)), sync.WithHealthOverride(lua.ResourceHealthOverrides(resourceOverrides)), sync.WithPermissionValidator(func(un *unstructured.Unstructured, res *v1.APIResource) error { @@ -280,6 +249,13 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha m.isSelfReferencedObj(live, target, app.GetName(), appLabelKey, trackingMethod) }), sync.WithManifestValidation(!syncOp.SyncOptions.HasOption(common.SyncOptionsDisableValidation)), + sync.WithNamespaceCreation(syncOp.SyncOptions.HasOption("CreateNamespace=true"), func(un *unstructured.Unstructured) bool { + if un != nil && kube.GetAppInstanceLabel(un, cdcommon.LabelKeyAppInstance) != "" { + kube.UnsetLabel(un, cdcommon.LabelKeyAppInstance) + return true + } + return false + }), sync.WithSyncWaveHook(delayBetweenSyncWaves), sync.WithPruneLast(syncOp.SyncOptions.HasOption(common.SyncOptionPruneLast)), sync.WithResourceModificationChecker(syncOp.SyncOptions.HasOption("ApplyOutOfSyncOnly=true"), compareResult.diffResultList), @@ -287,21 +263,6 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha sync.WithReplace(syncOp.SyncOptions.HasOption(common.SyncOptionReplace)), sync.WithServerSideApply(syncOp.SyncOptions.HasOption(common.SyncOptionServerSideApply)), sync.WithServerSideApplyManager(cdcommon.ArgoCDSSAManager), - } - - if syncOp.SyncOptions.HasOption("CreateNamespace=true") { - opts = append(opts, sync.WithNamespaceModifier(syncNamespace(m.resourceTracking, appLabelKey, trackingMethod, app.Name, app.Spec.SyncPolicy))) - } - - syncCtx, cleanup, err := sync.NewSyncContext( - compareResult.syncStatus.Revision, - reconciliationResult, - restConfig, - rawConfig, - m.kubectl, - app.Spec.Destination.Namespace, - openAPISchema, - opts..., ) if err != nil { @@ -340,7 +301,7 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha logEntry.WithField("duration", time.Since(start)).Info("sync/terminate complete") if !syncOp.DryRun && len(syncOp.Resources) == 0 && state.Phase.Successful() { - err := m.persistRevisionHistory(app, compareResult.syncStatus.Revision, source, compareResult.syncStatus.Revisions, compareResult.syncStatus.ComparedTo.Sources, app.Spec.HasMultipleSources(), state.StartedAt) + err := m.persistRevisionHistory(app, compareResult.syncStatus.Revision, source, state.StartedAt) if err != nil { state.Phase = common.OperationError state.Message = fmt.Sprintf("failed to record sync to history: %v", err) diff --git a/controller/sync_namespace.go b/controller/sync_namespace.go deleted file mode 100644 index 9203e27f502e7..0000000000000 --- a/controller/sync_namespace.go +++ /dev/null @@ -1,55 +0,0 @@ -package controller - -import ( - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" - "github.com/argoproj/argo-cd/v2/util/argo" - gitopscommon "github.com/argoproj/gitops-engine/pkg/sync/common" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" -) - -// syncNamespace determine if Argo CD should create and/or manage the namespace -// where the application will be deployed. -func syncNamespace(resourceTracking argo.ResourceTracking, appLabelKey string, trackingMethod v1alpha1.TrackingMethod, appName string, syncPolicy *v1alpha1.SyncPolicy) func(m, l *unstructured.Unstructured) (bool, error) { - // This function must return true for the managed namespace to be synced. - return func(managedNs, liveNs *unstructured.Unstructured) (bool, error) { - if managedNs == nil { - return false, nil - } - - isNewNamespace := liveNs == nil - isManagedNamespace := syncPolicy != nil && syncPolicy.ManagedNamespaceMetadata != nil - - // should only sync the namespace if it doesn't exist in k8s or if - // syncPolicy is defined to manage the metadata - if !isManagedNamespace && !isNewNamespace { - return false, nil - } - - if isManagedNamespace { - managedNamespaceMetadata := syncPolicy.ManagedNamespaceMetadata - managedNs.SetLabels(managedNamespaceMetadata.Labels) - // managedNamespaceMetadata relies on SSA in order to avoid overriding - // existing labels and annotations in namespaces - managedNs.SetAnnotations(appendSSAAnnotation(managedNamespaceMetadata.Annotations)) - } - - // TODO: https://github.com/argoproj/argo-cd/issues/11196 - // err := resourceTracking.SetAppInstance(managedNs, appLabelKey, appName, "", trackingMethod) - // if err != nil { - // return false, fmt.Errorf("failed to set app instance tracking on the namespace %s: %s", managedNs.GetName(), err) - // } - - return true, nil - } -} - -// appendSSAAnnotation will set the managed namespace to be synced -// with server-side apply -func appendSSAAnnotation(in map[string]string) map[string]string { - r := map[string]string{} - for k, v := range in { - r[k] = v - } - r[gitopscommon.AnnotationSyncOptions] = gitopscommon.SyncOptionServerSideApply - return r -} diff --git a/controller/sync_namespace_test.go b/controller/sync_namespace_test.go deleted file mode 100644 index e18f52800bf03..0000000000000 --- a/controller/sync_namespace_test.go +++ /dev/null @@ -1,261 +0,0 @@ -package controller - -import ( - "github.com/argoproj/argo-cd/v2/common" - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" - "github.com/argoproj/argo-cd/v2/util/argo" - "github.com/stretchr/testify/assert" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/types" - "testing" -) - -func createFakeNamespace(uid string, resourceVersion string, labels map[string]string, annotations map[string]string) *unstructured.Unstructured { - un := unstructured.Unstructured{} - un.SetUID(types.UID(uid)) - un.SetResourceVersion(resourceVersion) - un.SetLabels(labels) - un.SetAnnotations(annotations) - un.SetKind("Namespace") - un.SetName("some-namespace") - return &un -} - -func Test_shouldNamespaceSync(t *testing.T) { - tests := []struct { - name string - syncPolicy *v1alpha1.SyncPolicy - managedNs *unstructured.Unstructured - liveNs *unstructured.Unstructured - expected bool - expectedLabels map[string]string - expectedAnnotations map[string]string - }{ - { - name: "liveNs is nil and syncPolicy is nil", - expected: false, - managedNs: nil, - liveNs: nil, - syncPolicy: nil, - }, - { - name: "liveNs is nil and syncPolicy is not nil", - expected: false, - managedNs: nil, - liveNs: nil, - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: nil, - }, - }, - { - name: "liveNs is nil and syncPolicy has labels and annotations", - expected: false, - managedNs: nil, - liveNs: nil, - expectedLabels: map[string]string{"my-cool-label": "some-value"}, - expectedAnnotations: map[string]string{"my-cool-annotation": "some-value"}, - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: map[string]string{"my-cool-label": "some-value"}, - Annotations: map[string]string{"my-cool-annotation": "some-value"}, - }, - }, - }, - { - name: "namespace does not yet exist and managedNamespaceMetadata nil", - expected: true, - expectedLabels: map[string]string{}, - expectedAnnotations: map[string]string{}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: nil, - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: nil, - }, - }, - { - name: "namespace does not yet exist and managedNamespaceMetadata not nil", - expected: true, - expectedAnnotations: map[string]string{"argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: nil, - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{}, - }, - }, - { - name: "namespace does not yet exist and managedNamespaceMetadata has empty labels map", - expected: true, - expectedLabels: map[string]string{}, - expectedAnnotations: map[string]string{"argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: nil, - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: map[string]string{}, - }, - }, - }, - { - name: "namespace does not yet exist and managedNamespaceMetadata has empty annotations map", - expected: true, - expectedAnnotations: map[string]string{"argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: nil, - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Annotations: map[string]string{}, - }, - }, - }, - { - name: "namespace does not yet exist and managedNamespaceMetadata has empty annotations and labels map", - expected: true, - expectedLabels: map[string]string{}, - expectedAnnotations: map[string]string{"argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: nil, - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: map[string]string{}, - Annotations: map[string]string{}, - }, - }, - }, - { - name: "namespace does not yet exist and managedNamespaceMetadata has labels", - expected: true, - expectedLabels: map[string]string{"my-cool-label": "some-value"}, - expectedAnnotations: map[string]string{"argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: nil, - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: map[string]string{"my-cool-label": "some-value"}, - Annotations: nil, - }, - }, - }, - { - name: "namespace does not yet exist and managedNamespaceMetadata has annotations", - expected: true, - expectedAnnotations: map[string]string{"my-cool-annotation": "some-value", "argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: nil, - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: nil, - Annotations: map[string]string{"my-cool-annotation": "some-value"}, - }, - }, - }, - { - name: "namespace does not yet exist and managedNamespaceMetadata has annotations and labels", - expected: true, - expectedLabels: map[string]string{"my-cool-label": "some-value"}, - expectedAnnotations: map[string]string{"my-cool-annotation": "some-value", "argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: nil, - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: map[string]string{"my-cool-label": "some-value"}, - Annotations: map[string]string{"my-cool-annotation": "some-value"}, - }, - }, - }, - { - name: "namespace exists with no labels or annotations and managedNamespaceMetadata has labels", - expected: true, - expectedLabels: map[string]string{"my-cool-label": "some-value"}, - expectedAnnotations: map[string]string{"argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: createFakeNamespace("something", "1", map[string]string{}, map[string]string{}), - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: map[string]string{"my-cool-label": "some-value"}, - }, - }, - }, - { - name: "namespace exists with no labels or annotations and managedNamespaceMetadata has annotations", - expected: true, - expectedAnnotations: map[string]string{"my-cool-annotation": "some-value", "argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: createFakeNamespace("something", "1", map[string]string{}, map[string]string{}), - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Annotations: map[string]string{"my-cool-annotation": "some-value"}, - }, - }, - }, - { - name: "namespace exists with no labels or annotations and managedNamespaceMetadata has annotations and labels", - expected: true, - expectedLabels: map[string]string{"my-cool-label": "some-value"}, - expectedAnnotations: map[string]string{"my-cool-annotation": "some-value", "argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: createFakeNamespace("something", "1", map[string]string{}, map[string]string{}), - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: map[string]string{"my-cool-label": "some-value"}, - Annotations: map[string]string{"my-cool-annotation": "some-value"}, - }, - }, - }, - { - name: "namespace exists with labels and managedNamespaceMetadata has mismatching labels", - expected: true, - expectedAnnotations: map[string]string{"argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - expectedLabels: map[string]string{"my-cool-label": "some-value", "my-other-label": "some-other-value"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: createFakeNamespace("something", "1", map[string]string{"my-cool-label": "some-value"}, map[string]string{}), - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: map[string]string{"my-cool-label": "some-value", "my-other-label": "some-other-value"}, - Annotations: map[string]string{}, - }, - }, - }, - { - name: "namespace exists with annotations and managedNamespaceMetadata has mismatching annotations", - expected: true, - expectedLabels: map[string]string{}, - expectedAnnotations: map[string]string{"my-cool-annotation": "some-value", "argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: createFakeNamespace("something", "1", map[string]string{}, map[string]string{"my-cool-annotation": "some-value", "my-other-annotation": "some-other-value"}), - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: map[string]string{}, - Annotations: map[string]string{"my-cool-annotation": "some-value"}, - }, - }, - }, - { - name: "namespace exists with annotations and labels managedNamespaceMetadata has mismatching annotations and labels", - expected: true, - expectedLabels: map[string]string{"my-cool-label": "some-value", "my-other-label": "some-other-value"}, - expectedAnnotations: map[string]string{"my-cool-annotation": "some-value", "my-other-annotation": "some-other-value", "argocd.argoproj.io/sync-options": "ServerSideApply=true"}, - managedNs: createFakeNamespace("", "", map[string]string{}, map[string]string{}), - liveNs: createFakeNamespace("something", "1", map[string]string{"my-cool-label": "some-value"}, map[string]string{"my-cool-annotation": "some-value"}), - syncPolicy: &v1alpha1.SyncPolicy{ - ManagedNamespaceMetadata: &v1alpha1.ManagedNamespaceMetadata{ - Labels: map[string]string{"my-cool-label": "some-value", "my-other-label": "some-other-value"}, - Annotations: map[string]string{"my-cool-annotation": "some-value", "my-other-annotation": "some-other-value"}, - }, - }, - }, - } - - 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) - - if tt.managedNs != nil { - assert.Equal(t, tt.expectedLabels, tt.managedNs.GetLabels()) - assert.Equal(t, tt.expectedAnnotations, tt.managedNs.GetAnnotations()) - } - - assert.Equalf(t, tt.expected, actual, "syncNamespace(%v)", tt.syncPolicy) - }) - } -} diff --git a/controller/sync_test.go b/controller/sync_test.go index 13406ddc0cb0e..7694d9a885a1b 100644 --- a/controller/sync_test.go +++ b/controller/sync_test.go @@ -50,12 +50,12 @@ func TestPersistRevisionHistory(t *testing.T) { }} ctrl.appStateManager.SyncAppState(app, opState) // Ensure we record spec.source into sync result - assert.Equal(t, app.Spec.GetSource(), opState.SyncResult.Source) + assert.Equal(t, app.Spec.Source, opState.SyncResult.Source) updatedApp, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace).Get(context.Background(), app.Name, v1.GetOptions{}) assert.Nil(t, err) assert.Equal(t, 1, len(updatedApp.Status.History)) - assert.Equal(t, app.Spec.GetSource(), updatedApp.Status.History[0].Source) + assert.Equal(t, app.Spec.Source, updatedApp.Status.History[0].Source) assert.Equal(t, "abc123", updatedApp.Status.History[0].Revision) } diff --git a/docs/assets/repo-add-google-cloud-source.png b/docs/assets/repo-add-google-cloud-source.png deleted file mode 100644 index a201703592d14112391b5fa976625b99d5e9d29a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109142 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 DdLc8rkNfl0!kR;xP=({dKa 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

bIu8pdbG%%p_HFjOU;cg&k=#Q;shMZN7p)bp znx7*_bqr6k&&eKdTDX_$F07~Rik((3WjNgOR*LUkHi)^bB_N4D;xPGhOJ>@_*XDwH z4xgq}-8ZyERC5IUV)i_5e8B0}D5}*{;bChl|BZ3wF6-A@BiIpCOm0+Fytaz3N6;3p|Z$Vk7!L5JS&ccS*tKiqVv8~=WjiI3#C2n+nH%9jw&ej{v>Haa(~xr!UjqR zG6MWAW9quSMU2gJ)#|0Z-Nf|y&Ohs|N;EF{EU5}Z+1r9q*O{f?j7>SyER9IgmDI*& zNTpTe6_~B!6>to?Qj(TdO=o``XQZVW=vc?Y)fN>LU=u11)}X)0Ss%-oa@{&{&kDG1 zrv3g3QD#g{+?28Rs(Ip^ky6W}DC8YOHaGp|E7@FbLO}y5*c0ZLJp`d*;34HAIPXf- z&MtoYrsN{H^@{P>W$}6GhjM7GK13VaY;-e&Hz6m-93k+Teo-YNPVuMKXv60F?$Hy# zb6lMDo;?W2zPC!PEz?EOi>>YioX2%LPT;L{}a|qMYES?{DER z#84H7hLUY%)a~Er7_v*{tk zBZongy*$v6Z1Gw1nL)6?faXO~<0b_n$wHbs6D4Ei^- zcIjrMn0z}KZa>i}KD68Z^()W7zJ|0w6R_GsS0~O#-<}3X${OlF`Mb54Iac#)H1WC! zL`xMFd*km{mHFL+-wI$4Xsxf0$U8RnPK7kcr&9IY-tFVv`?YT+Pb`rV*?^UWzJ;Sa|!;%b2hlY$-w{*T(0upXxVhjqKFN1+l4q%zcX} zz4fa;;ACz$F^j}Z$=J^aNe0vS)SW%TMp%zkC9qA31}hHpjJqKIZZRHJqguT=PmtCY znyxp@9kGtD$mX_Jh8*45M}{8D#`J{ATMw^)nRee(sXhW@jo;>ZqD9J?Jw9uhRSgeP z7eO3}NkAJSAxE)=2YvDr+SzJS)=AuBEZKWymeQcuA8)!k1`|0)FZ&|s4fMcQ4m@S% zgZEibIOEcZeW8o+zH1lIt_PJkSME%3cfNexUyMw-P@~#>kT{k_D6U|ytCW4^F?_RN zQ%xQ#dpvj}20mNr{p}_9kQOLEAA>(iuwUgSxb^Z`0Eyp?=j$(iEk^_OB+ov!bmVZ= zikPw`TF$jsoQy;t2)$Pyz%#zCWxCg+AW-HPuQqu`%>c-`49d~1{5xxBl#nJulHlQYI0 zXigW_EcXZP@HnX<{NKVRTyp11iAVV*iT-&T4+bNS`A^L!i9;T@@+p znw`7kd9z~aX^K2}tod0MO9m^EM&3D%c2QWb(M?rg2sDe3L>Ty`8^k&(W^X8LJ9(NH zEYYIS71#drOapeibD3#E=eqFgrIkM?LbuR1N!BG{ae~^foy2U@>Z`P~@`C&FMtC4? z+jMC>zoTZ21Yd86S7kEWNic&47Zb8cOg zpA@dJzT-9*W0E(>wD?R&sLbGo}ZH^1nRFDV5J>5PqEQ ze~{wuYNBSw0VW?^@@%PL4a+t`vgHwF{HZhH`sr2Ej6V;0=*8`ax+|)vaq1>&Uay-1 zja)+=9j01sY5SCoCxCywZW5AlXXL1O8p1DtyL5LpNJoB_@LGFvt$J|-n;`xy;nbrM z)o;VfveA9t&)nCT9WT5hidI^M##=3=0;)Te>pZq;Wn*Q#@A2!mUvqXPIXkC34XHMB z=rWJvS|=e{^aj|yJL(yU&iz59zMQdC(4g04+4lsI*v##I6$c?0${KFaf}`KmR8i0i znwhdt>}uCntr_SHBOHI%%}ehn(#W1|S4mrXq!esSiHVR7&ZROph~jg3RhnH@*+II| zO$$ru-m6MZahIn#q+t_HkL7J;g04yNlPXCT&tiJh5XPS|PhDU3007sN?M${hN}!_Ro?8f*F>KJi z0ledmtGWhp-WlifXUjD-hK45(tuR9PpDf)`edbT(GcLXBZT4Si^Lh91`uiI4*L(I( zVb`lLN{**53;y&v`U8j{?=Ii@IAlq(9g;n~5&Y@Lj{c�fA*tAHID^!tY%Nmr)+R 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 literal 56121 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 diff --git a/docs/cli_installation.md b/docs/cli_installation.md index 639a9317639fe..b6b803dbfaa57 100644 --- a/docs/cli_installation.md +++ b/docs/cli_installation.md @@ -39,31 +39,6 @@ rm argocd-linux-amd64 You should now be able to run `argocd` commands. - -## Mac (M1) - -### Download With Curl - -You can view the latest version of Argo CD at the link above or run the following command to grab the version: - -```bash -VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/') -``` - -Replace `VERSION` in the command below with the version of Argo CD you would like to download: - -```bash -curl -sSL -o argocd-darwin-arm64 https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-darwin-arm64 -``` - -Install the Argo CD CLI binary: - -```bash -sudo install -m 555 argocd-darwin-arm64 /usr/local/bin/argocd -rm argocd-darwin-arm64 -``` - - ## Mac ### Homebrew diff --git a/docs/developer-guide/ci.md b/docs/developer-guide/ci.md index 53796c77500e6..64d0bf02a43a9 100644 --- a/docs/developer-guide/ci.md +++ b/docs/developer-guide/ci.md @@ -65,12 +65,12 @@ make builder-image IMAGE_NAMESPACE=argoproj IMAGE_TAG=v1.0.0 ## Public CD -Every commit to master is built and published to `ghcr.io/argoproj/argo-cd/argocd:-`. The list of images is available at +Every commit to master is built and published to `ghcr.io/argoproj/argocd:-`. The list of images is available at https://github.com/argoproj/argo-cd/packages. !!! note GitHub docker registry [requires](https://github.community/t5/GitHub-Actions/docker-pull-from-public-GitHub-Package-Registry-fail-with-quot/m-p/32888#M1294) authentication to read even publicly available packages. Follow the steps from Kubernetes [documentation](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry) - to configure image pull secret if you want to use `ghcr.io/argoproj/argo-cd/argocd` image. + to configure image pull secret if you want to use `ghcr.io/argoproj/argocd` image. The image is automatically deployed to the dev Argo CD instance: [https://cd.apps.argoproj.io/](https://cd.apps.argoproj.io/) diff --git a/docs/developer-guide/code-contributions.md b/docs/developer-guide/code-contributions.md index b57d9df6d8ae6..39110c44b22dc 100644 --- a/docs/developer-guide/code-contributions.md +++ b/docs/developer-guide/code-contributions.md @@ -103,7 +103,7 @@ Design documents are usually submitted as PR and use [this template](https://git Our community regularly meets virtually to discuss issues, ideas and enhancements around Argo CD. We do invite you to join this virtual meetings if you want to bring up certain things (including your enhancement proposals), participate in our triaging or just want to get to know other contributors. -The current cadence of our meetings is weekly, every Thursday at 4:15pm UTC (8:15am Pacific, 11:15am Eastern, 5:15pm Central European, 9:45pm Indian). We use Zoom to conduct these meetings. +The current cadence of our meetings is weekly, every Thursday at 4pm UTC (9am Pacific, 12pm Eastern, 6pm Central European, 9:30pm Indian). We use Zoom to conduct these meetings. * [Agenda document (Google Docs, includes Zoom link)](https://docs.google.com/document/d/1xkoFkVviB70YBzSEa4bDnu-rUZ1sIFtwKKG1Uw8XsY8) diff --git a/docs/developer-guide/debugging-remote-environment.md b/docs/developer-guide/debugging-remote-environment.md index 7fe7f18260205..8f1f9bac0b23e 100644 --- a/docs/developer-guide/debugging-remote-environment.md +++ b/docs/developer-guide/debugging-remote-environment.md @@ -20,36 +20,6 @@ curl -sSfL https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/i ## Connect Connect to one of the services, for example, to debug the main ArgoCD server run: ```shell -kubectl config set-context --current --namespace argocd -telepresence helm install # Installs telepresence into your cluster -telepresence connect # Starts the connection to your cluster (bound to the current namespace) -telepresence intercept argocd-server --port 8080:http --env-file .envrc.remote # Starts the interception -``` -* `--port` forwards traffic of remote port http to 8080 locally (use `--port 8080:https` if argocd-server terminates TLS) -* `--env-file` writes all the environment variables of the remote pod into a local file, the variables are also set on the subprocess of the `--run` command - -With this, any traffic that hits your argocd-server service in the cluster (e.g through a LB / ingress) will be forwarded to your laptop on port 8080. So that you can now start argocd-server locally to debug or test new code. If you launch argocd-server using the environment variables in `.envrc.remote`, he is able to fetch all the configmaps, secrets and so one from the cluster and transparently connect to the other microservices so that no further configuration should be neccesary and he behaves exactly the same as in the cluster. - -List current status of Telepresence using: -```shell -telepresence status -``` - -Stop the intercept using: -```shell -telepresence leave argocd-server-argocd -``` - -And uninstall telepresence from your cluster: -```shell -telepresence helm uninstall -``` - -See [this quickstart](https://www.telepresence.io/docs/latest/howtos/intercepts/) for more information on how to intercept services using Telepresence. - -### Connect (telepresence v1) -Use the following command instead: -```shell telepresence --swap-deployment argocd-server --namespace argocd --env-file .envrc.remote --expose 8080:8080 --expose 8083:8083 --run bash ``` * `--swap-deployment` changes the argocd-server deployment @@ -57,6 +27,7 @@ telepresence --swap-deployment argocd-server --namespace argocd --env-file .envr * `--env-file` writes all the environment variables of the remote pod into a local file, the variables are also set on the subprocess of the `--run` command * `--run` defines which command to run once a connection is established, use `bash`, `zsh` or others + ## Debug Once a connection is established, use your favorite tools to start the server locally. @@ -65,23 +36,21 @@ Once a connection is established, use your favorite tools to start the server lo * Run `./dist/argocd-server` ### VSCode -In VSCode use the following launch configuration to run argocd-server: - +In VSCode use the integrated terminal to run the Telepresence command to connect. Then, to run argocd-server service use the following configuration. +Update the configuration file to point to kubeconfig file: `KUBECONFIG=` (required) ```json { - "name": "Launch argocd-server", + "name": "Launch", "type": "go", "request": "launch", "mode": "auto", - "program": "${workspaceFolder}/cmd/main.go", + "program": "${workspaceFolder}/cmd/argocd-server", "envFile": [ "${workspaceFolder}/.envrc.remote", ], "env": { - "ARGOCD_BINARY_NAME": "argocd-server", "CGO_ENABLED": "0", "KUBECONFIG": "/path/to/kube/config" } } -``` - +``` \ No newline at end of file diff --git a/docs/developer-guide/faq.md b/docs/developer-guide/faq.md index 0a8d936477bb4..2614c5530acde 100644 --- a/docs/developer-guide/faq.md +++ b/docs/developer-guide/faq.md @@ -4,7 +4,7 @@ ### Can I discuss my contribution ideas somewhere? -Sure thing! You can either open an Enhancement Proposal in our GitHub issue tracker or you can [join us on Slack](https://argoproj.github.io/community/join-slack) in channel #argo-contributors to discuss your ideas and get guidance for submitting a PR. +Sure thing! You can either open an Enhancement Proposal in our GitHub issue tracker or you can [join us on Slack](https://argoproj.github.io/community/join-slack) in channel #argo-dev to discuss your ideas and get guidance for submitting a PR. ### No one has looked at my PR yet. Why? diff --git a/docs/developer-guide/release-process-and-cadence.md b/docs/developer-guide/release-process-and-cadence.md index 71e3072aed58c..5e495c7fe0e51 100644 --- a/docs/developer-guide/release-process-and-cadence.md +++ b/docs/developer-guide/release-process-and-cadence.md @@ -1,78 +1,49 @@ # Release Process And Cadence -## Release Cycle +Argo CD is being developed using the following process: -### Schedule +* Maintainers commit to work on set of features and enhancements and create GitHub milestone to track the work. +* We are trying to avoid delaying release and prefer moving the feature into the next release if we cannot complete it on time. +* The new release is published every **3 months**. +* Critical bug-fixes are cherry-picked into the release branch and delivered using patch releases as frequently as needed. -These are the upcoming releases dates: +## Release Planning -| Release | Release Planning Meeting | Release Candidate 1 | General Availability | Release Champion | Checklist | -|---------|--------------------------|-----------------------|----------------------|-------------------------------------------------------|---------------------------------------------------------------| -| v2.6 | Monday, Dec. 12, 2022 | Monday, Dec. 19, 2022 | Monday, Feb. 6, 2023 | [William Tam](https://github.com/wtam2018) | [checklist](https://github.com/argoproj/argo-cd/issues/11563) | -| v2.7 | Monday, Mar. 6, 2023 | Monday, Mar. 20, 2023 | Monday, May. 1, 2023 | [Pavel Kostohrys](https://github.com/pasha-codefresh) | -| v2.8 | Monday, Jun. 5, 2023 | Monday, Jun. 19, 2023 | Monday, Aug. 7, 2023 | -| v2.9 | Monday, Sep. 4, 2023 | Monday, Sep. 18, 2023 | Monday, Nov. 6, 2023 | +We are using GitHub milestones to perform release planning and tracking. Each release milestone includes two type of issues: -Actual release dates might differ from the plan by a few days. +* Issues that maintainers committed to working on. Maintainers decide which features they are committing to work on during the next release based on + their availability. Typically issues added offline by each maintainer and finalized during the contributors' meeting. Each such issue should be + assigned to maintainer who plans to implement and test it. +* Nice to have improvements contributed by community contributors. Nice to have issues are typically not critical, smallish enhancements that could + be contributed by community contributors. Maintainers are not committing to implement them but committing to review PR from the community. -### Release Process +The milestone should have a clear description of the most important features as well as the expected end date. This should provide clarity to end-users +about what to expect from the next release and when. -#### Minor Releases (e.g. 2.x.0) +In addition to the next milestone, we need to maintain a draft of the upcoming release milestone. -A minor Argo CD release occurs four times a year, once every three months. Each General Availability (GA) release is -preceded by several Release Candidates (RCs). The first RC is released three weeks before the scheduled GA date. This -effectively means that there is a three-week feature freeze. +## Community Contributions -These are the approximate release dates: +We receive a lot of contributions from our awesome community, and we're very grateful for that fact. However, reviewing and testing PRs is a lot of (unplanned) work and therefore, we cannot guarantee that contributions (especially large or complex ones) made by the community receive a timely review within a release's time frame. Maintainers may decide on their own to put work on a PR together with the contributor and in this case, the maintainer will self-assigned the PR and thereby committing to review, eventually merge and later test it on the release scope. -* The first Monday of February -* The first Monday of May -* The first Monday of August -* The first Monday of November +## Release Testing -Dates may be shifted slightly to accommodate holidays. Those shifts should be minimal. +We need to make sure that each change, both from maintainers and community contributors, is tested well and have someone who is going to fix last-minute +bugs. In order to ensure it, each merged pull request must have an assigned maintainer before it gets merged. The assigned maintainer will be working on +testing the introduced changes and fixing of any introduced bugs. -#### Patch Releases (e.g. 2.5.x) +We have a code freeze period two weeks before the release until the release branch is created. During code freeze no feature PR should be merged and it is ok +to merge bug fixes. -Argo CD patch releases occur on an as-needed basis. Only the three most recent minor versions are eligible for patch -releases. Versions older than the three most recent minor versions are considered EOL and will not receive bug fixes or -security updates. +Maintainers assigned to a PR that's been merged should drive testing and work on fixing last-minute issues. For tracking purposes after verifying PR the assigned +the maintainer should label it with a `verified` label. -#### Minor Release Planning Meeting +## Releasing -Roughly two weeks before the RC date, there will be a meeting to discuss which features are planned for the RC. This meeting is -for contributors to advocate for certain features. Features which have at least one approver (besides the contributor) -who can assure they will review/merge by the RC date will be included in the release milestone. All other features will -be dropped from the milestone (and potentially shifted to the next one). +The releasing procedure is described in [releasing](./releasing.md) document. Before closing the release milestone following should be verified: -Since not everyone will be able to attend the meeting, there will be a meeting doc. Contributors can add their feature -to a table, and Approvers can add their name to the table. Features with a corresponding approver will remain in the -release milestone. - -#### Release Champion - -To help manage all the steps involved in a release, we will have a Release Champion. The Release Champion will be -responsible for a checklist of items for their release. The checklist is an issue template in the Argo CD repository. - -The Release Champion can be anyone in the Argo CD community. Some tasks (like cherry-picking bug fixes and cutting -releases) require [Approver](https://github.com/argoproj/argoproj/blob/master/community/membership.md#community-membership) -membership. The Release Champion can delegate tasks when necessary and will be responsible for coordinating with the -Approver. - -### Feature Acceptance Criteria - -To be eligible for inclusion in a minor release, a new feature must meet the following criteria before the release’s RC -date. - -If it is a large feature that involves significant design decisions, that feature must be described in a Proposal, and -that Proposal must be reviewed and merged. - -The feature PR must include: - -* Tests (passing) -* Documentation -* If necessary, a note in the Upgrading docs for the planned minor release -* The PR must be reviewed, approved, and merged by an Approver. - -If these criteria are not met by the RC date, the feature will be ineligible for inclusion in the RC series or GA for -that minor release. It will have to wait for the next minor release. +- [ ] All merged PRs and verified (verify and remove `needs-verification` label): +- [ ] Triage issues reported by `yarn audit` and ensure there are no exploitable security issues. +- [ ] Roadmap is updated based one current release changes +- [ ] Next release milestone is created +- [ ] Upcoming release milestone is updated \ No newline at end of file diff --git a/docs/developer-guide/toolchain-guide.md b/docs/developer-guide/toolchain-guide.md index c529416a2634e..a80a88c875c22 100644 --- a/docs/developer-guide/toolchain-guide.md +++ b/docs/developer-guide/toolchain-guide.md @@ -117,27 +117,6 @@ The Docker container for the virtualized toolchain will use the following local The following steps are required no matter whether you chose to use a virtualized or a local toolchain. -!!!note "Docker privileges" - If you opt in to use the virtualized toolchain, you will need to have the - appropriate privileges to interact with the Docker daemon. It is not - recommended to work as the root user, and if your user does not have the - permissions to talk to the Docker user, but you have `sudo` setup on your - system, you can set the environment variable `SUDO` to `sudo` in order to - have the build scripts make any calls to the `docker` CLI using sudo, - without affecting the other parts of the build scripts (which should be - executed with your normal user privileges). - - You can either set this before calling `make`, like so for example: - - ``` - SUDO=sudo make sometarget - ``` - - Or you can opt to export this permanently to your environment, for example - ``` - export SUDO=sudo - ``` - ### Clone the Argo CD repository from your personal fork on GitHub * `mkdir -p ~/go/src/github.com/argoproj` diff --git a/docs/faq.md b/docs/faq.md index 91ba8064c4ab8..da9bcd0602caa 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -45,9 +45,10 @@ a secret named `argocd-initial-admin-secret`. To change the password, edit the `argocd-secret` secret and update the `admin.password` field with a new bcrypt hash. !!! note "Generating a bcrypt hash" - Use the following command to generate a bcrypt hash for `admin.password` + Use a trustworthy, offline `bcrypt` implementation such as the [Python bcrypt library](https://pypi.org/project/bcrypt/) to generate the hash. - argocd account bcrypt --password + pip3 install bcrypt + python3 -c "import bcrypt; print(bcrypt.hashpw(b'YOUR-PASSWORD-HERE', bcrypt.gensalt()).decode())" To apply the new password hash, use the following command (replacing the hash with your own): diff --git a/docs/getting_started.md b/docs/getting_started.md index f931bb49494fa..585fa2f6eeb47 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -78,10 +78,10 @@ The API server can then be accessed using https://localhost:8080 The initial password for the `admin` account is auto-generated and stored as clear text in the field `password` in a secret named `argocd-initial-admin-secret` in your Argo CD installation namespace. You can simply retrieve this password -using the `argocd` CLI: +using `kubectl`: ```bash -argocd admin initial-password +kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo ``` !!! warning diff --git a/docs/operator-manual/app-any-namespace.md b/docs/operator-manual/app-any-namespace.md deleted file mode 100644 index 1471aa0d221cb..0000000000000 --- a/docs/operator-manual/app-any-namespace.md +++ /dev/null @@ -1,220 +0,0 @@ -# Applications in any namespace - -**Current feature state**: Beta - -!!! warning - Please read this documentation carefully before you enable this feature. Misconfiguration could lead to potential security issues. - -## Introduction - -As of version 2.5, Argo CD supports managing `Application` resources in namespaces other than the control plane's namespace (which is usually `argocd`), but this feature has to be explicitly enabled and configured appropriately. - -Argo CD administrators can define a certain set of namespaces where `Application` resources may be created, updated and reconciled in. However, applications in these additional namespaces will only be allowed to use certain `AppProjects`, as configured by the Argo CD administrators. This allows ordinary Argo CD users (e.g. application teams) to use patterns like declarative management of `Application` resources, implementing app-of-apps and others without the risk of a privilege escalation through usage of other `AppProjects` that would exceed the permissions granted to the application teams. - -Some manual steps will need to be performed by the Argo CD administrator in order to enable this feature. - -!!! note - This feature is considered beta as of now. Some of the implementation details may change over the course of time until it is promoted to a stable status. We will be happy if early adopters use this feature and provide us with bug reports and feedback. - -## Prerequisites - -### Cluster-scoped Argo CD installation - -This feature can only be enabled and used when your Argo CD is installed as a cluster-wide instance, so it has permissions to list and manipulate resources on a cluster scope. It will *not* work with an Argo CD installed in namespace-scoped mode. - -### Switch resource tracking method - -Also, while technically not necessary, it is strongly suggested that you switch the application tracking method from the default `label` setting to either `annotation` or `annotation+label`. The reasonsing for this is, that application names will be a composite of the namespace's name and the name of the `Application`, and this can easily exceed the 63 characters length limit imposed on label values. Annotations have a notably greater length limit. - -To enable annotation based resource tracking, refer to the documentation about [resource tracking methods](../../user-guide/resource_tracking/) - -## Implementation details - -### Overview - -In order for an application to be managed and reconciled outside the Argo CD's control plane namespace, two prerequisites must match: - -1. The `Application`'s namespace must be explicitly enabled using the `--application-namespaces` parameter for the `argocd-application-controller` and `argocd-server` workloads. This parameter controls the list of namespaces that Argo CD will be allowed to source `Application` resources from globally. Any namespace not configured here cannot be used from any `AppProject`. -1. The `AppProject` referenced by the `.spec.project` field of the `Application` must have the namespace listed in its `.spec.sourceNamespaces` field. This setting will determine whether an `Application` may use a certain `AppProject`. If an `Application` specifies an `AppProject` that is not allowed, Argo CD refuses to process this `Application`. As stated above, any namespace configured in the `.spec.sourceNamespaces` field must also be enabled globally. - -`Applications` in different namespaces can be created and managed just like any other `Application` in the `argocd` namespace previously, either declaratively or through the Argo CD API (e.g. using the CLI, the web UI, the REST API, etc). - -### Reconfigure Argo CD to allow certain namespaces - -#### Change workload startup parameters - -In order to enable this feature, the Argo CD administrator must reconfigure the `argocd-server` and `argocd-application-controller` workloads to add the `--application-namespaces` parameter to the container's startup command. - -The `--application-namespaces` parameter takes a comma-separated list of namespaces where `Applications` are to be allowed in. Each entry of the list supports shell-style wildcards such as `*`, so for example the entry `app-team-*` would match `app-team-one` and `app-team-two`. To enable all namespaces on the cluster where Argo CD is running on, you can just specify `*`, i.e. `--application-namespaces=*`. - -The startup parameters for both, the `argocd-server` and the `argocd-application-controller` can also be conveniently set up and kept in sync by specifying the `application.namespaces` settings in the `argocd-cmd-params-cm` ConfigMap _instead_ of changing the manifests for the respective workloads. For example: - -```yaml -data: - application.namespaces: app-team-one, app-team-two -``` - -would allow the `app-team-one` and `app-team-two` namespaces for managing `Application` resources. After a change to the `argocd-cmd-params-cm` namespace, the appropriate workloads need to be restarted: - -```bash -kubectl rollout restart -n argocd deployment argocd-server -kubectl rollout restart -n argocd statefulset argocd-application-controller -``` - -#### Adapt Kubernetes RBAC - -We decided to not extend the Kubernetes RBAC for the `argocd-server` workload by default for the time being. If you want `Applications` in other namespaces to be managed by the Argo CD API (i.e. the CLI and UI), you need to extend the Kubernetes permissions for the `argocd-server` ServiceAccount. - -We supply a `ClusterRole` and `ClusterRoleBinding` suitable for this purpose in the `examples/k8s-rbac/argocd-server-applications` directory. For a default Argo CD installation (i.e. installed to the `argocd` namespace), you can just apply them as-is: - -```shell -kubectl apply -f examples/k8s-rbac/argocd-server-applications/ -``` - -!!! note - At some later point in time, we may make this cluster role part of the default installation manifests. - -### Allowing additional namespaces in an AppProject - -Any user with Kubernetes access to the Argo CD control plane's namespace (`argocd`), especially those with permissions to create or update `Applications` in a declarative way, is to be considered an Argo CD admin. - -This prevented unprivileged Argo CD users from declaratively creating or managing `Applications` in the past. Those users were constrained to using the API instead, subject to Argo CD RBAC which ensures only `Applications` in allowed `AppProjects` were created. - -For an `Application` to be created outside the `argocd` namespace, the `AppProject` referred to in the `Application`'s `.spec.project` field must include the `Application`'s namespace in its `.spec.sourceNamespaces` field. - -For example, consider the two following (incomplete) `AppProject` specs: - -```yaml -kind: AppProject -apiVersion: argoproj.io/v1alpha1 -metadata: - name: project-one - namespace: argocd -spec: - sourceNamespaces: - - namespace-one -``` - -and - -```yaml -kind: AppProject -apiVersion: argoproj.io/v1alpha1 -metadata: - name: project-two - namespace: argocd -spec: - sourceNamespaces: - - namespace-two -``` - -In order for an Application to set `.spec.project` to `project-one`, it would have to be created in either namespace `namespace-one` or `argocd`. Likewise, in order for an Application to set `.spec.project` to `project-two`, it would have to be created in either namespace `namespace-two` or `argocd`. - -If an Application in `namespace-two` would set their `.spec.project` to `project-one` or an Application in `namespace-one` would set their `.spec.project` to `project-two`, Argo CD would consider this as a permission violation and refuse to reconcile the Application. - -Also, the Argo CD API will enforce these constraints, regardless of the Argo CD RBAC permissions. - -The `.spec.sourceNamespaces` field of the `AppProject` is a list that can contain an arbitrary amount of namespaces, and each entry supports shell-style wildcard, so that you can allow namespaces with patterns like `team-one-*`. - -!!! warning - Do not add user controlled namespaces in the `.spec.sourceNamespaces` field of any privileged AppProject like the `default` project. Always make sure that the AppProject follows the principle of granting least required privileges. Never grant access to the `argocd` namespace within the AppProject. - -!!! note - For backwards compatibility, Applications in the Argo CD control plane's namespace (`argocd`) are allowed to set their `.spec.project` field to reference any AppProject, regardless of the restrictions placed by the AppProject's `.spec.sourceNamespaces` field. - -### Application names - -For the CLI and UI, applications are now referred to and displayed as in the format `/`. - -For backwards compatibility, if the namespace of the Application is the control plane's namespace (i.e. `argocd`), the `` can be omitted from the application name when referring to it. For example, the application names `argocd/someapp` and `someapp` are semantically the same and refer to the same application in the CLI and the UI. - -### Application RBAC - -The RBAC syntax for Application objects has been changed from `/` to `//` to accomodate the need to restrict access based on the source namespace of the Application to be managed. - -For backwards compatibility, Applications in the `argocd` namespace can still be refered to as `/` in the RBAC policy rules. - -Wildcards do not make any distinction between project and application namespaces yet. For example, the following RBAC rule would match any application belonging to project `foo`, regardless of the namespace it is created in: - -``` -p, somerole, applications, get, foo/*, allow -``` - -If you want to restrict access to be granted only to `Applications` in project `foo` within namespace `bar`, the rule would need to be adapted as follows: - -``` -p, somerole, applications, get, foo/bar/*, allow -``` - -## Managing applications in other namespaces - -### Declaratively - -For declarative management of Applications, just create the Application from a YAML or JSON manifest in the desired namespace. Make sure that the `.spec.project` field refers to an AppProject that allows this namespace. For example, the following (incomplete) Application manifest creates an Application in the namespace `some-namespace`: - -```yaml -kind: Application -apiVersion: argoproj.io/v1alpha1 -metadata: - name: some-app - namespace: some-namespace -spec: - project: some-project - # ... -``` - -The project `some-project` will then need to specify `some-namespace` in the list of allowed source namespaces, e.g. - -```yaml -kind: AppProject -apiVersion: argoproj.io/v1alpha1 -metadata: - name: some-project - namespace: argocd -spec: - sourceNamespaces: - - some-namespace -``` - -### Using the CLI - -You can use all existing Argo CD CLI commands for managing applications in other namespaces, exactly as you would use the CLI to manage applications in the control plane's namespace. - -For example, to retrieve the `Application` named `foo` in the namespace `bar`, you can use the following CLI command: - -```shell -argocd app get foo/bar -``` - -Likewise, to manage this application, keep referring to it as `foo/bar`: - -```bash -# Create an application -argocd app create foo/bar ... -# Sync the application -argocd app sync foo/bar -# Delete the application -argocd app delete foo/bar -# Retrieve application's manifest -argocd app manifests foo/bar -``` - -As stated previously, for applications in the Argo CD's control plane namespace, you can omit the namespace from the application name. - -### Using the UI - -Similar to the CLI, you can refer to the application in the UI as `foo/bar`. - -For example, to create an application named `bar` in the namespace `foo` in the web UI, set the application name in the creation dialogue's _Application Name_ field to `foo/bar`. If the namespace is omitted, the control plane's namespace will be used. - -### Using the REST API - -If you are using the REST API, the namespace for `Application` cannot be specified as the application name, and resources need to be specified using the optional `appNamespace` query parameter. For example, to work with the `Application` resource named `foo` in the namespace `bar`, the request would look like follows: - -```bash -GET /api/v1/applications/foo?appNamespace=bar -``` - -For other operations such as `POST` and `PUT`, the `appNamespace` parameter must be part of the request's payload. - -For `Application` resources in the control plane namespace, this parameter can be omitted. diff --git a/docs/operator-manual/application.yaml b/docs/operator-manual/application.yaml index c693a581a45ec..2b7d96d6a71f6 100644 --- a/docs/operator-manual/application.yaml +++ b/docs/operator-manual/application.yaml @@ -114,7 +114,6 @@ spec: # plugin specific config plugin: - # NOTE: this field is deprecated in v2.5 and must be removed to use sidecar-based plugins. # Only set the plugin name if the plugin is defined in argocd-cm. # If the plugin is defined as a sidecar, omit the name. The plugin will be automatically matched with the # Application according to the plugin's discovery rules. @@ -123,22 +122,6 @@ spec: env: - name: FOO value: bar - # Plugin parameters are new in v2.5. - parameters: - - name: string-param - string: example-string - - name: array-param - array: [item1, item2] - - name: map-param - map: - param-name: param-value - - # Sources field specifies the list of sources for the application - sources: - - repoURL: https://github.com/argoproj/argocd-example-apps.git # Can point to either a Helm chart repo or a git repo. - targetRevision: HEAD # For Helm, this refers to the chart version. - path: guestbook # This has no meaning for Helm charts pulled directly from a Helm repo instead of git. - ref: my-repo # For Helm, acts as a reference to this source for fetching values files from this source. Has no meaning when under `source` field # Destination cluster and namespace to deploy the application destination: @@ -157,15 +140,6 @@ spec: - CreateNamespace=true # Namespace Auto-Creation ensures that namespace specified as the application destination exists in the destination cluster. - PrunePropagationPolicy=foreground # Supported policies are background, foreground and orphan. - PruneLast=true # Allow the ability for resource pruning to happen as a final, implicit wave of a sync operation - managedNamespaceMetadata: # Sets the metadata for the application namespace. Only valid if CreateNamespace=true (see above), otherwise it's a no-op. - labels: # The labels to set on the application namespace - any: label - you: like - annotations: # The annotations to set on the application namespace - the: same - applies: for - annotations: on-the-namespace - # The retry feature is available since v1.7 retry: limit: 5 # number of failed sync attempt retries; unlimited number of attempts if less than 0 diff --git a/docs/operator-manual/applicationset.yaml b/docs/operator-manual/applicationset.yaml deleted file mode 100644 index 2267343a7c489..0000000000000 --- a/docs/operator-manual/applicationset.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: test-hello-world-appset - namespace: argocd -spec: - # See docs for available generators and their specs. - generators: - - list: - elements: - - cluster: https://kubernetes.default.svc - # Determines whether go templating will be used in the `template` field below. - goTemplate: false - # These fields are identical to the Application spec. - template: - metadata: - name: test-hello-world-app - spec: - project: my-project - # This sync policy pertains to the ApplicationSet, not to the Applications it creates. - syncPolicy: - # Determines whether the controller will delete Applications when an ApplicationSet is deleted. - preserveResourcesOnDeletion: false - # Alpha feature to determine the order in which ApplicationSet applies changes. - strategy: diff --git a/docs/operator-manual/applicationset/Controlling-Resource-Modification.md b/docs/operator-manual/applicationset/Controlling-Resource-Modification.md index f0bf6d37693ba..3dd92936a41da 100644 --- a/docs/operator-manual/applicationset/Controlling-Resource-Modification.md +++ b/docs/operator-manual/applicationset/Controlling-Resource-Modification.md @@ -18,7 +18,7 @@ See 'How to modify ApplicationSet container parameters' below for detailed steps The ApplicationSet controller supports a parameter `--policy`, which is specified on launch (within the controller Deployment container), and which restricts what types of modifications will be made to managed Argo CD `Application` resources. -The `--policy` parameter takes one of the following valid values: `sync`, `create-only`, `create-update`, and `create-delete`. (`sync` is the default, which is used if the `--policy` parameter is not specified; the other policies are described below). +The `--policy` parameter takes three values: `sync`, `create-only`, and `create-update`. (`sync` is the default, which is used if the `--policy` parameter is not specified; the other policies are described below). To allow the ApplicationSet controller to *create* `Application` resources, but prevent any further modification, such as deletion, or modification of Application fields, add this parameter in the ApplicationSet controller: ``` @@ -34,13 +34,6 @@ To allow the ApplicationSet controller to create or modify `Application` resourc This may be useful to users looking for additional protection against deletion of the Applications generated by the controller. -### Policy - `create-delete`: Prevent ApplicationSet controller from updating Applications - -To allow the ApplicationSet controller to create or delete `Application` resources, but prevent Applications from being updated, add the following parameter to the ApplicationSet controller `Deployment`: -``` ---policy create-delete -``` - ### Prevent an `Application`'s child resources from being deleted, when the parent Application is deleted By default, when an `Application` resource is deleted by the ApplicationSet controller, all of the child resources of the Application will be deleted as well (such as, all of the Application's `Deployments`, `Services`, etc). diff --git a/docs/operator-manual/applicationset/Generators-Git.md b/docs/operator-manual/applicationset/Generators-Git.md index e78fdf2812c6a..8a95699279835 100644 --- a/docs/operator-manual/applicationset/Generators-Git.md +++ b/docs/operator-manual/applicationset/Generators-Git.md @@ -70,8 +70,6 @@ The generator parameters are: **Note**: The right-most path name always becomes `{{path.basename}}`. For example, for `- path: /one/two/three/four`, `{{path.basename}}` is `four`. -**Note**: If the `pathParamPrefix` option is specified, all `path`-related parameter names above will be prefixed with the specified value and a dot separator. E.g., if `pathParamPrefix` is `myRepo`, then the generated parameter name would be `myRepo.path` instead of `path`. Using this option is necessary in a Matrix generator where both child generators are Git generators (to avoid conflicts when merging the child generators’ items). - Whenever a new Helm chart/Kustomize YAML/Application/plain subdirectory is added to the Git repository, the ApplicationSet controller will detect this change and automatically deploy the resulting manifests within new `Application` resources. As with other generators, clusters *must* already be defined within Argo CD, in order to generate Applications for them. @@ -286,7 +284,6 @@ In addition to the flattened key/value pairs from the configuration file, the fo **Note**: The right-most *directory* name always becomes `{{path.basename}}`. For example, from `- path: /one/two/three/four/config.json`, `{{path.basename}}` will be `four`. The filename can always be accessed using `{{path.filename}}`. -**Note**: If the `pathParamPrefix` option is specified, all `path`-related parameter names above will be prefixed with the specified value and a dot separator. E.g., if `pathParamPrefix` is `myRepo`, then the generated parameter name would be `myRepo.path` instead of `path`. Using this option is necessary in a Matrix generator where both child generators are Git generators (to avoid conflicts when merging the child generators’ items). ## Webhook Configuration diff --git a/docs/operator-manual/applicationset/Generators-Matrix.md b/docs/operator-manual/applicationset/Generators-Matrix.md index c0316d61c333c..f4d1e48d0ee32 100644 --- a/docs/operator-manual/applicationset/Generators-Matrix.md +++ b/docs/operator-manual/applicationset/Generators-Matrix.md @@ -11,8 +11,6 @@ By combining both generators parameters, to produce every possible combination, Any set of generators may be used, with the combined values of those generators inserted into the `template` parameters, as usual. -**Note**: If both child generators are Git generators, one or both of them must use the `pathParamPrefix` option to avoid conflicts when merging the child generators’ items. - ## Example: Git Directory generator + Cluster generator As an example, imagine that we have two clusters: @@ -168,102 +166,6 @@ In the 2nd child generator, the label selector with label `kubernetes.io/environ So in the above example, clusters with the label `kubernetes.io/environment: prod` will have only prod-specific configuration (ie. `prod/config.json`) applied to it, wheres clusters with the label `kubernetes.io/environment: dev` will have only dev-specific configuration (ie. `dev/config.json`) -## Example: Two Git Generators Using `pathParamPrefix` - -The matrix generator will fail if its children produce results containing identical keys with differing values. -This poses a problem for matrix generators where both children are Git generators since they auto-populate `path`-related parameters in their outputs. -To avoid this problem, specify a `pathParamPrefix` on one or both of the child generators to avoid conflicting parameter keys in the output. - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: two-gits-with-path-param-prefix -spec: - generators: - - matrix: - generators: - # git file generator referencing files containing details about each - # app to be deployed (e.g., `appName`). - - git: - repoURL: https://github.com/some-org/some-repo.git - revision: HEAD - files: - - path: "apps/*.json" - pathParamPrefix: app - # git file generator referencing files containing details about - # locations to which each app should deploy (e.g., `region` and - # `clusterName`). - - git: - repoURL: https://github.com/some-org/some-repo.git - revision: HEAD - files: - - path: "targets/{{appName}}/*.json" - pathParamPrefix: target - template: {} # ... -``` - -Then, given the following file structure/content: - -``` -├── apps -│ ├── app-one.json -│ │ { "appName": "app-one" } -│ └── app-two.json -│ { "appName": "app-two" } -└── targets - ├── app-one - │ ├── east-cluster-one.json - │ │ { "region": "east", "clusterName": "cluster-one" } - │ └── east-cluster-two.json - │ { "region": "east", "clusterName": "cluster-two" } - └── app-two - ├── east-cluster-one.json - │ { "region": "east", "clusterName": "cluster-one" } - └── west-cluster-three.json - { "region": "west", "clusterName": "cluster-three" } -``` - -…the matrix generator above would yield the following results: - -```yaml -- appName: app-one - app.path: /apps - app.path.filename: app-one.json - # plus additional path-related parameters from the first child generator, all - # prefixed with "app". - region: east - clusterName: cluster-one - target.path: /targets/app-one - target.path.filename: east-cluster-one.json - # plus additional path-related parameters from the second child generator, all - # prefixed with "target". - -- appName: app-one - app.path: /apps - app.path.filename: app-one.json - region: east - clusterName: cluster-two - target.path: /targets/app-one - target.path.filename: east-cluster-two.json - -- appName: app-two - app.path: /apps - app.path.filename: app-two.json - region: east - clusterName: cluster-one - target.path: /targets/app-two - target.path.filename: east-cluster-one.json - -- appName: app-two - app.path: /apps - app.path.filename: app-two.json - region: west - clusterName: cluster-three - target.path: /targets/app-two - target.path.filename: west-cluster-three.json -``` - ## Restrictions 1. The Matrix generator currently only supports combining the outputs of only two child generators (eg does not support generating combinations for 3 or more). diff --git a/docs/operator-manual/applicationset/Generators-Pull-Request.md b/docs/operator-manual/applicationset/Generators-Pull-Request.md index d90eb2d0f4695..101c0c902b839 100644 --- a/docs/operator-manual/applicationset/Generators-Pull-Request.md +++ b/docs/operator-manual/applicationset/Generators-Pull-Request.md @@ -60,7 +60,7 @@ spec: * `repo`: Required name of the GitHub repository. * `api`: If using GitHub Enterprise, the URL to access it. (Optional) * `tokenRef`: A `Secret` name and key containing the GitHub access token to use for requests. If not specified, will make anonymous requests which have a lower rate limit and can only see public repositories. (Optional) -* `labels`: Filter the PRs to those containing **all** of the labels listed. (Optional) +* `labels`: Labels is used to filter the PRs that you want to target. (Optional) * `appSecretName`: A `Secret` name containing a GitHub App secret in [repo-creds format][repo-creds]. [repo-creds]: ../declarative-setup.md#repository-credentials @@ -274,7 +274,6 @@ spec: * `branch_slug`: The branch name will be cleaned to be conform to the DNS label standard as defined in [RFC 1123](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-label-names), and truncated to 50 characters to give room to append/suffix-ing it with 13 more characters. * `head_sha`: This is the SHA of the head of the pull request. * `head_short_sha`: This is the short SHA of the head of the pull request (8 characters long or the length of the head SHA if it's shorter). -* `labels`: The array of pull request labels. (Supported only for Go Template ApplicationSet manifests.) ## Webhook Configuration diff --git a/docs/operator-manual/applicationset/Progressive-Rollouts.md b/docs/operator-manual/applicationset/Progressive-Rollouts.md deleted file mode 100644 index aa7d01702102f..0000000000000 --- a/docs/operator-manual/applicationset/Progressive-Rollouts.md +++ /dev/null @@ -1,111 +0,0 @@ -# Progressive Rollouts - -!!! warning "Alpha Feature" - This is an experimental, alpha-quality feature that allows you to control the order in which the ApplicationSet controller will create or update the Applications owned by an ApplicationSet resource. It may be removed in future releases or modified in backwards-incompatible ways. - -## Use Cases -The Progressive Rollouts feature set is intended to be light and flexible. The feature only interacts with the health of managed Applications. It is not intended to support direct integrations with other Rollout controllers (such as the native ReplicaSet controller or Argo Rollouts). - -* Progressive Rollouts watch for the managed Application resources to become "Healthy" before proceeding to the next stage. -* Deployments, DaemonSets, StatefulSets, and [Argo Rollouts](https://argoproj.github.io/argo-rollouts/) are all supported, because the Application enters a "Progressing" state while pods are being rolled out. In fact, any resource with a health check that can report a "Progressing" status is supported. -* [Argo CD Resource Hooks](../../user-guide/resource_hooks.md) are supported. We recommend this approach for users that need advanced functionality when an Argo Rollout cannot be used, such as smoke testing after a DaemonSet change. - -## Enabling Progressive Rollouts -As an experimental feature, progressive rollouts must be explicitly enabled, in one of these ways. - -1. Pass `--enable-progressive-rollouts` to the ApplicationSet controller args. -1. Set `ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_PROGRESSIVE_ROLLOUTS=true` in the ApplicationSet controller environment variables. -1. Set `applicationsetcontroller.enable.progressive.rollouts: true` in the ArgoCD ConfigMap. - -## Strategies - -* AllAtOnce (default) -* RollingSync - -### AllAtOnce -This default Application update behavior is unchanged from the original ApplicationSet implementation. - -All Applications managed by the ApplicationSet resource are updated simultaneously when the ApplicationSet is updated. - -### RollingSync -This update strategy allows you to group Applications by labels present on the generated Application resources. -When the ApplicationSet changes, the changes will be applied to each group of Application resources sequentially. - -* Application groups are selected by `matchExpressions`. -* All `matchExpressions` must be true for an Application to be selected (multiple expressions match with AND behavior). -* The `In` and `NotIn` operators must match at least one value to be considered true (OR behavior). -* The `NotIn` operatorn has priority in the event that both a `NotIn` and `In` operator produce a match. -* All Applications in each group must become Healthy before the ApplicationSet controller will proceed to update the next group of Applications. -* The number of simultaneous Application updates in a group will not exceed its `maxUpdate` parameter (default is 100%, unbounded). -* RollingSync will capture external changes outside the ApplicationSet resource, since it relies on watching the OutOfSync status of the managed Applications. -* RollingSync will force all generated Applications to have autosync disabled. Warnings are printed in the applicationset-controller logs for any Application specs with an automated syncPolicy enabled. -* Sync operations are triggered the same way as if they were triggered by the UI or CLI (by directly setting the `operation` status field on the Application resource). This means that a RollingSync will respect sync windows just as if a user had clicked the "Sync" button in the Argo UI. -* When a sync is triggered, the sync is performed with the same syncPolicy configured for the Application. For example, this preserves the Application's retry settings. -* If an Application is considered "Pending" for `applicationsetcontroller.default.application.progressing.timeout` seconds, the Application is automatically moved to Healthy status (default 300). - -#### Example -The following example illustrates how to stage a progressive rollout over Applications with explicitly configured environment labels. - -Once a change is pushed, the following will happen in order. - -* All `env-dev` Applications will be updated simultaneously. -* The rollout will wait for all `env-qa` Applications to be manually synced via the `argocd` CLI or by clicking the Sync button in the UI. -* 10% of all `env-prod` Applications will be updated at a time until all `env-prod` Applications have been updated. - -``` ---- -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: guestbook -spec: - generators: - - list: - elements: - - cluster: engineering-dev - url: https://1.2.3.4 - env: env-dev - - cluster: engineering-qa - url: https://2.4.6.8 - env: env-qa - - cluster: engineering-prod - url: https://9.8.7.6/ - env: env-prod - strategy: - type: RollingSync - rollingSync: - steps: - - matchExpressions: - - key: env - operator: In - values: - - env-dev - #maxUpdate: 100% # if undefined, all applications matched are updated together (default is 100%) - - matchExpressions: - - key: env - operator: In - values: - - env-qa - maxUpdate: 0 # if 0, no matched applications will be updated - - matchExpressions: - - key: env - operator: In - values: - - env-prod - maxUpdate: 10% # maxUpdate supports both integer and percentage string values (rounds down, but floored at 1 Application for >0%) - goTemplate: true - template: - metadata: - name: '{{.cluster}}-guestbook' - labels: - env: '{{.env}}' - spec: - project: my-project - source: - repoURL: https://github.com/infra-team/cluster-deployments.git - targetRevision: HEAD - path: guestbook/{{.cluster}} - destination: - server: '{{.url}}' - namespace: guestbook -``` diff --git a/docs/operator-manual/argocd-cm.yaml b/docs/operator-manual/argocd-cm.yaml index 6618b567beac6..7728cc9bd0d0e 100644 --- a/docs/operator-manual/argocd-cm.yaml +++ b/docs/operator-manual/argocd-cm.yaml @@ -47,7 +47,7 @@ data: help.download.windows-amd64: "path-or-url-to-download" # A dex connector configuration (optional). See SSO configuration documentation: - # https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/user-management/index.md#sso + # https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/sso # https://dexidp.io/docs/connectors/ dex.config: | connectors: @@ -190,9 +190,6 @@ data: clusters: - "*.local" - # An optional comma-separated list of metadata.labels to observe in the UI. - resource.customLabels: tier - resource.compareoptions: | # if ignoreAggregatedRoles set to true then differences caused by aggregated roles in RBAC resources are ignored. ignoreAggregatedRoles: true @@ -305,29 +302,3 @@ data: # token verification to pass despite the OIDC provider having an invalid certificate. Only set to "true" if you # understand the risks. oidc.tls.insecure.skip.verify: "false" - - # Add Deep Links to ArgoCD UI - # sample project level links - project.links: | - - url: https://myaudit-system.com?project={{.metadata.name}} - title: Audit - description: system audit logs - icon.class: "fa-book" - # sample application level links - application.links: | - # pkg.go.dev/text/template is used for evaluating url templates - - url: https://mycompany.splunk.com?search={{.spec.destination.namespace}} - title: Splunk - # conditionally show link e.g. for specific project - # github.com/antonmedv/expr is used for evaluation of conditions - - url: https://mycompany.splunk.com?search={{.spec.destination.namespace}} - title: Splunk - if: spec.project == "default" - - url: https://{{.metadata.annotations.splunkhost}}?search={{.spec.destination.namespace}} - title: Splunk - if: metadata.annotations.splunkhost - # sample resource level links - resource.links: | - - url: https://mycompany.splunk.com?search={{.metadata.namespace}} - title: Splunk - if: kind == "Pod" || kind == "Deployment" diff --git a/docs/operator-manual/argocd-cmd-params-cm.yaml b/docs/operator-manual/argocd-cmd-params-cm.yaml index a694cc650b0d5..03ede2bd0ca93 100644 --- a/docs/operator-manual/argocd-cmd-params-cm.yaml +++ b/docs/operator-manual/argocd-cmd-params-cm.yaml @@ -104,8 +104,6 @@ data: server.app.state.cache.expiration: "1h0m0s" # Cache expiration default (default 24h0m0s) server.default.cache.expiration: "24h0m0s" - # Enable the experimental proxy extension feature - server.enable.proxy.extension: "false" ## Repo-server properties # Set the logging format. One of: text|json (default "text") @@ -141,28 +139,6 @@ data: reposerver.streamed.manifest.max.tar.size: "100M" # Maximum size of extracted manifests when streaming manifests to the repo server for generation reposerver.streamed.manifest.max.extracted.size: "1G" - # Enable git submodule support - reposerver.enable.git.submodule: "true" # Disable TLS on the HTTP endpoint dexserver.disable.tls: "false" - - ## ApplicationSet Controller Properties - # Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager. - applicationsetcontroller.enable.leader.election: "false" - # Argo CD repo namespace (default: argocd) - applicationsetcontroller.namespace: "" - # "Modify how application is synced between the generator and the cluster. Default is 'sync' (create & update & delete), options: 'create-only', 'create-update' (no deletion), 'create-delete' (no update)" - applicationsetcontroller.policy: "sync" - # Print debug logs. Takes precedence over loglevel - applicationsetcontroller.debug: "false" - # Set the logging format. One of: text|json (default "text") - applicationsetcontroller.log.format: "text" - # Set the logging level. One of: debug|info|warn|error (default "info") - applicationsetcontroller.log.level: "info" - # Enable dry run mode - applicationsetcontroller.dryrun: "false" - # Enable git submodule support - applicationsetcontroller.enable.git.submodule: "true" - # Enables use of the Progressive Rollouts capability - applicationsetcontroller.enable.progressive.rollouts: "false" diff --git a/docs/operator-manual/config-management-plugins.md b/docs/operator-manual/config-management-plugins.md deleted file mode 100644 index d5492891d66bf..0000000000000 --- a/docs/operator-manual/config-management-plugins.md +++ /dev/null @@ -1,490 +0,0 @@ -# Config Management Plugins - -Argo CD's "native" config management tools are Helm, Jsonnet, and Kustomize. If you want to use a different config -management tools, or if Argo CD's native tool support does not include a feature you need, you might need to turn to -a Config Management Plugin (CMP). - -The Argo CD "repo server" component is in charge of building Kubernetes manifests based on some source files from a -Helm, OCI, or git repository. When a config management plugin is correctly configured, the repo server may delegate the -task of building manifests to the plugin. - -The following sections will describe how to create, install, and use plugins. Check out the -[example plugins](https://github.com/argoproj/argo-cd/tree/master/examples/plugins) for additional guidance. - -!!! warning - Plugins are granted a level of trust in the Argo CD system, so it is important to implement plugins securely. Argo - CD administrators should only install plugins from trusted sources, and they should audit plugins to weigh their - particular risks and benefits. - -## Installing a config management plugin - -There are two ways to install a Config Management Plugin: - -1. Add the plugin config to the Argo CD ConfigMap (**this method is deprecated and will be removed in a future - version**). The repo-server container will run your plugin's commands. This is a good option for a simple plugin that - requires only a few lines of code that fit nicely in the Argo CD ConfigMap. -2. Add the plugin as a sidecar to the repo-server Pod. - This is a good option for a more complex plugin that would clutter the Argo CD ConfigMap. A copy of the repository is - sent to the sidecar container as a tarball and processed individually per application, which makes it a good option - for [concurrent processing of monorepos](high_availability.md#enable-concurrent-processing). - -### Option 1: Configure plugins via Argo CD configmap (deprecated) - -The following changes are required to configure a new plugin: - -1. Make sure required binaries are available in `argocd-repo-server` pod. The binaries can be added via volume mounts or - using a custom image (see [custom_tools](custom_tools.md) for examples of both). -2. Register a new plugin in `argocd-cm` ConfigMap: - - :::yaml - data: - configManagementPlugins: | - - name: pluginName - init: # Optional command to initialize application source directory - command: ["sample command"] - args: ["sample args"] - generate: # Command to generate manifests YAML - command: ["sample command"] - args: ["sample args"] - lockRepo: true # Defaults to false. See below. - - The `generate` command must print a valid YAML or JSON stream to stdout. Both `init` and `generate` commands are executed inside the application source directory or in `path` when specified for the app. - -3. [Create an Application which uses your new CMP](#using-a-cmp). - -More CMP examples are available in [argocd-example-apps](https://github.com/argoproj/argocd-example-apps/tree/master/plugins). - -!!!note "Repository locking" - If your plugin makes use of `git` (e.g. `git crypt`), it is advised to set - `lockRepo` to `true` so that your plugin will have exclusive access to the - repository at the time it is executed. Otherwise, two applications synced - at the same time may result in a race condition and sync failure. - -### Option 2: Configure plugin via sidecar - -An operator can configure a plugin tool via a sidecar to repo-server. The following changes are required to configure a new plugin: - -#### 1. Write the plugin configuration file - -Plugins will be configured via a ConfigManagementPlugin manifest located inside the plugin container. - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: ConfigManagementPlugin -metadata: - # The name of the plugin must be unique within a given Argo CD instance. - name: my-plugin -spec: - version: v1.0 - # The init command runs in the Application source directory at the beginning of each manifest generation. The init - # command can output anything. A non-zero status code will fail manifest generation. - init: - # Init always happens immediately before generate, but its output is not treated as manifests. - # This is a good place to, for example, download chart dependencies. - command: [sh] - args: [-c, 'echo "Initializing..."'] - # The generate command runs in the Application source directory each time manifests are generated. Standard output - # must be ONLY valid YAML manifests. A non-zero exit code will fail manifest generation. - # Error output will be sent to the UI, so avoid printing sensitive information (such as secrets). - generate: - command: [sh, -c] - args: - - | - echo "{\"kind\": \"ConfigMap\", \"apiVersion\": \"v1\", \"metadata\": { \"name\": \"$ARGOCD_APP_NAME\", \"namespace\": \"$ARGOCD_APP_NAMESPACE\", \"annotations\": {\"Foo\": \"$ARGOCD_ENV_FOO\", \"KubeVersion\": \"$KUBE_VERSION\", \"KubeApiVersion\": \"$KUBE_API_VERSIONS\",\"Bar\": \"baz\"}}}" - # The discovery config is applied to a repository. If every configured discovery tool matches, then the plugin may be - # used to generate manifests for Applications using the repository. - # Only one of fileName, find.glob, or find.command should be specified. If multiple are specified then only the - # first (in that order) is evaluated. - discover: - # fileName is a glob pattern (https://pkg.go.dev/path/filepath#Glob) that is applied to the repository's root - # directory (not the Application source directory). If there is a match, this plugin may be used for the repository. - fileName: "./subdir/s*.yaml" - find: - # This does the same thing as fileName, but it supports double-start (nested directory) glob patterns. - glob: "**/Chart.yaml" - # The find command runs in the repository's root directory. To match, it must exit with status code 0 _and_ - # produce non-empty output to standard out. - command: [sh, -c, find . -name env.yaml] - # The parameters config describes what parameters the UI should display for an Application. It is up to the user to - # actually set parameters in the Application manifest (in spec.source.plugin.parameters). The announcements _only_ - # inform the "Parameters" tab in the App Details page of the UI. - parameters: - # Static parameter announcements are sent to the UI for _all_ Applications handled by this plugin. - # Think of the `string`, `array`, and `map` values set here as "defaults". It is up to the plugin author to make - # sure that these default values actually reflect the plugin's behavior if the user doesn't explicitly set different - # values for those parameters. - static: - - name: string-param - title: Description of the string param - tooltip: Tooltip shown when the user hovers the - # If this field is set, the UI will indicate to the user that they must set the value. - required: false - # itemType tells the UI how to present the parameter's value (or, for arrays and maps, values). Default is - # "string". Examples of other types which may be supported in the future are "boolean" or "number". - # Even if the itemType is not "string", the parameter value from the Application spec will be sent to the plugin - # as a string. It's up to the plugin to do the appropriate conversion. - itemType: "" - # collectionType describes what type of value this parameter accepts (string, array, or map) and allows the UI - # to present a form to match that type. Default is "string". This field must be present for non-string types. - # It will not be inferred from the presence of an `array` or `map` field. - collectionType: "" - # This field communicates the parameter's default value to the UI. Setting this field is optional. - string: default-string-value - # All the fields above besides "string" apply to both the array and map type parameter announcements. - - name: array-param - # This field communicates the parameter's default value to the UI. Setting this field is optional. - array: [default, items] - collectionType: array - - name: map-param - # This field communicates the parameter's default value to the UI. Setting this field is optional. - map: - some: value - collectionType: map - # Dynamic parameter announcements are announcements specific to an Application handled by this plugin. For example, - # the values for a Helm chart's values.yaml file could be sent as parameter announcements. - dynamic: - # The command is run in an Application's source directory. Standard output must be JSON matching the schema of the - # static parameter announcements list. - command: [echo, '[{"name": "example-param", "string": "default-string-value"}]'] -``` - -!!! note - While the ConfigManagementPlugin _looks like_ a Kubernetes object, it is not actually a custom resource. - It only follows kubernetes-style spec conventions. - -The `generate` command must print a valid YAML stream to stdout. Both `init` and `generate` commands are executed inside the application source directory. - -The `discover.fileName` is used as [glob](https://pkg.go.dev/path/filepath#Glob) pattern to determine whether an -application repository is supported by the plugin or not. - -```yaml - discover: - find: - command: [sh, -c, find . -name env.yaml] -``` - -If `discover.fileName` is not provided, the `discover.find.command` is executed in order to determine whether an -application repository is supported by the plugin or not. The `find` command should return a non-error exit code -and produce output to stdout when the application source type is supported. - -#### 2. Place the plugin configuration file in the sidecar - -Argo CD expects the plugin configuration file to be located at `/home/argocd/cmp-server/config/plugin.yaml` in the sidecar. - -If you use a custom image for the sidecar, you can add the file directly to that image. - -```dockerfile -WORKDIR /home/argocd/cmp-server/config/ -COPY plugin.yaml ./ -``` - -If you use a stock image for the sidecar or would rather maintain the plugin configuration in a ConfigMap, just nest the -plugin config file in a ConfigMap under the `plugin.yaml` key and mount the ConfigMap in the sidecar (see next section). - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-plugin-config -data: - plugin.yaml: | - apiVersion: argoproj.io/v1alpha1 - kind: ConfigManagementPlugin - metadata: - name: my-plugin - spec: - version: v1.0 - init: - command: [sh, -c, 'echo "Initializing..."'] - generate: - command: [sh, -c, 'echo "{\"kind\": \"ConfigMap\", \"apiVersion\": \"v1\", \"metadata\": { \"name\": \"$ARGOCD_APP_NAME\", \"namespace\": \"$ARGOCD_APP_NAMESPACE\", \"annotations\": {\"Foo\": \"$ARGOCD_ENV_FOO\", \"KubeVersion\": \"$KUBE_VERSION\", \"KubeApiVersion\": \"$KUBE_API_VERSIONS\",\"Bar\": \"baz\"}}}"'] - discover: - fileName: "./subdir/s*.yaml" -``` - -#### 3. Register the plugin sidecar - -To install a plugin, patch argocd-repo-server to run the plugin container as a sidecar, with argocd-cmp-server as its -entrypoint. You can use either off-the-shelf or custom-built plugin image as sidecar image. For example: - -```yaml -containers: -- name: my-plugin - command: [/var/run/argocd/argocd-cmp-server] # Entrypoint should be Argo CD lightweight CMP server i.e. argocd-cmp-server - image: busybox # This can be off-the-shelf or custom-built image - securityContext: - runAsNonRoot: true - runAsUser: 999 - volumeMounts: - - mountPath: /var/run/argocd - name: var-files - - mountPath: /home/argocd/cmp-server/plugins - name: plugins - # Remove this volumeMount if you've chosen to bake the config file into the sidecar image. - - mountPath: /home/argocd/cmp-server/config/plugin.yaml - subPath: plugin.yaml - name: my-plugin-config - # Starting with v2.4, do NOT mount the same tmp volume as the repo-server container. The filesystem separation helps - # mitigate path traversal attacks. - - mountPath: /tmp - name: cmp-tmp -volumes: -- configMap: - name: my-plugin-config - name: my-plugin-config -- emptyDir: {} - name: cmp-tmp -``` - -!!! important "Double-check these items" - 1. Make sure to use `/var/run/argocd/argocd-cmp-server` as an entrypoint. The `argocd-cmp-server` is a lightweight GRPC service that allows Argo CD to interact with the plugin. - 2. Make sure that sidecar container is running as user 999. - 3. Make sure that plugin configuration file is present at `/home/argocd/cmp-server/config/plugin.yaml`. It can either be volume mapped via configmap or baked into image. - -### Using environment variables in your plugin - -Plugin commands have access to - -1. The system environment variables (of the repo-server container for argocd-cm plugins or of the sidecar for sidecar plugins) -2. [Standard build environment variables](../user-guide/build-environment.md) -3. Variables in the Application spec (References to system and build variables will get interpolated in the variables' values): - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -spec: - source: - plugin: - env: - - name: FOO - value: bar - - name: REV - value: test-$ARGOCD_APP_REVISION -``` - -!!! note - The `discover.command` command only has access to the above environment starting with v2.4. - -Before reaching the `init.command`, `generate.command`, and `discover.command` commands, Argo CD prefixes all -user-supplied environment variables (#3 above) with `ARGOCD_ENV_`. This prevents users from directly setting -potentially-sensitive environment variables. - -If your plugin was written before 2.4 and depends on user-supplied environment variables, then you will need to update -your plugin's behavior to work with 2.4. If you use a third-party plugin, make sure they explicitly advertise support -for 2.4. - -4. (Starting in v2.4) Parameters in the Application spec: - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -spec: - source: - plugin: - parameters: - - name: values-files - array: [values-dev.yaml] - - name: helm-parameters - map: - image.tag: v1.2.3 -``` - -The parameters are available as JSON in the `ARGOCD_APP_PARAMETERS` environment variable. The example above would -produce this JSON: - -```json -[{"name": "values-files", "array": ["values-dev.yaml"]}, {"name": "helm-parameters", "map": {"image.tag": "v1.2.3"}}] -``` - -!!! note - Parameter announcements, even if they specify defaults, are _not_ sent to the plugin in `ARGOCD_APP_PARAMETERS`. - Only parameters explicitly set in the Application spec are sent to the plugin. It is up to the plugin to apply - the same defaults as the ones announced to the UI. - -The same parameters are also available as individual environment variables. The names of the environment variables -follows this convention: - -```yaml - - name: some-string-param - string: some-string-value - # PARAM_SOME_STRING_PARAM=some-string-value - - - name: some-array-param - value: [item1, item2] - # PARAM_SOME_ARRAY_PARAM_0=item1 - # PARAM_SOME_ARRAY_PARAM_1=item2 - - - name: some-map-param - map: - image.tag: v1.2.3 - # PARAM_SOME_MAP_PARAM_IMAGE_TAG=v1.2.3 -``` - -!!! warning - Sanitize/escape user input. As part of Argo CD's manifest generation system, config management plugins are treated with a level of trust. Be - sure to escape user input in your plugin to prevent malicious input from causing unwanted behavior. - - -## Using a config management plugin with an Application - -If your CMP is defined in the `argocd-cm` ConfigMap, you can create a new Application using the CLI. Replace -`` with the name configured in `argocd-cm`. - -```bash -argocd app create --config-management-plugin -``` - -If your CMP is defined as a sidecar, you must manually define the Application manifest. You may leave the `name` field -empty in the `plugin` section for the plugin to be automatically matched with the Application based on its discovery rules. If you do mention the name make sure -it is either `-` if version is mentioned in the `ConfigManagementPlugin` spec or else just ``. When name is explicitly -specified only that particular plugin will be used iff it's discovery pattern/command matches the provided application repo. - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: guestbook - namespace: argocd -spec: - project: default - source: - repoURL: https://github.com/argoproj/argocd-example-apps.git - targetRevision: HEAD - path: guestbook - plugin: - # For either argocd-cm- or sidecar-installed CMPs, you can pass environment variables to the CMP. - env: - - name: FOO - value: bar -``` - -If you don't need to set any environment variables, you can set an empty plugin section. - -```yaml - plugin: {} -``` - -!!! important - If your sidecar CMP command runs too long, the command will be killed, and the UI will show an error. The CMP server - respects the timeouts set by the `server.repo.server.timeout.seconds` and `controller.repo.server.timeout.seconds` - items in `argocd-cm`. Increase their values from the default of 60s. - - Each CMP command will also independently timeout on the `ARGOCD_EXEC_TIMEOUT` set for the CMP sidecar. The default - is 90s. So if you increase the repo server timeout greater than 90s, be sure to set `ARGOCD_EXEC_TIMEOUT` on the - sidecar. - -!!! note - Each Application can only have one config management plugin configured at a time. If you're converting an existing - plugin configured through the `argocd-cm` ConfigMap to a sidecar, make sure to update the plugin name to either `-` - if version was mentioned in the `ConfigManagementPlugin` spec or else just use ``. You can also remove the name altogether - and let the automatic discovery to identify the plugin. - -## Debugging a CMP - -If you are actively developing a sidecar-installed CMP, keep a few things in mind: - -1. If you are mounting plugin.yaml from a ConfigMap, you will have to restart the repo-server Pod so the plugin will - pick up the changes. -2. If you have baked plugin.yaml into your image, you will have to build, push, and force a re-pull of that image on the - repo-server Pod so the plugin will pick up the changes. If you are using `:latest`, the Pod will always pull the new - image. If you're using a different, static tag, set `imagePullPolicy: Always` on the CMP's sidecar container. -3. CMP errors are cached by the repo-server in Redis. Restarting the repo-server Pod will not clear the cache. Always - do a "Hard Refresh" when actively developing a CMP so you have the latest output. - -## Plugin tar stream exclusions - -In order to increase the speed of manifest generation, certain files and folders can be excluded from being sent to your -plugin. We recommend excluding your `.git` folder if it isn't necessary. Use Go's -[filepatch.Match](https://pkg.go.dev/path/filepath#Match) syntax. For example, `.git/*` to exclude `.git` folder. - -You can set it one of three ways: - -1. The `--plugin-tar-exclude` argument on the repo server. -2. The `reposerver.plugin.tar.exclusions` key if you are using `argocd-cmd-params-cm` -3. Directly setting `ARGOCD_REPO_SERVER_PLUGIN_TAR_EXCLUSIONS` environment variable on the repo server. - -For option 1, the flag can be repeated multiple times. For option 2 and 3, you can specify multiple globs by separating -them with semicolons. - -## Migrating from argocd-cm plugins - -Installing plugins by modifying the argocd-cm ConfigMap is deprecated as of v2.4. Support will be completely removed in -a future release. - -The following will show how to convert an argocd-cm plugin to a sidecar plugin. - -### 1. Convert the ConfigMap entry into a config file - -First, copy the plugin's configuration into its own YAML file. Take for example the following ConfigMap entry: - -```yaml -data: - configManagementPlugins: | - - name: pluginName - init: # Optional command to initialize application source directory - command: ["sample command"] - args: ["sample args"] - generate: # Command to generate manifests YAML - command: ["sample command"] - args: ["sample args"] - lockRepo: true # Defaults to false. See below. -``` - -The `pluginName` item would be converted to a config file like this: - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: ConfigManagementPlugin -metadata: - name: pluginName -spec: - init: # Optional command to initialize application source directory - command: ["sample command"] - args: ["sample args"] - generate: # Command to generate manifests YAML - command: ["sample command"] - args: ["sample args"] -``` - -!!! note - The `lockRepo` key is not relevant for sidecar plugins, because sidecar plugins do not share a single source repo - directory when generating manifests. - -### 2. Write discovery rules for your plugin - -Sidecar plugins use discovery rules instead of a plugin name to match Applications to plugins. - -Write rules applicable to your plugin [using the instructions above](#1-write-the-plugin-configuration-file) and add -them to your configuration file. - -!!! note - After installing your sidecar plugin, you may remove the `name` field from the plugin config in your - Application specs for auto-discovery or update the name to `-` - if version was mentioned in the `ConfigManagementPlugin` spec or else just use ``. For example: - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: guestbook -spec: - source: - plugin: - name: pluginName # Delete this for auto-discovery (and set `plugin: {}` if `name` was the only value) or use proper sidecar plugin name -``` - -### 3. Make sure the plugin has access to the tools it needs - -Plugins configured with argocd-cm ran on the Argo CD image. This gave it access to all the tools installed on that -image by default (see the [Dockerfile](https://github.com/argoproj/argo-cd/blob/master/Dockerfile) for base image and -installed tools). - -You can either use a stock image (like busybox) or design your own base image with the tools your plugin needs. For -security, avoid using image with more binaries installed than what your plugin actually needs. - -### 4. Test the plugin - -After installing the plugin as a sidecar [according to the directions above](#installing-a-config-management-plugin), -test it out on a few Applications before migrating all of them to the sidecar plugin. - -Once tests have checked out, remove the plugin entry from your argocd-cm ConfigMap. diff --git a/docs/operator-manual/custom-styles.md b/docs/operator-manual/custom-styles.md index 21fa79efeeb2f..e58824622c5f0 100644 --- a/docs/operator-manual/custom-styles.md +++ b/docs/operator-manual/custom-styles.md @@ -100,7 +100,7 @@ experience, you may wish to build a separate project using the [Argo CD UI dev s ## Banners -Argo CD can optionally display a banner that can be used to notify your users of upcoming maintenance and operational changes. This feature can be enabled by specifying the banner message using the `ui.bannercontent` field in the `argocd-cm` ConfigMap and Argo CD will display this message at the top of every UI page. You can optionally add a link to this message by setting `ui.bannerurl`. You can also make the banner sticky (permanent) by setting `ui.bannerpermanent` to `true` and change it's position to the bottom by using `ui.bannerposition: "bottom"` +Argo CD can optionally display a banner that can be used to notify your users of upcoming maintenance and operational changes. This feature can be enabled by specifying the banner message using the `ui.bannercontent` field in the `argocd-cm` ConfigMap and Argo CD will display this message at the top of every UI page. You can optionally add a link to this message by setting `ui.bannerurl`. ### argocd-cm ```yaml @@ -113,8 +113,6 @@ metadata: data: ui.bannercontent: "Banner message linked to a URL" ui.bannerurl: "www.bannerlink.com" - ui.bannerpermanent: "true" - ui.bannerposition: "bottom" ``` ![banner with link](../assets/banner.png) diff --git a/docs/operator-manual/custom_tools.md b/docs/operator-manual/custom_tools.md index e94a1d5ac6d03..9f7483db7ea89 100644 --- a/docs/operator-manual/custom_tools.md +++ b/docs/operator-manual/custom_tools.md @@ -7,7 +7,7 @@ other than what Argo CD bundles. Some reasons to do this might be: * To upgrade/downgrade to a specific version of a tool due to bugs or bug fixes. * To install additional dependencies to be used by kustomize's configmap/secret generators. (e.g. curl, vault, gpg, AWS CLI) -* To install a [config management plugin](config-management-plugins.md). +* To install a [config management plugin](../user-guide/config-management-plugins.md). As the Argo CD repo-server is the single service responsible for generating Kubernetes manifests, it can be customized to use alternative toolchain required by your environment. @@ -51,7 +51,7 @@ following example builds an entirely customized repo-server from a Dockerfile, i dependencies that may be needed for generating manifests. ```Dockerfile -FROM argoproj/argocd:v2.5.4 # Replace tag with the appropriate argo version +FROM argoproj/argocd:latest # Switch to root for the ability to perform install USER root @@ -69,5 +69,5 @@ RUN apt-get update && \ chmod +x /usr/local/bin/sops # Switch back to non-root user -USER $ARGOCD_USER_ID +USER 999 ``` diff --git a/docs/operator-manual/declarative-setup.md b/docs/operator-manual/declarative-setup.md index 8e3ff49fbda28..6e339f58d8062 100644 --- a/docs/operator-manual/declarative-setup.md +++ b/docs/operator-manual/declarative-setup.md @@ -178,7 +178,7 @@ Consider using [bitnami-labs/sealed-secrets](https://github.com/bitnami-labs/sea Each repository must have a `url` field and, depending on whether you connect using HTTPS, SSH, or GitHub App, `username` and `password` (for HTTPS), `sshPrivateKey` (for SSH), or `githubAppPrivateKey` (for GitHub App). !!!warning - When using [bitnami-labs/sealed-secrets](https://github.com/bitnami-labs/sealed-secrets) the labels will be removed and have to be readded as described here: https://github.com/bitnami-labs/sealed-secrets#sealedsecrets-as-templates-for-secrets + When using [bitnami-labs/sealed-secrets](https://github.com/bitnami-labs/sealed-secrets) the labels will be removed and have to be readded as descibed here: https://github.com/bitnami-labs/sealed-secrets#sealedsecrets-as-templates-for-secrets Example for HTTPS: @@ -255,33 +255,6 @@ stringData: -----END OPENSSH PRIVATE KEY----- ``` -Example for Google Cloud Source repositories: - -```yaml -kind: Secret -metadata: - name: github-repo - namespace: argocd - labels: - argocd.argoproj.io/secret-type: repository -stringData: - type: git - repo: https://source.developers.google.com/p/my-google-project/r/my-repo - gcpServiceAccountKey: | - { - "type": "service_account", - "project_id": "my-google-project", - "private_key_id": "REDACTED", - "private_key": "-----BEGIN PRIVATE KEY-----\nREDACTED\n-----END PRIVATE KEY-----\n", - "client_email": "argocd-service-account@my-google-project.iam.gserviceaccount.com", - "client_id": "REDACTED", - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/argocd-service-account%40my-google-project.iam.gserviceaccount.com" - } -``` - !!! tip The Kubernetes documentation has [instructions for creating a secret containing a private key](https://kubernetes.io/docs/concepts/configuration/secret/#use-case-pod-with-ssh-keys). @@ -709,10 +682,6 @@ Notes: * Invalid globs result in the whole rule being ignored. * If you add a rule that matches existing resources, these will appear in the interface as `OutOfSync`. -## Resource Custom Labels - -Custom Labels configured with `resource.customLabels` (comma separated string) will be displayed in the UI (for any resource that defines them). - ## SSO & RBAC * SSO configuration details: [SSO](./user-management/index.md) diff --git a/docs/operator-manual/deep_links.md b/docs/operator-manual/deep_links.md deleted file mode 100644 index 9b0778e045ac7..0000000000000 --- a/docs/operator-manual/deep_links.md +++ /dev/null @@ -1,63 +0,0 @@ -# Deep Links - -Deep links allow users to quickly redirect to third-party systems, such as Splunk, Datadog, etc. from the Argo CD -user interface. - -Argo CD administrator will be able to configure links to third-party systems by providing -deep link templates configured in `argocd-cm`. The templates can be conditionally rendered and are able -to reference different types of resources relating to where the links show up, this includes projects, applications, -or individual resources (pods, services, etc.). - -## Configuring Deep Links - -The configuration for Deep Links is present in `argocd-cm` as `.links` fields where -`` determines where it will be displayed. The possible values for `` are : -- `project` : all links under this field will show up in the project tab in the Argo CD UI -- `application` : all links under this field will show up in the application summary tab -- `resource` : all links under this field will show up in the resource (deployments, pods, services, etc.) summary tab - -Each link in the list has five subfields : -1. `title` : title/tag that will be displayed in the UI corresponding to that link -2. `url` : the actual URL where the deep link will redirect to, this field can be templated to use data from the - corresponing application, project or resource objects (depending on where it is located). This uses [text/template](pkg.go.dev/text/template) pkg for templating -3. `description` (optional) : a description for what the deep link is about -4. `icon.class` (optional) : a font-awesome icon class to be used when displaying the links in dropdown menus -5. `if` (optional) : a conditional statement that results in either `true` or `false`, it also has access to the same - data as the `url` field. If the condition resolves to `true` the deep link will be displayed - else it will be hidden. If - the field is omitted, by default the deep links will be displayed. This uses [antonmedv/expr](https://github.com/antonmedv/expr/tree/master/docs) for evaluating conditions - -!!!note - For resources of kind Secret the data fields are redacted but other fields are accessible for templating the deep links. - -!!!warning - Make sure to validate the url templates and inputs to prevent data leaks or possible generation of any malicious links. - - -An example `argocd-cm.yaml` file with deep links and their variations : - -```yaml - # sample project level links - project.links: | - - url: https://myaudit-system.com?project={{.metadata.name}} - title: Audit - description: system audit logs - icon.class: "fa-book" - # sample application level links - application.links: | - # pkg.go.dev/text/template is used for evaluating url templates - - url: https://mycompany.splunk.com?search={{.spec.destination.namespace}} - title: Splunk - # conditionally show link e.g. for specific project - # github.com/antonmedv/expr is used for evaluation of conditions - - url: https://mycompany.splunk.com?search={{.spec.destination.namespace}} - title: Splunk - if: spec.project == "default" - - url: https://{{.metadata.annotations.splunkhost}}?search={{.spec.destination.namespace}} - title: Splunk - if: metadata.annotations.splunkhost - # sample resource level links - resource.links: | - - url: https://mycompany.splunk.com?search={{.metadata.namespace}} - title: Splunk - if: kind == "Pod" || kind == "Deployment" -``` \ No newline at end of file diff --git a/docs/operator-manual/health.md b/docs/operator-manual/health.md index 6cc12a8e72cfc..947a2753f1033 100644 --- a/docs/operator-manual/health.md +++ b/docs/operator-manual/health.md @@ -16,8 +16,6 @@ with at least one value for `hostname` or `IP`. ### Ingress * The `status.loadBalancer.ingress` list is non-empty, with at least one value for `hostname` or `IP`. -### Job -* If job `.spec.suspended` is set to 'true', then the job and app health will be marked as suspended. ### PersistentVolumeClaim * The `status.phase` is `Bound` @@ -38,21 +36,19 @@ metadata: app.kubernetes.io/name: argocd-cm app.kubernetes.io/part-of: argocd data: - resource.customizations: | - argoproj.io/Application: - health.lua: | - hs = {} - hs.status = "Progressing" - hs.message = "" - if obj.status ~= nil then - if obj.status.health ~= nil then - hs.status = obj.status.health.status - if obj.status.health.message ~= nil then - hs.message = obj.status.health.message - end - end + resource.customizations.health.argoproj.io_Application: | + hs = {} + hs.status = "Progressing" + hs.message = "" + if obj.status ~= nil then + if obj.status.health ~= nil then + hs.status = obj.status.health.status + if obj.status.health.message ~= nil then + hs.message = obj.status.health.message end - return hs + end + end + return hs ``` ## Custom Health Checks @@ -66,61 +62,36 @@ There are two ways to configure a custom health check. The next two sections des ### Way 1. Define a Custom Health Check in `argocd-cm` ConfigMap -Custom health checks can be defined in -```yaml - resource.customizations: | - : - health.lua: | -``` -field of `argocd-cm`. If you are using argocd-operator, this is overridden by [the argocd-operator resourceCustomizations](https://argocd-operator.readthedocs.io/en/latest/reference/argocd/#resource-customizations). +Custom health checks can be defined in `resource.customizations.health.` field of `argocd-cm`. If you are using argocd-operator, this is overridden by [the argocd-operator resourceCustomizations](https://argocd-operator.readthedocs.io/en/latest/reference/argocd/#resource-customizations). The following example demonstrates a health check for `cert-manager.io/Certificate`. ```yaml data: - resource.customizations: | - cert-manager.io/Certificate: - health.lua: | - hs = {} - if obj.status ~= nil then - if obj.status.conditions ~= nil then - for i, condition in ipairs(obj.status.conditions) do - if condition.type == "Ready" and condition.status == "False" then - hs.status = "Degraded" - hs.message = condition.message - return hs - end - if condition.type == "Ready" and condition.status == "True" then - hs.status = "Healthy" - hs.message = condition.message - return hs - end - end + resource.customizations.health.cert-manager.io_Certificate: | + hs = {} + if obj.status ~= nil then + if obj.status.conditions ~= nil then + for i, condition in ipairs(obj.status.conditions) do + if condition.type == "Ready" and condition.status == "False" then + hs.status = "Degraded" + hs.message = condition.message + return hs + end + if condition.type == "Ready" and condition.status == "True" then + hs.status = "Healthy" + hs.message = condition.message + return hs end end + end + end - hs.status = "Progressing" - hs.message = "Waiting for certificate" - return hs -``` -In order to prevent duplication of the custom health check for potentially multiple resources, it is also possible to specify a wildcard in the resource kind, and anywhere in the resource group, like this: - -```yaml - resource.customizations: | - ec2.aws.crossplane.io/*: - health.lua: | - ... + hs.status = "Progressing" + hs.message = "Waiting for certificate" + return hs ``` -```yaml - resource.customizations: | - *.aws.crossplane.io/*: - health.lua: | - ... -``` - - - The `obj` is a global variable which contains the resource. The script must return an object with status and optional message field. The custom health check might return one of the following health statuses: @@ -168,5 +139,3 @@ tests: To test the implemented custom health checks, run `go test -v ./util/lua/`. The [PR#1139](https://github.com/argoproj/argo-cd/pull/1139) is an example of Cert Manager CRDs custom health check. - -Please note that bundled health checks with wildcards are not supported. diff --git a/docs/operator-manual/high_availability.md b/docs/operator-manual/high_availability.md index 0ae8a2edd9130..9c3a8ec0b03e3 100644 --- a/docs/operator-manual/high_availability.md +++ b/docs/operator-manual/high_availability.md @@ -6,8 +6,8 @@ A set of HA manifests are provided for users who wish to run Argo CD in a highly [Manifests ⧉](https://github.com/argoproj/argo-cd/tree/master/manifests) -> **NOTE:** The HA installation will require at least three different nodes due to pod anti-affinity roles in the -> specs. Additionally, IPv6 only clusters are not supported. +!!! note + The HA installation will require at least three different nodes due to pod anti-affinity roles in the specs. ## Scaling Up @@ -24,46 +24,50 @@ The `--parallelismlimit` flag controls how many manifests generations are runnin or custom plugin. As a result Git repositories with multiple applications might be affect repository server performance. Read [Monorepo Scaling Considerations](#monorepo-scaling-considerations) for more information. -* `argocd-repo-server` clones the repository into `/tmp` (or the path specified in the `TMPDIR` env variable). The Pod might run out of disk space if it has too many repositories -or if the repositories have a lot of files. To avoid this problem mount a persistent volume. +* `argocd-repo-server` clones repository into `/tmp` ( of path specified in `TMPDIR` env variable ). Pod might run out of disk space if have too many repository +or repositories has a lot of files. To avoid this problem mount persistent volume. -* `argocd-repo-server` uses `git ls-remote` to resolve ambiguous revisions such as `HEAD`, a branch or a tag name. This operation happens frequently -and might fail. To avoid failed syncs use the `ARGOCD_GIT_ATTEMPTS_COUNT` environment variable to retry failed requests. +* `argocd-repo-server` `git ls-remote` to resolve ambiguous revision such as `HEAD`, branch or tag name. This operation is happening pretty frequently +and might fail. To avoid failed syncs use `ARGOCD_GIT_ATTEMPTS_COUNT` environment variable to retry failed requests. * `argocd-repo-server` Every 3m (by default) Argo CD checks for changes to the app manifests. Argo CD assumes by default that manifests only change when the repo changes, so it caches generated manifests (for 24h by default). With Kustomize remote bases, or Helm patch releases, the manifests can change even though the repo has not changed. By reducing the cache time, you can get the changes without waiting for 24h. Use `--repo-cache-expiration duration`, and we'd suggest in low volume environments you try '1h'. Bear in mind this will negate the benefit of caching if set too low. -* `argocd-repo-server` executes config management tools such as `helm` or `kustomize` and enforces a 90 second timeout. This timeout can be changed by using the `ARGOCD_EXEC_TIMEOUT` env variable. The value should be in the Go time duration string format, for example, `2m30s`. +* `argocd-repo-server` fork exec config management tools such as `helm` or `kustomize` and enforces 90 seconds timeout. The timeout can be increased using `ARGOCD_EXEC_TIMEOUT` env variable. The value should be in Go time duration string format, for example, `2m30s`. **metrics:** -* `argocd_git_request_total` - Number of git requests. This metric provides two tags: `repo` - Git repo URL; `request_type` - `ls-remote` or `fetch`. +* `argocd_git_request_total` - Number of git requests. The metric provides two tags: `repo` - Git repo URL; `request_type` - `ls-remote` or `fetch`. -* `ARGOCD_ENABLE_GRPC_TIME_HISTOGRAM` - Is an environment variable that enables collecting RPC performance metrics. Enable it if you need to troubleshoot performance issues. Note: This metric is expensive to both query and store! +* `ARGOCD_ENABLE_GRPC_TIME_HISTOGRAM` - environment variable that enables collecting RPC performance metrics. Enable it if you need to troubleshoot performance issue. Note: metric is expensive to both query and store! ### argocd-application-controller **settings:** -The `argocd-application-controller` uses `argocd-repo-server` to get generated manifests and Kubernetes API server to get the actual cluster state. +The `argocd-application-controller` uses `argocd-repo-server` to get generated manifests and Kubernetes API server to get actual cluster state. -* each controller replica uses two separate queues to process application reconciliation (milliseconds) and app syncing (seconds). The number of queue processors for each queue is controlled by -`--status-processors` (20 by default) and `--operation-processors` (10 by default) flags. Increase the number of processors if your Argo CD instance manages too many applications. +* each controller replica uses two separate queues to process application reconciliation (milliseconds) and app syncing (seconds). Number of queue processors for each queue is controlled by +`--status-processors` (20 by default) and `--operation-processors` (10 by default) flags. Increase number of processors if your Argo CD instance manages too many applications. For 1000 application we use 50 for `--status-processors` and 25 for `--operation-processors` -* The manifest generation typically takes the most time during reconciliation. The duration of manifest generation is limited to make sure the controller refresh queue does not overflow. -The app reconciliation fails with `Context deadline exceeded` error if the manifest generation is taking too much time. As a workaround increase the value of `--repo-server-timeout-seconds` and -consider scaling up the `argocd-repo-server` deployment. +* The manifest generation typically takes the most time during reconciliation. The duration of manifest generation is limited to make sure controller refresh queue does not overflow. +The app reconciliation fails with `Context deadline exceeded` error if manifest generating taking too much time. As workaround increase value of `--repo-server-timeout-seconds` and +consider scaling up `argocd-repo-server` deployment. + +* The controller uses `kubectl` fork/exec to push changes into the cluster and to convert resource from preferred version into user specified version +(e.g. Deployment `apps/v1` into `extensions/v1beta1`). Same as config management tool `kubectl` fork/exec might cause pod OOM kill. Use `--kubectl-parallelism-limit` flag to limit +number of allowed concurrent kubectl fork/execs. -* The controller uses Kubernetes watch APIs to maintain a lightweight Kubernetes cluster cache. This allows avoiding querying Kubernetes during app reconciliation and significantly improves -performance. For performance reasons the controller monitors and caches only the preferred versions of a resource. During reconciliation, the controller might have to convert cached resources from the -preferred version into a version of the resource stored in Git. If `kubectl convert` fails because the conversion is not supported then the controller falls back to Kubernetes API query which slows down -reconciliation. In this case, we advise to use the preferred resource version in Git. +* The controller uses Kubernetes watch APIs to maintain lightweight Kubernetes cluster cache. This allows to avoid querying Kubernetes during app reconciliation and significantly improve +performance. For performance reasons controller monitors and caches only preferred the version of a resource. During reconciliation, the controller might have to convert cached resource from +preferred version into a version of the resource stored in Git. If `kubectl convert` fails because conversion is not supported then controller falls back to Kubernetes API query which slows down +reconciliation. In this case, we advise you to use the preferred resource version in Git. -* The controller polls Git every 3m by default. You can change this duration using the `timeout.reconciliation` setting in the `argocd-cm` ConfigMap. The value of `timeout.reconciliation` is a duration string e.g `60s`, `1m`, `1h` or `1d`. +* The controller polls Git every 3m by default. You can increase this duration using `timeout.reconciliation` setting in the `argocd-cm` ConfigMap. The value of `timeout.reconciliation` is a duration string e.g `60s`, `1m`, `1h` or `1d`. * If the controller is managing too many clusters and uses too much memory then you can shard clusters across multiple controller replicas. To enable sharding increase the number of replicas in `argocd-application-controller` `StatefulSet` -and repeat the number of replicas in the `ARGOCD_CONTROLLER_REPLICAS` environment variable. The strategic merge patch below +and repeat number of replicas in `ARGOCD_CONTROLLER_REPLICAS` environment variable. The strategic merge patch below demonstrates changes required to configure two controller replicas. ```yaml @@ -82,22 +86,22 @@ spec: value: "2" ``` -* `ARGOCD_ENABLE_GRPC_TIME_HISTOGRAM` - environment variable that enables collecting RPC performance metrics. Enable it if you need to troubleshoot performance issues. Note: This metric is expensive to both query and store! +* `ARGOCD_ENABLE_GRPC_TIME_HISTOGRAM` - environment variable that enables collecting RPC performance metrics. Enable it if you need to troubleshoot performance issue. Note: metric is expensive to both query and store! **metrics** -* `argocd_app_reconcile` - reports application reconciliation duration. Can be used to build reconciliation duration heat map to get a high-level reconciliation performance picture. +* `argocd_app_reconcile` - reports application reconciliation duration. Can be used to build reconciliation duration heat map to get high-level reconciliation performance picture. * `argocd_app_k8s_request_total` - number of k8s requests per application. The number of fallback Kubernetes API queries - useful to identify which application has a resource with non-preferred version and causes performance issues. ### argocd-server -The `argocd-server` is stateless and probably least likely to cause issues. You might consider increasing the number of replicas to 3 or more to ensure there is no downtime during upgrades. +The `argocd-server` is stateless and probably least likely to cause issues. You might consider increasing number of replicas to 3 or more to ensure there is no downtime during upgrades. **settings:** * The `ARGOCD_GRPC_MAX_SIZE_MB` environment variable allows specifying the max size of the server response message in megabytes. -The default value is 200. You might need to increase this for an Argo CD instance that manages 3000+ applications. +The default value is 200. You might need to increase for an Argo CD instance that manages 3000+ applications. ### argocd-dex-server, argocd-redis @@ -105,17 +109,17 @@ The `argocd-dex-server` uses an in-memory database, and two or more instances wo ## Monorepo Scaling Considerations -Argo CD repo server maintains one repository clone locally and uses it for application manifest generation. If the manifest generation requires to change a file in the local repository clone then only one concurrent manifest generation per server instance is allowed. This limitation might significantly slowdown Argo CD if you have a mono repository with multiple applications (50+). +Argo CD repo server maintains one repository clone locally and use it for application manifest generation. If the manifest generation requires to change a file in the local repository clone then only one concurrent manifest generation per server instance is allowed. This limitation might significantly slowdown Argo CD if you have a mono repository with multiple applications (50+). ### Enable Concurrent Processing -Argo CD determines if manifest generation might change local files in the local repository clone based on the config management tool and application settings. -If the manifest generation has no side effects then requests are processed in parallel without a performance penalty. The following are known cases that might cause slowness and their workarounds: +Argo CD determines if manifest generation might change local files in the local repository clone based on config management tool and application settings. +If the manifest generation has no side effects then requests are processed in parallel without the performance penalty. Following are known cases that might cause slowness and workarounds: - * **Multiple Helm based applications pointing to the same directory in one Git repository:** ensure that your Helm chart doesn't have conditional -[dependencies](https://helm.sh/docs/chart_best_practices/dependencies/#conditions-and-tags) and create `.argocd-allow-concurrency` file in the chart directory. + * **Multiple Helm based applications pointing to the same directory in one Git repository:** ensure that your Helm chart don't have conditional +[dependencies](https://helm.sh/docs/chart_best_practices/dependencies/#conditions-and-tags) and create `.argocd-allow-concurrency` file in chart directory. - * **Multiple Custom plugin based applications:** avoid creating temporal files during manifest generation and create `.argocd-allow-concurrency` file in the app directory, or use the sidecar plugin option, which processes each application using a temporary copy of the repository. + * **Multiple Custom plugin based applications:** avoid creating temporal files during manifest generation and create `.argocd-allow-concurrency` file in app directory, or use the sidecar plugin option, which processes each application using a temporary copy of the repository. * **Multiple Kustomize applications in same repository with [parameter overrides](../user-guide/parameters.md):** sorry, no workaround for now. @@ -184,4 +188,4 @@ spec: targetRevision: HEAD path: my-application # ... -``` \ No newline at end of file +``` diff --git a/docs/operator-manual/notifications/services/googlechat.md b/docs/operator-manual/notifications/services/googlechat.md index 041ea6e022ef5..0448469146da1 100755 --- a/docs/operator-manual/notifications/services/googlechat.md +++ b/docs/operator-manual/notifications/services/googlechat.md @@ -51,7 +51,7 @@ You can send [simple text](https://developers.google.com/chat/reference/message- ```yaml template.app-sync-succeeded: | - message: The app {{ .app.metadata.name }} has successfully synced! + message: The app {{ .app.metadata.name }} has succesfully synced! ``` A card message can be defined as follows: @@ -65,7 +65,7 @@ template.app-sync-succeeded: | sections: - widgets: - textParagraph: - text: The app {{ .app.metadata.name }} has successfully synced! + text: The app {{ .app.metadata.name }} has succesfully synced! - widgets: - keyValue: topLabel: Repository @@ -79,14 +79,3 @@ template.app-sync-succeeded: | ``` The card message can be written in JSON too. - -## Chat Threads - -It is possible send both simple text and card messages in a chat thread by specifying a unique key for the thread. The thread key can be defined as follows: - -```yaml -template.app-sync-succeeded: | - message: The app {{ .app.metadata.name }} has succesfully synced! - googlechat: - threadKey: {{ .app.metadata.name }} -``` diff --git a/docs/operator-manual/notifications/services/newrelic.md b/docs/operator-manual/notifications/services/newrelic.md deleted file mode 100755 index d98288a846422..0000000000000 --- a/docs/operator-manual/notifications/services/newrelic.md +++ /dev/null @@ -1,61 +0,0 @@ -# NewRelic - -## Parameters - -* `apiURL` - the api server url, e.g. https://api.newrelic.com -* `apiKey` - a [NewRelic ApiKey](https://docs.newrelic.com/docs/apis/rest-api-v2/get-started/introduction-new-relic-rest-api-v2/#api_key) - -## Configuration - -1. Create a NewRelic [Api Key](https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/#user-api-key) -2. Store apiKey in `argocd-notifications-secret` Secret and configure NewRelic integration in `argocd-notifications-cm` ConfigMap - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: -data: - service.newrelic: | - apiURL: - apiKey: $newrelic-apiKey -``` - -```yaml -apiVersion: v1 -kind: Secret -metadata: - name: -stringData: - newrelic-apiKey: apiKey -``` - -3. Copy [Application ID](https://docs.newrelic.com/docs/apis/rest-api-v2/get-started/get-app-other-ids-new-relic-one/#apm) -4. Create subscription for your NewRelic integration - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - annotations: - notifications.argoproj.io/subscribe..newrelic: -``` - -## Templates - -* `description` - __optional__, high-level description of this deployment, visible in the [Summary](https://docs.newrelic.com/docs/apm/applications-menu/monitoring/apm-overview-page) page and on the [Deployments](https://docs.newrelic.com/docs/apm/applications-menu/events/deployments-page) page when you select an individual deployment. - * Defaults to `message` -* `changelog` - __optional__, A summary of what changed in this deployment, visible in the [Deployments](https://docs.newrelic.com/docs/apm/applications-menu/events/deployments-page) page when you select (selected deployment) > Change log. - * Defaults to `{{(call .repo.GetCommitMetadata .app.status.sync.revision).Message}}` -* `user` - __optional__, A username to associate with the deployment, visible in the [Summary](https://docs.newrelic.com/docs/apm/applications-menu/events/deployments-page) and on the [Deployments](https://docs.newrelic.com/docs/apm/applications-menu/events/deployments-page). - * Defaults to `{{(call .repo.GetCommitMetadata .app.status.sync.revision).Author}}` - -```yaml -context: | - argocdUrl: https://example.com/argocd - -template.app-deployed: | - message: Application {{.app.metadata.name}} has successfully deployed. - newrelic: - description: Application {{.app.metadata.name}} has successfully deployed -``` diff --git a/docs/operator-manual/notifications/services/slack.md b/docs/operator-manual/notifications/services/slack.md index 0cd9a0f17708e..c2d0562c1d139 100755 --- a/docs/operator-manual/notifications/services/slack.md +++ b/docs/operator-manual/notifications/services/slack.md @@ -29,56 +29,48 @@ The Slack notification service configuration includes following settings: 1. Invite your slack bot to this channel **otherwise slack bot won't be able to deliver notifications to this channel** 1. Store Oauth access token in `argocd-notifications-secret` secret -```yaml - apiVersion: v1 - kind: Secret - metadata: - name: - stringData: - slack-token: -``` + apiVersion: v1 + kind: Secret + metadata: + name: + stringData: + slack-token: 1. Define service type slack in data section of `argocd-notifications-cm` configmap: -```yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: - data: - service.slack: | - token: $slack-token -``` + apiVersion: v1 + kind: ConfigMap + metadata: + name: + data: + service.slack: | + token: $slack-token 1. Add annotation in application yaml file to enable notifications for specific argocd app -```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Application - metadata: - annotations: - notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my_channel -``` + apiVersion: argoproj.io/v1alpha1 + kind: Application + metadata: + annotations: + notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my_channel 1. Annotation with more than one trigger multiple of destinations and recipients -```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Application - metadata: - annotations: - notifications.argoproj.io/subscriptions: | - - trigger: [on-scaling-replica-set, on-rollout-updated, on-rollout-step-completed] - destinations: - - service: slack - recipients: [my-channel-1, my-channel-2] - - service: email - recipients: [recipient-1, recipient-2, recipient-3 ] - - trigger: [on-rollout-aborted, on-analysis-run-failed, on-analysis-run-error] - destinations: - - service: slack - recipients: [my-channel-21, my-channel-22] -``` + apiVersion: argoproj.io/v1alpha1 + kind: Application + metadata: + annotations: + notifications.argoproj.io/subscriptions: | + - trigger: [on-scaling-replica-set, on-rollout-updated, on-rollout-step-completed] + destinations: + - service: slack + recipients: [my-channel-1, my-channel-2] + - service: email + recipients: [recipient-1, recipient-2, recipient-3 ] + - trigger: [on-rollout-aborted, on-analysis-run-failed, on-analysis-run-error] + destinations: + - service: slack + recipients: [my-channel-21, my-channel-22] ## Templates diff --git a/docs/operator-manual/notifications/services/webex.md b/docs/operator-manual/notifications/services/webex.md deleted file mode 100755 index 440ed1ddc738f..0000000000000 --- a/docs/operator-manual/notifications/services/webex.md +++ /dev/null @@ -1,41 +0,0 @@ -# Webex Teams - -## Parameters - -The Webex Teams notification service configuration includes following settings: - -* `token` - the app token - -## Configuration - -1. Create a Webex [Bot](https://developer.webex.com/docs/bots) -1. Copy the bot access [token](https://developer.webex.com/my-apps) and store it in the `argocd-notifications-secret` Secret and configure Webex Teams integration in `argocd-notifications-cm` ConfigMap - - ``` yaml - apiVersion: v1 - kind: Secret - metadata: - name: - stringData: - webex-token: - ``` - - ``` yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: - data: - service.webex: | - token: $webex-token - ``` - -1. Create subscription for your Webex Teams integration - - ``` yaml - apiVersion: argoproj.io/v1alpha1 - kind: Application - metadata: - annotations: - notifications.argoproj.io/subscribe..webex: - ``` diff --git a/docs/operator-manual/notifications/services/webhook.md b/docs/operator-manual/notifications/services/webhook.md index bd45b1f69e40b..b6aee1ea7dcd5 100755 --- a/docs/operator-manual/notifications/services/webhook.md +++ b/docs/operator-manual/notifications/services/webhook.md @@ -1,19 +1,8 @@ -# Webhook +## Configuration The webhook notification service allows sending a generic HTTP request using the templatized request body and URL. Using Webhook you might trigger a Jenkins job, update Github commit status. -## Parameters - -The Webhook notification service configuration includes following settings: - -- `url` - the url to send the webhook to -- `headers` - optional, the headers to pass along with the webhook -- `basicAuth` - optional, the basic authentication to pass along with the webook -- `insecureSkipVerify` - optional bool, true or false - -## Configuration - Use the following steps to configure webhook: 1 Register webhook in `argocd-notifications-cm` ConfigMap: @@ -32,7 +21,6 @@ data: basicAuth: #optional username password username: password: - insecureSkipVerify: true #optional bool ``` 2 Define template that customizes webhook request method, path and body: diff --git a/docs/operator-manual/project.yaml b/docs/operator-manual/project.yaml index 20dcfa87ab29c..60e26466c5d12 100644 --- a/docs/operator-manual/project.yaml +++ b/docs/operator-manual/project.yaml @@ -15,11 +15,9 @@ spec: - '*' # Only permit applications to deploy to the guestbook namespace in the same cluster - # Destination clusters can be identified by 'server', 'name', or both. destinations: - namespace: guestbook server: https://kubernetes.default.svc - name: in-cluster # Deny all cluster-scoped resources from being created, except for Namespace clusterResourceWhitelist: diff --git a/docs/operator-manual/secret-management.md b/docs/operator-manual/secret-management.md index 54795fe4cc56c..84cbc56fd767b 100644 --- a/docs/operator-manual/secret-management.md +++ b/docs/operator-manual/secret-management.md @@ -1,11 +1,6 @@ # Secret Management -Argo CD is un-opinionated about how secrets are managed. There are many ways to do it, and there's no one-size-fits-all solution. - -Many solutions use plugins to inject secrets into the application manifests. See [Mitigating Risks of Secret-Injection Plugins](#mitigating-risks-of-secret-injection-plugins) -below to make sure you use those plugins securely. - -Here are some ways people are doing GitOps secrets: +Argo CD is un-opinionated about how secrets are managed. There's many ways to do it and there's no one-size-fits-all solution. Here's some ways people are doing GitOps secrets: * [Bitnami Sealed Secrets](https://github.com/bitnami-labs/sealed-secrets) * [External Secrets Operator](https://github.com/external-secrets/external-secrets) @@ -20,17 +15,3 @@ Here are some ways people are doing GitOps secrets: * [Kubernetes Secrets Store CSI Driver](https://github.com/kubernetes-sigs/secrets-store-csi-driver) For discussion, see [#1364](https://github.com/argoproj/argo-cd/issues/1364) - -## Mitigating Risks of Secret-Injection Plugins - -Argo CD caches the manifests generated by plugins, along with the injected secrets, in its Redis instance. Those -manifests are also available via the repo-server API (a gRPC service). This means that the secrets are available to -anyone who has access to the Redis instance or to the repo-server. - -Consider these steps to mitigate the risks of secret-injection plugins: - -1. Set up network policies to prevent direct access to Argo CD components (Redis and the repo-server). Make sure your - cluster supports those network policies and can actually enforce them. -2. Consider running Argo CD on its own cluster, with no other applications running on it. -3. [Enable password authentication on the Redis instance](https://github.com/argoproj/argo-cd/issues/3130) (currently - only supported for non-HA Argo CD installations). diff --git a/docs/operator-manual/server-commands/argocd-server.md b/docs/operator-manual/server-commands/argocd-server.md index 461ac194fa341..bf9b6d6c3aa4a 100644 --- a/docs/operator-manual/server-commands/argocd-server.md +++ b/docs/operator-manual/server-commands/argocd-server.md @@ -32,7 +32,6 @@ argocd-server [flags] --dex-server-strict-tls Perform strict validation of TLS certificates when connecting to dex server --disable-auth Disable client authentication --enable-gzip Enable GZIP compression - --enable-proxy-extension Enable Proxy Extension feature --gloglevel int Set the glog logging level -h, --help help for argocd-server --insecure Run server without TLS diff --git a/docs/operator-manual/signed-release-assets.md b/docs/operator-manual/signed-release-assets.md index d5aa36dc9eea1..346dda49eb11e 100644 --- a/docs/operator-manual/signed-release-assets.md +++ b/docs/operator-manual/signed-release-assets.md @@ -4,17 +4,21 @@ All Argo CD container images are signed by cosign. Checksums are created for the ## Prerequisites - Cosign [installation instructions](https://docs.sigstore.dev/cosign/installation) -- Obtain or have a copy of ```argocd-cosign.pub```, which can be located in the assets section of the [release page](https://github.com/argoproj/argo-cd/releases) - -Once you have installed cosign, you can use ```argocd-cosign.pub``` to verify the signed assets or container images. - +- Obtain or have a copy of the [public key](https://github.com/argoproj/argo-cd/blob/master/argocd-cosign.pub) ```argocd-cosign.pub``` +Once you have installed cosign, you can use [argocd-cosign.pub](https://github.com/argoproj/argo-cd/blob/master/argocd-cosign.pub) to verify the signed assets or container images. +``` +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEesHEB7vX5Y2RxXypjMy1nI1z7iRG +JI9/gt/sYqzpsa65aaNP4npM43DDxoIy/MQBo9s/mxGxmA+8UXeDpVC9vw== +-----END PUBLIC KEY----- +``` ## Verification of container images ```bash -cosign verify --key argocd-cosign.pub quay.io/argoproj/argocd: +cosign verify --key argocd-cosign.pub quay.io/argoproj/argocd:latest -Verification for quay.io/argoproj/argocd: -- +Verification for quay.io/argoproj/argocd:latest -- The following checks were performed on each of these signatures: * The cosign claims were validated * The signatures were verified against the specified public key @@ -23,9 +27,6 @@ The following checks were performed on each of these signatures: ## Verification of signed assets ```bash -cosign verify-blob --key cosign.pub --signature $(cat argocd--checksums.sig) argocd-$VERSION-checksums.txt +cosign verify-blob --key cosign.pub --signature $(cat argocd-$VERSION-checksums.sig) argocd-$VERSION-checksums.txt Verified OK ``` -## Admission controllers - -Cosign is compatible with several types of admission controllers. Please see the [Cosign documentation](https://docs.sigstore.dev/cosign/overview/#kubernetes-integrations) for supported controllers diff --git a/docs/operator-manual/upgrading/2.2-2.3.md b/docs/operator-manual/upgrading/2.2-2.3.md index 4d7fec93be0c2..b7a1707e52cc3 100644 --- a/docs/operator-manual/upgrading/2.2-2.3.md +++ b/docs/operator-manual/upgrading/2.2-2.3.md @@ -36,7 +36,7 @@ data: ## Removed Python from the base image -If you are using a [Config Management Plugin](../config-management-plugins.md) that relies on Python, you +If you are using a [Config Management Plugin](../../user-guide/config-management-plugins.md) that relies on Python, you will need to build a custom image on the Argo CD base to install Python. ## Upgraded Kustomize Version diff --git a/docs/operator-manual/upgrading/2.3-2.4.md b/docs/operator-manual/upgrading/2.3-2.4.md index f877063226419..964b1cc18923a 100644 --- a/docs/operator-manual/upgrading/2.3-2.4.md +++ b/docs/operator-manual/upgrading/2.3-2.4.md @@ -176,7 +176,7 @@ that uses the Service Account for auth), be sure to test before deploying the 2. ### Remove the shared volume from any sidecar plugins -As a security enhancement, [sidecar plugins](../config-management-plugins.md#option-2-configure-plugin-via-sidecar) +As a security enhancement, [sidecar plugins](../../user-guide/config-management-plugins.md#option-2-configure-plugin-via-sidecar) no longer share the /tmp directory with the repo-server. If you have one or more sidecar plugins enabled, replace the /tmp volume mount for each sidecar to use a volume specific diff --git a/docs/operator-manual/upgrading/2.5-2.6.md b/docs/operator-manual/upgrading/2.5-2.6.md deleted file mode 100644 index 65864c88896ab..0000000000000 --- a/docs/operator-manual/upgrading/2.5-2.6.md +++ /dev/null @@ -1,13 +0,0 @@ -# v2.5 to 2.6 - -## ApplicationSets: `^` behavior change in Sprig's semver functions -Argo CD 2.5 introduced [Go templating in ApplicationSets](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/GoTemplate/). Go templates have access to the Sprig function library. - -Argo CD 2.6 upgrades Sprig to v3. That upgrade includes an upgrade of [Masterminds/semver](https://github.com/Masterminds/semver/releases) to v3. - -Masterminds/semver v3 changed the behavior of the `^` prefix in semantic version constraints. If you are using Go-templated ApplicationSets which include references to [Sprig's semver functions](https://masterminds.github.io/sprig/semver.html) and use the `^` prefix, read the [Masterminds/semver changelog](https://github.com/Masterminds/semver/releases/tag/v3.0.0) to understand how your ApplicationSets' behavior may change. - -## Applications with suspended jobs now marked "Suspended" instead of "Progressing" -Prior to Argo CD v2.6, an Application managing a suspended Job would be marked as "Progressing". This was confusing/unexpected behavior for many. Starting with v2.6, Argo CD will mark such Applications as "Suspended". - -If you have processes which rely on the previous behavior (for example, a CI job with an argocd app wait call), update those before upgrading to v2.6. \ No newline at end of file diff --git a/docs/operator-manual/user-management/auth0.md b/docs/operator-manual/user-management/auth0.md index 411517df05e06..b9d397b1214cb 100644 --- a/docs/operator-manual/user-management/auth0.md +++ b/docs/operator-manual/user-management/auth0.md @@ -12,7 +12,7 @@ Follow the [register app](https://auth0.com/docs/dashboard/guides/applications/r * Take note of the _clientId_ and _clientSecret_ values. * Register login url as https://your.argoingress.address/login * Set allowed callback url to https://your.argoingress.address/auth/callback -* Under connections, select the user-registries you want to use with argo. +* Under connections, select the user-registries you want to use with argo Any other settings are non-essential for the authentication to work. @@ -70,4 +70,4 @@ data:
!!! note "Storing Client Secrets" - Details on storing your clientSecret securely and correctly can be found on the [User Management Overview page](index.md#sensitive-data-and-sso-client-secrets). + Details on storing your clientSecret securely and correctly can be found on the [User Management Overview page](../../user-management/#sensitive-data-and-sso-client-secrets). \ No newline at end of file diff --git a/docs/operator-manual/web_based_terminal.md b/docs/operator-manual/web_based_terminal.md index 5c791e9faa00f..25fccf2de4195 100644 --- a/docs/operator-manual/web_based_terminal.md +++ b/docs/operator-manual/web_based_terminal.md @@ -11,25 +11,24 @@ they have the `exec/create` privilege. If the Pod mounts a ServiceAccount token Kubernetes), then the user effectively has the same privileges as that ServiceAccount. ## Enabling the terminal - 1. Set the `exec.enabled` key to `"true"` on the `argocd-cm` ConfigMap. 2. Patch the `argocd-server` Role (if using namespaced Argo) or ClusterRole (if using clustered Argo) to allow `argocd-server` to exec into pods - - - apiGroups: - - "" - resources: - - pods/exec - verbs: - - create - - -3. Add RBAC rules to allow your users to `create` the `exec` resource, i.e. - - p, role:myrole, exec, create, */*, allow - +```yaml +- apiGroups: + - "" + resources: + - pods/exec + verbs: + - create +``` + +3. Add RBAC rules to allow your users to `create` the `exec` resource, i.e. +``` +p, role:myrole, exec, create, */*, allow +``` See [RBAC Configuration](rbac.md#exec-resource) for more info. @@ -43,4 +42,4 @@ By default, Argo CD attempts to execute shells in this order: 4. cmd If none of the shells are found, the terminal session will fail. To add to or change the allowed shells, change the -`exec.shells` key in the `argocd-cm` ConfigMap, separating them with commas. +`exec.shells` key in the `argocd-cm` ConfigMap, separating them with commas. \ No newline at end of file diff --git a/docs/proposals/2022-07-13-appset-progressive-rollout-strategy.md b/docs/proposals/2022-07-13-appset-progressive-rollout-strategy.md deleted file mode 100644 index 8393c445cc5ea..0000000000000 --- a/docs/proposals/2022-07-13-appset-progressive-rollout-strategy.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: ApplicationSet Progressive Rollout Strategy -authors: - - "@wmgroot" - - "@cnmcavoy" -sponsors: - - indeed.com -reviewers: - - "@alexmt" - - TBD -approvers: - - "@alexmt" - - TBD - -creation-date: 2022-07-13 -last-updated: 2022-08-11 ---- - -# ApplicationSet Progressive Rollout Strategy - -## Summary - -Enhance the ArgoCD ApplicationSet resource to embed a rollout strategy for a progressive application resource update after the ApplicationSet spec or Application templates are modified. -Further discussion and interest has been communicated here: https://github.com/argoproj/argo-cd/issues/9437 - -## Motivation - -As cluster operators, we would like to make changes to ApplicationSets which may target multiple environments, pre-defined staging areas, or other configurations, and have these changes rolled out in a declarative, defined manner rather than all at once as ApplicationSets currently behave. A progressive ApplicationSet rollout would prevent mistakes in configuration from having a larger blast radius than intended and give cluster operators a chance to verify and have confidence in their changes. - -### Goals - -Users are able to make a single change to ApplicationSet that is updated across the generated Applications in a controlled manner. When this enhancement is enabled, Applications are updated in a declaractive order, instead of simultaneously. - -### Non-Goals - -Handling controlled rollouts for changes to a helm chart or raw manifests referenced by the Applications managed by the ApplicationSet. We understand this would be valuable, but we would like to implement the rollout implementation handling only changes to the ApplicationSet initially. - -## Proposal - -This is where we get down to details of what the proposal is about. - -### Use cases - -Add a list of detailed use cases this enhancement intends to take care of. - -#### Use case 1: -As a user, I would like to declaratively control the rollout order of ApplicationSet changes to its generated Application resources. - -We propose adding a `RollingUpdate` and `RollingSync` strategy spec (taking inspiration from other controllers). - -The rolling update strategy deterministically chooses applications to update following a maxUpdate value. If maxUpdate is set to 1, then applications are updated one by one, proceeding each step only if the previous application syncs completed successfully. If set to more than 1, then applications are updated in parallel up to that number. -Steps for the rolling update are defined by a list of matchExpression label selectors. Each step must finish updating before the next step advances. If steps are left undefined the application update order is deterministic. - -Complete ApplicationSet spec example. -``` -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: guestbook -spec: - generators: - - list: - elements: - - cluster: engineering-dev - url: https://1.2.3.4 - env: dev - - cluster: engineering-prod - url: https://2.4.6.8 - env: prod - - cluster: engineering-qa - url: https://9.8.7.6/ - env: qa - strategy: - type: RollingUpdate - rollingUpdate: - steps: - - matchExpressions: - - key: env - operator: In - values: - - dev - maxUpdate: 0 # if undefined or 0, all applications matched are updated together - - matchExpressions: - - key: env - operator: In - values: - - qa - - matchExpressions: - - key: env - operator: In - values: - - us-east-2 - - eu-west-1 - - ap-southeast-1 - maxUpdate: 1 # maxUpdate supports both integer and percentage string values - template: - metadata: - name: '{{cluster}}-guestbook' - labels: - env: "{{env}}" # label can be provided explicitly from a list generator - region: "{{metadata.labels.cluster/region}}" # or pulled from labels on the argo cluster secrets - spec: - source: - repoURL: https://github.com/infra-team/cluster-deployments.git - targetRevision: HEAD - path: guestbook/{{cluster}} - destination: - server: '{{url}}' - namespace: guestbook -``` - -In the above example, when the guestbook ApplicationSet is created or modified, the Application resources are each updated in the order defined in `strategy.rollingUpdate`. In this case, all generated Applications (applied or not) with a label that matches the expression `env: dev` are updated to match the template. All Applications in this step are updated in parallel, because the `maxUpdate` is set to zero. The rolling update strategy progresses after the first set of Applications has successfully progressed and become healthy again. Progress towards the next step starts only after the current step has completely finished, regardless of the `maxUpdate` value. The `maxUpdate` field only throttles the total number of matching Applications updating in the current step. After the first step completes, the ApplicationSet updates all Application resources with label `env: qa` at the same time, because `maxUpdate` is undefined. Finally, during the third step, the Application resources labeled `region: us-east-2`, `region: eu-west-1`, or `region: ap-southeast-1` are updated, one by one, as the `maxUpdate` for the final step is 1. - -An Application rollout is considered “complete” when the Application resource has been: -- Synced successfully. -- Moved into a “Progressing” state. -- Moved out of a “Progressing” state and into a “Healthy” state. - -`RollingSync` operates using the same spec, but is a re-implementation of the https://github.com/Skyscanner/applicationset-progressive-sync tool. It notices that Applications become OutOfSync, and triggers sync operations on those Applications following the order declared in the Application strategy spec. - - -#### Use case 2: -As a user, I would like to continue to use the current simultaneous Application update behavior of the ApplicationSet controller. - -If no strategy is provided, we propose defaulting to an `AllAtOnce` strategy, which maintains the current behavior. - - -### Implementation Details/Notes/Constraints [optional] - -#### Initial ApplicationSet Creation -Application resource creation from an ApplicationSet with a defined strategy looks much like the update process. When a brand new ApplicationSet is first created with a rollout strategy specified, the desired Application resource metadata labels are used to determine when each Application resource is created. Each Application created will be created in the order defined by the steps, if any, and advance to the next step only when a step completes successfully. The same applies if an ApplicationSet is modified to target a different set of destination clusters or namespaces, Applications are created or updated in the order defined by their desired state and the defined step order in the strategy. - -#### ApplicationSet Rollout Failure -In the event that an ApplicationSet spec or template is modified and a target Application resource fails to “complete” a sync in any of the steps, the ApplicationSet rollout is stalled. The ApplicationSet resource will ensure the status field for “ApplicationSetUpToDate” is False. If the maxUpdate allows it, the ApplicationSet will continue updating Applications in the current step, but otherwise, no further changes will be propagated to Application resources by the ApplicationSet, and no steps will advance until each Application can successfully complete a sync. If the ApplicationSet is modified while still in the midst of an ApplicationSet rollout, stalled or otherwise, then the existing rollout is abandoned, the application resources are left in their present state, and the new rollout begins. - -#### "Pausing" Application Changes During Rollout -To implement the “paused” functionality of Applications that are not yet ready to be updated, we have a few options. -* Disable auto-sync. -** Potentially conflicts with user provided auto-sync settings. -** Provides the benefit of being able to see the full diff of the ApplicationSet change. -* “Pause” the Application. -** Not Yet Implemented: https://github.com/argoproj/argo-cd/issues/4808 -* Prevent any updates at all to the live Applications via the rolling update strategy defined. -** This is likely the initial implementation method we'll target. - -#### Draft Pull Request -This PR is now functional and ready for comment. We are actively working on unit tests and documentation. -https://github.com/wmgroot/argo-cd/pull/1 - -### Security Considerations -We do not believe this proposal results in any new security considerations for the ApplicationSet controller. - -### Risks and Mitigations - -If this proposal is implemented, I believe the next logical step would be to solve the case where users would like to control rollout order for Application resources with a consistent specification, but changes being pushed to the upstream `source` of the Application. A common use case is an update to an unversioned "wrapper" helm chart that depends on a versioned upstream chart. The wrapper chart is often used to apply simple supplementary resources in a gitops pattern, such as company specific RBAC configuration, or ExternalSecrets configuration. These supplementary resources do not typically warrant publishing a versioned wrapper chart, making it difficult to implement changes to the chart's templates or value files and roll them out in an ordered way with the ApplicationSet changes discussed here. - -Implementing progressive rollout stragies to handled changes upstream of the generated Application source could be difficult, since the applicationset controller would need to intercept the sync operation of the Application to prevent the changes from syncing automatically. - -Added maintenance burden on the ArgoCD team is always a risk with the addition of new features. - -### Upgrade / Downgrade Strategy - -We are introducing new fields to the ApplicationSet CRD, however no existing fields are being changed. We believe this means that a new ApplicationSet version is unnecessary, and that upgrading to the new spec with extra fields will be a clean operation. - -Downgrading would risk users receiving K8s API errors if they continue to try to apply the `strategy` field to a downgraded version of the ApplicationSet resource. -Downgrading the controller while keeping the upgraded version of the CRD should cleanly downgrade/revert the behavior of the controller to the previous version without requiring users to adjust their existing ApplicationSet specs. - -## Drawbacks - -The idea is to find the best form of an argument why this enhancement should _not_ be implemented. - -## Alternatives - -One alternative we considered was to create an extra CRD specifically to govern the rollout process for an ApplicationSet. We ultimately decided against this approach because all other rollout strategy specs we looked at were implemented in the same CRD resource (K8s Deployments, Argo Rollouts, CAPI MachineDeployments, etc). - -Another alternative is to implement Application Dependencies through the application-controller instead. This is a far more complicated approach that requires implementing and maintaining an Application DAG. -https://github.com/argoproj/argo-cd/issues/7437 diff --git a/docs/proposals/deep-links.md b/docs/proposals/deep-links.md deleted file mode 100644 index 6f1f13f04cc46..0000000000000 --- a/docs/proposals/deep-links.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: Deep Links - -authors: -- "@gdsoumya" -- "@alexmt" - -sponsors: -- TBD - -reviewers: -- TBD - -approvers: -- TBD - -creation-date: 2022-08-01 - ---- - -# Deep Links - -Deep links allow end users to quickly redirect to third-party systems such as Splunk, DataDog etc. from the Argo CD -user interface. - - -## Summary - -Argo CD administrator will be able to configure links that redirect users to third-party systems such as Splunk, -DataDog etc. The template should be able to reference different types of resources relating to where the links show up, -this includes projects, applications, or individual resources(pods, services etc.) that are part of the application. - -Deep Link is a generic integration solution for third-party systems which enables users to integrate any system - not -only popular solutions but also custom/private systems that can leverage the data available in Argo CD. - -## Motivation - -Argo CD UI with deep links to third-party integrations will provide a unified solution for users making it easier for -them to switch between relevant systems without having to separately navigate and correlate the information. - - -## Proposal - -The configuration for Deep Links will be present in the `argocd-cm`, we will add new `.links` fields in the -cm to list all the deep links that will be displayed in the provided location. The possible values for `` -currently are : -- `project` : all links under this field will show up in the project tab in the Argo CD UI. -- `application` : all links under this field will show up in the application summary tab. -- `resource` : all links under this field will show up in the individual resource(deployments, pods, services etc.) - summary tab. - -Each link in the list has five subfields : -1. `title` : title/tag that will be displayed in the UI corresponding to that link -2. `url` : the actual URL where the deep link will redirect to, this field can be templated to use data from the - application, project or resource objects (depending on where it is located) -3. `description` (optional) : a description for what the deep link is about -4. `icon.class` (optional) : a font-awesome icon class to be used when displaying the links in dropdown menus. -5. `if` (optional) : a conditional statement that results in either `true` or `false`, it also has access to the same - data as the `url` field. If the condition resolves to `true` the deep link will be displayed else it will be hidden. If - the field is omitted by default the deep links will be displayed. - - -An example `argocd-cm.yaml` file with deep links and its variations : - -```yaml -data: - # project level links - project.links: | - - url: https://myaudit-system.com?project={{proj.metadata.name}} - title: Audit - # application level links - application.links: | - - url: https://mycompany.splunk.com?search={{app.spec.destination.namespace}} - title: Splunk - # conditionally show link e.g. for specific project - - url: https://mycompany.splunk.com?search={{app.spec.destination.namespace}} - title: Splunk - if: app.spec.proj == "abc" - - url: https://{{project.metadata.annotations.splunkhost}}?search={{app.spec.destination.namespace}} - title: Splunk - if: project.metadata.annotations.splunkhost - - # resource level links - resource.links: | - - url: https://mycompany.splunk.com?search={{res.metadata.namespace}} - title: Splunk - if: res.kind == "Pod" || res.kind == "Deployment" - -``` - -The argocd server will expose new APIs for rendering deep links in the UI, the server will handle the templating and -conditional rendering logic and will provide the UI with the final list of links that need to be displayed for a -particular location/resource. - -The following API methods are proposed: - -```protobuf -message LinkInfo { - required string name = 1; - required string url = 2; - optional string description = 3; - optional string iconClass = 4; -} - -message LinksResponse { - repeated LinkInfo items = 1; -} - -service ApplicationService { - rpc ListLinks(google.protobuf.Empty) returns (LinksResponse) { - option (google.api.http).get = "/api/v1/applications/{name}/links"; - } - - rpc ListResourceLinks(ApplicationResourceRequest) returns (LinksResponse) { - option (google.api.http).get = "/api/v1/applications/{name}/resource/links"; - } -} - -service ProjectService { - - rpc ListLinks(google.protobuf.Empty) returns (LinksResponse) { - option (google.api.http).get = "/api/v1/projects/{name}/links"; - } -} -``` - -### Use cases - -Some example use cases this enhancement intends to take care of - - -#### Use case 1: -As a user, I would like to quickly open a splunk/datadog UI with a query that retrieves all logs of application -namespace or metrics for specific applications etc. diff --git a/docs/proposals/proxy-extensions.md b/docs/proposals/proxy-extensions.md deleted file mode 100644 index 0ba5b48885b44..0000000000000 --- a/docs/proposals/proxy-extensions.md +++ /dev/null @@ -1,425 +0,0 @@ ---- -title: Reverse Proxy Extensions - -authors: -- "@leoluz" - -sponsors: -- TBD - -reviewers: -- TBD - -approvers: -- TBD - -creation-date: 2022-07-23 - ---- - -# Reverse-Proxy Extensions support for Argo CD - -Enable UI extensions to use a backend service. - -* [Summary](#summary) -* [Motivation](#motivation) -* [Goals](#goals) -* [Non-Goals](#non-goals) -* [Proposal](#proposal) - * [Use cases](#use-cases) - * [Security Considerations](#security-considerations) - * [Risks and Mitigations](#risks-and-mitigations) - * [Upgrade / Downgrade](#upgrade--downgrade) -* [Drawbacks](#drawbacks) -* [Open Questions](#open-questions) - ---- - -## Summary - -Argo CD currently supports the creation of [UI extensions][1] allowing -developers to define the visual content of the "more" tab inside -a specific resource. Developers are able to access the resource state to -build the UI. However, currently it isn't possible to use a backend -service to provide additional functionality to extensions. This proposal -defines a new reverse proxy feature in Argo CD, allowing developers to -create a backend service that can be used in UI extensions. Extensions -backend code will live outside Argo CD main repository. - -## Motivation - -The initiative to implement the anomaly detection capability in Argo CD -highlighted the need to improve the existing UI extensions feature. The -new capability will required the UI to have access to data that isn't -available as part of Application's owned resources. It is necessary to -access an API defined by the extension's development team so the proper -information can be displayed. - -## Goals - -The following goals are desired but not necessarily all must be -implemented in a given Argo CD release: - -#### [G-1] Argo CD (API Server) must have low performance impact when running extensions - -Argo CD API server is a critical component as it serves all APIs used by -the CLI as well as the UI. The Argo CD team has no controll over what is -going to be executed in extension's backend service. Thus it is important -that the reverse proxy implementation to cause the lowest possible impact -in the API server while processing high latency requests. - -Possible solutions: -- Implement a rate limit layer to protect Argo CD API server -- Implement configurable different types of timeouts (idle connection, - duration, etc) between Argo CD API server and backend services. -- Implement the reverse proxy as a separate server/pod (needs discussion). - ----- - -#### [G-2] Argo CD admins should be able to define rbacs to define which users can invoke specific extensions - -Argo CD Admins must be able to define which extensions are allowed to be -executed by the logged in user. This should be fine grained by Argo CD -project like the current rbac implementation. - ----- - -#### [G-3] Argo CD deployment should be independent from backend services - -Extension developers should be able to deploy their backend services -independently from Argo CD. An extension can evolve their internal API and -deploying a new version shouldn't require Argo CD to be updated or -restarted. - ----- - -#### [G-4] Enhance the current Extensions framework to configure backend services - -*Not in the first release* - -[Argo CD extensions][2] is an `argoproj-labs` project that supports loading -extensions in runtime. Currently the project is implementing a controller -that defines and reconciles the custom resource `ArgoCDExtension`. This -CRD should be enhanced to provide the ability to define backend services -that will be used by the extension. Once configured UI can send requests -to API server in a specific endpoint. API server will act as a reverse -proxy receiving the request from the UI and routing to the appropriate -backend service. - -Example: -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: ArgoCDExtension -metadata: - name: my-cool-extention - finalizers: - - extensions-finalizer.argocd.argoproj.io -spec: - sources: - - git: - url: https://github.com/some-org/my-cool-extension.git - backend: - serviceName: some-backend-svc - endpoint: /some-backend -``` - -**Note**: While this is a nice-to-have, it won't be part of the first proxy -extension version. This would need to be considered if Argo CD extensions -eventually get traction. - ----- - -#### [G-5] Setup multiple backend services for the same extension - -In case of one Argo CD instance managing applications in multiple clusters, it -will be necessary to configure backend service URLs per cluster for the same -extension. This should be an optional configuration. If only one URL is -configured, that one should be used for all clusters. - ----- - -#### [G-6] Provide safe communication channel between Argo CD API server and extension backend - -Argo CD API server should provide configuration for establishing a safe communication -channel with the extension backend. This can be achieved similarly to how Kubernetes -API Server does to [authenticate with aggregated servers][5] by using certificates. - -## Non-Goals - -It isn't in the scope of this proposal to specify commands in the Argo CD -CLI. This proposal covers the reverse-proxy extension spec that will be -used by Argo CD UI. - -## Proposal - -### Use cases - -The following use cases should be implemented for the conclusion of this -proposal: - -#### [UC-1]: As an Argo CD admin, I want to configure a backend services so it can be used by my UI extension - -Define a new section in the Argo CD configmap ([argocd-cm.yaml][4]) -allowing admins to register and configure new extensions. All enabled -extensions backend will be available to be invoked by the Argo CD UI under -the following API base path: - -`/api/v1/extensions/` - -With the configuration below, the expected behavior is explained in the -following examples: - -```yaml -extension.config: | - extensions: - - name: some-extension - enabled: true - backend: - idleConnTimeout: 10s - services: - - url: http://extension-name.com:8080 -``` - -- **Example 1**: - -Argo CD API server acts as a reverse-proxy forwarding http requests as -follows: - -``` - ┌────────────┐ - │ Argo CD UI │ - └──────┬─────┘ - │ - │ GET http://argo.com/api/v1/extensions/some-extension - │ - ▼ - ┌──────────────────┐ - │Argo CD API Server│ - └────────┬─────────┘ - │ - │ GET http://extension-name.com:8080 - │ - ▼ - ┌───────────────┐ - │Backend Service│ - └───────────────┘ -``` - -- **Example 2**: - -If a backend provides an API under the `/apiv1/metrics` endpoint, Argo CD -should be able to invoke it such as: - -``` - ┌────────────┐ - │ Argo CD UI │ - └──────┬─────┘ - │ - │ GET http://argo.com/api/v1/extensions/some-extension/apiv1/metrics/123 - │ - ▼ - ┌──────────────────┐ - │Argo CD API Server│ - └────────┬─────────┘ - │ - │ GET http://extension-name.com:8080/apiv1/metrics/123 - │ - ▼ - ┌───────────────┐ - │Backend Service│ - └───────────────┘ -``` - -- **Example 3**: - -In this use-case we have one Argo CD instance connected with different -clusters. There is a requirement defining that every extension instance -needs to be deployed in each of the target clusters. To address this -use-case there is a need to configure multiple backend URLs for the -same extension (one for each cluster). For doing so, the following -configuration should be possible: - -```yaml -extension.config: | - extensions: - - name: some-extension - enabled: true - backend: - idleConnTimeout: 10s - services: - - url: http://extension-name.com:8080 - clusterName: kubernetes.local - - url: https://extension-name.ppd.cluster.k8s.local:8080 - clusterName: admins@ppd.cluster.k8s.local -``` - -Note that there is an URL configuration per cluster name. The cluster -name is extracted from the Argo CD cluster secret and must match the -field `data.name`. In this case the UI must send the header -`Argocd-Application-Name` with the full qualified application name -(`/`). - -Example: - -`Argocd-Application-Name: preprod/some-application` - -With this information, API Server can check in which cluster it should -get the backend URL from. This will be done by inspecting the -Application destination configuration to find the proper cluster name. - -The diagram below shows how Argo CD UI could send the request with -the additional header to get the proxy forwarding it to the proper -cluster: - -``` - ┌────────────┐ - │ Argo CD UI │ - └──────┬─────┘ - │ - │ GET http://argo.com/api/v1/extensions/some-extension - │ HEADER: "Argocd-Application-Name: default/ppd-application" - │ - ▼ - ┌──────────────────┐ - │Argo CD API Server│ - └────────┬─────────┘ - │ - │ GET https://extension-name.ppd.cluster.k8s.local:8080 - │ - ▼ - ┌───────────────┐ - │Backend Service│ - └───────────────┘ -``` - -##### Considerations - -- The `idleConnTimeout` can be used to avoid accumulating too many - goroutines waiting slow for extensions. In this case a proper timeout - error (408) should be returned to the browser. -- Scheme, http verb and request body are forwarded as it is - received by the API server to the backend service. -- Headers will be filtered and not forwarded as it is received in Argo CD - API server. Sensitive headers will be removed (e.g. `Cookie`). -- A new header is added in the forwared request (`X-Forwarded-Host`) to - allow ssl redirection. -- This proposal doesn't specify how backends should implement authz or - authn. This topic could be discussed as a future enhancement to the - proxy extension feature in Argo CD. - ----- - -#### [UC-2]: As an Argo CD admin, I want to define extensions rbacs so access permissions can be enforced - -Extend Argo CD rbac registering a new `ResourceType` for extensions in the -[policy configuration][3]. The current policy permission configuration is -defined as: - -``` -p, , , , , -``` - -With a new resource type for extensions, admins will be able to configure -access rights per extension per project. - -* **Basic config suggestion:** - -This is the basic suggestion where admins will be able to define permissions -per project and per extension. In this case namespace specific permissions -isn't covered. - -The `object` field must contain the project name and the extension name in -the format `/` - -- *Example 1*: - -``` -p, role:allow-extensions, extensions, *, some-project/some-extension, allow -``` - -In the example 1, a permission is configured to allowing the subject -`role:allow-extensions`, for the resource type `extensions`, for all (`*`) -actions, in the project `some-project`, for the extension name -`some-extension`. - - -- *Example 2*: - -``` -p, role:allow-extensions, extensions, *, */some-extension, allow -``` - -In the example 2, the permission is similar to the example 1 with the -difference that the extension `some-extension` will be allowed for all -projects. - -- *Example 3*: - -``` -p, role:allow-extensions, extensions, *, */*, allow -``` - -In the example 3, the subject `role:allow-extensions` is allowed to -execute extensions in all projects. - -* **Advanced config suggestions:** - -With advanced RBAC configuration suggestions, admins will be able to define -permissions per project, per namespace and per extension. - -There are 3 main approaches to achieve this type of RBAC configuration: - -1. `` has addional section for namespace: -``` -p, dev, extensions, *, some-project/some-namespace/some-extension, allow -``` - -2. `` has 2 sections for extension name and namespace: -``` -p, dev, extensions, some-extension/some-namespace, some-project/some-application, allow -``` - -3. `` has 2 sections for extension type and extension name: -``` -p, dev, extensions/some-extension, *, some-project/some-application, allow -``` - -Reference: [Original discussion][6] - -The final RBAC format must be defined and properly documented during implementation. - -### Security Considerations - -- Argo CD API Server must apply **authn** and **authz** for all incoming - extensions requests -- Argo CD must authorize requests coming from UI and check that the - authenticated user has access to invoke a specific URL belonging to an - extension - -### Risks and Mitigations - -### Upgrade / Downgrade - -## Drawbacks - -- Slight increase in Argo CD code base complexity. -- Increased security risk. -- Impact of extensions on overall Argo CD performance (mitigated by rate limiting + idle conn timeout). - -## Open Questions - -1. What are the possible actions that can be provided to extensions RBAC? -A. This proposal does not define additional RBAC actions for extensions. -Currently the only possible value is `*` which will allow admins to enable -or disable certain extensions per project. If there is a new requirement -to support additional actions for extensions to limit just specific HTTP -verbs for example, an enhancement can be created to extend this -functionality. If this requirement becomes necessary, it won't be a -breaking change as it will be more restrictive. - -[1]: https://argo-cd.readthedocs.io/en/stable/developer-guide/ui-extensions/ -[2]: https://github.com/argoproj-labs/argocd-extensions -[3]: https://github.com/argoproj/argo-cd/blob/a23bfc3acaa464cbdeafdbbe66d05a121d5d1fb3/server/rbacpolicy/rbacpolicy.go#L17-L25 -[4]: https://argo-cd.readthedocs.io/en/stable/operator-manual/argocd-cm.yaml -[5]: https://kubernetes.io/docs/tasks/extend-kubernetes/configure-aggregation-layer/#authentication-flow -[6]: https://github.com/argoproj/argo-cd/pull/10435#discussion_r986941880 diff --git a/docs/roadmap.md b/docs/roadmap.md index dd2f1ee89fbbf..06008f3e9e2e7 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,5 +1,224 @@ # Roadmap -The Argo CD roadmap is maintained in [a GitHub Project](https://github.com/orgs/argoproj/projects/25/views/14). +- [Roadmap](#roadmap) + - [v2.4](#v24) + - [Server side apply](#server-side-apply) + - [Input Forms UI Refresh](#input-forms-ui-refresh) + - [Web Shell](#web-shell) + - [Helm values from external repo](#helm-values-from-external-repo) + - [Support multiple sources for an Application](#support-multiple-sources-for-an-application) + - [Config Management Tools Enhancements: Parametrization & Security Improvements](#config-management-tools-enhancements-parametrization--security-improvements) + - [v2.5 and beyond](#v25-and-beyond) + - [Config Management Tools Enhancements: UI/CLI](#config-management-tools-enhancements-uicli) + - [First class support for ApplicationSet resources](#first-class-support-for-applicationset-resources) + - [Merge Argo CD Image Updater into Argo CD](#merge-argo-cd-image-updater-into-argo-cd) + - [Sharding application controller](#sharding-application-controller) + - [Add support for secrets in Application parameters](#add-support-for-secrets-in-application-parameters) + - [Allow specifying parent/child relationships in config](#allow-specifying-parentchild-relationships-in-config) + - [Dependencies between applications](#dependencies-between-applications) + - [Multi-tenancy improvements](#multi-tenancy-improvements) + - [GitOps Engine Enhancements](#gitops-engine-enhancements) + - [Completed](#completed) + - [✅ Merge Argo CD Notifications into Argo CD](#-merge-argo-cd-notifications-into-argo-cd) + - [✅ Merge ApplicationSet controller into Argo CD](#-merge-applicationset-controller-into-argo-cd) + - [✅ Compact resources tree](#-compact-resources-tree) + - [✅ Maintain difference in cluster and git values for specific fields](#-maintain-difference-in-cluster-and-git-values-for-specific-fields) + - [✅ ARM images and CLI binary](#-arm-images-and-cli-binary) + - [✅ Config Management Tools Integrations (proposal)](#-config-management-tools-integrations-proposal) + - [✅ Argo CD Extensions (proposal)](#-argo-cd-extensions-proposal) + - [✅ Project scoped repository and clusters (proposal)](#-project-scoped-repository-and-clusters-proposal) + - [✅ Core Argo CD (proposal)](#-core-argo-cd-proposal) + - [✅ Core Functionality Bug Fixes](#-core-functionality-bug-fixes) + - [✅ Performance](#-performance) + - [✅ ApplicationSet](#-applicationset) + - [✅ Large Applications support](#-large-applications-support) + - [✅ Serviceability](#-serviceability) + - [✅ Argo CD Notifications](#-argo-cd-notifications) + - [✅ Automated Registry Monitoring](#-automated-registry-monitoring) + - [✅ Projects Enhancements](#-projects-enhancements) -Releases are planned according to the [Release Process and Cadence](developer-guide/release-process-and-cadence.md) doc. +## v2.4 + +> ETA: May 2022 + +### Server side apply + +Support using [server side apply](https://kubernetes.io/docs/reference/using-api/server-side-apply/) during application syncing +[#2267](https://github.com/argoproj/argo-cd/issues/2267) + +### Input Forms UI Refresh + +Improved design of the input forms in Argo CD Web UI: https://www.figma.com/file/IIlsFqqmM5UhqMVul9fQNq/Argo-CD?node-id=0%3A1 + +### Web Shell + +Exec into the Kubernetes Pod right from Argo CD Web UI! [#4351](https://github.com/argoproj/argo-cd/issues/4351) + +### Helm values from external repo + +The feature allows combining of-the-shelf Helm chart and value file in Git repository ([#2789](https://github.com/argoproj/argo-cd/issues/2789)) + +### Support multiple sources for an Application + +Support more than one source for creating an Application [#8322](https://github.com/argoproj/argo-cd/pull/8322). + +### Config Management Tools Enhancements: Parametrization & Security Improvements + +The continuation of the Config Management Tools of [proposal](https://github.com/argoproj/argo-cd/blob/master/docs/proposals/parameterized-config-management-plugins.md). +The Argo config management plugin configuration allows users to specify the accepted parameters, default values to eventually power UI and CLI. +Additionally, plugins implementation should provide better Argo CD tenant isolation and security. + +## v2.5 and beyond + +### Config Management Tools Enhancements: UI/CLI + +The Argo CD should provide a first-class experience for configured third-party config management tools. User should be able to view supported parameters, +observe default parameter values and override them. + +### First class support for ApplicationSet resources + +The Argo CD UI/CLI/API allows to manage ApplicationSet resources same as Argo CD Applications ([#7352](https://github.com/argoproj/argo-cd/issues/7352)). + +### Merge Argo CD Image Updater into Argo CD + +The [Argo CD Image Updater](https://github.com/argoproj-labs/argocd-image-updater) should be merged into Argo CD and available out-of-the-box: [#7385](https://github.com/argoproj/argo-cd/issues/7385) + + +### Sharding application controller + +Application controller to scale automatically to provide high availability[#8340](https://github.com/argoproj/argo-cd/issues/8340). + +### Add support for secrets in Application parameters + +The feature allows referencing secrets in Application parameters. [#1786](https://github.com/argoproj/argo-cd/issues/1786). + +### Allow specifying parent/child relationships in config + +The feature [#5082](https://github.com/argoproj/argo-cd/issues/5082) allows configuring parent/child relationships between resources. This allows to correctly +visualize custom resources that don't have owner references. + +### Dependencies between applications + +The feature allows specifying dependencies between applications that allow orchestrating synchronization of multiple applications. [#3517](https://github.com/argoproj/argo-cd/issues/3517) + + +### Multi-tenancy improvements + +The multi-tenancy improvements that allow end-users to create Argo CD applications using Kubernetes directly without accessing Argo CD API. + +* [Applications outside argocd namespace](https://github.com/argoproj/argo-cd/pull/6409) +* [AppSource](https://github.com/argoproj-labs/appsource) + + +### GitOps Engine Enhancements + +The [GitOps Engine](https://github.com/argoproj/gitops-engine) is a library that implements core GitOps functions such as K8S resource reconciliation and diffing. +A lot of Argo CD features are still not available in GitOps engine. The following features have to be contributed to the GitOps Engine: + +* an ability to customize resources health assessment and existing CRD health [assessment functions](https://github.com/argoproj/argo-cd/tree/master/resource_customizations). +* resource diffing [customization](../user-guide/diffing/). +* config management [tools](../user-guide/application_sources/) integration. +* unified syncing annotations [argoproj/gitops-engine#43](https://github.com/argoproj/gitops-engine/issues/43). + +## Completed + +### ✅ Merge Argo CD Notifications into Argo CD + +The [Argo CD Notifications](https://github.com/argoproj-labs/argocd-notifications) should be merged into Argo CD and available out-of-the-box: [#7350](https://github.com/argoproj/argo-cd/issues/7350) + +### ✅ Merge ApplicationSet controller into Argo CD + +The ApplicationSet functionality is available in Argo CD out-of-the-box ([#7351](https://github.com/argoproj/argo-cd/issues/7351)). + +### ✅ Compact resources tree + +An ability to collaps leaf resources tree to improve visualization of very large applications: [#7349](https://github.com/argoproj/argo-cd/issues/7349) + +### ✅ Maintain difference in cluster and git values for specific fields + +The feature allows to avoid updating fields excluded from diffing ([#2913](https://github.com/argoproj/argo-cd/issues/2913)). + +### ✅ ARM images and CLI binary + +The release workflow should build and publish ARM images and CLI binaries: ([#4211](https://github.com/argoproj/argo-cd/issues/4211)) + +### ✅ Config Management Tools Integrations ([proposal](https://github.com/argoproj/argo-cd/pull/5927)) + +The community likes the first class support of Helm, Kustomize and keeps requesting support for more tools. +Argo CD provides a mechanism to integrate with any config management tool. We need to investigate why +it is not enough and implement missing features. + +### ✅ Argo CD Extensions ([proposal](https://github.com/argoproj/argo-cd/pull/6240)) + +Argo CD supports customizing handling of Kubernetes resources via diffing customizations, +health checks, and custom actions. The Argo CD Extensions proposal takes it to next +level and allows to deliver the resource customizations along with custom visualization in Argo CD +via Git repository. + +### ✅ Project scoped repository and clusters ([proposal](https://github.com/argoproj/argo-cd/blob/master/docs/proposals/project-repos-and-clusters.md)) + +The feature streamlines the process of adding repositories and clusters to the project and makes it self-service. +Instead of asking an administrator to change Argo CD settings end users can perform the change independently. + +### ✅ Core Argo CD ([proposal](https://github.com/argoproj/argo-cd/pull/6385)) + +Core Argo CD allows to installation and use of lightweight Argo CD that includes only the backend without exposing the API or UI. +The Core Argo CD provides a better experience to users who need only core Argo CD features and don't want to deal with multi-tenancy features. + +### ✅ Core Functionality Bug Fixes + +The core GitOps features still have several known bugs and limitations. The full list is available in [v1.9 milestone]( +https://github.com/argoproj/argo-cd/issues?q=is%3Aopen+is%3Aissue+label%3Abug+milestone%3A%22v1.9%22+label%3Acomponent%3Acore) + +The most notable issues: + +* [Argo CD synchronization lasts incredibly long](https://github.com/argoproj/argo-cd/issues/3663) + +### ✅ Performance + +* 2000+ Applications support. The user interface becomes notably slower if one Argo CD instance manages more than 1 thousand applications. +A set of optimizations is required to fix that issue. + +* 100+ Clusters support. The cluster addon management use-case requires connecting a large number of clusters to one Argo CD controller. +Currently Argo CD controller is unable to handle that many clusters. The solution is to support horizontal controller scaling and automated sharding. + +* Mono Repository support. Argo CD is not optimized for mono repositories with a large number of applications. With 50+ applications in the same repository, manifest generation performance drops significantly. The repository server optimization is required to improve it. + +### ✅ ApplicationSet + +Argo CD Applications allow splitting the cluster configuration into logic groups that are managed independently. However, the set of applications +is a configuration that should be managed declaratively as well. The app-of-apps pattern solves this problem but still has some challenges such as +maintenance overhead, security, and lack of some additional features. + +[ApplicationSet](https://github.com/argoproj-labs/applicationset) project provides a better solution for managing applications across multiple environments. + +### ✅ Large Applications support + +The application details page is not suitable to visualize applications that include a large number of resources (hundreds of resources). The page has to be reworked +to improve user experience. + +### ✅ Serviceability + +To make Argo CD successful we need to build tools that enable Argo CD administrators to handle scalability and performance issues in a self-service model. + +That includes more metrics, out-of-the-box alerts and a cluster management user interface. + + +### ✅ Argo CD Notifications + +[Argo CD Notifications](https://github.com/argoproj-labs/argocd-notifications) provides the ability to notify users about Argo CD Application +changes as well as implement integrations such as update GitHub commit status, trigger Jenkins job, set Grafana label, etc. + +### ✅ Automated Registry Monitoring + +[Argo CD Image Updater](https://github.com/argoproj-labs/argocd-image-updater) provides an ability to monitor Docker registries and automatically +update image versions in the deployment repository. See [https://github.com/argoproj/argo-cd/issues/1648](https://github.com/argoproj/argo-cd/issues/1648). + + +### ✅ Projects Enhancements + +Argo CD projects accumulated a lot of debt: + +* Users don't know how to use project roles and SSO. It is one of the key features but not documented well. We need to document and promote it +* Project management UI has evolved organically and needs a complete redesign. We packaged everything into one sliding panel which is painful to use +* Enhancements: [#3598](https://github.com/argoproj/argo-cd/issues/3598) \ No newline at end of file diff --git a/docs/snyk/index.md b/docs/snyk/index.md index 520d2b224c90d..534f70168e15c 100644 --- a/docs/snyk/index.md +++ b/docs/snyk/index.md @@ -13,64 +13,51 @@ recent minor releases. | | Critical | High | Medium | Low | |---:|:--------:|:----:|:------:|:---:| -| [go.mod](master/argocd-test.html) | 0 | 0 | 0 | 0 | -| [ui/yarn.lock](master/argocd-test.html) | 0 | 0 | 1 | 0 | -| [dex:v2.35.3](master/ghcr.io_dexidp_dex_v2.35.3.html) | 0 | 0 | 0 | 0 | +| [go.mod](master/argocd-test.html) | 0 | 0 | 2 | 0 | +| [ui/yarn.lock](master/argocd-test.html) | 0 | 0 | 0 | 0 | +| [dex:v2.32.0-distroless](master/ghcr.io_dexidp_dex_v2.32.0-distroless.html) | 0 | 0 | 0 | 0 | | [haproxy:2.6.2-alpine](master/haproxy_2.6.2-alpine.html) | 0 | 0 | 0 | 0 | -| [argocd:latest](master/quay.io_argoproj_argocd_latest.html) | 0 | 0 | 2 | 14 | -| [redis:7.0.7-alpine](master/redis_7.0.7-alpine.html) | 0 | 0 | 0 | 0 | +| [argocd:latest](master/quay.io_argoproj_argocd_latest.html) | 0 | 0 | 3 | 17 | +| [redis:7.0.4-alpine](master/redis_7.0.4-alpine.html) | 0 | 0 | 0 | 0 | | [install.yaml](master/argocd-iac-install.html) | - | - | - | - | | [namespace-install.yaml](master/argocd-iac-namespace-install.html) | - | - | - | - | -### v2.6.0-rc4 +### v2.4.11 | | Critical | High | Medium | Low | |---:|:--------:|:----:|:------:|:---:| -| [go.mod](v2.6.0-rc4/argocd-test.html) | 0 | 0 | 0 | 0 | -| [ui/yarn.lock](v2.6.0-rc4/argocd-test.html) | 0 | 0 | 1 | 0 | -| [dex:v2.35.3](v2.6.0-rc4/ghcr.io_dexidp_dex_v2.35.3.html) | 0 | 0 | 0 | 0 | -| [haproxy:2.6.2-alpine](v2.6.0-rc4/haproxy_2.6.2-alpine.html) | 0 | 0 | 0 | 0 | -| [argocd:v2.6.0-rc4](v2.6.0-rc4/quay.io_argoproj_argocd_v2.6.0-rc4.html) | 0 | 0 | 2 | 14 | -| [redis:7.0.7-alpine](v2.6.0-rc4/redis_7.0.7-alpine.html) | 0 | 0 | 0 | 0 | -| [install.yaml](v2.6.0-rc4/argocd-iac-install.html) | - | - | - | - | -| [namespace-install.yaml](v2.6.0-rc4/argocd-iac-namespace-install.html) | - | - | - | - | +| [go.mod](v2.4.11/argocd-test.html) | 0 | 0 | 3 | 0 | +| [ui/yarn.lock](v2.4.11/argocd-test.html) | 0 | 0 | 0 | 0 | +| [dex:v2.32.0](v2.4.11/ghcr.io_dexidp_dex_v2.32.0.html) | 1 | 1 | 1 | 0 | +| [haproxy:2.0.29-alpine](v2.4.11/haproxy_2.0.29-alpine.html) | 1 | 0 | 0 | 0 | +| [argocd:v2.4.11](v2.4.11/quay.io_argoproj_argocd_v2.4.11.html) | 0 | 0 | 3 | 18 | +| [redis:7.0.4-alpine](v2.4.11/redis_7.0.4-alpine.html) | 0 | 0 | 0 | 0 | +| [install.yaml](v2.4.11/argocd-iac-install.html) | - | - | - | - | +| [namespace-install.yaml](v2.4.11/argocd-iac-namespace-install.html) | - | - | - | - | -### v2.5.7 +### v2.3.7 | | Critical | High | Medium | Low | |---:|:--------:|:----:|:------:|:---:| -| [go.mod](v2.5.7/argocd-test.html) | 0 | 0 | 4 | 0 | -| [ui/yarn.lock](v2.5.7/argocd-test.html) | 0 | 0 | 4 | 0 | -| [dex:v2.35.3](v2.5.7/ghcr.io_dexidp_dex_v2.35.3.html) | 0 | 0 | 0 | 0 | -| [haproxy:2.6.2-alpine](v2.5.7/haproxy_2.6.2-alpine.html) | 0 | 0 | 0 | 0 | -| [argocd:v2.5.7](v2.5.7/quay.io_argoproj_argocd_v2.5.7.html) | 0 | 0 | 2 | 14 | -| [redis:7.0.7-alpine](v2.5.7/redis_7.0.7-alpine.html) | 0 | 0 | 0 | 0 | -| [install.yaml](v2.5.7/argocd-iac-install.html) | - | - | - | - | -| [namespace-install.yaml](v2.5.7/argocd-iac-namespace-install.html) | - | - | - | - | - -### v2.4.19 - -| | Critical | High | Medium | Low | -|---:|:--------:|:----:|:------:|:---:| -| [go.mod](v2.4.19/argocd-test.html) | 0 | 0 | 4 | 0 | -| [ui/yarn.lock](v2.4.19/argocd-test.html) | 0 | 0 | 4 | 0 | -| [dex:v2.35.3](v2.4.19/ghcr.io_dexidp_dex_v2.35.3.html) | 0 | 0 | 0 | 0 | -| [haproxy:2.0.29-alpine](v2.4.19/haproxy_2.0.29-alpine.html) | 0 | 0 | 0 | 0 | -| [argocd:v2.4.19](v2.4.19/quay.io_argoproj_argocd_v2.4.19.html) | 0 | 0 | 2 | 14 | -| [redis:7.0.7-alpine](v2.4.19/redis_7.0.7-alpine.html) | 0 | 0 | 0 | 0 | -| [install.yaml](v2.4.19/argocd-iac-install.html) | - | - | - | - | -| [namespace-install.yaml](v2.4.19/argocd-iac-namespace-install.html) | - | - | - | - | - -### v2.3.13 +| [go.mod](v2.3.7/argocd-test.html) | 0 | 0 | 3 | 0 | +| [ui/yarn.lock](v2.3.7/argocd-test.html) | 0 | 1 | 2 | 0 | +| [dex:v2.32.0](v2.3.7/ghcr.io_dexidp_dex_v2.32.0.html) | 1 | 1 | 1 | 0 | +| [haproxy:2.0.29-alpine](v2.3.7/haproxy_2.0.29-alpine.html) | 1 | 0 | 0 | 0 | +| [argocd-applicationset:v0.4.1](v2.3.7/quay.io_argoproj_argocd-applicationset_v0.4.1.html) | 0 | 4 | 38 | 29 | +| [argocd:v2.3.7](v2.3.7/quay.io_argoproj_argocd_v2.3.7.html) | 0 | 0 | 4 | 18 | +| [redis:6.2.7-alpine](v2.3.7/redis_6.2.7-alpine.html) | 1 | 0 | 0 | 0 | +| [install.yaml](v2.3.7/argocd-iac-install.html) | - | - | - | - | +| [namespace-install.yaml](v2.3.7/argocd-iac-namespace-install.html) | - | - | - | - | + +### v2.2.12 | | Critical | High | Medium | Low | |---:|:--------:|:----:|:------:|:---:| -| [go.mod](v2.3.13/argocd-test.html) | 0 | 0 | 4 | 0 | -| [ui/yarn.lock](v2.3.13/argocd-test.html) | 0 | 2 | 6 | 0 | -| [dex:v2.35.3](v2.3.13/ghcr.io_dexidp_dex_v2.35.3.html) | 0 | 0 | 0 | 0 | -| [haproxy:2.0.29-alpine](v2.3.13/haproxy_2.0.29-alpine.html) | 0 | 0 | 0 | 0 | -| [argocd-applicationset:v0.4.1](v2.3.13/quay.io_argoproj_argocd-applicationset_v0.4.1.html) | 0 | 4 | 38 | 29 | -| [argocd:v2.3.13](v2.3.13/quay.io_argoproj_argocd_v2.3.13.html) | 0 | 0 | 2 | 14 | -| [redis:6.2.8-alpine](v2.3.13/redis_6.2.8-alpine.html) | 0 | 0 | 0 | 0 | -| [install.yaml](v2.3.13/argocd-iac-install.html) | - | - | - | - | -| [namespace-install.yaml](v2.3.13/argocd-iac-namespace-install.html) | - | - | - | - | +| [go.mod](v2.2.12/argocd-test.html) | 0 | 0 | 3 | 0 | +| [ui/yarn.lock](v2.2.12/argocd-test.html) | 0 | 1 | 2 | 0 | +| [dex:v2.32.0](v2.2.12/ghcr.io_dexidp_dex_v2.32.0.html) | 1 | 1 | 1 | 0 | +| [haproxy:2.0.29-alpine](v2.2.12/haproxy_2.0.29-alpine.html) | 1 | 0 | 0 | 0 | +| [argocd:v2.2.12](v2.2.12/quay.io_argoproj_argocd_v2.2.12.html) | 0 | 0 | 7 | 28 | +| [redis:6.2.7-alpine](v2.2.12/redis_6.2.7-alpine.html) | 1 | 0 | 0 | 0 | +| [install.yaml](v2.2.12/argocd-iac-install.html) | - | - | - | - | +| [namespace-install.yaml](v2.2.12/argocd-iac-namespace-install.html) | - | - | - | - | diff --git a/docs/snyk/master/argocd-iac-install.html b/docs/snyk/master/argocd-iac-install.html index 08b5e4e70a09f..772de5e53e0b8 100644 --- a/docs/snyk/master/argocd-iac-install.html +++ b/docs/snyk/master/argocd-iac-install.html @@ -456,12 +456,12 @@

Snyk test report

-

January 22nd 2023, 12:17:21 am

+

September 7th 2022, 7:35:15 pm

Scanned the following path:
    -
  • /argo-cd/manifests/install.yaml (Kubernetes)
  • +
  • /private/argo-cd/manifests/install.yaml (Kubernetes)
@@ -476,7 +476,7 @@

Snyk test report

- +
Project manifests/install.yaml
Path /argo-cd/manifests/install.yaml
Path /private/argo-cd/manifests/install.yaml
Project Type Kubernetes
@@ -500,6 +500,8 @@

Role with dangerous permissions

  • Introduced through: [DocId: 10] + role + rules[0] resources @@ -507,7 +509,7 @@

    Role with dangerous permissions

  • - Line number: 15177 + Line number: 9299
  • @@ -546,6 +548,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 11] + role + rules[4] resources @@ -553,7 +557,7 @@

    Role with dangerous permissions

  • - Line number: 15254 + Line number: 9338
  • @@ -592,6 +596,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 12] + role + rules[0] resources @@ -599,7 +605,7 @@

    Role with dangerous permissions

  • - Line number: 15282 + Line number: 9404
  • @@ -638,14 +644,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 13] - rules[3] + role + + rules[1] resources
  • - Line number: 15326 + Line number: 9423
  • @@ -684,14 +692,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 13] - rules[1] + role + + rules[3] resources
  • - Line number: 15308 + Line number: 9423
  • @@ -730,6 +740,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 14] + role + rules[0] resources @@ -737,7 +749,7 @@

    Role with dangerous permissions

  • - Line number: 15342 + Line number: 9464
  • @@ -789,7 +801,7 @@

    Container could be running with outdated image

  • - Line number: 16346 + Line number: 10412
  • @@ -847,7 +859,7 @@

    Container has no CPU limit

  • - Line number: 15809 + Line number: 9942
  • @@ -905,7 +917,7 @@

    Container has no CPU limit

  • - Line number: 15982 + Line number: 10055
  • @@ -963,7 +975,7 @@

    Container has no CPU limit

  • - Line number: 15948 + Line number: 10021
  • @@ -1021,7 +1033,7 @@

    Container has no CPU limit

  • - Line number: 16038 + Line number: 10111
  • @@ -1079,7 +1091,7 @@

    Container has no CPU limit

  • - Line number: 16112 + Line number: 10185
  • @@ -1137,7 +1149,7 @@

    Container has no CPU limit

  • - Line number: 16346 + Line number: 10412
  • @@ -1195,7 +1207,7 @@

    Container has no CPU limit

  • - Line number: 16168 + Line number: 10241
  • @@ -1253,7 +1265,7 @@

    Container has no CPU limit

  • - Line number: 16431 + Line number: 10497
  • @@ -1311,7 +1323,7 @@

    Container has no CPU limit

  • - Line number: 16735 + Line number: 10794
  • @@ -1363,7 +1375,7 @@

    Container is running with multiple open ports

  • - Line number: 15962 + Line number: 10035
  • @@ -1419,7 +1431,7 @@

    Container is running with writable root filesystem

  • - Line number: 16122 + Line number: 10195
  • @@ -1471,7 +1483,7 @@

    Container is running without liveness probe

  • - Line number: 15809 + Line number: 9942
  • @@ -1523,7 +1535,7 @@

    Container is running without liveness probe

  • - Line number: 15948 + Line number: 10021
  • @@ -1575,7 +1587,7 @@

    Container is running without liveness probe

  • - Line number: 15982 + Line number: 10055
  • @@ -1627,7 +1639,7 @@

    Container is running without liveness probe

  • - Line number: 16112 + Line number: 10185
  • @@ -1679,7 +1691,7 @@

    Container is running without liveness probe

  • - Line number: 16346 + Line number: 10412
  • @@ -1737,7 +1749,7 @@

    Container is running without memory limit

  • - Line number: 15809 + Line number: 9942
  • @@ -1795,7 +1807,7 @@

    Container is running without memory limit

  • - Line number: 15948 + Line number: 10021
  • @@ -1853,7 +1865,7 @@

    Container is running without memory limit

  • - Line number: 15982 + Line number: 10055
  • @@ -1911,7 +1923,7 @@

    Container is running without memory limit

  • - Line number: 16038 + Line number: 10111
  • @@ -1969,7 +1981,7 @@

    Container is running without memory limit

  • - Line number: 16112 + Line number: 10185
  • @@ -2027,7 +2039,7 @@

    Container is running without memory limit

  • - Line number: 16346 + Line number: 10412
  • @@ -2085,7 +2097,7 @@

    Container is running without memory limit

  • - Line number: 16168 + Line number: 10241
  • @@ -2143,7 +2155,7 @@

    Container is running without memory limit

  • - Line number: 16431 + Line number: 10497
  • @@ -2201,7 +2213,7 @@

    Container is running without memory limit

  • - Line number: 16735 + Line number: 10794
  • diff --git a/docs/snyk/master/argocd-iac-namespace-install.html b/docs/snyk/master/argocd-iac-namespace-install.html index 76128f58b2dd9..0fa9090f4774b 100644 --- a/docs/snyk/master/argocd-iac-namespace-install.html +++ b/docs/snyk/master/argocd-iac-namespace-install.html @@ -456,12 +456,12 @@

    Snyk test report

    -

    January 22nd 2023, 12:17:30 am

    +

    September 7th 2022, 7:35:27 pm

    Scanned the following path:
      -
    • /argo-cd/manifests/namespace-install.yaml (Kubernetes)
    • +
    • /private/argo-cd/manifests/namespace-install.yaml (Kubernetes)
    @@ -476,7 +476,7 @@

    Snyk test report

    - +
    Project manifests/namespace-install.yaml
    Path /argo-cd/manifests/namespace-install.yaml
    Path /private/argo-cd/manifests/namespace-install.yaml
    Project Type Kubernetes
    @@ -500,6 +500,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 7] + role + rules[0] resources @@ -507,7 +509,7 @@

    Role with dangerous permissions

  • - Line number: 77 + Line number: 65
  • @@ -546,6 +548,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 8] + role + rules[4] resources @@ -553,7 +557,7 @@

    Role with dangerous permissions

  • - Line number: 154 + Line number: 104
  • @@ -592,6 +596,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 9] + role + rules[0] resources @@ -599,7 +605,7 @@

    Role with dangerous permissions

  • - Line number: 182 + Line number: 170
  • @@ -638,14 +644,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 10] - rules[3] + role + + rules[1] resources
  • - Line number: 226 + Line number: 189
  • @@ -684,14 +692,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 10] - rules[1] + role + + rules[3] resources
  • - Line number: 208 + Line number: 189
  • @@ -730,6 +740,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 11] + role + rules[0] resources @@ -737,7 +749,7 @@

    Role with dangerous permissions

  • - Line number: 242 + Line number: 230
  • @@ -789,7 +801,7 @@

    Container could be running with outdated image

  • - Line number: 1153 + Line number: 1085
  • @@ -847,7 +859,7 @@

    Container has no CPU limit

  • - Line number: 616 + Line number: 615
  • @@ -905,7 +917,7 @@

    Container has no CPU limit

  • - Line number: 789 + Line number: 728
  • @@ -963,7 +975,7 @@

    Container has no CPU limit

  • - Line number: 755 + Line number: 694
  • @@ -1021,7 +1033,7 @@

    Container has no CPU limit

  • - Line number: 845 + Line number: 784
  • @@ -1079,7 +1091,7 @@

    Container has no CPU limit

  • - Line number: 919 + Line number: 858
  • @@ -1137,7 +1149,7 @@

    Container has no CPU limit

  • - Line number: 1153 + Line number: 1085
  • @@ -1195,7 +1207,7 @@

    Container has no CPU limit

  • - Line number: 975 + Line number: 914
  • @@ -1253,7 +1265,7 @@

    Container has no CPU limit

  • - Line number: 1238 + Line number: 1170
  • @@ -1311,7 +1323,7 @@

    Container has no CPU limit

  • - Line number: 1542 + Line number: 1467
  • @@ -1363,7 +1375,7 @@

    Container is running with multiple open ports

  • - Line number: 769 + Line number: 708
  • @@ -1419,7 +1431,7 @@

    Container is running with writable root filesystem

  • - Line number: 929 + Line number: 868
  • @@ -1471,7 +1483,7 @@

    Container is running without liveness probe

  • - Line number: 616 + Line number: 615
  • @@ -1523,7 +1535,7 @@

    Container is running without liveness probe

  • - Line number: 755 + Line number: 694
  • @@ -1575,7 +1587,7 @@

    Container is running without liveness probe

  • - Line number: 789 + Line number: 728
  • @@ -1627,7 +1639,7 @@

    Container is running without liveness probe

  • - Line number: 919 + Line number: 858
  • @@ -1679,7 +1691,7 @@

    Container is running without liveness probe

  • - Line number: 1153 + Line number: 1085
  • @@ -1737,7 +1749,7 @@

    Container is running without memory limit

  • - Line number: 616 + Line number: 615
  • @@ -1795,7 +1807,7 @@

    Container is running without memory limit

  • - Line number: 755 + Line number: 694
  • @@ -1853,7 +1865,7 @@

    Container is running without memory limit

  • - Line number: 789 + Line number: 728
  • @@ -1911,7 +1923,7 @@

    Container is running without memory limit

  • - Line number: 845 + Line number: 784
  • @@ -1969,7 +1981,7 @@

    Container is running without memory limit

  • - Line number: 919 + Line number: 858
  • @@ -2027,7 +2039,7 @@

    Container is running without memory limit

  • - Line number: 1153 + Line number: 1085
  • @@ -2085,7 +2097,7 @@

    Container is running without memory limit

  • - Line number: 975 + Line number: 914
  • @@ -2143,7 +2155,7 @@

    Container is running without memory limit

  • - Line number: 1238 + Line number: 1170
  • @@ -2201,7 +2213,7 @@

    Container is running without memory limit

  • - Line number: 1542 + Line number: 1467
  • diff --git a/docs/snyk/master/argocd-test.html b/docs/snyk/master/argocd-test.html index a139b2f3831bd..107d1ba3d9258 100644 --- a/docs/snyk/master/argocd-test.html +++ b/docs/snyk/master/argocd-test.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,19 +456,19 @@

    Snyk test report

    -

    January 22nd 2023, 12:15:25 am

    +

    September 7th 2022, 7:33:58 pm

    Scanned the following paths:
      -
    • /argo-cd/argoproj/argo-cd/v2 (gomodules)
    • /argo-cd (yarn)
    • +
    • /private/argo-cd/argoproj/argo-cd/v2 (gomodules)
    • /private/argo-cd (yarn)
    -
    1 known vulnerabilities
    -
    1 vulnerable dependency paths
    -
    1728 dependencies
    +
    2 known vulnerabilities
    +
    6 vulnerable dependency paths
    +
    1717 dependencies
    @@ -477,7 +477,7 @@

    Snyk test report

    -

    Regular Expression Denial of Service (ReDoS)

    +

    Improper Input Validation

    @@ -488,18 +488,18 @@

    Regular Expression Denial of Service (ReDoS)

    • - Package Manager: npm + Package Manager: golang
    • Vulnerable module: - cookiejar + go.mongodb.org/mongo-driver/bson/bsonrw
    • Introduced through: - argo-cd-ui@1.0.0, superagent@7.1.6 and others + github.com/argoproj/argo-cd/v2@0.0.0, github.com/go-openapi/runtime/middleware@0.19.4 and others
    @@ -511,11 +511,36 @@

    Detailed paths

    • Introduced through: - argo-cd-ui@1.0.0 + github.com/argoproj/argo-cd/v2@0.0.0 - superagent@7.1.6 + github.com/go-openapi/runtime/middleware@0.19.4 - cookiejar@2.1.3 + github.com/go-openapi/validate@0.19.5 + + github.com/go-openapi/strfmt@0.19.3 + + go.mongodb.org/mongo-driver/bson@1.1.2 + + go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/go-openapi/runtime/middleware@0.19.4 + + github.com/go-openapi/validate@0.19.5 + + github.com/go-openapi/strfmt@0.19.3 + + go.mongodb.org/mongo-driver/bson@1.1.2 + + go.mongodb.org/mongo-driver/bson/bsoncodec@1.1.2 + + go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 @@ -527,91 +552,137 @@

      Detailed paths


      Overview

      -

      Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the Cookie.parse function, which uses an insecure regular expression.

      -

      PoC

      -
      const { CookieJar } = require("cookiejar");
      -        
      -        const jar = new CookieJar();
      -        
      -        const start = performance.now();
      -        const attack = "a" + "t".repeat(50_000);
      -        jar.setCookie(attack);
      -        console.log(`CookieJar.setCookie(): ${performance.now() - start}`);
      -        
      -

      Details

      -

      Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

      -

      The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

      -

      Let’s take the following regular expression as an example:

      -
      regex = /A(B|C+)+D/
      -        
      -

      This regular expression accomplishes the following:

      +

      go.mongodb.org/mongo-driver/bson/bsonrw is a The MongoDB supported driver for Go.

      +

      Affected versions of this package are vulnerable to Improper Input Validation. Specific cstrings input may not be properly validated in the MongoDB Go Driver when marshalling Go objects into BSON. A malicious user could use a Go object with specific string to potentially inject additional fields into marshalled documents.

      +

      Remediation

      +

      Upgrade go.mongodb.org/mongo-driver/bson/bsonrw to version 1.5.1 or higher.

      +

      References

        -
      • A The string must start with the letter 'A'
      • -
      • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
      • -
      • D Finally, we ensure this section of the string ends with a 'D'
      • +
      • GitHub Commit
      • +
      • GitHub Issue
      • +
      • GitHub Release
      -

      The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

      -

      It most cases, it doesn't take very long for a regex engine to find a match:

      -
      $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
      -        0.04s user 0.01s system 95% cpu 0.052 total
      -        
      -        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
      -        1.79s user 0.02s system 99% cpu 1.812 total
      -        
      -

      The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

      -

      Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

      -

      Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

      -
        -
      1. CCC
      2. -
      3. CC+C
      4. -
      5. C+CC
      6. -
      7. C+C+C.
      8. -
      -

      The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

      -

      From there, the number of steps the engine must use to validate a string just continues to grow.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      StringNumber of C'sNumber of steps
      ACCCX338
      ACCCCX471
      ACCCCCX5136
      ACCCCCCCCCCCCCCX1465,553
      -

      By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

      + +
      + + + +
    +
    +

    Insecure Randomness

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + github.com/Masterminds/goutils +
    • + +
    • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, github.com/Masterminds/sprig@2.22.0 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/Masterminds/sprig@2.22.0 + + github.com/Masterminds/goutils@1.1.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f + + github.com/argoproj/notifications-engine/pkg/templates@#4d8552b0775f + + github.com/Masterminds/sprig@2.22.0 + + github.com/Masterminds/goutils@1.1.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/argoproj/notifications-engine/pkg/cmd@#4d8552b0775f + + github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f + + github.com/argoproj/notifications-engine/pkg/templates@#4d8552b0775f + + github.com/Masterminds/sprig@2.22.0 + + github.com/Masterminds/goutils@1.1.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/argoproj/notifications-engine/pkg/controller@#4d8552b0775f + + github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f + + github.com/argoproj/notifications-engine/pkg/templates@#4d8552b0775f + + github.com/Masterminds/sprig@2.22.0 + + github.com/Masterminds/goutils@1.1.0 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    github.com/masterminds/goutils is a provides users with utility functions to manipulate strings in various ways.

    +

    Affected versions of this package are vulnerable to Insecure Randomness via the RandomAlphaNumeric(int) and CryptoRandomAlphaNumeric(int) functions. Small values of int in the functions above will return a smaller subset of results than they should. For example, RandomAlphaNumeric(1) would always return a digit in the 0-9 range, while RandomAlphaNumeric(4) return around ~7 million of the ~13M possible permutations.

    Remediation

    -

    Upgrade cookiejar to version 2.1.4 or higher.

    +

    Upgrade github.com/masterminds/goutils to version 1.1.1 or higher.

    References


    diff --git a/docs/snyk/master/ghcr.io_dexidp_dex_v2.35.3.html b/docs/snyk/master/ghcr.io_dexidp_dex_v2.32.0-distroless.html similarity index 97% rename from docs/snyk/master/ghcr.io_dexidp_dex_v2.35.3.html rename to docs/snyk/master/ghcr.io_dexidp_dex_v2.32.0-distroless.html index cc34f61f14aba..b878d948de058 100644 --- a/docs/snyk/master/ghcr.io_dexidp_dex_v2.35.3.html +++ b/docs/snyk/master/ghcr.io_dexidp_dex_v2.32.0-distroless.html @@ -456,19 +456,19 @@

    Snyk test report

    -

    January 22nd 2023, 12:15:32 am

    +

    September 7th 2022, 7:34:05 pm

    Scanned the following path:
      -
    • ghcr.io/dexidp/dex:v2.35.3/dexidp/dex (apk)
    • +
    • ghcr.io/dexidp/dex:v2.32.0-distroless/dexidp/dex (deb)
    0 known vulnerabilities
    0 vulnerable dependency paths
    -
    14 dependencies
    +
    3 dependencies
    @@ -477,8 +477,8 @@

    Snyk test report

    - - + +
    Project docker-image|ghcr.io/dexidp/dex
    Path ghcr.io/dexidp/dex:v2.35.3/dexidp/dex
    Package Manager apk
    Path ghcr.io/dexidp/dex:v2.32.0-distroless/dexidp/dex
    Package Manager deb
    diff --git a/docs/snyk/master/haproxy_2.6.2-alpine.html b/docs/snyk/master/haproxy_2.6.2-alpine.html index c484716686348..65a036d2e97fa 100644 --- a/docs/snyk/master/haproxy_2.6.2-alpine.html +++ b/docs/snyk/master/haproxy_2.6.2-alpine.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    January 22nd 2023, 12:15:36 am

    +

    September 7th 2022, 7:34:13 pm

    Scanned the following path: diff --git a/docs/snyk/master/quay.io_argoproj_argocd_latest.html b/docs/snyk/master/quay.io_argoproj_argocd_latest.html index e2ee32c460857..d03ed8915bfb2 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

    -

    January 22nd 2023, 12:15:59 am

    +

    September 7th 2022, 7:34:26 pm

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

    Snyk test report

    -
    16 known vulnerabilities
    -
    102 vulnerable dependency paths
    +
    20 known vulnerabilities
    +
    62 vulnerable dependency paths
    162 dependencies
    @@ -486,7 +486,7 @@

    Snyk test report

    -

    Off-by-one Error

    +

    Out-of-bounds Write

    @@ -502,13 +502,13 @@

    Off-by-one Error

  • Vulnerable module: - systemd/libsystemd0 + zlib/zlib1g
  • Introduced through: - docker-image|quay.io/argoproj/argocd@latest and systemd/libsystemd0@249.11-0ubuntu3.6 + docker-image|quay.io/argoproj/argocd@latest, meta-common-packages@meta and others
  • @@ -522,108 +522,88 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - systemd/libsystemd0@249.11-0ubuntu3.6 - - - - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - apt@2.4.8 + meta-common-packages@meta - systemd/libsystemd0@249.11-0ubuntu3.6 + zlib/zlib1g@1:1.2.11.dfsg-2ubuntu9
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - procps/libprocps8@2:3.3.17-6ubuntu2 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - + -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - util-linux@2.37.2-4ubuntu3 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
  • - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - util-linux/bsdutils@1:2.37.2-4ubuntu3 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 zlib.

    +

    References

    + -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - apt@2.4.8 - - apt/libapt-pkg6.0@2.4.8 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
    -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - systemd/libudev1@249.11-0ubuntu3.6 - - + -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - libfido2/libfido2-1@1.10.0-1 - - systemd/libudev1@249.11-0ubuntu3.6 - - +
  • +
    +

    Out-of-bounds Read

    +
    - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - util-linux@2.37.2-4ubuntu3 - - systemd/libudev1@249.11-0ubuntu3.6 - - +
    + medium severity +
    -
  • +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + sqlite3/libsqlite3-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@latest, gnupg2/gpg@2.2.27-3ubuntu2.1 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: docker-image|quay.io/argoproj/argocd@latest - apt@2.4.8 - - apt/libapt-pkg6.0@2.4.8 + gnupg2/gpg@2.2.27-3ubuntu2.1 - systemd/libudev1@249.11-0ubuntu3.6 + sqlite3/libsqlite3-0@3.37.2-2 @@ -635,29 +615,33 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream systemd package.

      -

      An off-by-one Error issue was discovered in Systemd in format_timespan() function of time-util.c. An attacker could supply specific values for time and accuracy that leads to buffer overrun in format_timespan(), leading to a Denial of Service.

      +

      Note: Versions mentioned in the description apply to the upstream sqlite3 package.

      +

      An out-of-bounds read was addressed with improved bounds checking. This issue is fixed in iOS 13.5 and iPadOS 13.5, macOS Catalina 10.15.5, tvOS 13.4.5, watchOS 6.2.5, iTunes 12.10.7 for Windows, iCloud for Windows 11.2, iCloud for Windows 7.19. A malicious application may cause a denial of service or potentially disclose memory contents.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 systemd.

      +

      There is no fixed version for Ubuntu:22.04 sqlite3.

      References


    -

    Integer Overflow or Wraparound

    +

    Improper Verification of Cryptographic Signature

    @@ -673,13 +657,13 @@

    Integer Overflow or Wraparound

  • Vulnerable module: - krb5/libk5crypto3 + perl/perl-modules-5.34
  • Introduced through: - docker-image|quay.io/argoproj/argocd@latest and krb5/libk5crypto3@1.19.2-2 + docker-image|quay.io/argoproj/argocd@latest, git@1:2.34.1-1ubuntu1.4 and others
  • @@ -693,28 +677,11 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - krb5/libk5crypto3@1.19.2-2 - - - - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - adduser@3.118ubuntu5 + git@1:2.34.1-1ubuntu1.4 - shadow/passwd@1:4.8.1-2ubuntu2.1 + perl@5.34.0-3ubuntu1 - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 + perl/perl-modules-5.34@5.34.0-3ubuntu1 @@ -723,30 +690,13 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 + git@1:2.34.1-1ubuntu1.4 - krb5/libkrb5-3@1.19.2-2 + perl@5.34.0-3ubuntu1 - krb5/libk5crypto3@1.19.2-2 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest + perl/libperl5.34@5.34.0-3ubuntu1 - krb5/libkrb5-3@1.19.2-2 + perl/perl-modules-5.34@5.34.0-3ubuntu1 @@ -755,28 +705,11 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - adduser@3.118ubuntu5 + git@1:2.34.1-1ubuntu1.4 - shadow/passwd@1:4.8.1-2ubuntu2.1 + perl@5.34.0-3ubuntu1 - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - - -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - krb5/libgssapi-krb5-2@1.19.2-2 + perl/libperl5.34@5.34.0-3ubuntu1 @@ -785,9 +718,9 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - openssh/openssh-client@1:8.9p1-3ubuntu0.1 + git@1:2.34.1-1ubuntu1.4 - krb5/libgssapi-krb5-2@1.19.2-2 + perl@5.34.0-3ubuntu1 @@ -796,56 +729,155 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 + meta-common-packages@meta - krb5/libgssapi-krb5-2@1.19.2-2 + perl/perl-base@5.34.0-3ubuntu1
  • + + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream perl package.

    +

    CPAN 2.28 allows Signature Verification Bypass.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 perl.

    +

    References

    + + +
    + + + +
    +
    +

    NULL Pointer Dereference

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + tar +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@latest, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: docker-image|quay.io/argoproj/argocd@latest - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 + meta-common-packages@meta - krb5/libgssapi-krb5-2@1.19.2-2 + tar@1.34+dfsg-1build3
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream tar package.

    +

    pax_decode_header in sparse.c in GNU Tar before 1.32 had a NULL pointer dereference when parsing certain archives that have malformed extended headers.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 tar.

    +

    References

    + + +
    + + + +
    +
    +

    CVE-2020-9991

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + sqlite3/libsqlite3-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@latest, gnupg2/gpg@2.2.27-3ubuntu2.1 and others +
    • +
    + +
    - + +

    Detailed paths

    + +
    • Introduced through: docker-image|quay.io/argoproj/argocd@latest - meta-common-packages@meta + gnupg2/gpg@2.2.27-3ubuntu2.1 - krb5/libkrb5support0@1.19.2-2 + sqlite3/libsqlite3-0@3.37.2-2 @@ -857,31 +889,32 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream krb5 package.

      -

      PAC parsing in MIT Kerberos 5 (aka krb5) before 1.19.4 and 1.20.x before 1.20.1 has integer overflows that may lead to remote code execution (in KDC, kadmind, or a GSS or Kerberos application server) on 32-bit platforms (which have a resultant heap-based buffer overflow), and cause a denial of service on other platforms. This occurs in krb5_pac_parse in lib/krb5/krb/pac.c. Heimdal before 7.7.1 has "a similar bug."

      +

      Note: Versions mentioned in the description apply to the upstream sqlite3 package.

      +

      This issue was addressed with improved checks. This issue is fixed in macOS Big Sur 11.0.1, watchOS 7.0, iOS 14.0 and iPadOS 14.0, iCloud for Windows 7.21, tvOS 14.0. A remote attacker may be able to cause a denial of service.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 krb5.

      +

      There is no fixed version for Ubuntu:22.04 sqlite3.

      References


    -

    CVE-2022-46908

    +

    Information Exposure

    @@ -919,7 +952,7 @@

    Detailed paths

    gnupg2/gpg@2.2.27-3ubuntu2.1 - sqlite3/libsqlite3-0@3.37.2-2ubuntu0.1 + sqlite3/libsqlite3-0@3.37.2-2 @@ -932,21 +965,126 @@

    Detailed paths

    NVD Description

    Note: Versions mentioned in the description apply to the upstream sqlite3 package.

    -

    SQLite through 3.40.0, when relying on --safe for execution of an untrusted CLI script, does not properly implement the azProhibitedFunctions protection mechanism, and instead allows UDF functions such as WRITEFILE.

    +

    An information disclosure issue was addressed with improved state management. This issue is fixed in macOS Big Sur 11.0.1, watchOS 7.0, iOS 14.0 and iPadOS 14.0, iTunes for Windows 12.10.9, iCloud for Windows 11.5, tvOS 14.0. A remote attacker may be able to leak memory.

    Remediation

    There is no fixed version for Ubuntu:22.04 sqlite3.

    References

    + +
    + + + +
    +
    +

    Time-of-check Time-of-use (TOCTOU)

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + shadow/passwd +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@latest and shadow/passwd@1:4.8.1-2ubuntu2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@latest + + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@latest + + adduser@3.118ubuntu5 + + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@latest + + openssh/openssh-client@1:8.9p1-3 + + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@latest + + shadow/login@1:4.8.1-2ubuntu2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream shadow package.

    +

    shadow: TOCTOU (time-of-check time-of-use) race condition when copying and removing directory trees

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 shadow.

    +

    References

    +
    @@ -1016,12 +1154,12 @@

    Remediation

    There is no fixed version for Ubuntu:22.04 pcre3.

    References


    @@ -1032,7 +1170,7 @@

    References

    -

    Release of Invalid Pointer or Reference

    +

    Out-of-bounds Read

    @@ -1048,13 +1186,13 @@

    Release of Invalid Pointer or Reference

  • Vulnerable module: - patch + pcre2/libpcre2-8-0
  • Introduced through: - docker-image|quay.io/argoproj/argocd@latest and patch@2.7.6-7build2 + docker-image|quay.io/argoproj/argocd@latest, meta-common-packages@meta and others
  • @@ -1068,7 +1206,9 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - patch@2.7.6-7build2 + meta-common-packages@meta + + pcre2/libpcre2-8-0@10.39-3build1 @@ -1080,25 +1220,30 @@

    Detailed paths


    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream patch package.

    -

    An Invalid Pointer vulnerability exists in GNU patch 2.7 via the another_hunk function, which causes a Denial of Service.

    +

    Note: Versions mentioned in the description apply to the upstream pcre2 package.

    +

    An out-of-bounds read vulnerability was discovered in the PCRE2 library in the get_recurse_data_length() function of the pcre2_jit_compile.c file. This issue affects recursions in JIT-compiled regular expressions caused by duplicate data transfers.

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 patch.

    +

    There is no fixed version for Ubuntu:22.04 pcre2.

    References


    -

    Double Free

    +

    Out-of-bounds Read

    @@ -1114,13 +1259,13 @@

    Double Free

  • Vulnerable module: - patch + pcre2/libpcre2-8-0
  • Introduced through: - docker-image|quay.io/argoproj/argocd@latest and patch@2.7.6-7build2 + docker-image|quay.io/argoproj/argocd@latest, meta-common-packages@meta and others
  • @@ -1134,7 +1279,9 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - patch@2.7.6-7build2 + meta-common-packages@meta + + pcre2/libpcre2-8-0@10.39-3build1 @@ -1146,30 +1293,31 @@

    Detailed paths


    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream patch package.

    -

    A double free exists in the another_hunk function in pch.c in GNU patch through 2.7.6.

    +

    Note: Versions mentioned in the description apply to the upstream pcre2 package.

    +

    An out-of-bounds read vulnerability was discovered in the PCRE2 library in the compile_xclass_matchingpath() function of the pcre2_jit_compile.c file. This involves a unicode property matching issue in JIT-compiled regular expressions. The issue occurs because the character was not fully read in case-less matching within JIT.

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 patch.

    +

    There is no fixed version for Ubuntu:22.04 pcre2.

    References


    -

    Improper Locking

    +

    Release of Invalid Pointer or Reference

    @@ -1185,12 +1333,12 @@

    Improper Locking

  • Vulnerable module: - openssl/libssl3 + patch
  • Introduced through: - docker-image|quay.io/argoproj/argocd@latest and openssl/libssl3@3.0.2-0ubuntu1.7 + docker-image|quay.io/argoproj/argocd@latest and patch@2.7.6-7build2
  • @@ -1205,111 +1353,73 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - openssl/libssl3@3.0.2-0ubuntu1.7 + patch@2.7.6-7build2 -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - cyrus-sasl2/libsasl2-modules@2.1.27+dfsg2-3ubuntu1.1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - + -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - libfido2/libfido2-1@1.10.0-1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - +
  • - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream patch package.

    +

    An Invalid Pointer vulnerability exists in GNU patch 2.7 via the another_hunk function, which causes a Denial of Service.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 patch.

    +

    References

    + -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - ca-certificates@20211016ubuntu0.22.04.1 - - openssl@3.0.2-0ubuntu1.7 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - +
    -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - + -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - +
  • +
    +

    Double Free

    +
    - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - openssl@3.0.2-0ubuntu1.7 - - +
    + low severity +
    -
  • +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + patch +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@latest and patch@2.7.6-7build2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: docker-image|quay.io/argoproj/argocd@latest - ca-certificates@20211016ubuntu0.22.04.1 - - openssl@3.0.2-0ubuntu1.7 + patch@2.7.6-7build2 @@ -1321,21 +1431,25 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream openssl package.

      -

      If an X.509 certificate contains a malformed policy constraint and policy processing is enabled, then a write lock will be taken twice recursively. On some operating systems (most widely: Windows) this results in a denial of service when the affected process hangs. Policy processing being enabled on a publicly facing server is not considered to be a common setup. Policy processing is enabled by passing the -policy&#39; argument to the command line utilities or by calling either X509_VERIFY_PARAM_add0_policy()' or `X509_VERIFY_PARAM_set1_policies()' functions.

      +

      Note: Versions mentioned in the description apply to the upstream patch package.

      +

      A double free exists in the another_hunk function in pch.c in GNU patch through 2.7.6.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 openssl.

      +

      There is no fixed version for Ubuntu:22.04 patch.

      References


    @@ -1361,7 +1475,7 @@

    CVE-2021-41617

  • Introduced through: - docker-image|quay.io/argoproj/argocd@latest and openssh/openssh-client@1:8.9p1-3ubuntu0.1 + docker-image|quay.io/argoproj/argocd@latest and openssh/openssh-client@1:8.9p1-3
  • @@ -1376,7 +1490,7 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - openssh/openssh-client@1:8.9p1-3ubuntu0.1 + openssh/openssh-client@1:8.9p1-3 @@ -1405,7 +1519,6 @@

    References

  • MISC
  • MISC
  • N/A
  • -
  • MISC

  • @@ -1437,7 +1550,7 @@

    Information Exposure

  • Introduced through: - docker-image|quay.io/argoproj/argocd@latest and openssh/openssh-client@1:8.9p1-3ubuntu0.1 + docker-image|quay.io/argoproj/argocd@latest and openssh/openssh-client@1:8.9p1-3
  • @@ -1452,7 +1565,7 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - openssh/openssh-client@1:8.9p1-3ubuntu0.1 + openssh/openssh-client@1:8.9p1-3 @@ -1737,9 +1850,6 @@

    References

  • ADVISORY
  • MISC
  • MISC
  • -
  • CONFIRM
  • -
  • MLIST
  • -
  • FULLDISC

  • @@ -1781,277 +1891,12 @@

    Integer Overflow or Wraparound

    Detailed paths

    -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - meta-common-packages@meta - - krb5/libkrb5support0@1.19.2-2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream krb5 package.

    -

    An issue was discovered in MIT Kerberos 5 (aka krb5) through 1.16. There is a variable "dbentry->n_key_data" in kadmin/dbutil/dump.c that can store 16-bit data but unknowingly the developer has assigned a "u4" variable to it, which is for 32-bit data. An attacker can use this vulnerability to affect other artifacts of the database as we know that a Kerberos database dump file contains trusted data.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 krb5.

    -

    References

    - - -
    - - - -
    -
    -

    CVE-2022-3219

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - gnupg2/gpgv -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@latest and gnupg2/gpgv@2.2.27-3ubuntu2.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - apt@2.4.8 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • +
      • Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gpg@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 + krb5/libk5crypto3@1.19.2-2 @@ -2060,33 +1905,19 @@

        Detailed paths

        Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg@2.2.27-3ubuntu2.1 + adduser@3.118ubuntu5 - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 + shadow/passwd@1:4.8.1-2ubuntu2 - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
      • -
      • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest + pam/libpam-modules@1.4.0-11ubuntu2 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + libnsl/libnsl2@1.3.0-2build2 - gnupg2/gpgsm@2.2.27-3ubuntu2.1 + libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
      • -
      • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest + krb5/libgssapi-krb5-2@1.19.2-2 - gnupg2/dirmngr@2.2.27-3ubuntu2.1 + krb5/libk5crypto3@1.19.2-2 @@ -2095,42 +1926,21 @@

        Detailed paths

        Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg@2.2.27-3ubuntu2.1 + adduser@3.118ubuntu5 - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
      • -
      • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest + shadow/passwd@1:4.8.1-2ubuntu2 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + pam/libpam-modules@1.4.0-11ubuntu2 - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 + libnsl/libnsl2@1.3.0-2build2 - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
      • -
      • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest + libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - gnupg2/gnupg-l10n@2.2.27-3ubuntu2.1 - - - -
      • -
      • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest + krb5/libgssapi-krb5-2@1.19.2-2 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + krb5/libkrb5-3@1.19.2-2 - gnupg2/gnupg-l10n@2.2.27-3ubuntu2.1 + krb5/libk5crypto3@1.19.2-2 @@ -2139,7 +1949,7 @@

        Detailed paths

        Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg-utils@2.2.27-3ubuntu2.1 + krb5/libkrb5-3@1.19.2-2 @@ -2148,9 +1958,19 @@

        Detailed paths

        Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg@2.2.27-3ubuntu2.1 + adduser@3.118ubuntu5 + + shadow/passwd@1:4.8.1-2ubuntu2 + + pam/libpam-modules@1.4.0-11ubuntu2 + + libnsl/libnsl2@1.3.0-2build2 + + libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - gnupg2/gnupg-utils@2.2.27-3ubuntu2.1 + krb5/libgssapi-krb5-2@1.19.2-2 + + krb5/libkrb5-3@1.19.2-2 @@ -2159,7 +1979,7 @@

        Detailed paths

        Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gpg@2.2.27-3ubuntu2.1 + krb5/libgssapi-krb5-2@1.19.2-2 @@ -2168,9 +1988,9 @@

        Detailed paths

        Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg@2.2.27-3ubuntu2.1 + openssh/openssh-client@1:8.9p1-3 - gnupg2/gpg@2.2.27-3ubuntu2.1 + krb5/libgssapi-krb5-2@1.19.2-2 @@ -2179,11 +1999,11 @@

        Detailed paths

        Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg@2.2.27-3ubuntu2.1 + git@1:2.34.1-1ubuntu1.4 - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.4 - gnupg2/gpg@2.2.27-3ubuntu2.1 + krb5/libgssapi-krb5-2@1.19.2-2 @@ -2192,20 +2012,13 @@

        Detailed paths

        Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg@2.2.27-3ubuntu2.1 + git@1:2.34.1-1ubuntu1.4 - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.4 - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
      • -
      • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest + libssh/libssh-4@0.9.6-2build1 - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 + krb5/libgssapi-krb5-2@1.19.2-2 @@ -2214,22 +2027,17 @@

        Detailed paths

        Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg@2.2.27-3ubuntu2.1 + adduser@3.118ubuntu5 - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
      • -
      • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest + shadow/passwd@1:4.8.1-2ubuntu2 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + pam/libpam-modules@1.4.0-11ubuntu2 + + libnsl/libnsl2@1.3.0-2build2 - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 + libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 + krb5/libgssapi-krb5-2@1.19.2-2 @@ -2238,20 +2046,78 @@

        Detailed paths

        Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 + meta-common-packages@meta - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 + krb5/libkrb5support0@1.19.2-2
      • +
      + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream krb5 package.

    +

    An issue was discovered in MIT Kerberos 5 (aka krb5) through 1.16. There is a variable "dbentry->n_key_data" in kadmin/dbutil/dump.c that can store 16-bit data but unknowingly the developer has assigned a "u4" variable to it, which is for 32-bit data. An attacker can use this vulnerability to affect other artifacts of the database as we know that a Kerberos database dump file contains trusted data.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 krb5.

    +

    References

    + + +
    + + + +
    +
    +

    Integer Overflow or Wraparound

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + gmp/libgmp10 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@latest and gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 @@ -2260,9 +2126,9 @@

      Detailed paths

      Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg@2.2.27-3ubuntu2.1 + coreutils@8.32-4.1ubuntu1 - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 @@ -2271,18 +2137,11 @@

      Detailed paths

      Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest + apt@2.4.7 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + gnutls28/libgnutls30@3.7.3-4ubuntu1.1 - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 @@ -2291,18 +2150,13 @@

      Detailed paths

      Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest + apt@2.4.7 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + gnutls28/libgnutls30@3.7.3-4ubuntu1.1 + + nettle/libhogweed6@3.7.3-1build2 - gnupg2/gpgsm@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 @@ -2311,7 +2165,13 @@

      Detailed paths

      Introduced through: docker-image|quay.io/argoproj/argocd@latest - gnupg2/gnupg@2.2.27-3ubuntu2.1 + git@1:2.34.1-1ubuntu1.4 + + curl/libcurl3-gnutls@7.81.0-1ubuntu1.4 + + rtmpdump/librtmp1@2.4+20151223.gitfa8646d.1-2build4 + + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 @@ -2323,18 +2183,23 @@

      Detailed paths


      NVD Description

      -

      This vulnerability has not been analyzed by NVD yet.

      +

      Note: Versions mentioned in the description apply to the upstream gmp package.

      +

      GNU Multiple Precision Arithmetic Library (GMP) through 6.2.1 has an mpz/inp_raw.c integer overflow and resultant buffer overflow via crafted input, leading to a segmentation fault on 32-bit platforms.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 gnupg2.

      +

      There is no fixed version for Ubuntu:22.04 gmp.

      References


    @@ -2440,7 +2305,7 @@

    Improper Input Validation

  • Introduced through: - docker-image|quay.io/argoproj/argocd@latest, git@1:2.34.1-1ubuntu1.6 and others + docker-image|quay.io/argoproj/argocd@latest, git@1:2.34.1-1ubuntu1.4 and others
  • @@ -2454,9 +2319,9 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 - git/git-man@1:2.34.1-1ubuntu1.6 + git/git-man@1:2.34.1-1ubuntu1.4 @@ -2465,7 +2330,7 @@

    Detailed paths

    Introduced through: docker-image|quay.io/argoproj/argocd@latest - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 @@ -2476,7 +2341,7 @@

    Detailed paths

    git-lfs@3.0.2-1 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 @@ -2494,9 +2359,9 @@

    Remediation

    There is no fixed version for Ubuntu:22.04 git.

    References


    @@ -2561,11 +2426,11 @@

    Remediation

    There is no fixed version for Ubuntu:22.04 coreutils.

    References


    @@ -2575,72 +2440,6 @@

    References

    -
    -

    Out-of-bounds Write

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - bash -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@latest and bash@5.1-6ubuntu1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@latest - - bash@5.1-6ubuntu1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream bash package.

    -

    A flaw was found in the bash package, where a heap-buffer overflow can occur in valid parameter_transform. This issue may lead to memory problems.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 bash.

    -

    References

    - - -
    - - - -
    diff --git a/docs/snyk/v2.3.13/redis_6.2.8-alpine.html b/docs/snyk/master/redis_7.0.4-alpine.html similarity index 98% rename from docs/snyk/v2.3.13/redis_6.2.8-alpine.html rename to docs/snyk/master/redis_7.0.4-alpine.html index 43779992e4301..96982f67b5625 100644 --- a/docs/snyk/v2.3.13/redis_6.2.8-alpine.html +++ b/docs/snyk/master/redis_7.0.4-alpine.html @@ -456,19 +456,19 @@

    Snyk test report

    -

    January 22nd 2023, 12:24:04 am

    +

    September 7th 2022, 7:34:30 pm

    Scanned the following path:
      -
    • redis:6.2.8-alpine (apk)
    • +
    • redis:7.0.4-alpine (apk)
    0 known vulnerabilities
    0 vulnerable dependency paths
    -
    18 dependencies
    +
    17 dependencies
    @@ -477,7 +477,7 @@

    Snyk test report

    - + diff --git a/docs/snyk/v2.5.7/argocd-iac-namespace-install.html b/docs/snyk/v2.2.12/argocd-iac-install.html similarity index 82% rename from docs/snyk/v2.5.7/argocd-iac-namespace-install.html rename to docs/snyk/v2.2.12/argocd-iac-install.html index 472530a63d5da..77dfaa9341393 100644 --- a/docs/snyk/v2.5.7/argocd-iac-namespace-install.html +++ b/docs/snyk/v2.2.12/argocd-iac-install.html @@ -456,17 +456,17 @@

    Snyk test report

    -

    January 22nd 2023, 12:21:22 am

    +

    September 7th 2022, 7:39:56 pm

    Scanned the following path:
      -
    • /argo-cd/manifests/namespace-install.yaml (Kubernetes)
    • +
    • /private/argo-cd/manifests/install.yaml (Kubernetes)
    -
    32 total issues
    +
    35 total issues
    @@ -475,15 +475,15 @@

    Snyk test report

    Project docker-image|redis
    Path redis:6.2.8-alpine
    Path redis:7.0.4-alpine
    Package Manager apk
    - - + +
    Project manifests/namespace-install.yaml
    Path /argo-cd/manifests/namespace-install.yaml
    Project manifests/install.yaml
    Path /private/argo-cd/manifests/install.yaml
    Project Type Kubernetes
    -

    Role with dangerous permissions

    +

    Container does not drop all default capabilities

    @@ -494,42 +494,54 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-6
    • Introduced through: - [DocId: 7] + [DocId: 30] - rules[0] + input - resources + spec + + template + + spec + + containers[dex] + + securityContext + + capabilities + + drop
    • - Line number: 77 + Line number: 3067

    Impact

    -

    Using this role grants dangerous permissions

    +

    Containers are running with potentially unnecessary privileges

    Remediation

    -

    Consider removing this permissions

    +

    Add `ALL` to `securityContext.capabilities.drop` list, and add only required capabilities in `securityContext.capabilities.add`


    -

    Role with dangerous permissions

    +

    Container does not drop all default capabilities

    @@ -540,42 +552,54 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-6
    • Introduced through: - [DocId: 8] + [DocId: 30] - rules[4] + input - resources + spec + + template + + spec + + initContainers[copyutil] + + securityContext + + capabilities + + drop
    • - Line number: 154 + Line number: 3077

    Impact

    -

    Using this role grants dangerous permissions

    +

    Containers are running with potentially unnecessary privileges

    Remediation

    -

    Consider removing this permissions

    +

    Add `ALL` to `securityContext.capabilities.drop` list, and add only required capabilities in `securityContext.capabilities.add`


    -

    Role with dangerous permissions

    +

    Container does not drop all default capabilities

    @@ -586,42 +610,54 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-6
    • Introduced through: - [DocId: 9] + [DocId: 31] - rules[0] + input - resources + spec + + template + + spec + + containers[redis] + + securityContext + + capabilities + + drop
    • - Line number: 182 + Line number: 3130

    Impact

    -

    Using this role grants dangerous permissions

    +

    Containers are running with potentially unnecessary privileges

    Remediation

    -

    Consider removing this permissions

    +

    Add `ALL` to `securityContext.capabilities.drop` list, and add only required capabilities in `securityContext.capabilities.add`


    -

    Role with dangerous permissions

    +

    Container does not drop all default capabilities

    @@ -632,42 +668,54 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-6
    • Introduced through: - [DocId: 10] + [DocId: 32] - rules[3] + input - resources + spec + + template + + spec + + initContainers[copyutil] + + securityContext + + capabilities + + drop
    • - Line number: 226 + Line number: 3313

    Impact

    -

    Using this role grants dangerous permissions

    +

    Containers are running with potentially unnecessary privileges

    Remediation

    -

    Consider removing this permissions

    +

    Add `ALL` to `securityContext.capabilities.drop` list, and add only required capabilities in `securityContext.capabilities.add`


    -

    Role with dangerous permissions

    +

    Container is running without privilege escalation control

    @@ -678,42 +726,52 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-9
    • Introduced through: - [DocId: 10] + [DocId: 30] - rules[1] + input - resources + spec + + template + + spec + + initContainers[copyutil] + + securityContext + + allowPrivilegeEscalation
    • - Line number: 208 + Line number: 3077

    Impact

    -

    Using this role grants dangerous permissions

    +

    Processes could elevate current privileges via known vectors, for example SUID binaries

    Remediation

    -

    Consider removing this permissions

    +

    Set `securityContext.allowPrivilegeEscalation` to `false`


    -

    Role with dangerous permissions

    +

    Container is running without privilege escalation control

    @@ -724,57 +782,69 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-9
    • Introduced through: - [DocId: 11] + [DocId: 31] - rules[0] + input - resources + spec + + template + + spec + + containers[redis] + + securityContext + + allowPrivilegeEscalation
    • - Line number: 242 + Line number: 3130

    Impact

    -

    Using this role grants dangerous permissions

    +

    Processes could elevate current privileges via known vectors, for example SUID binaries

    Remediation

    -

    Consider removing this permissions

    +

    Set `securityContext.allowPrivilegeEscalation` to `false`


    -
    -

    Container could be running with outdated image

    +
    +

    Container is running without privilege escalation control

    -
    - low severity +
    + medium severity

    • - Public ID: SNYK-CC-K8S-42 + Public ID: SNYK-CC-K8S-9
    • Introduced through: - [DocId: 39] + [DocId: 32] + + input spec @@ -784,49 +854,51 @@

      Container could be running with outdated image

      initContainers[copyutil] - imagePullPolicy + securityContext + + allowPrivilegeEscalation
    • - Line number: 1086 + Line number: 3313

    Impact

    -

    The container may run with outdated or unauthorized image

    +

    Processes could elevate current privileges via known vectors, for example SUID binaries

    Remediation

    -

    Set `imagePullPolicy` attribute to `Always`

    +

    Set `securityContext.allowPrivilegeEscalation` to `false`


    -
    -

    Container has no CPU limit

    +
    +

    Container is running without root user control

    -
    - low severity +
    + medium severity

    • - Public ID: SNYK-CC-K8S-5 + Public ID: SNYK-CC-K8S-10
    • Introduced through: - [DocId: 35] + [DocId: 30] input @@ -836,55 +908,53 @@

      Container has no CPU limit

      spec - containers[argocd-applicationset-controller] - - resources + initContainers[copyutil] - limits + securityContext - cpu + runAsNonRoot
    • - Line number: 616 + Line number: 3077

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    +

    Container could be running with full administrative privileges

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    +

    Set `securityContext.runAsNonRoot` to `true`


    -
    -

    Container has no CPU limit

    +
    +

    Container is running without root user control

    -
    - low severity +
    + medium severity

    • - Public ID: SNYK-CC-K8S-5 + Public ID: SNYK-CC-K8S-10
    • Introduced through: - [DocId: 36] + [DocId: 32] input @@ -896,38 +966,180 @@

      Container has no CPU limit

      initContainers[copyutil] + securityContext + + runAsNonRoot + +
    • + +
    • + Line number: 3313 +
    • +
    + +
    + +

    Impact

    +

    Container could be running with full administrative privileges

    + +

    Remediation

    +

    Set `securityContext.runAsNonRoot` to `true`

    + + +
    +
    + + + +
    +
    +

    Role with dangerous permissions

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Public ID: SNYK-CC-K8S-47 +
    • + +
    • Introduced through: + [DocId: 6] + + role + + rules[0] + resources + +
    • + +
    • + Line number: 2594 +
    • +
    + +
    + +

    Impact

    +

    Using this role grants dangerous permissions

    + +

    Remediation

    +

    Consider removing this permissions

    + + +
    +
    + + + +
    +
    +

    Role with dangerous permissions

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Public ID: SNYK-CC-K8S-47 +
    • + +
    • Introduced through: + [DocId: 7] - limits + role - cpu + rules[0] + + resources
    • - Line number: 729 + Line number: 2633

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    +

    Using this role grants dangerous permissions

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    +

    Consider removing this permissions


    + +
    +
    +

    Role with dangerous permissions

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Public ID: SNYK-CC-K8S-47 +
    • + +
    • Introduced through: + [DocId: 8] + + role + + rules[0] + + resources + +
    • + +
    • + Line number: 2652 +
    • +
    + +
    + +

    Impact

    +

    Using this role grants dangerous permissions

    + +

    Remediation

    +

    Consider removing this permissions

    + + +
    +
    + +
    -

    Container has no CPU limit

    +

    Container could be running with outdated image

    @@ -938,13 +1150,11 @@

    Container has no CPU limit

    • - Public ID: SNYK-CC-K8S-5 + Public ID: SNYK-CC-K8S-42
    • Introduced through: - [DocId: 36] - - input + [DocId: 32] spec @@ -952,35 +1162,31 @@

      Container has no CPU limit

      spec - containers[dex] - - resources - - limits + initContainers[copyutil] - cpu + imagePullPolicy
    • - Line number: 695 + Line number: 3313

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    +

    The container may run with outdated or unauthorized image

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    +

    Set `imagePullPolicy` attribute to `Always`


    @@ -1000,7 +1206,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 37] + [DocId: 30] input @@ -1010,7 +1216,7 @@

    Container has no CPU limit

    spec - containers[argocd-notifications-controller] + initContainers[copyutil] resources @@ -1021,7 +1227,7 @@

    Container has no CPU limit

  • - Line number: 785 + Line number: 3077
  • @@ -1058,7 +1264,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 38] + [DocId: 30] input @@ -1068,7 +1274,7 @@

    Container has no CPU limit

    spec - containers[redis] + containers[dex] resources @@ -1079,7 +1285,7 @@

    Container has no CPU limit

  • - Line number: 859 + Line number: 3057
  • @@ -1116,7 +1322,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 39] + [DocId: 31] input @@ -1126,7 +1332,7 @@

    Container has no CPU limit

    spec - initContainers[copyutil] + containers[redis] resources @@ -1137,7 +1343,7 @@

    Container has no CPU limit

  • - Line number: 1086 + Line number: 3130
  • @@ -1174,7 +1380,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 39] + [DocId: 32] input @@ -1184,7 +1390,7 @@

    Container has no CPU limit

    spec - containers[argocd-repo-server] + initContainers[copyutil] resources @@ -1195,7 +1401,7 @@

    Container has no CPU limit

  • - Line number: 915 + Line number: 3313
  • @@ -1232,7 +1438,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 40] + [DocId: 32] input @@ -1242,7 +1448,7 @@

    Container has no CPU limit

    spec - containers[argocd-server] + containers[argocd-repo-server] resources @@ -1253,7 +1459,7 @@

    Container has no CPU limit

  • - Line number: 1171 + Line number: 3179
  • @@ -1290,7 +1496,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 41] + [DocId: 33] input @@ -1300,7 +1506,7 @@

    Container has no CPU limit

    spec - containers[argocd-application-controller] + containers[argocd-server] resources @@ -1311,7 +1517,7 @@

    Container has no CPU limit

  • - Line number: 1468 + Line number: 3388
  • @@ -1333,7 +1539,7 @@

    Remediation

    -

    Container is running with multiple open ports

    +

    Container has no CPU limit

    @@ -1344,11 +1550,13 @@

    Container is running with multiple open ports

    • - Public ID: SNYK-CC-K8S-36 + Public ID: SNYK-CC-K8S-5
    • Introduced through: - [DocId: 36] + [DocId: 34] + + input spec @@ -1356,36 +1564,40 @@

      Container is running with multiple open ports

      spec - containers[dex] + containers[argocd-application-controller] - ports + resources + + limits + + cpu
    • - Line number: 709 + Line number: 3638

    Impact

    -

    Increases the attack surface of the application and the container.

    +

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    Remediation

    -

    Reduce `ports` count to 2

    +

    Add `resources.limits.cpu` field with required CPU limit value


    -

    Container is running with writable root filesystem

    +

    Container is running with multiple open ports

    @@ -1396,13 +1608,11 @@

    Container is running with writable root filesystem

    • - Public ID: SNYK-CC-K8S-8 + Public ID: SNYK-CC-K8S-36
    • Introduced through: - [DocId: 38] - - input + [DocId: 30] spec @@ -1410,38 +1620,36 @@

      Container is running with writable root filesystem

      spec - containers[redis] - - securityContext + containers[dex] - readOnlyRootFilesystem + ports
    • - Line number: 869 + Line number: 3064

    Impact

    -

    Compromised process could abuse writable root filesystem to elevate privileges

    +

    Increases the attack surface of the application and the container.

    Remediation

    -

    Set `securityContext.readOnlyRootFilesystem` to `true`

    +

    Reduce `ports` count to 2


    -

    Container is running without liveness probe

    +

    Container is running with writable root filesystem

    @@ -1452,11 +1660,13 @@

    Container is running without liveness probe

    • - Public ID: SNYK-CC-K8S-41 + Public ID: SNYK-CC-K8S-8
    • Introduced through: - [DocId: 35] + [DocId: 30] + + input spec @@ -1464,36 +1674,38 @@

      Container is running without liveness probe

      spec - containers[argocd-applicationset-controller] + initContainers[copyutil] - livenessProbe + securityContext + + readOnlyRootFilesystem
    • - Line number: 616 + Line number: 3077

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    +

    Compromised process could abuse writable root filesystem to elevate privileges

    Remediation

    -

    Add `livenessProbe` attribute

    +

    Set `securityContext.readOnlyRootFilesystem` to `true`


    -

    Container is running without liveness probe

    +

    Container is running with writable root filesystem

    @@ -1504,11 +1716,13 @@

    Container is running without liveness probe

    • - Public ID: SNYK-CC-K8S-41 + Public ID: SNYK-CC-K8S-8
    • Introduced through: - [DocId: 36] + [DocId: 31] + + input spec @@ -1516,36 +1730,38 @@

      Container is running without liveness probe

      spec - containers[dex] + containers[redis] - livenessProbe + securityContext + + readOnlyRootFilesystem
    • - Line number: 695 + Line number: 3130

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    +

    Compromised process could abuse writable root filesystem to elevate privileges

    Remediation

    -

    Add `livenessProbe` attribute

    +

    Set `securityContext.readOnlyRootFilesystem` to `true`


    -

    Container is running without liveness probe

    +

    Container is running with writable root filesystem

    @@ -1556,11 +1772,13 @@

    Container is running without liveness probe

    • - Public ID: SNYK-CC-K8S-41 + Public ID: SNYK-CC-K8S-8
    • Introduced through: - [DocId: 36] + [DocId: 32] + + input spec @@ -1570,29 +1788,31 @@

      Container is running without liveness probe

      initContainers[copyutil] - livenessProbe + securityContext + + readOnlyRootFilesystem
    • - Line number: 729 + Line number: 3313

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    +

    Compromised process could abuse writable root filesystem to elevate privileges

    Remediation

    -

    Add `livenessProbe` attribute

    +

    Set `securityContext.readOnlyRootFilesystem` to `true`


    @@ -1612,7 +1832,7 @@

    Container is running without liveness probe

  • Introduced through: - [DocId: 38] + [DocId: 30] spec @@ -1620,14 +1840,14 @@

    Container is running without liveness probe

    spec - containers[redis] + containers[dex] livenessProbe
  • - Line number: 859 + Line number: 3057
  • @@ -1664,7 +1884,7 @@

    Container is running without liveness probe

  • Introduced through: - [DocId: 39] + [DocId: 30] spec @@ -1679,7 +1899,7 @@

    Container is running without liveness probe

  • - Line number: 1086 + Line number: 3077
  • @@ -1701,7 +1921,7 @@

    Remediation

    -

    Container is running without memory limit

    +

    Container is running without liveness probe

    @@ -1712,13 +1932,11 @@

    Container is running without memory limit

    • - Public ID: SNYK-CC-K8S-4 + Public ID: SNYK-CC-K8S-41
    • Introduced through: - [DocId: 35] - - input + [DocId: 31] spec @@ -1726,40 +1944,36 @@

      Container is running without memory limit

      spec - containers[argocd-applicationset-controller] - - resources - - limits + containers[redis] - memory + livenessProbe
    • - Line number: 616 + Line number: 3130

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    +

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    Remediation

    -

    Set `resources.limits.memory` value

    +

    Add `livenessProbe` attribute


    -

    Container is running without memory limit

    +

    Container is running without liveness probe

    @@ -1770,13 +1984,11 @@

    Container is running without memory limit

    • - Public ID: SNYK-CC-K8S-4 + Public ID: SNYK-CC-K8S-41
    • Introduced through: - [DocId: 36] - - input + [DocId: 32] spec @@ -1784,35 +1996,31 @@

      Container is running without memory limit

      spec - containers[dex] - - resources - - limits + initContainers[copyutil] - memory + livenessProbe
    • - Line number: 695 + Line number: 3313

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    +

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    Remediation

    -

    Set `resources.limits.memory` value

    +

    Add `livenessProbe` attribute


    @@ -1832,7 +2040,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 36] + [DocId: 30] input @@ -1842,7 +2050,7 @@

    Container is running without memory limit

    spec - initContainers[copyutil] + containers[dex] resources @@ -1853,7 +2061,7 @@

    Container is running without memory limit

  • - Line number: 729 + Line number: 3057
  • @@ -1890,7 +2098,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 37] + [DocId: 30] input @@ -1900,7 +2108,7 @@

    Container is running without memory limit

    spec - containers[argocd-notifications-controller] + initContainers[copyutil] resources @@ -1911,7 +2119,7 @@

    Container is running without memory limit

  • - Line number: 785 + Line number: 3077
  • @@ -1948,7 +2156,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 38] + [DocId: 31] input @@ -1969,7 +2177,7 @@

    Container is running without memory limit

  • - Line number: 859 + Line number: 3130
  • @@ -2006,7 +2214,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 39] + [DocId: 32] input @@ -2027,7 +2235,7 @@

    Container is running without memory limit

  • - Line number: 1086 + Line number: 3313
  • @@ -2064,7 +2272,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 39] + [DocId: 32] input @@ -2085,7 +2293,7 @@

    Container is running without memory limit

  • - Line number: 915 + Line number: 3179
  • @@ -2122,7 +2330,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 40] + [DocId: 33] input @@ -2143,7 +2351,7 @@

    Container is running without memory limit

  • - Line number: 1171 + Line number: 3388
  • @@ -2180,7 +2388,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 41] + [DocId: 34] input @@ -2201,7 +2409,7 @@

    Container is running without memory limit

  • - Line number: 1468 + Line number: 3638
  • diff --git a/docs/snyk/v2.6.0-rc4/argocd-iac-namespace-install.html b/docs/snyk/v2.2.12/argocd-iac-namespace-install.html similarity index 82% rename from docs/snyk/v2.6.0-rc4/argocd-iac-namespace-install.html rename to docs/snyk/v2.2.12/argocd-iac-namespace-install.html index 935671b03009d..c5e8d39894bd3 100644 --- a/docs/snyk/v2.6.0-rc4/argocd-iac-namespace-install.html +++ b/docs/snyk/v2.2.12/argocd-iac-namespace-install.html @@ -456,17 +456,17 @@

    Snyk test report

    -

    January 22nd 2023, 12:19:39 am

    +

    September 7th 2022, 7:40:03 pm

    Scanned the following path:
      -
    • /argo-cd/manifests/namespace-install.yaml (Kubernetes)
    • +
    • /private/argo-cd/manifests/namespace-install.yaml (Kubernetes)
    -
    32 total issues
    +
    35 total issues
    @@ -476,14 +476,14 @@

    Snyk test report

    - +
    Project manifests/namespace-install.yaml
    Path /argo-cd/manifests/namespace-install.yaml
    Path /private/argo-cd/manifests/namespace-install.yaml
    Project Type Kubernetes
    -

    Role with dangerous permissions

    +

    Container does not drop all default capabilities

    @@ -494,42 +494,54 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-6
    • Introduced through: - [DocId: 7] + [DocId: 24] - rules[0] + input - resources + spec + + template + + spec + + containers[dex] + + securityContext + + capabilities + + drop
    • - Line number: 77 + Line number: 426

    Impact

    -

    Using this role grants dangerous permissions

    +

    Containers are running with potentially unnecessary privileges

    Remediation

    -

    Consider removing this permissions

    +

    Add `ALL` to `securityContext.capabilities.drop` list, and add only required capabilities in `securityContext.capabilities.add`


    -

    Role with dangerous permissions

    +

    Container does not drop all default capabilities

    @@ -540,42 +552,54 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-6
    • Introduced through: - [DocId: 8] + [DocId: 24] - rules[4] + input - resources + spec + + template + + spec + + initContainers[copyutil] + + securityContext + + capabilities + + drop
    • - Line number: 154 + Line number: 436

    Impact

    -

    Using this role grants dangerous permissions

    +

    Containers are running with potentially unnecessary privileges

    Remediation

    -

    Consider removing this permissions

    +

    Add `ALL` to `securityContext.capabilities.drop` list, and add only required capabilities in `securityContext.capabilities.add`


    -

    Role with dangerous permissions

    +

    Container does not drop all default capabilities

    @@ -586,42 +610,54 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-6
    • Introduced through: - [DocId: 9] + [DocId: 25] - rules[0] + input - resources + spec + + template + + spec + + containers[redis] + + securityContext + + capabilities + + drop
    • - Line number: 182 + Line number: 489

    Impact

    -

    Using this role grants dangerous permissions

    +

    Containers are running with potentially unnecessary privileges

    Remediation

    -

    Consider removing this permissions

    +

    Add `ALL` to `securityContext.capabilities.drop` list, and add only required capabilities in `securityContext.capabilities.add`


    -

    Role with dangerous permissions

    +

    Container does not drop all default capabilities

    @@ -632,42 +668,54 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-6
    • Introduced through: - [DocId: 10] + [DocId: 26] - rules[3] + input - resources + spec + + template + + spec + + initContainers[copyutil] + + securityContext + + capabilities + + drop
    • - Line number: 226 + Line number: 672

    Impact

    -

    Using this role grants dangerous permissions

    +

    Containers are running with potentially unnecessary privileges

    Remediation

    -

    Consider removing this permissions

    +

    Add `ALL` to `securityContext.capabilities.drop` list, and add only required capabilities in `securityContext.capabilities.add`


    -

    Role with dangerous permissions

    +

    Container is running without privilege escalation control

    @@ -678,42 +726,52 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-9
    • Introduced through: - [DocId: 10] + [DocId: 24] - rules[1] + input - resources + spec + + template + + spec + + initContainers[copyutil] + + securityContext + + allowPrivilegeEscalation
    • - Line number: 208 + Line number: 436

    Impact

    -

    Using this role grants dangerous permissions

    +

    Processes could elevate current privileges via known vectors, for example SUID binaries

    Remediation

    -

    Consider removing this permissions

    +

    Set `securityContext.allowPrivilegeEscalation` to `false`


    -

    Role with dangerous permissions

    +

    Container is running without privilege escalation control

    @@ -724,57 +782,69 @@

    Role with dangerous permissions

    • - Public ID: SNYK-CC-K8S-47 + Public ID: SNYK-CC-K8S-9
    • Introduced through: - [DocId: 11] + [DocId: 25] - rules[0] + input - resources + spec + + template + + spec + + containers[redis] + + securityContext + + allowPrivilegeEscalation
    • - Line number: 242 + Line number: 489

    Impact

    -

    Using this role grants dangerous permissions

    +

    Processes could elevate current privileges via known vectors, for example SUID binaries

    Remediation

    -

    Consider removing this permissions

    +

    Set `securityContext.allowPrivilegeEscalation` to `false`


    -
    -

    Container could be running with outdated image

    +
    +

    Container is running without privilege escalation control

    -
    - low severity +
    + medium severity

    • - Public ID: SNYK-CC-K8S-42 + Public ID: SNYK-CC-K8S-9
    • Introduced through: - [DocId: 39] + [DocId: 26] + + input spec @@ -784,49 +854,51 @@

      Container could be running with outdated image

      initContainers[copyutil] - imagePullPolicy + securityContext + + allowPrivilegeEscalation
    • - Line number: 1153 + Line number: 672

    Impact

    -

    The container may run with outdated or unauthorized image

    +

    Processes could elevate current privileges via known vectors, for example SUID binaries

    Remediation

    -

    Set `imagePullPolicy` attribute to `Always`

    +

    Set `securityContext.allowPrivilegeEscalation` to `false`


    -
    -

    Container has no CPU limit

    +
    +

    Container is running without root user control

    -
    - low severity +
    + medium severity

    • - Public ID: SNYK-CC-K8S-5 + Public ID: SNYK-CC-K8S-10
    • Introduced through: - [DocId: 35] + [DocId: 24] input @@ -836,55 +908,53 @@

      Container has no CPU limit

      spec - containers[argocd-applicationset-controller] - - resources + initContainers[copyutil] - limits + securityContext - cpu + runAsNonRoot
    • - Line number: 616 + Line number: 436

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    +

    Container could be running with full administrative privileges

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    +

    Set `securityContext.runAsNonRoot` to `true`


    -
    -

    Container has no CPU limit

    +
    +

    Container is running without root user control

    -
    - low severity +
    + medium severity

    • - Public ID: SNYK-CC-K8S-5 + Public ID: SNYK-CC-K8S-10
    • Introduced through: - [DocId: 36] + [DocId: 26] input @@ -896,38 +966,180 @@

      Container has no CPU limit

      initContainers[copyutil] + securityContext + + runAsNonRoot + +
    • + +
    • + Line number: 672 +
    • +
    + +
    + +

    Impact

    +

    Container could be running with full administrative privileges

    + +

    Remediation

    +

    Set `securityContext.runAsNonRoot` to `true`

    + + +
    +
    + + + +
    +
    +

    Role with dangerous permissions

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Public ID: SNYK-CC-K8S-47 +
    • + +
    • Introduced through: + [DocId: 4] + + role + + rules[0] + resources + +
    • + +
    • + Line number: 38 +
    • +
    + +
    + +

    Impact

    +

    Using this role grants dangerous permissions

    + +

    Remediation

    +

    Consider removing this permissions

    + + +
    +
    + + + +
    +
    +

    Role with dangerous permissions

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Public ID: SNYK-CC-K8S-47 +
    • + +
    • Introduced through: + [DocId: 5] - limits + role - cpu + rules[0] + + resources
    • - Line number: 789 + Line number: 77

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    +

    Using this role grants dangerous permissions

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    +

    Consider removing this permissions


    + +
    +
    +

    Role with dangerous permissions

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Public ID: SNYK-CC-K8S-47 +
    • + +
    • Introduced through: + [DocId: 6] + + role + + rules[0] + + resources + +
    • + +
    • + Line number: 96 +
    • +
    + +
    + +

    Impact

    +

    Using this role grants dangerous permissions

    + +

    Remediation

    +

    Consider removing this permissions

    + + +
    +
    + +
    -

    Container has no CPU limit

    +

    Container could be running with outdated image

    @@ -938,13 +1150,11 @@

    Container has no CPU limit

    • - Public ID: SNYK-CC-K8S-5 + Public ID: SNYK-CC-K8S-42
    • Introduced through: - [DocId: 36] - - input + [DocId: 26] spec @@ -952,35 +1162,31 @@

      Container has no CPU limit

      spec - containers[dex] - - resources - - limits + initContainers[copyutil] - cpu + imagePullPolicy
    • - Line number: 755 + Line number: 672

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    +

    The container may run with outdated or unauthorized image

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    +

    Set `imagePullPolicy` attribute to `Always`


    @@ -1000,7 +1206,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 37] + [DocId: 24] input @@ -1010,7 +1216,7 @@

    Container has no CPU limit

    spec - containers[argocd-notifications-controller] + initContainers[copyutil] resources @@ -1021,7 +1227,7 @@

    Container has no CPU limit

  • - Line number: 845 + Line number: 436
  • @@ -1058,7 +1264,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 38] + [DocId: 24] input @@ -1068,7 +1274,7 @@

    Container has no CPU limit

    spec - containers[redis] + containers[dex] resources @@ -1079,7 +1285,7 @@

    Container has no CPU limit

  • - Line number: 919 + Line number: 416
  • @@ -1116,7 +1322,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 39] + [DocId: 25] input @@ -1126,7 +1332,7 @@

    Container has no CPU limit

    spec - initContainers[copyutil] + containers[redis] resources @@ -1137,7 +1343,7 @@

    Container has no CPU limit

  • - Line number: 1153 + Line number: 489
  • @@ -1174,7 +1380,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 39] + [DocId: 26] input @@ -1184,7 +1390,7 @@

    Container has no CPU limit

    spec - containers[argocd-repo-server] + initContainers[copyutil] resources @@ -1195,7 +1401,7 @@

    Container has no CPU limit

  • - Line number: 975 + Line number: 672
  • @@ -1232,7 +1438,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 40] + [DocId: 26] input @@ -1242,7 +1448,7 @@

    Container has no CPU limit

    spec - containers[argocd-server] + containers[argocd-repo-server] resources @@ -1253,7 +1459,7 @@

    Container has no CPU limit

  • - Line number: 1238 + Line number: 538
  • @@ -1290,7 +1496,7 @@

    Container has no CPU limit

  • Introduced through: - [DocId: 41] + [DocId: 27] input @@ -1300,7 +1506,7 @@

    Container has no CPU limit

    spec - containers[argocd-application-controller] + containers[argocd-server] resources @@ -1311,7 +1517,7 @@

    Container has no CPU limit

  • - Line number: 1542 + Line number: 747
  • @@ -1333,7 +1539,7 @@

    Remediation

    -

    Container is running with multiple open ports

    +

    Container has no CPU limit

    @@ -1344,11 +1550,13 @@

    Container is running with multiple open ports

    • - Public ID: SNYK-CC-K8S-36 + Public ID: SNYK-CC-K8S-5
    • Introduced through: - [DocId: 36] + [DocId: 28] + + input spec @@ -1356,36 +1564,40 @@

      Container is running with multiple open ports

      spec - containers[dex] + containers[argocd-application-controller] - ports + resources + + limits + + cpu
    • - Line number: 769 + Line number: 997

    Impact

    -

    Increases the attack surface of the application and the container.

    +

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    Remediation

    -

    Reduce `ports` count to 2

    +

    Add `resources.limits.cpu` field with required CPU limit value


    -

    Container is running with writable root filesystem

    +

    Container is running with multiple open ports

    @@ -1396,13 +1608,11 @@

    Container is running with writable root filesystem

    • - Public ID: SNYK-CC-K8S-8 + Public ID: SNYK-CC-K8S-36
    • Introduced through: - [DocId: 38] - - input + [DocId: 24] spec @@ -1410,38 +1620,36 @@

      Container is running with writable root filesystem

      spec - containers[redis] - - securityContext + containers[dex] - readOnlyRootFilesystem + ports
    • - Line number: 929 + Line number: 423

    Impact

    -

    Compromised process could abuse writable root filesystem to elevate privileges

    +

    Increases the attack surface of the application and the container.

    Remediation

    -

    Set `securityContext.readOnlyRootFilesystem` to `true`

    +

    Reduce `ports` count to 2


    -

    Container is running without liveness probe

    +

    Container is running with writable root filesystem

    @@ -1452,11 +1660,13 @@

    Container is running without liveness probe

    • - Public ID: SNYK-CC-K8S-41 + Public ID: SNYK-CC-K8S-8
    • Introduced through: - [DocId: 35] + [DocId: 24] + + input spec @@ -1464,36 +1674,38 @@

      Container is running without liveness probe

      spec - containers[argocd-applicationset-controller] + initContainers[copyutil] - livenessProbe + securityContext + + readOnlyRootFilesystem
    • - Line number: 616 + Line number: 436

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    +

    Compromised process could abuse writable root filesystem to elevate privileges

    Remediation

    -

    Add `livenessProbe` attribute

    +

    Set `securityContext.readOnlyRootFilesystem` to `true`


    -

    Container is running without liveness probe

    +

    Container is running with writable root filesystem

    @@ -1504,11 +1716,13 @@

    Container is running without liveness probe

    • - Public ID: SNYK-CC-K8S-41 + Public ID: SNYK-CC-K8S-8
    • Introduced through: - [DocId: 36] + [DocId: 25] + + input spec @@ -1516,36 +1730,38 @@

      Container is running without liveness probe

      spec - containers[dex] + containers[redis] - livenessProbe + securityContext + + readOnlyRootFilesystem
    • - Line number: 755 + Line number: 489

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    +

    Compromised process could abuse writable root filesystem to elevate privileges

    Remediation

    -

    Add `livenessProbe` attribute

    +

    Set `securityContext.readOnlyRootFilesystem` to `true`


    -

    Container is running without liveness probe

    +

    Container is running with writable root filesystem

    @@ -1556,11 +1772,13 @@

    Container is running without liveness probe

    • - Public ID: SNYK-CC-K8S-41 + Public ID: SNYK-CC-K8S-8
    • Introduced through: - [DocId: 36] + [DocId: 26] + + input spec @@ -1570,29 +1788,31 @@

      Container is running without liveness probe

      initContainers[copyutil] - livenessProbe + securityContext + + readOnlyRootFilesystem
    • - Line number: 789 + Line number: 672

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    +

    Compromised process could abuse writable root filesystem to elevate privileges

    Remediation

    -

    Add `livenessProbe` attribute

    +

    Set `securityContext.readOnlyRootFilesystem` to `true`


    @@ -1612,7 +1832,7 @@

    Container is running without liveness probe

  • Introduced through: - [DocId: 38] + [DocId: 24] spec @@ -1620,14 +1840,14 @@

    Container is running without liveness probe

    spec - containers[redis] + containers[dex] livenessProbe
  • - Line number: 919 + Line number: 416
  • @@ -1664,7 +1884,7 @@

    Container is running without liveness probe

  • Introduced through: - [DocId: 39] + [DocId: 24] spec @@ -1679,7 +1899,7 @@

    Container is running without liveness probe

  • - Line number: 1153 + Line number: 436
  • @@ -1701,7 +1921,7 @@

    Remediation

    -

    Container is running without memory limit

    +

    Container is running without liveness probe

    @@ -1712,13 +1932,11 @@

    Container is running without memory limit

    • - Public ID: SNYK-CC-K8S-4 + Public ID: SNYK-CC-K8S-41
    • Introduced through: - [DocId: 35] - - input + [DocId: 25] spec @@ -1726,40 +1944,36 @@

      Container is running without memory limit

      spec - containers[argocd-applicationset-controller] - - resources - - limits + containers[redis] - memory + livenessProbe
    • - Line number: 616 + Line number: 489

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    +

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    Remediation

    -

    Set `resources.limits.memory` value

    +

    Add `livenessProbe` attribute


    -

    Container is running without memory limit

    +

    Container is running without liveness probe

    @@ -1770,13 +1984,11 @@

    Container is running without memory limit

    • - Public ID: SNYK-CC-K8S-4 + Public ID: SNYK-CC-K8S-41
    • Introduced through: - [DocId: 36] - - input + [DocId: 26] spec @@ -1784,35 +1996,31 @@

      Container is running without memory limit

      spec - containers[dex] - - resources - - limits + initContainers[copyutil] - memory + livenessProbe
    • - Line number: 755 + Line number: 672

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    +

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    Remediation

    -

    Set `resources.limits.memory` value

    +

    Add `livenessProbe` attribute


    @@ -1832,7 +2040,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 36] + [DocId: 24] input @@ -1842,7 +2050,7 @@

    Container is running without memory limit

    spec - initContainers[copyutil] + containers[dex] resources @@ -1853,7 +2061,7 @@

    Container is running without memory limit

  • - Line number: 789 + Line number: 416
  • @@ -1890,7 +2098,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 37] + [DocId: 24] input @@ -1900,7 +2108,7 @@

    Container is running without memory limit

    spec - containers[argocd-notifications-controller] + initContainers[copyutil] resources @@ -1911,7 +2119,7 @@

    Container is running without memory limit

  • - Line number: 845 + Line number: 436
  • @@ -1948,7 +2156,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 38] + [DocId: 25] input @@ -1969,7 +2177,7 @@

    Container is running without memory limit

  • - Line number: 919 + Line number: 489
  • @@ -2006,7 +2214,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 39] + [DocId: 26] input @@ -2027,7 +2235,7 @@

    Container is running without memory limit

  • - Line number: 1153 + Line number: 672
  • @@ -2064,7 +2272,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 39] + [DocId: 26] input @@ -2085,7 +2293,7 @@

    Container is running without memory limit

  • - Line number: 975 + Line number: 538
  • @@ -2122,7 +2330,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 40] + [DocId: 27] input @@ -2143,7 +2351,7 @@

    Container is running without memory limit

  • - Line number: 1238 + Line number: 747
  • @@ -2180,7 +2388,7 @@

    Container is running without memory limit

  • Introduced through: - [DocId: 41] + [DocId: 28] input @@ -2201,7 +2409,7 @@

    Container is running without memory limit

  • - Line number: 1542 + Line number: 997
  • diff --git a/docs/snyk/v2.2.12/argocd-test.html b/docs/snyk/v2.2.12/argocd-test.html new file mode 100644 index 0000000000000..0002991d19a09 --- /dev/null +++ b/docs/snyk/v2.2.12/argocd-test.html @@ -0,0 +1,1109 @@ + + + + + + + + + Snyk test report + + + + + + + + + +
    +
    +
    +
    + + + Snyk - Open Source Security + + + + + + + +
    +

    Snyk test report

    + +

    September 7th 2022, 7:39:03 pm

    +
    +
    + Scanned the following paths: +
      +
    • /private/argo-cd/argoproj/argo-cd/v2 (gomodules)
    • /private/argo-cd (yarn)
    • +
    +
    + +
    +
    6 known vulnerabilities
    +
    11 vulnerable dependency paths
    +
    1367 dependencies
    +
    +
    +
    +
    + +
    +
    +
    +

    Regular Expression Denial of Service (ReDoS)

    +
    + +
    + high severity +
    + +
    + +
      +
    • + Package Manager: npm +
    • +
    • + Vulnerable module: + + moment +
    • + +
    • Introduced through: + + + argo-cd-ui@1.0.0, argo-ui@1.0.0 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + argo-cd-ui@1.0.0 + + argo-ui@1.0.0 + + moment@2.29.1 + + + +
    • +
    • + Introduced through: + argo-cd-ui@1.0.0 + + argo-ui@1.0.0 + + moment-timezone@0.5.33 + + moment@2.29.1 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    moment is a lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.

    +

    Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the preprocessRFC2822() function in from-string.js, when processing a very long crafted string (over 10k characters).

    +

    PoC:

    +
    moment("(".repeat(500000))
    +        
    +

    Details

    +

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

    +

    The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

    +

    Let’s take the following regular expression as an example:

    +
    regex = /A(B|C+)+D/
    +        
    +

    This regular expression accomplishes the following:

    +
      +
    • A The string must start with the letter 'A'
    • +
    • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
    • +
    • D Finally, we ensure this section of the string ends with a 'D'
    • +
    +

    The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

    +

    It most cases, it doesn't take very long for a regex engine to find a match:

    +
    $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
    +        0.04s user 0.01s system 95% cpu 0.052 total
    +        
    +        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
    +        1.79s user 0.02s system 99% cpu 1.812 total
    +        
    +

    The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

    +

    Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

    +

    Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

    +
      +
    1. CCC
    2. +
    3. CC+C
    4. +
    5. C+CC
    6. +
    7. C+C+C.
    8. +
    +

    The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

    +

    From there, the number of steps the engine must use to validate a string just continues to grow.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    StringNumber of C'sNumber of steps
    ACCCX338
    ACCCCX471
    ACCCCCX5136
    ACCCCCCCCCCCCCCX1465,553
    +

    By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

    +

    Remediation

    +

    Upgrade moment to version 2.29.4 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Information Exposure

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: npm +
    • +
    • + Vulnerable module: + + node-fetch +
    • + +
    • Introduced through: + + + argo-cd-ui@1.0.0, argo-ui@1.0.0 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + argo-cd-ui@1.0.0 + + argo-ui@1.0.0 + + portable-fetch@3.0.0 + + node-fetch@1.7.3 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    node-fetch is a light-weight module that brings window.fetch to node.js

    +

    Affected versions of this package are vulnerable to Information Exposure when fetching a remote url with Cookie, if it get a Location response header, it will follow that url and try to fetch that url with provided cookie. This can lead to forwarding secure headers to 3th party.

    +

    Remediation

    +

    Upgrade node-fetch to version 2.6.7, 3.1.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Denial of Service

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: npm +
    • +
    • + Vulnerable module: + + node-fetch +
    • + +
    • Introduced through: + + + argo-cd-ui@1.0.0, argo-ui@1.0.0 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + argo-cd-ui@1.0.0 + + argo-ui@1.0.0 + + portable-fetch@3.0.0 + + node-fetch@1.7.3 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    node-fetch is a light-weight module that brings window.fetch to node.js

    +

    Affected versions of this package are vulnerable to Denial of Service. Node Fetch did not honor the size option after following a redirect, which means that when a content size was over the limit, a FetchError would never get thrown and the process would end without failure.

    +

    Remediation

    +

    Upgrade node-fetch to version 2.6.1, 3.0.0-beta.9 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + golang.org/x/text/internal/language +
    • + +
    • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, sigs.k8s.io/controller-runtime/pkg/envtest@0.8.3 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + sigs.k8s.io/controller-runtime/pkg/envtest@0.8.3 + + sigs.k8s.io/controller-runtime/pkg/internal/testing/integration@0.8.3 + + sigs.k8s.io/controller-runtime/pkg/internal/testing/integration/internal@0.8.3 + + github.com/onsi/gomega/gexec@1.15.0 + + github.com/onsi/gomega@1.15.0 + + github.com/onsi/gomega/matchers@1.15.0 + + golang.org/x/net/html/charset@#491a49abca63 + + golang.org/x/text/encoding/htmlindex@0.3.6 + + golang.org/x/text/language@0.3.6 + + golang.org/x/text/internal/language@0.3.6 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + sigs.k8s.io/controller-runtime/pkg/envtest@0.8.3 + + sigs.k8s.io/controller-runtime/pkg/internal/testing/integration@0.8.3 + + sigs.k8s.io/controller-runtime/pkg/internal/testing/integration/internal@0.8.3 + + github.com/onsi/gomega/gexec@1.15.0 + + github.com/onsi/gomega@1.15.0 + + github.com/onsi/gomega/matchers@1.15.0 + + golang.org/x/net/html/charset@#491a49abca63 + + golang.org/x/text/encoding/htmlindex@0.3.6 + + golang.org/x/text/language@0.3.6 + + golang.org/x/text/internal/language/compact@0.3.6 + + golang.org/x/text/internal/language@0.3.6 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    Affected versions of this package are vulnerable to Out-of-bounds Read due to improper index calculation, an incorrectly formatted language tag can cause Parse to panic. If Parse is used to process untrusted user inputs, this may be used as a vector for a denial of service attack.

    +

    Remediation

    +

    Upgrade golang.org/x/text/internal/language to version 0.3.7 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Improper Input Validation

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + go.mongodb.org/mongo-driver/bson/bsonrw +
    • + +
    • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, github.com/go-openapi/runtime/middleware@0.19.4 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/go-openapi/runtime/middleware@0.19.4 + + github.com/go-openapi/validate@0.19.2 + + github.com/go-openapi/strfmt@0.19.3 + + go.mongodb.org/mongo-driver/bson@1.1.1 + + go.mongodb.org/mongo-driver/bson/bsonrw@1.1.1 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/go-openapi/runtime/middleware@0.19.4 + + github.com/go-openapi/validate@0.19.2 + + github.com/go-openapi/strfmt@0.19.3 + + go.mongodb.org/mongo-driver/bson@1.1.1 + + go.mongodb.org/mongo-driver/bson/bsoncodec@1.1.1 + + go.mongodb.org/mongo-driver/bson/bsonrw@1.1.1 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    go.mongodb.org/mongo-driver/bson/bsonrw is a The MongoDB supported driver for Go.

    +

    Affected versions of this package are vulnerable to Improper Input Validation. Specific cstrings input may not be properly validated in the MongoDB Go Driver when marshalling Go objects into BSON. A malicious user could use a Go object with specific string to potentially inject additional fields into marshalled documents.

    +

    Remediation

    +

    Upgrade go.mongodb.org/mongo-driver/bson/bsonrw to version 1.5.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Denial of Service (DoS)

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + github.com/prometheus/client_golang/prometheus/promhttp +
    • + +
    • Introduced through: + + github.com/argoproj/argo-cd/v2@0.0.0 and github.com/prometheus/client_golang/prometheus/promhttp@1.11.0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/prometheus/client_golang/prometheus/promhttp@1.11.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + k8s.io/component-base/metrics/prometheus/workqueue@0.22.2 + + k8s.io/component-base/metrics/legacyregistry@0.22.2 + + github.com/prometheus/client_golang/prometheus/promhttp@1.11.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + k8s.io/component-base/metrics/prometheus/workqueue@0.22.2 + + k8s.io/component-base/metrics/legacyregistry@0.22.2 + + k8s.io/component-base/metrics@0.22.2 + + github.com/prometheus/client_golang/prometheus/promhttp@1.11.0 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    Affected versions of this package are vulnerable to Denial of Service (DoS) when handling requests with non-standard HTTP methods.

    +

    Note: In order to be affected, an instrumented software must:

    +
      +
    1. use promhttp.InstrumentHandler* middleware except RequestsInFlight

      +
    2. +
    3. not filter any specific methods (e.g GET) before middleware

      +
    4. +
    5. pass metric with method label name to the middleware

      +
    6. +
    7. not have any firewall/LB/proxy that filters away requests with unknown method.

      +
    8. +
    +

    Workarounds:

    +
      +
    1. removing the method label name from counter/gauge used in the InstrumentHandler

      +
    2. +
    3. turning off affected promhttp handlers

      +
    4. +
    5. adding custom middleware before promhttp handler that will sanitize the request method given by Go http.Request

      +
    6. +
    7. using a reverse proxy or web application firewall, configured to only allow a limited set of methods.

      +
    8. +
    +

    Details

    +

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its intended and legitimate users.

    +

    Unlike other vulnerabilities, DoS attacks usually do not aim at breaching security. Rather, they are focused on making websites and services unavailable to genuine users resulting in downtime.

    +

    One popular Denial of Service vulnerability is DDoS (a Distributed Denial of Service), an attack that attempts to clog network pipes to the system by generating a large volume of traffic from many machines.

    +

    When it comes to open source libraries, DoS vulnerabilities allow attackers to trigger such a crash or crippling of the service by using a flaw either in the application code or from the use of open source libraries.

    +

    Two common types of DoS vulnerabilities:

    +
      +
    • High CPU/Memory Consumption- An attacker sending crafted requests that could cause the system to take a disproportionate amount of time to process. For example, commons-fileupload:commons-fileupload.

      +
    • +
    • Crash - An attacker sending crafted requests that could cause the system to crash. For Example, npm ws package

      +
    • +
    +

    Remediation

    +

    Upgrade github.com/prometheus/client_golang/prometheus/promhttp to version 1.11.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +
    +
    + + + diff --git a/docs/snyk/v2.2.12/ghcr.io_dexidp_dex_v2.32.0.html b/docs/snyk/v2.2.12/ghcr.io_dexidp_dex_v2.32.0.html new file mode 100644 index 0000000000000..5d8eb5b9da332 --- /dev/null +++ b/docs/snyk/v2.2.12/ghcr.io_dexidp_dex_v2.32.0.html @@ -0,0 +1,805 @@ + + + + + + + + + Snyk test report + + + + + + + + + +
    +
    +
    +
    + + + Snyk - Open Source Security + + + + + + + +
    +

    Snyk test report

    + +

    September 7th 2022, 7:39:09 pm

    +
    +
    + Scanned the following path: +
      +
    • ghcr.io/dexidp/dex:v2.32.0/dexidp/dex (apk)
    • +
    +
    + +
    +
    3 known vulnerabilities
    +
    12 vulnerable dependency paths
    +
    14 dependencies
    +
    +
    +
    +
    +
    + + + + + + + +
    Project docker-image|ghcr.io/dexidp/dex
    Path ghcr.io/dexidp/dex:v2.32.0/dexidp/dex
    Package Manager apk
    +
    +
    +
    +
    +

    Out-of-bounds Write

    +
    + +
    + critical severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + zlib/zlib +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.32.0 and zlib/zlib@1.2.12-r1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + apk-tools/apk-tools@2.12.9-r3 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    Upgrade Alpine:3.16 zlib to version 1.2.12-r2 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + high severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.32.0 and busybox/busybox@1.35.0-r13 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/busybox@1.35.0-r13 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + alpine-baselayout/alpine-baselayout-data@3.2.0-r20 + + alpine-baselayout/alpine-baselayout@3.2.0-r20 + + busybox/busybox@1.35.0-r13 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/ssl_client@1.35.0-r13 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream busybox package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    A use-after-free in Busybox 1.35-x's awk applet leads to denial of service and possibly code execution when processing a crafted awk pattern in the copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.16 busybox to version 1.35.0-r15 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Inadequate Encryption Strength

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + openssl/libcrypto1.1 +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.32.0 and openssl/libcrypto1.1@1.1.1o-r0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + openssl/libssl1.1@1.1.1o-r0 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + apk-tools/apk-tools@2.12.9-r3 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/ssl_client@1.35.0-r13 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + openssl/libssl1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + apk-tools/apk-tools@2.12.9-r3 + + openssl/libssl1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/ssl_client@1.35.0-r13 + + openssl/libssl1.1@1.1.1o-r0 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream openssl package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    AES OCB mode for 32-bit x86 platforms using the AES-NI assembly optimised implementation will not encrypt the entirety of the data under some circumstances. This could reveal sixteen bytes of data that was preexisting in the memory that wasn't written. In the special case of "in place" encryption, sixteen bytes of the plaintext would be revealed. Since OpenSSL does not support OCB based cipher suites for TLS and DTLS, they are both unaffected. Fixed in OpenSSL 3.0.5 (Affected 3.0.0-3.0.4). Fixed in OpenSSL 1.1.1q (Affected 1.1.1-1.1.1p).

    +

    Remediation

    +

    Upgrade Alpine:3.16 openssl to version 1.1.1q-r0 or higher.

    +

    References

    + + +
    + + + +
    +
    +
    +
    + + + diff --git a/docs/snyk/v2.4.19/haproxy_2.0.29-alpine.html b/docs/snyk/v2.2.12/haproxy_2.0.29-alpine.html similarity index 69% rename from docs/snyk/v2.4.19/haproxy_2.0.29-alpine.html rename to docs/snyk/v2.2.12/haproxy_2.0.29-alpine.html index 82f50b8f63a41..20c62084f47ec 100644 --- a/docs/snyk/v2.4.19/haproxy_2.0.29-alpine.html +++ b/docs/snyk/v2.2.12/haproxy_2.0.29-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    January 22nd 2023, 12:21:47 am

    +

    September 7th 2022, 7:39:13 pm

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

    Snyk test report

    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    +
    1 known vulnerabilities
    +
    3 vulnerable dependency paths
    17 dependencies
    @@ -484,7 +484,107 @@

    Snyk test report

    - No known vulnerabilities detected. +
    +
    +

    Out-of-bounds Write

    +
    + +
    + critical severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + zlib/zlib +
    • + +
    • Introduced through: + + docker-image|haproxy@2.0.29-alpine and zlib/zlib@1.2.12-r1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.0.29-alpine + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.0.29-alpine + + .haproxy-rundeps@20220718.230945 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.0.29-alpine + + apk-tools/apk-tools@2.12.9-r3 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    Upgrade Alpine:3.16 zlib to version 1.2.12-r2 or higher.

    +

    References

    + + +
    + + + +
    +
    diff --git a/docs/snyk/v2.2.12/quay.io_argoproj_argocd_v2.2.12.html b/docs/snyk/v2.2.12/quay.io_argoproj_argocd_v2.2.12.html new file mode 100644 index 0000000000000..0f20bf07089dd --- /dev/null +++ b/docs/snyk/v2.2.12/quay.io_argoproj_argocd_v2.2.12.html @@ -0,0 +1,4838 @@ + + + + + + + + + Snyk test report + + + + + + + + + +
    +
    +
    +
    + + + Snyk - Open Source Security + + + + + + + +
    +

    Snyk test report

    + +

    September 7th 2022, 7:39:36 pm

    +
    +
    + Scanned the following path: +
      +
    • quay.io/argoproj/argocd:v2.2.12/argoproj/argocd (deb)
    • +
    +
    + +
    +
    35 known vulnerabilities
    +
    195 vulnerable dependency paths
    +
    253 dependencies
    +
    +
    +
    +
    +
    + + + + + + + +
    Project docker-image|quay.io/argoproj/argocd
    Path quay.io/argoproj/argocd:v2.2.12/argoproj/argocd
    Package Manager deb
    Manifest Dockerfile
    +
    +
    +
    +
    +

    Out-of-bounds Write

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + zlib/zlib1g +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + zlib/zlib1g@1:1.2.11.dfsg-2ubuntu9 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + zlib/zlib1g-dev@1:1.2.11.dfsg-2ubuntu9 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + zlib/zlib1g-dev@1:1.2.11.dfsg-2ubuntu9 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 zlib.

    +

    References

    + + +
    + + + +
    +
    +

    CVE-2022-1354

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + tiff/libtiff5 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and tiff/libtiff5@4.3.0-6 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + tiff/libtiff5@4.3.0-6 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + glibc/libc-devtools@2.35-0ubuntu3.1 + + libgd2/libgd3@2.3.0-2ubuntu2 + + tiff/libtiff5@4.3.0-6 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream tiff package.

    +

    A heap buffer overflow flaw was found in Libtiffs' tiffinfo.c in TIFFReadRawDataStriped() function. This flaw allows an attacker to pass a crafted TIFF file to the tiffinfo tool, triggering a heap buffer overflow issue and causing a crash that leads to a denial of service.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 tiff.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + sqlite3/libsqlite3-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, gnupg2/gpg@2.2.27-3ubuntu2.1 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + gnupg2/gpg@2.2.27-3ubuntu2.1 + + sqlite3/libsqlite3-0@3.37.2-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + + sqlite3/libsqlite3-0@3.37.2-2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream sqlite3 package.

    +

    An out-of-bounds read was addressed with improved bounds checking. This issue is fixed in iOS 13.5 and iPadOS 13.5, macOS Catalina 10.15.5, tvOS 13.4.5, watchOS 6.2.5, iTunes 12.10.7 for Windows, iCloud for Windows 11.2, iCloud for Windows 7.19. A malicious application may cause a denial of service or potentially disclose memory contents.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 sqlite3.

    +

    References

    + + +
    + + + +
    +
    +

    Improper Verification of Cryptographic Signature

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + perl/perl-modules-5.34 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, git@1:2.34.1-1ubuntu1.4 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git@1:2.34.1-1ubuntu1.4 + + perl@5.34.0-3ubuntu1 + + perl/perl-modules-5.34@5.34.0-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git@1:2.34.1-1ubuntu1.4 + + perl@5.34.0-3ubuntu1 + + perl/libperl5.34@5.34.0-3ubuntu1 + + perl/perl-modules-5.34@5.34.0-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git@1:2.34.1-1ubuntu1.4 + + perl@5.34.0-3ubuntu1 + + perl/libperl5.34@5.34.0-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git@1:2.34.1-1ubuntu1.4 + + perl@5.34.0-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + libalgorithm-diff-xs-perl@0.04-6build3 + + perl@5.34.0-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + libalgorithm-merge-perl@0.08-3 + + perl@5.34.0-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + libfile-fcntllock-perl@0.22-3build7 + + perl@5.34.0-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + perl/perl-base@5.34.0-3ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream perl package.

    +

    CPAN 2.28 allows Signature Verification Bypass.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 perl.

    +

    References

    + + +
    + + + +
    +
    +

    Double Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + gnutls28/libgnutls30 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and gnutls28/libgnutls30@3.7.3-4ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + gnutls28/libgnutls30@3.7.3-4ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + apt@2.4.6 + + gnutls28/libgnutls30@3.7.3-4ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + gnupg2/dirmngr@2.2.27-3ubuntu2.1 + + gnutls28/libgnutls30@3.7.3-4ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git@1:2.34.1-1ubuntu1.4 + + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 + + gnutls28/libgnutls30@3.7.3-4ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git@1:2.34.1-1ubuntu1.4 + + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 + + openldap/libldap-2.5-0@2.5.12+dfsg-0ubuntu0.22.04.1 + + gnutls28/libgnutls30@3.7.3-4ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git@1:2.34.1-1ubuntu1.4 + + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 + + rtmpdump/librtmp1@2.4+20151223.gitfa8646d.1-2build4 + + gnutls28/libgnutls30@3.7.3-4ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream gnutls28 package. + See How to fix? for Ubuntu:22.04 relevant versions.

    +

    A vulnerability found in gnutls. This security flaw happens because of a double free error occurs during verification of pkcs7 signatures in gnutls_pkcs7_verify function.

    +

    Remediation

    +

    Upgrade Ubuntu:22.04 gnutls28 to version 3.7.3-4ubuntu1.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Information Exposure

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + gcc-defaults/cpp +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and gcc-defaults/cpp@4:11.2.0-1ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + gcc-defaults/cpp@4:11.2.0-1ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/g++@4:11.2.0-1ubuntu1 + + gcc-defaults/cpp@4:11.2.0-1ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/gcc@4:11.2.0-1ubuntu1 + + gcc-defaults/cpp@4:11.2.0-1ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + gcc-defaults/gcc@4:11.2.0-1ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/gcc@4:11.2.0-1ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/g++@4:11.2.0-1ubuntu1 + + gcc-defaults/gcc@4:11.2.0-1ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + gcc-defaults/g++@4:11.2.0-1ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/g++@4:11.2.0-1ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream gcc-defaults package.

    +

    Arm Armv8-A core implementations utilizing speculative execution past unconditional changes in control flow may allow unauthorized disclosure of information to an attacker with local user access via a side-channel analysis, aka "straight-line speculation."

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 gcc-defaults.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Write

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + binutils/binutils-common +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and binutils/binutils-common@2.38-3ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf0@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libctf-nobfd0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf-nobfd0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libctf0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + dpkg/dpkg-dev@1.21.1ubuntu2.1 + + binutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/gcc@4:11.2.0-1ubuntu1 + + gcc-11@11.2.0-19ubuntu1 + + binutils@2.38-3ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream binutils package.

    +

    In GNU Binutils before 2.40, there is a heap-buffer-overflow in the error function bfd_getl32 when called from the strip_main function in strip-new via a crafted file.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 binutils.

    +

    References

    + + +
    + + + +
    +
    +

    Resource Exhaustion

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + tiff/libtiff5 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and tiff/libtiff5@4.3.0-6 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + tiff/libtiff5@4.3.0-6 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + glibc/libc-devtools@2.35-0ubuntu3.1 + + libgd2/libgd3@2.3.0-2ubuntu2 + + tiff/libtiff5@4.3.0-6 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream tiff package.

    +

    A vulnerability classified as problematic was found in LibTIFF 4.3.0. Affected by this vulnerability is the TIFF File Handler of tiff2ps. Opening a malicious file leads to a denial of service. The attack can be launched remotely but requires user interaction. The exploit has been disclosed to the public and may be used.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 tiff.

    +

    References

    + + +
    + + + +
    +
    +

    NULL Pointer Dereference

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + tiff/libtiff5 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and tiff/libtiff5@4.3.0-6 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + tiff/libtiff5@4.3.0-6 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + glibc/libc-devtools@2.35-0ubuntu3.1 + + libgd2/libgd3@2.3.0-2ubuntu2 + + tiff/libtiff5@4.3.0-6 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream tiff package.

    +

    LibTIFF 4.0.9 has a NULL pointer dereference in the jpeg_fdct_16x16 function in jfdctint.c.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 tiff.

    +

    References

    + + +
    + + + +
    +
    +

    NULL Pointer Dereference

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + tar +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + tar@1.34+dfsg-1build3 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream tar package.

    +

    pax_decode_header in sparse.c in GNU Tar before 1.32 had a NULL pointer dereference when parsing certain archives that have malformed extended headers.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 tar.

    +

    References

    + + +
    + + + +
    +
    +

    CVE-2020-9991

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + sqlite3/libsqlite3-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, gnupg2/gpg@2.2.27-3ubuntu2.1 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + gnupg2/gpg@2.2.27-3ubuntu2.1 + + sqlite3/libsqlite3-0@3.37.2-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + + sqlite3/libsqlite3-0@3.37.2-2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream sqlite3 package.

    +

    This issue was addressed with improved checks. This issue is fixed in macOS Big Sur 11.0.1, watchOS 7.0, iOS 14.0 and iPadOS 14.0, iCloud for Windows 7.21, tvOS 14.0. A remote attacker may be able to cause a denial of service.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 sqlite3.

    +

    References

    + + +
    + + + +
    +
    +

    Information Exposure

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + sqlite3/libsqlite3-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, gnupg2/gpg@2.2.27-3ubuntu2.1 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + gnupg2/gpg@2.2.27-3ubuntu2.1 + + sqlite3/libsqlite3-0@3.37.2-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + + sqlite3/libsqlite3-0@3.37.2-2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream sqlite3 package.

    +

    An information disclosure issue was addressed with improved state management. This issue is fixed in macOS Big Sur 11.0.1, watchOS 7.0, iOS 14.0 and iPadOS 14.0, iTunes for Windows 12.10.9, iCloud for Windows 11.5, tvOS 14.0. A remote attacker may be able to leak memory.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 sqlite3.

    +

    References

    + + +
    + + + +
    +
    +

    Time-of-check Time-of-use (TOCTOU)

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + shadow/passwd +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and shadow/passwd@1:4.8.1-2ubuntu2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + adduser@3.118ubuntu5 + + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + openssh/openssh-client@1:8.9p1-3 + + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + shadow/login@1:4.8.1-2ubuntu2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream shadow package.

    +

    shadow: TOCTOU (time-of-check time-of-use) race condition when copying and removing directory trees

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 shadow.

    +

    References

    + + +
    + + + +
    +
    +

    Open Redirect

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + python3.10/libpython3.10-stdlib +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-stdlib@3.10.4-0ubuntu2 + + python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/python3@3.10.4-0ubuntu2 + + python3.10@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3.10/libpython3.10@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/python3-dev@3.10.4-0ubuntu2 + + python3.10/python3.10-dev@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3.10/libpython3.10-minimal@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-minimal@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/python3@3.10.4-0ubuntu2 + + python3.10@3.10.4-3ubuntu0.1 + + python3.10/python3.10-minimal@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-minimal@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/python3-dev@3.10.4-0ubuntu2 + + python3.10/python3.10-dev@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3.10/python3.10-minimal@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/python3@3.10.4-0ubuntu2 + + python3-defaults/python3-minimal@3.10.4-0ubuntu2 + + python3.10/python3.10-minimal@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/python3@3.10.4-0ubuntu2 + + python3.10@3.10.4-3ubuntu0.1 + + python3.10/python3.10-minimal@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3.10@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/python3@3.10.4-0ubuntu2 + + python3.10@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/python3-dev@3.10.4-0ubuntu2 + + python3.10/python3.10-dev@3.10.4-3ubuntu0.1 + + python3.10@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3.10/python3.10-dev@3.10.4-3ubuntu0.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/python3-dev@3.10.4-0ubuntu2 + + python3.10/python3.10-dev@3.10.4-3ubuntu0.1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream python3.10 package.

    +

    ** DISPUTED ** Python 3.x through 3.10 has an open redirection vulnerability in lib/http/server.py due to no protection against multiple (/) at the beginning of URI path which may leads to information disclosure. NOTE: this is disputed by a third party because the http.server.html documentation page states "Warning: http.server is not recommended for production. It only implements basic security checks."

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 python3.10.

    +

    References

    + + +
    + + + +
    +
    +

    Uncontrolled Recursion

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + pcre3/libpcre3 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + grep@3.7-1build1 + + pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream pcre3 package.

    +

    In PCRE 8.41, the OP_KETRMAX feature in the match function in pcre_exec.c allows stack exhaustion (uncontrolled recursion) when processing a crafted regular expression.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 pcre3.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + pcre2/libpcre2-8-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + pcre2/libpcre2-8-0@10.39-3build1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream pcre2 package.

    +

    An out-of-bounds read vulnerability was discovered in the PCRE2 library in the get_recurse_data_length() function of the pcre2_jit_compile.c file. This issue affects recursions in JIT-compiled regular expressions caused by duplicate data transfers.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 pcre2.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + pcre2/libpcre2-8-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + pcre2/libpcre2-8-0@10.39-3build1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream pcre2 package.

    +

    An out-of-bounds read vulnerability was discovered in the PCRE2 library in the compile_xclass_matchingpath() function of the pcre2_jit_compile.c file. This involves a unicode property matching issue in JIT-compiled regular expressions. The issue occurs because the character was not fully read in case-less matching within JIT.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 pcre2.

    +

    References

    + + +
    + + + +
    +
    +

    Release of Invalid Pointer or Reference

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + patch +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and patch@2.7.6-7build2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + patch@2.7.6-7build2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + dpkg/dpkg-dev@1.21.1ubuntu2.1 + + patch@2.7.6-7build2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream patch package.

    +

    An Invalid Pointer vulnerability exists in GNU patch 2.7 via the another_hunk function, which causes a Denial of Service.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 patch.

    +

    References

    + + +
    + + + +
    +
    +

    Double Free

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + patch +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and patch@2.7.6-7build2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + patch@2.7.6-7build2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + dpkg/dpkg-dev@1.21.1ubuntu2.1 + + patch@2.7.6-7build2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream patch package.

    +

    A double free exists in the another_hunk function in pch.c in GNU patch through 2.7.6.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 patch.

    +

    References

    + + +
    + + + +
    +
    +

    CVE-2021-41617

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + openssh/openssh-client +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and openssh/openssh-client@1:8.9p1-3 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + openssh/openssh-client@1:8.9p1-3 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream openssh package.

    +

    sshd in OpenSSH 6.2 through 8.x before 8.8, when certain non-default configurations are used, allows privilege escalation because supplemental groups are not initialized as expected. Helper programs for AuthorizedKeysCommand and AuthorizedPrincipalsCommand may run with privileges associated with group memberships of the sshd process, if the configuration specifies running the command as a different user.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 openssh.

    +

    References

    + + +
    + + + +
    +
    +

    Information Exposure

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + openssh/openssh-client +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and openssh/openssh-client@1:8.9p1-3 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + openssh/openssh-client@1:8.9p1-3 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream openssh package.

    +

    The client side in OpenSSH 5.7 through 8.4 has an Observable Discrepancy leading to an information leak in the algorithm negotiation. This allows man-in-the-middle attackers to target initial connection attempts (where no host key for the server has been cached by the client). NOTE: some reports state that 8.5 and 8.6 are also affected.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 openssh.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + ncurses/libncursesw6 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and ncurses/libncursesw6@6.3-2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + ncurses/libncursesw6@6.3-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + procps@2:3.3.17-6ubuntu2 + + ncurses/libncursesw6@6.3-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + gnupg2/gnupg@2.2.27-3ubuntu2.1 + + gnupg2/gpg-agent@2.2.27-3ubuntu2.1 + + pinentry/pinentry-curses@1.1.1-1build2 + + ncurses/libncursesw6@6.3-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + python3.10/libpython3.10-stdlib@3.10.4-3ubuntu0.1 + + ncurses/libncursesw6@6.3-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + ncurses/libtinfo6@6.3-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + ncurses/libncurses6@6.3-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + procps@2:3.3.17-6ubuntu2 + + ncurses/libncurses6@6.3-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + ncurses/ncurses-base@6.3-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + ncurses/ncurses-bin@6.3-2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream ncurses package.

    +

    ncurses 6.3 before patch 20220416 has an out-of-bounds read and segmentation violation in convert_strings in tinfo/read_entry.c in the terminfo library.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 ncurses.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + libjpeg-turbo/libjpeg-turbo8 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and libjpeg-turbo/libjpeg-turbo8@2.1.2-0ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + libjpeg-turbo/libjpeg-turbo8@2.1.2-0ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + glibc/libc-devtools@2.35-0ubuntu3.1 + + libgd2/libgd3@2.3.0-2ubuntu2 + + libjpeg8-empty/libjpeg8@8c-2ubuntu10 + + libjpeg-turbo/libjpeg-turbo8@2.1.2-0ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream libjpeg-turbo package.

    +

    JPEGOPTIM v1.4.7 was discovered to contain a segmentation violation which is caused by a READ memory access at jpegoptim.c.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 libjpeg-turbo.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + libgd2/libgd3 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and libgd2/libgd3@2.3.0-2ubuntu2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + libgd2/libgd3@2.3.0-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + glibc/libc-devtools@2.35-0ubuntu3.1 + + libgd2/libgd3@2.3.0-2ubuntu2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream libgd2 package.

    +

    The GD Graphics Library (aka LibGD) through 2.3.2 has an out-of-bounds read because of the lack of certain gdGetBuf and gdPutBuf return value checks.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 libgd2.

    +

    References

    + + +
    + + + +
    +
    +

    Integer Overflow or Wraparound

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + krb5/libgssapi-krb5-2 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + krb5/libgssapi-krb5-2@1.19.2-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + krb5/libk5crypto3@1.19.2-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + krb5/libkrb5-3@1.19.2-2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + krb5/libkrb5support0@1.19.2-2 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream krb5 package.

    +

    An issue was discovered in MIT Kerberos 5 (aka krb5) through 1.16. There is a variable "dbentry->n_key_data" in kadmin/dbutil/dump.c that can store 16-bit data but unknowingly the developer has assigned a "u4" variable to it, which is for 32-bit data. An attacker can use this vulnerability to affect other artifacts of the database as we know that a Kerberos database dump file contains trusted data.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 krb5.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-Bounds

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + jbigkit/libjbig0 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and jbigkit/libjbig0@2.1-3.1build3 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + jbigkit/libjbig0@2.1-3.1build3 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + glibc/libc-devtools@2.35-0ubuntu3.1 + + libgd2/libgd3@2.3.0-2ubuntu2 + + tiff/libtiff5@4.3.0-6 + + jbigkit/libjbig0@2.1-3.1build3 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream jbigkit package.

    +

    In LibTIFF 4.0.8, there is a memory malloc failure in tif_jbig.c. A crafted TIFF document can lead to an abort resulting in a remote denial of service attack.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 jbigkit.

    +

    References

    + + +
    + + + +
    +
    +

    Integer Overflow or Wraparound

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + gmp/libgmp10 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream gmp package.

    +

    GNU Multiple Precision Arithmetic Library (GMP) through 6.2.1 has an mpz/inp_raw.c integer overflow and resultant buffer overflow via crafted input, leading to a segmentation fault on 32-bit platforms.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 gmp.

    +

    References

    + + +
    + + + +
    +
    +

    Allocation of Resources Without Limits or Throttling

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + glibc/libc6-dev +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and glibc/libc6-dev@2.35-0ubuntu3.1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + glibc/libc6-dev@2.35-0ubuntu3.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + expat/libexpat1-dev@2.4.7-1 + + glibc/libc6-dev@2.35-0ubuntu3.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + glibc/libc6-dev@2.35-0ubuntu3.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + python3-defaults/libpython3-dev@3.10.4-0ubuntu2 + + python3.10/libpython3.10-dev@3.10.4-3ubuntu0.1 + + zlib/zlib1g-dev@1:1.2.11.dfsg-2ubuntu9 + + glibc/libc6-dev@2.35-0ubuntu3.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/g++@4:11.2.0-1ubuntu1 + + gcc-11/g++-11@11.2.0-19ubuntu1 + + gcc-11/libstdc++-11-dev@11.2.0-19ubuntu1 + + glibc/libc6-dev@2.35-0ubuntu3.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + glibc/libc-dev-bin@2.35-0ubuntu3.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + glibc/libc6-dev@2.35-0ubuntu3.1 + + glibc/libc-dev-bin@2.35-0ubuntu3.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + glibc/libc-bin@2.35-0ubuntu3.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + glibc/libc-devtools@2.35-0ubuntu3.1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + meta-common-packages@meta + + glibc/libc6@2.35-0ubuntu3.1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream glibc package.

    +

    sha256crypt and sha512crypt through 0.6 allow attackers to cause a denial of service (CPU consumption) because the algorithm's runtime is proportional to the square of the length of the password.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 glibc.

    +

    References

    + + +
    + + + +
    +
    +

    Improper Input Validation

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + git/git-man +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, git@1:2.34.1-1ubuntu1.4 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git@1:2.34.1-1ubuntu1.4 + + git/git-man@1:2.34.1-1ubuntu1.4 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git@1:2.34.1-1ubuntu1.4 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git-lfs@3.0.2-1 + + git@1:2.34.1-1ubuntu1.4 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream git package.

    +

    GIT version 2.15.1 and earlier contains a Input Validation Error vulnerability in Client that can result in problems including messing up terminal configuration to RCE. This attack appear to be exploitable via The user must interact with a malicious git server, (or have their traffic modified in a MITM attack).

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 git.

    +

    References

    + + +
    + + + +
    +
    +

    CVE-2022-35252

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + curl/libcurl3-gnutls +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.2.12, git@1:2.34.1-1ubuntu1.4 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + git@1:2.34.1-1ubuntu1.4 + + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    This vulnerability has not been analyzed by NVD yet.

    +

    Remediation

    +

    Upgrade Ubuntu:22.04 curl to version 7.81.0-1ubuntu1.4 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Improper Input Validation

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + coreutils +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and coreutils@8.32-4.1ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + coreutils@8.32-4.1ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + fontconfig/fontconfig-config@2.13.1-4.2ubuntu5 + + ucf@3.0043 + + coreutils@8.32-4.1ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream coreutils package.

    +

    chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 coreutils.

    +

    References

    + + +
    + + + +
    +
    +

    Uncontrolled Recursion

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + binutils/binutils-common +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and binutils/binutils-common@2.38-3ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf0@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libctf-nobfd0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf-nobfd0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libctf0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + dpkg/dpkg-dev@1.21.1ubuntu2.1 + + binutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/gcc@4:11.2.0-1ubuntu1 + + gcc-11@11.2.0-19ubuntu1 + + binutils@2.38-3ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream binutils package.

    +

    A flaw was discovered in GNU libiberty within demangle_path() in rust-demangle.c, as distributed in GNU Binutils version 2.36. A crafted symbol can cause stack memory to be exhausted leading to a crash.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 binutils.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + binutils/binutils-common +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and binutils/binutils-common@2.38-3ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf0@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libctf-nobfd0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf-nobfd0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libctf0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + dpkg/dpkg-dev@1.21.1ubuntu2.1 + + binutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/gcc@4:11.2.0-1ubuntu1 + + gcc-11@11.2.0-19ubuntu1 + + binutils@2.38-3ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream binutils package.

    +

    GNU binutils gold gold v1.11-v1.16 (GNU binutils v2.21-v2.31.1) is affected by: Improper Input Validation, Signed/Unsigned Comparison, Out-of-bounds Read. The impact is: Denial of service. The component is: gold/fileread.cc:497, elfcpp/elfcpp_file.h:644. The attack vector is: An ELF file with an invalid e_shoff header field must be opened.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 binutils.

    +

    References

    + + +
    + + + +
    +
    +

    Missing Release of Resource after Effective Lifetime

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + binutils/binutils-common +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and binutils/binutils-common@2.38-3ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf0@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libctf-nobfd0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf-nobfd0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libctf0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + dpkg/dpkg-dev@1.21.1ubuntu2.1 + + binutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/gcc@4:11.2.0-1ubuntu1 + + gcc-11@11.2.0-19ubuntu1 + + binutils@2.38-3ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream binutils package.

    +

    The demangle_template function in cplus-dem.c in GNU libiberty, as distributed in GNU Binutils 2.31.1, has a memory leak via a crafted string, leading to a denial of service (memory consumption), as demonstrated by cxxfilt, a related issue to CVE-2018-12698.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 binutils.

    +

    References

    + + +
    + + + +
    +
    +

    Allocation of Resources Without Limits or Throttling

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + binutils/binutils-common +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.2.12 and binutils/binutils-common@2.38-3ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/binutils-common@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf0@2.38-3ubuntu1 + + binutils/libbinutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libctf-nobfd0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf-nobfd0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/libctf0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + binutils/libctf0@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + binutils/binutils-x86-64-linux-gnu@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + binutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + dpkg/dpkg-dev@1.21.1ubuntu2.1 + + binutils@2.38-3ubuntu1 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.2.12 + + build-essential@12.9ubuntu3 + + gcc-defaults/gcc@4:11.2.0-1ubuntu1 + + gcc-11@11.2.0-19ubuntu1 + + binutils@2.38-3ubuntu1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream binutils package.

    +

    The C++ symbol demangler routine in cplus-dem.c in libiberty, as distributed in GNU Binutils 2.29, allows remote attackers to cause a denial of service (excessive memory allocation and application crash) via a crafted file, as demonstrated by a call from the Binary File Descriptor (BFD) library (aka libbfd).

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 binutils.

    +

    References

    + + +
    + + + +
    +
    +
    +
    + + + diff --git a/docs/snyk/v2.6.0-rc4/haproxy_2.6.2-alpine.html b/docs/snyk/v2.2.12/redis_6.2.7-alpine.html similarity index 70% rename from docs/snyk/v2.6.0-rc4/haproxy_2.6.2-alpine.html rename to docs/snyk/v2.2.12/redis_6.2.7-alpine.html index 93198b20ea6fe..09fdac73a20a0 100644 --- a/docs/snyk/v2.6.0-rc4/haproxy_2.6.2-alpine.html +++ b/docs/snyk/v2.2.12/redis_6.2.7-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,18 +456,18 @@

    Snyk test report

    -

    January 22nd 2023, 12:17:52 am

    +

    September 7th 2022, 7:39:41 pm

    Scanned the following path:
      -
    • haproxy:2.6.2-alpine (apk)
    • +
    • redis:6.2.7-alpine (apk)
    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    +
    1 known vulnerabilities
    +
    2 vulnerable dependency paths
    17 dependencies
    @@ -476,15 +476,104 @@

    Snyk test report

    - - + +
    Project docker-image|haproxy
    Path haproxy:2.6.2-alpine
    Project docker-image|redis
    Path redis:6.2.7-alpine
    Package Manager apk
    - No known vulnerabilities detected. +
    +
    +

    Out-of-bounds Write

    +
    + +
    + critical severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + zlib/zlib +
    • + +
    • Introduced through: + + docker-image|redis@6.2.7-alpine and zlib/zlib@1.2.12-r1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|redis@6.2.7-alpine + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|redis@6.2.7-alpine + + apk-tools/apk-tools@2.12.9-r3 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    Upgrade Alpine:3.16 zlib to version 1.2.12-r2 or higher.

    +

    References

    + + +
    + + + +
    +
    diff --git a/docs/snyk/v2.3.13/argocd-test.html b/docs/snyk/v2.3.13/argocd-test.html deleted file mode 100644 index b1f378aa6e9e7..0000000000000 --- a/docs/snyk/v2.3.13/argocd-test.html +++ /dev/null @@ -1,3314 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:23:14 am

    -
    -
    - Scanned the following paths: -
      -
    • /argo-cd/argoproj/argo-cd/v2 (gomodules)
    • /argo-cd (yarn)
    • -
    -
    - -
    -
    12 known vulnerabilities
    -
    113 vulnerable dependency paths
    -
    1467 dependencies
    -
    -
    -
    -
    - -
    -
    -
    -

    Prototype Poisoning

    -
    - -
    - high severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - qs -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, superagent@3.8.3 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - superagent@3.8.3 - - qs@6.10.1 - - - -
    • -
    • - Introduced through: - argo-cd-ui@1.0.0 - - git-url-parse@11.1.2 - - git-up@4.0.5 - - parse-url@6.0.5 - - parse-path@4.0.3 - - qs@6.10.1 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    qs is a querystring parser that supports nesting and arrays, with a depth limit.

    -

    Affected versions of this package are vulnerable to Prototype Poisoning which allows attackers to cause a Node process to hang, processing an Array object whose prototype has been replaced by one with an excessive length value.

    -

    Note: In many typical Express use cases, an unauthenticated remote attacker can place the attack payload in the query string of the URL that is used to visit the application, such as a[__proto__]=b&a[__proto__]&a[length]=100000000.

    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its intended and legitimate users.

    -

    Unlike other vulnerabilities, DoS attacks usually do not aim at breaching security. Rather, they are focused on making websites and services unavailable to genuine users resulting in downtime.

    -

    One popular Denial of Service vulnerability is DDoS (a Distributed Denial of Service), an attack that attempts to clog network pipes to the system by generating a large volume of traffic from many machines.

    -

    When it comes to open source libraries, DoS vulnerabilities allow attackers to trigger such a crash or crippling of the service by using a flaw either in the application code or from the use of open source libraries.

    -

    Two common types of DoS vulnerabilities:

    -
      -
    • High CPU/Memory Consumption- An attacker sending crafted requests that could cause the system to take a disproportionate amount of time to process. For example, commons-fileupload:commons-fileupload.

      -
    • -
    • Crash - An attacker sending crafted requests that could cause the system to crash. For Example, npm ws package

      -
    • -
    -

    Remediation

    -

    Upgrade qs to version 6.2.4, 6.3.3, 6.4.1, 6.5.3, 6.6.1, 6.7.3, 6.8.3, 6.9.7, 6.10.3 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Regular Expression Denial of Service (ReDoS)

    -
    - -
    - high severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - moment -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, argo-ui@1.0.0 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - argo-ui@1.0.0 - - moment@2.29.1 - - - -
    • -
    • - Introduced through: - argo-cd-ui@1.0.0 - - argo-ui@1.0.0 - - antd@4.18.3 - - moment@2.29.1 - - - -
    • -
    • - Introduced through: - argo-cd-ui@1.0.0 - - argo-ui@1.0.0 - - moment-timezone@0.5.33 - - moment@2.29.1 - - - -
    • -
    • - Introduced through: - argo-cd-ui@1.0.0 - - argo-ui@1.0.0 - - antd@4.18.3 - - rc-picker@2.5.19 - - moment@2.29.1 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    moment is a lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.

    -

    Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the preprocessRFC2822() function in from-string.js, when processing a very long crafted string (over 10k characters).

    -

    PoC:

    -
    moment("(".repeat(500000))
    -        
    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

    -

    The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

    -

    Let’s take the following regular expression as an example:

    -
    regex = /A(B|C+)+D/
    -        
    -

    This regular expression accomplishes the following:

    -
      -
    • A The string must start with the letter 'A'
    • -
    • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
    • -
    • D Finally, we ensure this section of the string ends with a 'D'
    • -
    -

    The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

    -

    It most cases, it doesn't take very long for a regex engine to find a match:

    -
    $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
    -        0.04s user 0.01s system 95% cpu 0.052 total
    -        
    -        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
    -        1.79s user 0.02s system 99% cpu 1.812 total
    -        
    -

    The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

    -

    Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

    -

    Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

    -
      -
    1. CCC
    2. -
    3. CC+C
    4. -
    5. C+CC
    6. -
    7. C+C+C.
    8. -
    -

    The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

    -

    From there, the number of steps the engine must use to validate a string just continues to grow.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    StringNumber of C'sNumber of steps
    ACCCX338
    ACCCCX471
    ACCCCCX5136
    ACCCCCCCCCCCCCCX1465,553
    -

    By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

    -

    Remediation

    -

    Upgrade moment to version 2.29.4 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Server-side Request Forgery (SSRF)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - parse-url -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, git-url-parse@11.1.2 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - git-url-parse@11.1.2 - - git-up@4.0.5 - - parse-url@6.0.5 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    parse-url is an An advanced url parser supporting git urls too.

    -

    Affected versions of this package are vulnerable to Server-side Request Forgery (SSRF) due to improper detection of protocol, resource, and pathname fields. Exploiting this vulnerability results in bypassing protocol verification.

    -

    PoC:

    -
    import parseUrl from "parse-url";
    -        import fetch from 'node-fetch';
    -        var parsed=parseUrl("http://nnnn@localhost:808:/?id=xss")
    -        if(parsed.resource=="localhost"){
    -        console.log("internal network access is blocked")
    -        }
    -        else{
    -           const response = await fetch('http://'+parsed.resource+parsed.pathname);
    -                console.log(response)
    -         }
    -        
    -

    Remediation

    -

    Upgrade parse-url to version 8.1.0 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Improper Input Validation

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - parse-url -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, git-url-parse@11.1.2 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - git-url-parse@11.1.2 - - git-up@4.0.5 - - parse-url@6.0.5 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    parse-url is an An advanced url parser supporting git urls too.

    -

    Affected versions of this package are vulnerable to Improper Input Validation due to incorrect parsing of URLs. This allows the attacker to craft a malformed URL which can lead to a phishing attack.

    -
    
    -        const parseUrl = require("parse-url");
    -        const Url = require("url");
    -        
    -        const express = require('express');
    -        const app = express();
    -        
    -        var url = "https://www.google.com:x@fakesite.com:x";
    -        parsed = parseUrl(url);
    -        console.log("[*]`parse-url` output: ")
    -        console.log(parsed);
    -        
    -        parsed2 = Url.parse(url);
    -        console.log("[*]`url` output: ")
    -        console.log(parsed2)
    -        
    -        app.get('/', (req, res) => {
    -            if (parsed.host == "www.google.com") {
    -                res.send("<a href=\'" + parsed2.href + "\'>CLICK ME!</a>")
    -            }
    -        })
    -        
    -        app.listen(8888,"0.0.0.0");
    -        
    -

    Remediation

    -

    Upgrade parse-url to version 8.1.0 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Information Exposure

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - node-fetch -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, argo-ui@1.0.0 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - argo-ui@1.0.0 - - portable-fetch@3.0.0 - - node-fetch@1.7.3 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    node-fetch is a light-weight module that brings window.fetch to node.js

    -

    Affected versions of this package are vulnerable to Information Exposure when fetching a remote url with Cookie, if it get a Location response header, it will follow that url and try to fetch that url with provided cookie. This can lead to forwarding secure headers to 3th party.

    -

    Remediation

    -

    Upgrade node-fetch to version 2.6.7, 3.1.1 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Denial of Service

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - node-fetch -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, argo-ui@1.0.0 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - argo-ui@1.0.0 - - portable-fetch@3.0.0 - - node-fetch@1.7.3 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    node-fetch is a light-weight module that brings window.fetch to node.js

    -

    Affected versions of this package are vulnerable to Denial of Service. Node Fetch did not honor the size option after following a redirect, which means that when a content size was over the limit, a FetchError would never get thrown and the process would end without failure.

    -

    Remediation

    -

    Upgrade node-fetch to version 2.6.1, 3.0.0-beta.9 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Regular Expression Denial of Service (ReDoS)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - minimatch -
    • - -
    • Introduced through: - - argo-cd-ui@1.0.0 and minimatch@3.0.4 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - minimatch@3.0.4 - - - -
    • -
    • - Introduced through: - argo-cd-ui@1.0.0 - - redoc@2.0.0-rc.64 - - @redocly/openapi-core@1.0.0-beta.82 - - minimatch@3.0.4 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    minimatch is a minimal matching utility.

    -

    Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the braceExpand function in minimatch.js.

    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

    -

    The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

    -

    Let’s take the following regular expression as an example:

    -
    regex = /A(B|C+)+D/
    -        
    -

    This regular expression accomplishes the following:

    -
      -
    • A The string must start with the letter 'A'
    • -
    • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
    • -
    • D Finally, we ensure this section of the string ends with a 'D'
    • -
    -

    The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

    -

    It most cases, it doesn't take very long for a regex engine to find a match:

    -
    $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
    -        0.04s user 0.01s system 95% cpu 0.052 total
    -        
    -        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
    -        1.79s user 0.02s system 99% cpu 1.812 total
    -        
    -

    The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

    -

    Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

    -

    Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

    -
      -
    1. CCC
    2. -
    3. CC+C
    4. -
    5. C+CC
    6. -
    7. C+C+C.
    8. -
    -

    The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

    -

    From there, the number of steps the engine must use to validate a string just continues to grow.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    StringNumber of C'sNumber of steps
    ACCCX338
    ACCCCX471
    ACCCCCX5136
    ACCCCCCCCCCCCCCX1465,553
    -

    By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

    -

    Remediation

    -

    Upgrade minimatch to version 3.0.5 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Denial of Service (DoS)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - golang.org/x/net/http2 -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, k8s.io/client-go/rest@0.23.1 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/improbable-eng/grpc-web/go/grpcweb@#16092bd1d58a - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/soheilhy/cmux@0.1.5 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/dynamic@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/pkg/kubeclientmetrics@#36c59d8fafe0 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/azure@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/gcp@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/oidc@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/listers/core/v1@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers/core/v1@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/clientcmd@0.23.1 - - k8s.io/client-go/tools/auth@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#91deed20b998 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery/fake@0.23.1 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes/fake@0.23.1 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/remotecommand@0.23.1 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware@1.3.0 - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus@1.3.0 - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/improbable-eng/grpc-web/go/grpcweb@#16092bd1d58a - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc/health/grpc_health_v1@1.15.0 - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/auth@1.3.0 - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-prometheus@1.2.0 - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/retry@1.3.0 - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/cache@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#91deed20b998 - - k8s.io/client-go/tools/clientcmd@0.23.1 - - k8s.io/client-go/tools/auth@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/term@0.23.1 - - k8s.io/client-go/tools/remotecommand@0.23.1 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/api/rbac/v1@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/api/core/v1@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/api/errors@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/dynamic@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/pkg/kubeclientmetrics@#36c59d8fafe0 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/azure@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/gcp@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/oidc@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc/health@1.15.0 - - google.golang.org/grpc/health/grpc_health_v1@1.15.0 - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc/reflection@1.15.0 - - google.golang.org/grpc/reflection/grpc_reflection_v1alpha@1.15.0 - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/health@0.6.2 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/common@0.6.2 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/envtest@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/testing/controlplane@0.11.0 - - k8s.io/client-go/tools/clientcmd@0.23.1 - - k8s.io/client-go/tools/auth@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/common@0.6.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/hook@0.6.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/resource@0.6.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/ignore@0.6.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/syncwaves@0.6.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/utils/testing@0.6.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/resource@0.23.1 - - k8s.io/api/core/v1@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/health@0.6.2 - - k8s.io/kubectl/pkg/util/podutils@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/portforward@0.23.1 - - k8s.io/api/core/v1@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery/fake@0.23.1 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes/fake@0.23.1 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/remotecommand@0.23.1 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/tags/logrus@1.3.0 - - github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus@1.3.0 - - github.com/grpc-ecosystem/go-grpc-middleware/tags@1.3.0 - - google.golang.org/grpc@1.15.0 - - google.golang.org/grpc/internal/transport@1.15.0 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/cache@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/runtime/serializer@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/listers/core/v1@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers/core/v1@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#91deed20b998 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/term@0.23.1 - - k8s.io/client-go/tools/remotecommand@0.23.1 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/hook@0.6.2 - - github.com/argoproj/gitops-engine/pkg/sync/hook/helm@0.6.2 - - github.com/argoproj/gitops-engine/pkg/sync/common@0.6.2 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/syncwaves@0.6.2 - - github.com/argoproj/gitops-engine/pkg/sync/hook/helm@0.6.2 - - github.com/argoproj/gitops-engine/pkg/sync/common@0.6.2 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes/scheme@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/clientcmd@0.23.1 - - k8s.io/client-go/tools/clientcmd/api/latest@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/ignore@0.6.2 - - github.com/argoproj/gitops-engine/pkg/sync/hook@0.6.2 - - github.com/argoproj/gitops-engine/pkg/sync/hook/helm@0.6.2 - - github.com/argoproj/gitops-engine/pkg/sync/common@0.6.2 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.6.2 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/diff@0.6.2 - - k8s.io/client-go/kubernetes/scheme@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/envtest@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/webhook/conversion@0.11.0 - - k8s.io/apimachinery/pkg/runtime/serializer@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#91deed20b998 - - k8s.io/client-go/tools/clientcmd@0.23.1 - - k8s.io/client-go/tools/clientcmd/api/latest@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#491a49abca63 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

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

    -

    Affected versions of this package are vulnerable to Denial of Service (DoS) due to improper checks and limitations for the number of entries in the cache, which can allow an attacker to consume unbounded amounts of memory by sending a small number of very large keys.

    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its intended and legitimate users.

    -

    Unlike other vulnerabilities, DoS attacks usually do not aim at breaching security. Rather, they are focused on making websites and services unavailable to genuine users resulting in downtime.

    -

    One popular Denial of Service vulnerability is DDoS (a Distributed Denial of Service), an attack that attempts to clog network pipes to the system by generating a large volume of traffic from many machines.

    -

    When it comes to open source libraries, DoS vulnerabilities allow attackers to trigger such a crash or crippling of the service by using a flaw either in the application code or from the use of open source libraries.

    -

    Two common types of DoS vulnerabilities:

    -
      -
    • High CPU/Memory Consumption- An attacker sending crafted requests that could cause the system to take a disproportionate amount of time to process. For example, commons-fileupload:commons-fileupload.

      -
    • -
    • Crash - An attacker sending crafted requests that could cause the system to crash. For Example, npm ws package

      -
    • -
    -

    Remediation

    -

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

    -

    References

    - - -
    - - - -
    -
    -

    Improper Input Validation

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - go.mongodb.org/mongo-driver/bson/bsonrw -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, github.com/go-openapi/runtime/middleware@0.19.4 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/go-openapi/runtime/middleware@0.19.4 - - github.com/go-openapi/validate@0.19.5 - - github.com/go-openapi/strfmt@0.19.3 - - go.mongodb.org/mongo-driver/bson@1.1.2 - - go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/go-openapi/runtime/middleware@0.19.4 - - github.com/go-openapi/validate@0.19.5 - - github.com/go-openapi/strfmt@0.19.3 - - go.mongodb.org/mongo-driver/bson@1.1.2 - - go.mongodb.org/mongo-driver/bson/bsoncodec@1.1.2 - - go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    go.mongodb.org/mongo-driver/bson/bsonrw is a The MongoDB supported driver for Go.

    -

    Affected versions of this package are vulnerable to Improper Input Validation. Specific cstrings input may not be properly validated in the MongoDB Go Driver when marshalling Go objects into BSON. A malicious user could use a Go object with specific string to potentially inject additional fields into marshalled documents.

    -

    Remediation

    -

    Upgrade go.mongodb.org/mongo-driver/bson/bsonrw to version 1.5.1 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Insecure Randomness

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - github.com/Masterminds/goutils -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 - - github.com/argoproj/notifications-engine/pkg/templates@#91deed20b998 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#91deed20b998 - - github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 - - github.com/argoproj/notifications-engine/pkg/templates@#91deed20b998 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#91deed20b998 - - github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 - - github.com/argoproj/notifications-engine/pkg/templates@#91deed20b998 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    github.com/masterminds/goutils is a provides users with utility functions to manipulate strings in various ways.

    -

    Affected versions of this package are vulnerable to Insecure Randomness via the RandomAlphaNumeric(int) and CryptoRandomAlphaNumeric(int) functions. Small values of int in the functions above will return a smaller subset of results than they should. For example, RandomAlphaNumeric(1) would always return a digit in the 0-9 range, while RandomAlphaNumeric(4) return around ~7 million of the ~13M possible permutations.

    -

    Remediation

    -

    Upgrade github.com/masterminds/goutils to version 1.1.1 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Insecure Randomness

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - github.com/Masterminds/goutils -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 - - github.com/argoproj/notifications-engine/pkg/templates@#91deed20b998 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#91deed20b998 - - github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 - - github.com/argoproj/notifications-engine/pkg/templates@#91deed20b998 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#91deed20b998 - - github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 - - github.com/argoproj/notifications-engine/pkg/templates@#91deed20b998 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    github.com/masterminds/goutils is a provides users with utility functions to manipulate strings in various ways.

    -

    Affected versions of this package are vulnerable to Insecure Randomness when randomly-generated alphanumeric strings contain significantly less entropy than expected, the RandomAlphaNumeric and CryptoRandomAlphaNumeric functions always return strings containing at least one digit from 0 to 9. This significantly reduces the amount of entropy in short strings generated by these functions.

    -

    Remediation

    -

    Upgrade github.com/masterminds/goutils to version 1.1.1 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Regular Expression Denial of Service (ReDoS)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - cookiejar -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, superagent@3.8.3 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - superagent@3.8.3 - - cookiejar@2.1.2 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the Cookie.parse function, which uses an insecure regular expression.

    -

    PoC

    -
    const { CookieJar } = require("cookiejar");
    -        
    -        const jar = new CookieJar();
    -        
    -        const start = performance.now();
    -        const attack = "a" + "t".repeat(50_000);
    -        jar.setCookie(attack);
    -        console.log(`CookieJar.setCookie(): ${performance.now() - start}`);
    -        
    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

    -

    The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

    -

    Let’s take the following regular expression as an example:

    -
    regex = /A(B|C+)+D/
    -        
    -

    This regular expression accomplishes the following:

    -
      -
    • A The string must start with the letter 'A'
    • -
    • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
    • -
    • D Finally, we ensure this section of the string ends with a 'D'
    • -
    -

    The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

    -

    It most cases, it doesn't take very long for a regex engine to find a match:

    -
    $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
    -        0.04s user 0.01s system 95% cpu 0.052 total
    -        
    -        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
    -        1.79s user 0.02s system 99% cpu 1.812 total
    -        
    -

    The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

    -

    Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

    -

    Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

    -
      -
    1. CCC
    2. -
    3. CC+C
    4. -
    5. C+CC
    6. -
    7. C+C+C.
    8. -
    -

    The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

    -

    From there, the number of steps the engine must use to validate a string just continues to grow.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    StringNumber of C'sNumber of steps
    ACCCX338
    ACCCCX471
    ACCCCCX5136
    ACCCCCCCCCCCCCCX1465,553
    -

    By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

    -

    Remediation

    -

    Upgrade cookiejar to version 2.1.4 or higher.

    -

    References

    - - -
    - - - -
    -
    -
    -
    - - - diff --git a/docs/snyk/v2.3.13/ghcr.io_dexidp_dex_v2.35.3.html b/docs/snyk/v2.3.13/ghcr.io_dexidp_dex_v2.35.3.html deleted file mode 100644 index 2793c5a1fffc5..0000000000000 --- a/docs/snyk/v2.3.13/ghcr.io_dexidp_dex_v2.35.3.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:23:18 am

    -
    -
    - Scanned the following path: -
      -
    • ghcr.io/dexidp/dex:v2.35.3/dexidp/dex (apk)
    • -
    -
    - -
    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    -
    14 dependencies
    -
    -
    -
    -
    -
    - - - - - - - -
    Project docker-image|ghcr.io/dexidp/dex
    Path ghcr.io/dexidp/dex:v2.35.3/dexidp/dex
    Package Manager apk
    -
    -
    - No known vulnerabilities detected. -
    -
    - - - diff --git a/docs/snyk/v2.3.13/quay.io_argoproj_argocd_v2.3.13.html b/docs/snyk/v2.3.13/quay.io_argoproj_argocd_v2.3.13.html deleted file mode 100644 index 528814aa093d0..0000000000000 --- a/docs/snyk/v2.3.13/quay.io_argoproj_argocd_v2.3.13.html +++ /dev/null @@ -1,2649 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:23:59 am

    -
    -
    - Scanned the following path: -
      -
    • quay.io/argoproj/argocd:v2.3.13/argoproj/argocd (deb)
    • -
    -
    - -
    -
    16 known vulnerabilities
    -
    102 vulnerable dependency paths
    -
    162 dependencies
    -
    -
    -
    -
    -
    - - - - - - - -
    Project docker-image|quay.io/argoproj/argocd
    Path quay.io/argoproj/argocd:v2.3.13/argoproj/argocd
    Package Manager deb
    Manifest Dockerfile
    -
    -
    -
    -
    -

    Off-by-one Error

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - systemd/libsystemd0 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and systemd/libsystemd0@249.11-0ubuntu3.6 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - apt@2.4.8 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - procps/libprocps8@2:3.3.17-6ubuntu2 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - util-linux@2.37.2-4ubuntu3 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - util-linux/bsdutils@1:2.37.2-4ubuntu3 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - apt@2.4.8 - - apt/libapt-pkg6.0@2.4.8 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - systemd/libudev1@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - libfido2/libfido2-1@1.10.0-1 - - systemd/libudev1@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - util-linux@2.37.2-4ubuntu3 - - systemd/libudev1@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - apt@2.4.8 - - apt/libapt-pkg6.0@2.4.8 - - systemd/libudev1@249.11-0ubuntu3.6 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream systemd package.

    -

    An off-by-one Error issue was discovered in Systemd in format_timespan() function of time-util.c. An attacker could supply specific values for time and accuracy that leads to buffer overrun in format_timespan(), leading to a Denial of Service.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 systemd.

    -

    References

    - - -
    - - - -
    -
    -

    Integer Overflow or Wraparound

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - krb5/libk5crypto3 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and krb5/libk5crypto3@1.19.2-2 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - meta-common-packages@meta - - krb5/libkrb5support0@1.19.2-2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream krb5 package.

    -

    PAC parsing in MIT Kerberos 5 (aka krb5) before 1.19.4 and 1.20.x before 1.20.1 has integer overflows that may lead to remote code execution (in KDC, kadmind, or a GSS or Kerberos application server) on 32-bit platforms (which have a resultant heap-based buffer overflow), and cause a denial of service on other platforms. This occurs in krb5_pac_parse in lib/krb5/krb/pac.c. Heimdal before 7.7.1 has "a similar bug."

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 krb5.

    -

    References

    - - -
    - - - -
    -
    -

    CVE-2022-46908

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - sqlite3/libsqlite3-0 -
    • - -
    • Introduced through: - - - docker-image|quay.io/argoproj/argocd@v2.3.13, gnupg2/gpg@2.2.27-3ubuntu2.1 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - sqlite3/libsqlite3-0@3.37.2-2ubuntu0.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream sqlite3 package.

    -

    SQLite through 3.40.0, when relying on --safe for execution of an untrusted CLI script, does not properly implement the azProhibitedFunctions protection mechanism, and instead allows UDF functions such as WRITEFILE.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 sqlite3.

    -

    References

    - - -
    - - - -
    -
    -

    Uncontrolled Recursion

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - pcre3/libpcre3 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - grep@3.7-1build1 - - pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream pcre3 package.

    -

    In PCRE 8.41, the OP_KETRMAX feature in the match function in pcre_exec.c allows stack exhaustion (uncontrolled recursion) when processing a crafted regular expression.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 pcre3.

    -

    References

    - - -
    - - - -
    -
    -

    Release of Invalid Pointer or Reference

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - patch -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and patch@2.7.6-7build2 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - patch@2.7.6-7build2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream patch package.

    -

    An Invalid Pointer vulnerability exists in GNU patch 2.7 via the another_hunk function, which causes a Denial of Service.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 patch.

    -

    References

    - - -
    - - - -
    -
    -

    Double Free

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - patch -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and patch@2.7.6-7build2 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - patch@2.7.6-7build2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream patch package.

    -

    A double free exists in the another_hunk function in pch.c in GNU patch through 2.7.6.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 patch.

    -

    References

    - - -
    - - - -
    -
    -

    Improper Locking

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - openssl/libssl3 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and openssl/libssl3@3.0.2-0ubuntu1.7 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - cyrus-sasl2/libsasl2-modules@2.1.27+dfsg2-3ubuntu1.1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - libfido2/libfido2-1@1.10.0-1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - ca-certificates@20211016ubuntu0.22.04.1 - - openssl@3.0.2-0ubuntu1.7 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - openssl@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - ca-certificates@20211016ubuntu0.22.04.1 - - openssl@3.0.2-0ubuntu1.7 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream openssl package.

    -

    If an X.509 certificate contains a malformed policy constraint and policy processing is enabled, then a write lock will be taken twice recursively. On some operating systems (most widely: Windows) this results in a denial of service when the affected process hangs. Policy processing being enabled on a publicly facing server is not considered to be a common setup. Policy processing is enabled by passing the -policy&#39; argument to the command line utilities or by calling either X509_VERIFY_PARAM_add0_policy()' or `X509_VERIFY_PARAM_set1_policies()' functions.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 openssl.

    -

    References

    - - -
    - - - -
    -
    -

    CVE-2021-41617

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - openssh/openssh-client -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and openssh/openssh-client@1:8.9p1-3ubuntu0.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream openssh package.

    -

    sshd in OpenSSH 6.2 through 8.x before 8.8, when certain non-default configurations are used, allows privilege escalation because supplemental groups are not initialized as expected. Helper programs for AuthorizedKeysCommand and AuthorizedPrincipalsCommand may run with privileges associated with group memberships of the sshd process, if the configuration specifies running the command as a different user.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 openssh.

    -

    References

    - - -
    - - - -
    -
    -

    Information Exposure

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - openssh/openssh-client -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and openssh/openssh-client@1:8.9p1-3ubuntu0.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream openssh package.

    -

    The client side in OpenSSH 5.7 through 8.4 has an Observable Discrepancy leading to an information leak in the algorithm negotiation. This allows man-in-the-middle attackers to target initial connection attempts (where no host key for the server has been cached by the client). NOTE: some reports state that 8.5 and 8.6 are also affected.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 openssh.

    -

    References

    - - -
    - - - -
    -
    -

    Out-of-bounds Read

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - ncurses/libtinfo6 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and ncurses/libtinfo6@6.3-2 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - bash@5.1-6ubuntu1 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - ncurses/libncursesw6@6.3-2 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - less@590-1build1 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - libedit/libedit2@3.1-20210910-1build1 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - ncurses/libncurses6@6.3-2 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - ncurses/ncurses-bin@6.3-2 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - procps@2:3.3.17-6ubuntu2 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - util-linux@2.37.2-4ubuntu3 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - readline/libreadline8@8.1.2-1 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - pinentry/pinentry-curses@1.1.1-1build2 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - ncurses/libncursesw6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - procps@2:3.3.17-6ubuntu2 - - ncurses/libncursesw6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - pinentry/pinentry-curses@1.1.1-1build2 - - ncurses/libncursesw6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - ncurses/libncurses6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - procps@2:3.3.17-6ubuntu2 - - ncurses/libncurses6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - ncurses/ncurses-base@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - ncurses/ncurses-bin@6.3-2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream ncurses package.

    -

    ncurses 6.3 before patch 20220416 has an out-of-bounds read and segmentation violation in convert_strings in tinfo/read_entry.c in the terminfo library.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 ncurses.

    -

    References

    - - -
    - - - -
    -
    -

    Integer Overflow or Wraparound

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - krb5/libk5crypto3 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and krb5/libk5crypto3@1.19.2-2 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - meta-common-packages@meta - - krb5/libkrb5support0@1.19.2-2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream krb5 package.

    -

    An issue was discovered in MIT Kerberos 5 (aka krb5) through 1.16. There is a variable "dbentry->n_key_data" in kadmin/dbutil/dump.c that can store 16-bit data but unknowingly the developer has assigned a "u4" variable to it, which is for 32-bit data. An attacker can use this vulnerability to affect other artifacts of the database as we know that a Kerberos database dump file contains trusted data.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 krb5.

    -

    References

    - - -
    - - - -
    -
    -

    CVE-2022-3219

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - gnupg2/gpgv -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and gnupg2/gpgv@2.2.27-3ubuntu2.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - apt@2.4.8 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg-l10n@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gnupg-l10n@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg-utils@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gnupg-utils@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    This vulnerability has not been analyzed by NVD yet.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 gnupg2.

    -

    References

    - - -
    - - - -
    -
    -

    Allocation of Resources Without Limits or Throttling

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - glibc/libc-bin -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and glibc/libc-bin@2.35-0ubuntu3.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - glibc/libc-bin@2.35-0ubuntu3.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - meta-common-packages@meta - - glibc/libc6@2.35-0ubuntu3.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream glibc package.

    -

    sha256crypt and sha512crypt through 0.6 allow attackers to cause a denial of service (CPU consumption) because the algorithm's runtime is proportional to the square of the length of the password.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 glibc.

    -

    References

    - - -
    - - - -
    -
    -

    Improper Input Validation

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - git/git-man -
    • - -
    • Introduced through: - - - docker-image|quay.io/argoproj/argocd@v2.3.13, git@1:2.34.1-1ubuntu1.6 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - git@1:2.34.1-1ubuntu1.6 - - git/git-man@1:2.34.1-1ubuntu1.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - git@1:2.34.1-1ubuntu1.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - git-lfs@3.0.2-1 - - git@1:2.34.1-1ubuntu1.6 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream git package.

    -

    GIT version 2.15.1 and earlier contains a Input Validation Error vulnerability in Client that can result in problems including messing up terminal configuration to RCE. This attack appear to be exploitable via The user must interact with a malicious git server, (or have their traffic modified in a MITM attack).

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 git.

    -

    References

    - - -
    - - - -
    -
    -

    Improper Input Validation

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - coreutils -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and coreutils@8.32-4.1ubuntu1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - coreutils@8.32-4.1ubuntu1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream coreutils package.

    -

    chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 coreutils.

    -

    References

    - - -
    - - - -
    -
    -

    Out-of-bounds Write

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - bash -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.3.13 and bash@5.1-6ubuntu1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.3.13 - - bash@5.1-6ubuntu1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream bash package.

    -

    A flaw was found in the bash package, where a heap-buffer overflow can occur in valid parameter_transform. This issue may lead to memory problems.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 bash.

    -

    References

    - - -
    - - - -
    -
    -
    -
    - - - diff --git a/docs/snyk/v2.3.13/argocd-iac-install.html b/docs/snyk/v2.3.7/argocd-iac-install.html similarity index 99% rename from docs/snyk/v2.3.13/argocd-iac-install.html rename to docs/snyk/v2.3.7/argocd-iac-install.html index 91bfb11773e3b..a5907ee97e88e 100644 --- a/docs/snyk/v2.3.13/argocd-iac-install.html +++ b/docs/snyk/v2.3.7/argocd-iac-install.html @@ -456,12 +456,12 @@

    Snyk test report

    -

    January 22nd 2023, 12:24:51 am

    +

    September 7th 2022, 7:38:25 pm

    Scanned the following path:
      -
    • /argo-cd/manifests/install.yaml (Kubernetes)
    • +
    • /private/argo-cd/manifests/install.yaml (Kubernetes)
    @@ -476,7 +476,7 @@

    Snyk test report

    - +
    Project manifests/install.yaml
    Path /argo-cd/manifests/install.yaml
    Path /private/argo-cd/manifests/install.yaml
    Project Type Kubernetes
    @@ -1296,6 +1296,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 9] + role + rules[0] resources @@ -1303,7 +1305,7 @@

    Role with dangerous permissions

  • - Line number: 9184 + Line number: 9172
  • @@ -1342,6 +1344,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 10] + role + rules[3] resources @@ -1349,7 +1353,7 @@

    Role with dangerous permissions

  • - Line number: 9256 + Line number: 9211
  • @@ -1388,6 +1392,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 11] + role + rules[0] resources @@ -1395,7 +1401,7 @@

    Role with dangerous permissions

  • - Line number: 9284 + Line number: 9272
  • @@ -1434,14 +1440,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 12] - rules[3] + role + + rules[1] resources
  • - Line number: 9328 + Line number: 9291
  • @@ -1480,14 +1488,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 12] - rules[1] + role + + rules[3] resources
  • - Line number: 9310 + Line number: 9291
  • @@ -1526,6 +1536,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 13] + role + rules[0] resources @@ -1533,7 +1545,7 @@

    Role with dangerous permissions

  • - Line number: 9344 + Line number: 9332
  • diff --git a/docs/snyk/v2.3.13/argocd-iac-namespace-install.html b/docs/snyk/v2.3.7/argocd-iac-namespace-install.html similarity index 99% rename from docs/snyk/v2.3.13/argocd-iac-namespace-install.html rename to docs/snyk/v2.3.7/argocd-iac-namespace-install.html index b67dcb0a6e068..0a56b6ab78c98 100644 --- a/docs/snyk/v2.3.13/argocd-iac-namespace-install.html +++ b/docs/snyk/v2.3.7/argocd-iac-namespace-install.html @@ -456,12 +456,12 @@

    Snyk test report

    -

    January 22nd 2023, 12:25:20 am

    +

    September 7th 2022, 7:38:52 pm

    Scanned the following path:
      -
    • /argo-cd/manifests/namespace-install.yaml (Kubernetes)
    • +
    • /private/argo-cd/manifests/namespace-install.yaml (Kubernetes)
    @@ -476,7 +476,7 @@

    Snyk test report

    - +
    Project manifests/namespace-install.yaml
    Path /argo-cd/manifests/namespace-install.yaml
    Path /private/argo-cd/manifests/namespace-install.yaml
    Project Type Kubernetes
    @@ -1296,6 +1296,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 7] + role + rules[0] resources @@ -1303,7 +1305,7 @@

    Role with dangerous permissions

  • - Line number: 6565 + Line number: 6553
  • @@ -1342,6 +1344,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 8] + role + rules[3] resources @@ -1349,7 +1353,7 @@

    Role with dangerous permissions

  • - Line number: 6637 + Line number: 6592
  • @@ -1388,6 +1392,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 9] + role + rules[0] resources @@ -1395,7 +1401,7 @@

    Role with dangerous permissions

  • - Line number: 6665 + Line number: 6653
  • @@ -1434,14 +1440,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 10] - rules[3] + role + + rules[1] resources
  • - Line number: 6709 + Line number: 6672
  • @@ -1480,14 +1488,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 10] - rules[1] + role + + rules[3] resources
  • - Line number: 6691 + Line number: 6672
  • @@ -1526,6 +1536,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 11] + role + rules[0] resources @@ -1533,7 +1545,7 @@

    Role with dangerous permissions

  • - Line number: 6725 + Line number: 6713
  • diff --git a/docs/snyk/v2.3.7/argocd-test.html b/docs/snyk/v2.3.7/argocd-test.html new file mode 100644 index 0000000000000..d8dd417ebf199 --- /dev/null +++ b/docs/snyk/v2.3.7/argocd-test.html @@ -0,0 +1,1101 @@ + + + + + + + + + Snyk test report + + + + + + + + + +
    +
    +
    +
    + + + Snyk - Open Source Security + + + + + + + +
    +

    Snyk test report

    + +

    September 7th 2022, 7:37:07 pm

    +
    +
    + Scanned the following paths: +
      +
    • /private/argo-cd/argoproj/argo-cd/v2 (gomodules)
    • /private/argo-cd (yarn)
    • +
    +
    + +
    +
    6 known vulnerabilities
    +
    12 vulnerable dependency paths
    +
    1467 dependencies
    +
    +
    +
    +
    + +
    +
    +
    +

    Regular Expression Denial of Service (ReDoS)

    +
    + +
    + high severity +
    + +
    + +
      +
    • + Package Manager: npm +
    • +
    • + Vulnerable module: + + moment +
    • + +
    • Introduced through: + + + argo-cd-ui@1.0.0, argo-ui@1.0.0 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + argo-cd-ui@1.0.0 + + argo-ui@1.0.0 + + moment@2.29.1 + + + +
    • +
    • + Introduced through: + argo-cd-ui@1.0.0 + + argo-ui@1.0.0 + + antd@4.18.3 + + moment@2.29.1 + + + +
    • +
    • + Introduced through: + argo-cd-ui@1.0.0 + + argo-ui@1.0.0 + + moment-timezone@0.5.33 + + moment@2.29.1 + + + +
    • +
    • + Introduced through: + argo-cd-ui@1.0.0 + + argo-ui@1.0.0 + + antd@4.18.3 + + rc-picker@2.5.19 + + moment@2.29.1 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    moment is a lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.

    +

    Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the preprocessRFC2822() function in from-string.js, when processing a very long crafted string (over 10k characters).

    +

    PoC:

    +
    moment("(".repeat(500000))
    +        
    +

    Details

    +

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

    +

    The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

    +

    Let’s take the following regular expression as an example:

    +
    regex = /A(B|C+)+D/
    +        
    +

    This regular expression accomplishes the following:

    +
      +
    • A The string must start with the letter 'A'
    • +
    • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
    • +
    • D Finally, we ensure this section of the string ends with a 'D'
    • +
    +

    The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

    +

    It most cases, it doesn't take very long for a regex engine to find a match:

    +
    $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
    +        0.04s user 0.01s system 95% cpu 0.052 total
    +        
    +        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
    +        1.79s user 0.02s system 99% cpu 1.812 total
    +        
    +

    The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

    +

    Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

    +

    Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

    +
      +
    1. CCC
    2. +
    3. CC+C
    4. +
    5. C+CC
    6. +
    7. C+C+C.
    8. +
    +

    The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

    +

    From there, the number of steps the engine must use to validate a string just continues to grow.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    StringNumber of C'sNumber of steps
    ACCCX338
    ACCCCX471
    ACCCCCX5136
    ACCCCCCCCCCCCCCX1465,553
    +

    By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

    +

    Remediation

    +

    Upgrade moment to version 2.29.4 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Information Exposure

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: npm +
    • +
    • + Vulnerable module: + + node-fetch +
    • + +
    • Introduced through: + + + argo-cd-ui@1.0.0, argo-ui@1.0.0 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + argo-cd-ui@1.0.0 + + argo-ui@1.0.0 + + portable-fetch@3.0.0 + + node-fetch@1.7.3 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    node-fetch is a light-weight module that brings window.fetch to node.js

    +

    Affected versions of this package are vulnerable to Information Exposure when fetching a remote url with Cookie, if it get a Location response header, it will follow that url and try to fetch that url with provided cookie. This can lead to forwarding secure headers to 3th party.

    +

    Remediation

    +

    Upgrade node-fetch to version 2.6.7, 3.1.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Denial of Service

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: npm +
    • +
    • + Vulnerable module: + + node-fetch +
    • + +
    • Introduced through: + + + argo-cd-ui@1.0.0, argo-ui@1.0.0 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + argo-cd-ui@1.0.0 + + argo-ui@1.0.0 + + portable-fetch@3.0.0 + + node-fetch@1.7.3 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    node-fetch is a light-weight module that brings window.fetch to node.js

    +

    Affected versions of this package are vulnerable to Denial of Service. Node Fetch did not honor the size option after following a redirect, which means that when a content size was over the limit, a FetchError would never get thrown and the process would end without failure.

    +

    Remediation

    +

    Upgrade node-fetch to version 2.6.1, 3.0.0-beta.9 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Improper Input Validation

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + go.mongodb.org/mongo-driver/bson/bsonrw +
    • + +
    • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, github.com/go-openapi/runtime/middleware@0.19.4 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/go-openapi/runtime/middleware@0.19.4 + + github.com/go-openapi/validate@0.19.5 + + github.com/go-openapi/strfmt@0.19.3 + + go.mongodb.org/mongo-driver/bson@1.1.2 + + go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/go-openapi/runtime/middleware@0.19.4 + + github.com/go-openapi/validate@0.19.5 + + github.com/go-openapi/strfmt@0.19.3 + + go.mongodb.org/mongo-driver/bson@1.1.2 + + go.mongodb.org/mongo-driver/bson/bsoncodec@1.1.2 + + go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    go.mongodb.org/mongo-driver/bson/bsonrw is a The MongoDB supported driver for Go.

    +

    Affected versions of this package are vulnerable to Improper Input Validation. Specific cstrings input may not be properly validated in the MongoDB Go Driver when marshalling Go objects into BSON. A malicious user could use a Go object with specific string to potentially inject additional fields into marshalled documents.

    +

    Remediation

    +

    Upgrade go.mongodb.org/mongo-driver/bson/bsonrw to version 1.5.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Denial of Service (DoS)

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + github.com/prometheus/client_golang/prometheus/promhttp +
    • + +
    • Introduced through: + + github.com/argoproj/argo-cd/v2@0.0.0 and github.com/prometheus/client_golang/prometheus/promhttp@1.11.0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/prometheus/client_golang/prometheus/promhttp@1.11.0 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    Affected versions of this package are vulnerable to Denial of Service (DoS) when handling requests with non-standard HTTP methods.

    +

    Note: In order to be affected, an instrumented software must:

    +
      +
    1. use promhttp.InstrumentHandler* middleware except RequestsInFlight

      +
    2. +
    3. not filter any specific methods (e.g GET) before middleware

      +
    4. +
    5. pass metric with method label name to the middleware

      +
    6. +
    7. not have any firewall/LB/proxy that filters away requests with unknown method.

      +
    8. +
    +

    Workarounds:

    +
      +
    1. removing the method label name from counter/gauge used in the InstrumentHandler

      +
    2. +
    3. turning off affected promhttp handlers

      +
    4. +
    5. adding custom middleware before promhttp handler that will sanitize the request method given by Go http.Request

      +
    6. +
    7. using a reverse proxy or web application firewall, configured to only allow a limited set of methods.

      +
    8. +
    +

    Details

    +

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its intended and legitimate users.

    +

    Unlike other vulnerabilities, DoS attacks usually do not aim at breaching security. Rather, they are focused on making websites and services unavailable to genuine users resulting in downtime.

    +

    One popular Denial of Service vulnerability is DDoS (a Distributed Denial of Service), an attack that attempts to clog network pipes to the system by generating a large volume of traffic from many machines.

    +

    When it comes to open source libraries, DoS vulnerabilities allow attackers to trigger such a crash or crippling of the service by using a flaw either in the application code or from the use of open source libraries.

    +

    Two common types of DoS vulnerabilities:

    +
      +
    • High CPU/Memory Consumption- An attacker sending crafted requests that could cause the system to take a disproportionate amount of time to process. For example, commons-fileupload:commons-fileupload.

      +
    • +
    • Crash - An attacker sending crafted requests that could cause the system to crash. For Example, npm ws package

      +
    • +
    +

    Remediation

    +

    Upgrade github.com/prometheus/client_golang/prometheus/promhttp to version 1.11.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Insecure Randomness

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + github.com/Masterminds/goutils +
    • + +
    • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 + + github.com/argoproj/notifications-engine/pkg/templates@#91deed20b998 + + github.com/Masterminds/sprig@2.22.0 + + github.com/Masterminds/goutils@1.1.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/argoproj/notifications-engine/pkg/cmd@#91deed20b998 + + github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 + + github.com/argoproj/notifications-engine/pkg/templates@#91deed20b998 + + github.com/Masterminds/sprig@2.22.0 + + github.com/Masterminds/goutils@1.1.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/argoproj/notifications-engine/pkg/controller@#91deed20b998 + + github.com/argoproj/notifications-engine/pkg/api@#91deed20b998 + + github.com/argoproj/notifications-engine/pkg/templates@#91deed20b998 + + github.com/Masterminds/sprig@2.22.0 + + github.com/Masterminds/goutils@1.1.0 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    github.com/masterminds/goutils is a provides users with utility functions to manipulate strings in various ways.

    +

    Affected versions of this package are vulnerable to Insecure Randomness via the RandomAlphaNumeric(int) and CryptoRandomAlphaNumeric(int) functions. Small values of int in the functions above will return a smaller subset of results than they should. For example, RandomAlphaNumeric(1) would always return a digit in the 0-9 range, while RandomAlphaNumeric(4) return around ~7 million of the ~13M possible permutations.

    +

    Remediation

    +

    Upgrade github.com/masterminds/goutils to version 1.1.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +
    +
    + + + diff --git a/docs/snyk/v2.3.7/ghcr.io_dexidp_dex_v2.32.0.html b/docs/snyk/v2.3.7/ghcr.io_dexidp_dex_v2.32.0.html new file mode 100644 index 0000000000000..219bd4c04e271 --- /dev/null +++ b/docs/snyk/v2.3.7/ghcr.io_dexidp_dex_v2.32.0.html @@ -0,0 +1,805 @@ + + + + + + + + + Snyk test report + + + + + + + + + +
    +
    +
    +
    + + + Snyk - Open Source Security + + + + + + + +
    +

    Snyk test report

    + +

    September 7th 2022, 7:37:12 pm

    +
    +
    + Scanned the following path: +
      +
    • ghcr.io/dexidp/dex:v2.32.0/dexidp/dex (apk)
    • +
    +
    + +
    +
    3 known vulnerabilities
    +
    12 vulnerable dependency paths
    +
    14 dependencies
    +
    +
    +
    +
    +
    + + + + + + + +
    Project docker-image|ghcr.io/dexidp/dex
    Path ghcr.io/dexidp/dex:v2.32.0/dexidp/dex
    Package Manager apk
    +
    +
    +
    +
    +

    Out-of-bounds Write

    +
    + +
    + critical severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + zlib/zlib +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.32.0 and zlib/zlib@1.2.12-r1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + apk-tools/apk-tools@2.12.9-r3 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    Upgrade Alpine:3.16 zlib to version 1.2.12-r2 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + high severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.32.0 and busybox/busybox@1.35.0-r13 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/busybox@1.35.0-r13 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + alpine-baselayout/alpine-baselayout-data@3.2.0-r20 + + alpine-baselayout/alpine-baselayout@3.2.0-r20 + + busybox/busybox@1.35.0-r13 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/ssl_client@1.35.0-r13 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream busybox package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    A use-after-free in Busybox 1.35-x's awk applet leads to denial of service and possibly code execution when processing a crafted awk pattern in the copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.16 busybox to version 1.35.0-r15 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Inadequate Encryption Strength

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + openssl/libcrypto1.1 +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.32.0 and openssl/libcrypto1.1@1.1.1o-r0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + openssl/libssl1.1@1.1.1o-r0 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + apk-tools/apk-tools@2.12.9-r3 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/ssl_client@1.35.0-r13 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + openssl/libssl1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + apk-tools/apk-tools@2.12.9-r3 + + openssl/libssl1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/ssl_client@1.35.0-r13 + + openssl/libssl1.1@1.1.1o-r0 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream openssl package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    AES OCB mode for 32-bit x86 platforms using the AES-NI assembly optimised implementation will not encrypt the entirety of the data under some circumstances. This could reveal sixteen bytes of data that was preexisting in the memory that wasn't written. In the special case of "in place" encryption, sixteen bytes of the plaintext would be revealed. Since OpenSSL does not support OCB based cipher suites for TLS and DTLS, they are both unaffected. Fixed in OpenSSL 3.0.5 (Affected 3.0.0-3.0.4). Fixed in OpenSSL 1.1.1q (Affected 1.1.1-1.1.1p).

    +

    Remediation

    +

    Upgrade Alpine:3.16 openssl to version 1.1.1q-r0 or higher.

    +

    References

    + + +
    + + + +
    +
    +
    +
    + + + diff --git a/docs/snyk/v2.3.13/haproxy_2.0.29-alpine.html b/docs/snyk/v2.3.7/haproxy_2.0.29-alpine.html similarity index 69% rename from docs/snyk/v2.3.13/haproxy_2.0.29-alpine.html rename to docs/snyk/v2.3.7/haproxy_2.0.29-alpine.html index dd8eef8394b4b..4f7b31f9c8871 100644 --- a/docs/snyk/v2.3.13/haproxy_2.0.29-alpine.html +++ b/docs/snyk/v2.3.7/haproxy_2.0.29-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,7 +456,7 @@

    Snyk test report

    -

    January 22nd 2023, 12:23:21 am

    +

    September 7th 2022, 7:37:16 pm

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

    Snyk test report

    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    +
    1 known vulnerabilities
    +
    3 vulnerable dependency paths
    17 dependencies
    @@ -484,7 +484,107 @@

    Snyk test report

    - No known vulnerabilities detected. +
    +
    +

    Out-of-bounds Write

    +
    + +
    + critical severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + zlib/zlib +
    • + +
    • Introduced through: + + docker-image|haproxy@2.0.29-alpine and zlib/zlib@1.2.12-r1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.0.29-alpine + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.0.29-alpine + + .haproxy-rundeps@20220718.230945 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.0.29-alpine + + apk-tools/apk-tools@2.12.9-r3 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    Upgrade Alpine:3.16 zlib to version 1.2.12-r2 or higher.

    +

    References

    + + +
    + + + +
    +
    diff --git a/docs/snyk/v2.3.13/quay.io_argoproj_argocd-applicationset_v0.4.1.html b/docs/snyk/v2.3.7/quay.io_argoproj_argocd-applicationset_v0.4.1.html similarity index 97% rename from docs/snyk/v2.3.13/quay.io_argoproj_argocd-applicationset_v0.4.1.html rename to docs/snyk/v2.3.7/quay.io_argoproj_argocd-applicationset_v0.4.1.html index c2fd5b45a92ef..96421aae5da8f 100644 --- a/docs/snyk/v2.3.13/quay.io_argoproj_argocd-applicationset_v0.4.1.html +++ b/docs/snyk/v2.3.7/quay.io_argoproj_argocd-applicationset_v0.4.1.html @@ -456,7 +456,7 @@

    Snyk test report

    -

    January 22nd 2023, 12:23:34 am

    +

    September 7th 2022, 7:37:26 pm

    Scanned the following path: @@ -673,7 +673,6 @@

    References

  • MISC
  • CONFIRM
  • N/A
  • -
  • GENTOO

  • @@ -752,7 +751,6 @@

    References

  • MISC
  • MISC
  • CONFIRM
  • -
  • GENTOO

  • @@ -830,7 +828,6 @@

    References

  • MLIST
  • MISC
  • CONFIRM
  • -
  • GENTOO

  • @@ -938,7 +935,6 @@

    References

  • FEDORA
  • FEDORA
  • N/A
  • -
  • CONFIRM

  • @@ -1033,9 +1029,6 @@

    References

  • CONFIRM
  • FEDORA
  • FEDORA
  • -
  • MLIST
  • -
  • GENTOO
  • -
  • CONFIRM

  • @@ -1046,7 +1039,7 @@

    References

    -

    Improper Input Validation

    +

    CVE-2022-1271

    @@ -1111,8 +1104,6 @@

    References

  • MISC
  • MISC
  • MISC
  • -
  • GENTOO
  • -
  • CONFIRM

  • @@ -1358,10 +1349,6 @@

    References

  • MISC
  • MISC
  • MISC
  • -
  • MLIST
  • -
  • FULLDISC
  • -
  • MISC
  • -
  • CONFIRM

  • @@ -1606,10 +1593,6 @@

    References

  • MISC
  • MISC
  • MISC
  • -
  • MLIST
  • -
  • FULLDISC
  • -
  • MISC
  • -
  • CONFIRM

  • @@ -1992,7 +1975,6 @@

    References

  • CONFIRM
  • N/A
  • CONFIRM
  • -
  • GENTOO

  • @@ -2171,7 +2153,6 @@

    References

  • FEDORA
  • CONFIRM
  • FEDORA
  • -
  • CONFIRM

  • @@ -2349,8 +2330,6 @@

    References

  • FEDORA
  • CONFIRM
  • FEDORA
  • -
  • GENTOO
  • -
  • CONFIRM

  • @@ -2669,7 +2648,6 @@

    References

  • MISC
  • MLIST
  • N/A
  • -
  • MISC

  • @@ -2680,7 +2658,7 @@

    References

    -

    Improper Input Validation

    +

    CVE-2022-1271

    @@ -2743,8 +2721,6 @@

    References

  • MISC
  • MISC
  • MISC
  • -
  • GENTOO
  • -
  • CONFIRM

  • @@ -3208,8 +3184,6 @@

    References

  • MISC
  • MISC
  • MISC
  • -
  • MLIST
  • -
  • CONFIRM

  • @@ -3220,7 +3194,7 @@

    References

    -

    Out-of-bounds Read

    +

    Unchecked Return Value

    @@ -3294,7 +3268,6 @@

    References

  • MISC
  • MISC
  • MISC
  • -
  • CONFIRM

  • @@ -3394,7 +3367,6 @@

    References

  • FULLDISC
  • FEDORA
  • FEDORA
  • -
  • MLIST

  • @@ -3489,9 +3461,6 @@

    References

  • MLIST
  • FEDORA
  • FEDORA
  • -
  • CONFIRM
  • -
  • FULLDISC
  • -
  • MLIST

  • @@ -3567,7 +3536,6 @@

    References

  • CONFIRM
  • DEBIAN
  • CONFIRM
  • -
  • GENTOO

  • @@ -3641,7 +3609,6 @@

    References

  • CONFIRM
  • DEBIAN
  • CONFIRM
  • -
  • GENTOO

  • @@ -3715,7 +3682,6 @@

    References

  • CONFIRM
  • DEBIAN
  • CONFIRM
  • -
  • GENTOO

  • @@ -3789,7 +3755,6 @@

    References

  • CONFIRM
  • DEBIAN
  • CONFIRM
  • -
  • GENTOO

  • @@ -3863,7 +3828,6 @@

    References

  • CONFIRM
  • DEBIAN
  • CONFIRM
  • -
  • GENTOO

  • @@ -3937,7 +3901,6 @@

    References

  • CONFIRM
  • DEBIAN
  • CONFIRM
  • -
  • GENTOO

  • @@ -4011,7 +3974,6 @@

    References

  • CONFIRM
  • DEBIAN
  • CONFIRM
  • -
  • GENTOO

  • @@ -4087,7 +4049,6 @@

    References

  • MLIST
  • MISC
  • CONFIRM
  • -
  • GENTOO

  • @@ -4163,7 +4124,6 @@

    References

  • DEBIAN
  • MISC
  • CONFIRM
  • -
  • GENTOO

  • @@ -4241,7 +4201,6 @@

    References

  • MLIST
  • MISC
  • CONFIRM
  • -
  • GENTOO

  • @@ -4318,7 +4277,6 @@

    References

  • CONFIRM
  • MISC
  • CONFIRM
  • -
  • GENTOO

  • @@ -4396,7 +4354,6 @@

    References

  • MLIST
  • MISC
  • CONFIRM
  • -
  • GENTOO

  • @@ -4675,7 +4632,6 @@

    References

  • MISC
  • MISC
  • MISC
  • -
  • CONFIRM

  • @@ -4748,7 +4704,6 @@

    References

  • CONFIRM
  • DEBIAN
  • MLIST
  • -
  • GENTOO

  • @@ -4820,7 +4775,6 @@

    References

  • MISC
  • CONFIRM
  • DEBIAN
  • -
  • GENTOO

  • @@ -4893,7 +4847,6 @@

    References

  • CONFIRM
  • DEBIAN
  • MLIST
  • -
  • GENTOO

  • @@ -4966,11 +4919,6 @@

    References

  • FEDORA
  • DEBIAN
  • MLIST
  • -
  • CONFIRM
  • -
  • CONFIRM
  • -
  • FULLDISC
  • -
  • FULLDISC
  • -
  • GENTOO

  • @@ -5042,11 +4990,6 @@

    References

  • MISC
  • FEDORA
  • DEBIAN
  • -
  • CONFIRM
  • -
  • CONFIRM
  • -
  • FULLDISC
  • -
  • FULLDISC
  • -
  • GENTOO

  • @@ -5119,12 +5062,6 @@

    References

  • FEDORA
  • DEBIAN
  • MLIST
  • -
  • CONFIRM
  • -
  • CONFIRM
  • -
  • FULLDISC
  • -
  • FULLDISC
  • -
  • CONFIRM
  • -
  • GENTOO

  • @@ -5196,12 +5133,6 @@

    References

  • MISC
  • FEDORA
  • DEBIAN
  • -
  • CONFIRM
  • -
  • CONFIRM
  • -
  • FULLDISC
  • -
  • FULLDISC
  • -
  • CONFIRM
  • -
  • GENTOO

  • @@ -5346,15 +5277,6 @@

    References

  • ADVISORY
  • MISC
  • N/A
  • -
  • CONFIRM
  • -
  • CONFIRM
  • -
  • CONFIRM
  • -
  • CONFIRM
  • -
  • FULLDISC
  • -
  • FULLDISC
  • -
  • FULLDISC
  • -
  • FULLDISC
  • -
  • FULLDISC

  • @@ -5613,12 +5535,11 @@

    Remediation

    There is no fixed version for Ubuntu:21.10 shadow.

    References


    @@ -5779,12 +5700,12 @@

    Remediation

    There is no fixed version for Ubuntu:21.10 pcre3.

    References


    @@ -5858,7 +5779,6 @@

    References

  • FEDORA
  • FEDORA
  • FEDORA
  • -
  • CONFIRM

  • @@ -5933,7 +5853,6 @@

    References

  • FEDORA
  • FEDORA
  • FEDORA
  • -
  • CONFIRM

  • @@ -5998,13 +5917,13 @@

    Remediation

    There is no fixed version for Ubuntu:21.10 patch.

    References


    @@ -6146,7 +6065,6 @@

    References

  • MISC
  • MISC
  • N/A
  • -
  • MISC

  • @@ -6480,9 +6398,6 @@

    References

  • ADVISORY
  • MISC
  • MISC
  • -
  • CONFIRM
  • -
  • MLIST
  • -
  • FULLDISC

  • @@ -7169,9 +7084,6 @@

    References

  • MISC
  • MISC
  • MLIST
  • -
  • MLIST
  • -
  • FULLDISC
  • -
  • CONFIRM

  • @@ -7252,7 +7164,6 @@

    References

  • MISC
  • N/A
  • GENTOO
  • -
  • MLIST

  • @@ -7333,7 +7244,6 @@

    References

  • MISC
  • N/A
  • GENTOO
  • -
  • MLIST

  • @@ -7499,9 +7409,9 @@

    Remediation

    There is no fixed version for Ubuntu:21.10 git.

    References


    @@ -7578,7 +7488,6 @@

    References

  • CONFIRM
  • DEBIAN
  • CONFIRM
  • -
  • GENTOO

  • @@ -7650,7 +7559,6 @@

    References

  • MISC
  • CONFIRM
  • DEBIAN
  • -
  • GENTOO

  • @@ -7723,9 +7631,6 @@

    References

  • CONFIRM
  • DEBIAN
  • MLIST
  • -
  • FEDORA
  • -
  • FEDORA
  • -
  • GENTOO

  • @@ -7798,7 +7703,6 @@

    References

  • CONFIRM
  • DEBIAN
  • MLIST
  • -
  • GENTOO

  • @@ -7863,11 +7767,11 @@

    Remediation

    There is no fixed version for Ubuntu:21.10 coreutils.

    References


    diff --git a/docs/snyk/v2.5.7/quay.io_argoproj_argocd_v2.5.7.html b/docs/snyk/v2.3.7/quay.io_argoproj_argocd_v2.3.7.html similarity index 72% rename from docs/snyk/v2.5.7/quay.io_argoproj_argocd_v2.5.7.html rename to docs/snyk/v2.3.7/quay.io_argoproj_argocd_v2.3.7.html index 8633b3405fe50..85c54d1a50343 100644 --- a/docs/snyk/v2.5.7/quay.io_argoproj_argocd_v2.5.7.html +++ b/docs/snyk/v2.3.7/quay.io_argoproj_argocd_v2.3.7.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,18 +456,18 @@

    Snyk test report

    -

    January 22nd 2023, 12:20:22 am

    +

    September 7th 2022, 7:37:42 pm

    Scanned the following path:
      -
    • quay.io/argoproj/argocd:v2.5.7/argoproj/argocd (deb)
    • +
    • quay.io/argoproj/argocd:v2.3.7/argoproj/argocd (deb)
    -
    16 known vulnerabilities
    -
    102 vulnerable dependency paths
    +
    22 known vulnerabilities
    +
    69 vulnerable dependency paths
    162 dependencies
    @@ -477,7 +477,7 @@

    Snyk test report

    - + @@ -486,7 +486,7 @@

    Snyk test report

    -

    Off-by-one Error

    +

    Out-of-bounds Write

    @@ -502,13 +502,13 @@

    Off-by-one Error

  • Vulnerable module: - systemd/libsystemd0 + zlib/zlib1g
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and systemd/libsystemd0@249.11-0ubuntu3.6 + docker-image|quay.io/argoproj/argocd@v2.3.7, meta-common-packages@meta and others
  • @@ -520,110 +520,90 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - apt@2.4.8 + meta-common-packages@meta - systemd/libsystemd0@249.11-0ubuntu3.6 + zlib/zlib1g@1:1.2.11.dfsg-2ubuntu9
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - procps/libprocps8@2:3.3.17-6ubuntu2 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
    - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - util-linux@2.37.2-4ubuntu3 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
  • - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - util-linux/bsdutils@1:2.37.2-4ubuntu3 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 zlib.

    +

    References

    + -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - apt@2.4.8 - - apt/libapt-pkg6.0@2.4.8 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
    -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - systemd/libudev1@249.11-0ubuntu3.6 - - + -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - libfido2/libfido2-1@1.10.0-1 - - systemd/libudev1@249.11-0ubuntu3.6 - - +
  • +
    +

    Out-of-bounds Read

    +
    - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - util-linux@2.37.2-4ubuntu3 - - systemd/libudev1@249.11-0ubuntu3.6 - - +
    + medium severity +
    -
  • +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + sqlite3/libsqlite3-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.3.7, gnupg2/gpg@2.2.27-3ubuntu2.1 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - apt@2.4.8 + docker-image|quay.io/argoproj/argocd@v2.3.7 - apt/libapt-pkg6.0@2.4.8 + gnupg2/gpg@2.2.27-3ubuntu2.1 - systemd/libudev1@249.11-0ubuntu3.6 + sqlite3/libsqlite3-0@3.37.2-2 @@ -635,29 +615,33 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream systemd package.

      -

      An off-by-one Error issue was discovered in Systemd in format_timespan() function of time-util.c. An attacker could supply specific values for time and accuracy that leads to buffer overrun in format_timespan(), leading to a Denial of Service.

      +

      Note: Versions mentioned in the description apply to the upstream sqlite3 package.

      +

      An out-of-bounds read was addressed with improved bounds checking. This issue is fixed in iOS 13.5 and iPadOS 13.5, macOS Catalina 10.15.5, tvOS 13.4.5, watchOS 6.2.5, iTunes 12.10.7 for Windows, iCloud for Windows 11.2, iCloud for Windows 7.19. A malicious application may cause a denial of service or potentially disclose memory contents.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 systemd.

      +

      There is no fixed version for Ubuntu:22.04 sqlite3.

      References


    -

    Integer Overflow or Wraparound

    +

    Improper Verification of Cryptographic Signature

    @@ -673,13 +657,13 @@

    Integer Overflow or Wraparound

  • Vulnerable module: - krb5/libk5crypto3 + perl/perl-modules-5.34
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and krb5/libk5crypto3@1.19.2-2 + docker-image|quay.io/argoproj/argocd@v2.3.7, git@1:2.34.1-1ubuntu1.4 and others
  • @@ -691,161 +675,198 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - krb5/libk5crypto3@1.19.2-2 + git@1:2.34.1-1ubuntu1.4 + + perl@5.34.0-3ubuntu1 + + perl/perl-modules-5.34@5.34.0-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 + git@1:2.34.1-1ubuntu1.4 - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 + perl@5.34.0-3ubuntu1 - krb5/libgssapi-krb5-2@1.19.2-2 + perl/libperl5.34@5.34.0-3ubuntu1 - krb5/libk5crypto3@1.19.2-2 + perl/perl-modules-5.34@5.34.0-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 - krb5/libgssapi-krb5-2@1.19.2-2 + git@1:2.34.1-1ubuntu1.4 - krb5/libkrb5-3@1.19.2-2 + perl@5.34.0-3ubuntu1 - krb5/libk5crypto3@1.19.2-2 + perl/libperl5.34@5.34.0-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - krb5/libkrb5-3@1.19.2-2 + git@1:2.34.1-1ubuntu1.4 + + perl@5.34.0-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 - krb5/libgssapi-krb5-2@1.19.2-2 + meta-common-packages@meta - krb5/libkrb5-3@1.19.2-2 + perl/perl-base@5.34.0-3ubuntu1
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream perl package.

    +

    CPAN 2.28 allows Signature Verification Bypass.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 perl.

    +

    References

    + + +
    + + + +
    +
    +

    Double Free

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + gnutls28/libgnutls30 +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.3.7 and gnutls28/libgnutls30@3.7.3-4ubuntu1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - krb5/libgssapi-krb5-2@1.19.2-2 + gnutls28/libgnutls30@3.7.3-4ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - openssh/openssh-client@1:8.9p1-3ubuntu0.1 + apt@2.4.6 - krb5/libgssapi-krb5-2@1.19.2-2 + gnutls28/libgnutls30@3.7.3-4ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - git@1:2.34.1-1ubuntu1.6 + docker-image|quay.io/argoproj/argocd@v2.3.7 - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 + gnupg2/dirmngr@2.2.27-3ubuntu2.1 - krb5/libgssapi-krb5-2@1.19.2-2 + gnutls28/libgnutls30@3.7.3-4ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 - krb5/libgssapi-krb5-2@1.19.2-2 + gnutls28/libgnutls30@3.7.3-4ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 - pam/libpam-modules@1.4.0-11ubuntu2 + git@1:2.34.1-1ubuntu1.4 - libnsl/libnsl2@1.3.0-2build2 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 + openldap/libldap-2.5-0@2.5.12+dfsg-0ubuntu0.22.04.1 - krb5/libgssapi-krb5-2@1.19.2-2 + gnutls28/libgnutls30@3.7.3-4ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - meta-common-packages@meta + git@1:2.34.1-1ubuntu1.4 - krb5/libkrb5support0@1.19.2-2 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 + + rtmpdump/librtmp1@2.4+20151223.gitfa8646d.1-2build4 + + gnutls28/libgnutls30@3.7.3-4ubuntu1 @@ -857,31 +878,30 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream krb5 package.

      -

      PAC parsing in MIT Kerberos 5 (aka krb5) before 1.19.4 and 1.20.x before 1.20.1 has integer overflows that may lead to remote code execution (in KDC, kadmind, or a GSS or Kerberos application server) on 32-bit platforms (which have a resultant heap-based buffer overflow), and cause a denial of service on other platforms. This occurs in krb5_pac_parse in lib/krb5/krb/pac.c. Heimdal before 7.7.1 has "a similar bug."

      +

      Note: Versions mentioned in the description apply to the upstream gnutls28 package. + See How to fix? for Ubuntu:22.04 relevant versions.

      +

      A vulnerability found in gnutls. This security flaw happens because of a double free error occurs during verification of pkcs7 signatures in gnutls_pkcs7_verify function.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 krb5.

      +

      Upgrade Ubuntu:22.04 gnutls28 to version 3.7.3-4ubuntu1.1 or higher.

      References


    -

    CVE-2022-46908

    +

    NULL Pointer Dereference

    @@ -897,13 +917,13 @@

    CVE-2022-46908

  • Vulnerable module: - sqlite3/libsqlite3-0 + tar
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7, gnupg2/gpg@2.2.27-3ubuntu2.1 and others + docker-image|quay.io/argoproj/argocd@v2.3.7, meta-common-packages@meta and others
  • @@ -915,11 +935,11 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - gnupg2/gpg@2.2.27-3ubuntu2.1 + meta-common-packages@meta - sqlite3/libsqlite3-0@3.37.2-2ubuntu0.1 + tar@1.34+dfsg-1build3 @@ -931,27 +951,31 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream sqlite3 package.

      -

      SQLite through 3.40.0, when relying on --safe for execution of an untrusted CLI script, does not properly implement the azProhibitedFunctions protection mechanism, and instead allows UDF functions such as WRITEFILE.

      +

      Note: Versions mentioned in the description apply to the upstream tar package.

      +

      pax_decode_header in sparse.c in GNU Tar before 1.32 had a NULL pointer dereference when parsing certain archives that have malformed extended headers.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 sqlite3.

      +

      There is no fixed version for Ubuntu:22.04 tar.

      References


    -

    Uncontrolled Recursion

    +

    CVE-2020-9991

    @@ -967,13 +991,13 @@

    Uncontrolled Recursion

  • Vulnerable module: - pcre3/libpcre3 + sqlite3/libsqlite3-0
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 + docker-image|quay.io/argoproj/argocd@v2.3.7, gnupg2/gpg@2.2.27-3ubuntu2.1 and others
  • @@ -985,20 +1009,11 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - grep@3.7-1build1 + gnupg2/gpg@2.2.27-3ubuntu2.1 - pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 + sqlite3/libsqlite3-0@3.37.2-2 @@ -1010,29 +1025,32 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream pcre3 package.

      -

      In PCRE 8.41, the OP_KETRMAX feature in the match function in pcre_exec.c allows stack exhaustion (uncontrolled recursion) when processing a crafted regular expression.

      +

      Note: Versions mentioned in the description apply to the upstream sqlite3 package.

      +

      This issue was addressed with improved checks. This issue is fixed in macOS Big Sur 11.0.1, watchOS 7.0, iOS 14.0 and iPadOS 14.0, iCloud for Windows 7.21, tvOS 14.0. A remote attacker may be able to cause a denial of service.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 pcre3.

      +

      There is no fixed version for Ubuntu:22.04 sqlite3.

      References


    -

    Release of Invalid Pointer or Reference

    +

    Information Exposure

    @@ -1048,13 +1066,13 @@

    Release of Invalid Pointer or Reference

  • Vulnerable module: - patch + sqlite3/libsqlite3-0
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and patch@2.7.6-7build2 + docker-image|quay.io/argoproj/argocd@v2.3.7, gnupg2/gpg@2.2.27-3ubuntu2.1 and others
  • @@ -1066,9 +1084,11 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - patch@2.7.6-7build2 + gnupg2/gpg@2.2.27-3ubuntu2.1 + + sqlite3/libsqlite3-0@3.37.2-2 @@ -1080,25 +1100,32 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream patch package.

      -

      An Invalid Pointer vulnerability exists in GNU patch 2.7 via the another_hunk function, which causes a Denial of Service.

      +

      Note: Versions mentioned in the description apply to the upstream sqlite3 package.

      +

      An information disclosure issue was addressed with improved state management. This issue is fixed in macOS Big Sur 11.0.1, watchOS 7.0, iOS 14.0 and iPadOS 14.0, iTunes for Windows 12.10.9, iCloud for Windows 11.5, tvOS 14.0. A remote attacker may be able to leak memory.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 patch.

      +

      There is no fixed version for Ubuntu:22.04 sqlite3.

      References


    -

    Double Free

    +

    Time-of-check Time-of-use (TOCTOU)

    @@ -1114,12 +1141,12 @@

    Double Free

  • Vulnerable module: - patch + shadow/passwd
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and patch@2.7.6-7build2 + docker-image|quay.io/argoproj/argocd@v2.3.7 and shadow/passwd@1:4.8.1-2ubuntu2
  • @@ -1132,9 +1159,40 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - patch@2.7.6-7build2 + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.3.7 + + adduser@3.118ubuntu5 + + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.3.7 + + openssh/openssh-client@1:8.9p1-3 + + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.3.7 + + shadow/login@1:4.8.1-2ubuntu2 @@ -1146,30 +1204,28 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream patch package.

      -

      A double free exists in the another_hunk function in pch.c in GNU patch through 2.7.6.

      +

      Note: Versions mentioned in the description apply to the upstream shadow package.

      +

      shadow: TOCTOU (time-of-check time-of-use) race condition when copying and removing directory trees

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 patch.

      +

      There is no fixed version for Ubuntu:22.04 shadow.

      References


    -

    Improper Locking

    +

    Uncontrolled Recursion

    @@ -1185,12 +1241,12 @@

    Improper Locking

  • Vulnerable module: - openssl/libssl3 + pcre3/libpcre3
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and openssl/libssl3@3.0.2-0ubuntu1.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 and pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1
  • @@ -1203,113 +1259,303 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - openssl/libssl3@3.0.2-0ubuntu1.7 + pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - cyrus-sasl2/libsasl2-modules@2.1.27+dfsg2-3ubuntu1.1 + grep@3.7-1build1 - openssl/libssl3@3.0.2-0ubuntu1.7 + pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - libfido2/libfido2-1@1.10.0-1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - +
    - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - +
  • - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - ca-certificates@20211016ubuntu0.22.04.1 - - openssl@3.0.2-0ubuntu1.7 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream pcre3 package.

    +

    In PCRE 8.41, the OP_KETRMAX feature in the match function in pcre_exec.c allows stack exhaustion (uncontrolled recursion) when processing a crafted regular expression.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 pcre3.

    +

    References

    + -
  • +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + pcre2/libpcre2-8-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.3.7, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - git@1:2.34.1-1ubuntu1.6 + docker-image|quay.io/argoproj/argocd@v2.3.7 - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 + meta-common-packages@meta - openssl/libssl3@3.0.2-0ubuntu1.7 + pcre2/libpcre2-8-0@10.39-3build1
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream pcre2 package.

    +

    An out-of-bounds read vulnerability was discovered in the PCRE2 library in the get_recurse_data_length() function of the pcre2_jit_compile.c file. This issue affects recursions in JIT-compiled regular expressions caused by duplicate data transfers.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 pcre2.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + pcre2/libpcre2-8-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.3.7, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 + docker-image|quay.io/argoproj/argocd@v2.3.7 - krb5/libkrb5-3@1.19.2-2 + meta-common-packages@meta - openssl/libssl3@3.0.2-0ubuntu1.7 + pcre2/libpcre2-8-0@10.39-3build1
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream pcre2 package.

    +

    An out-of-bounds read vulnerability was discovered in the PCRE2 library in the compile_xclass_matchingpath() function of the pcre2_jit_compile.c file. This involves a unicode property matching issue in JIT-compiled regular expressions. The issue occurs because the character was not fully read in case-less matching within JIT.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 pcre2.

    +

    References

    + + +
    + + + +
    +
    +

    Release of Invalid Pointer or Reference

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + patch +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.3.7 and patch@2.7.6-7build2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - openssl@3.0.2-0ubuntu1.7 + patch@2.7.6-7build2
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream patch package.

    +

    An Invalid Pointer vulnerability exists in GNU patch 2.7 via the another_hunk function, which causes a Denial of Service.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 patch.

    +

    References

    + + +
    + + + +
    +
    +

    Double Free

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + patch +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.3.7 and patch@2.7.6-7build2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - ca-certificates@20211016ubuntu0.22.04.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 - openssl@3.0.2-0ubuntu1.7 + patch@2.7.6-7build2 @@ -1321,21 +1567,25 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream openssl package.

      -

      If an X.509 certificate contains a malformed policy constraint and policy processing is enabled, then a write lock will be taken twice recursively. On some operating systems (most widely: Windows) this results in a denial of service when the affected process hangs. Policy processing being enabled on a publicly facing server is not considered to be a common setup. Policy processing is enabled by passing the -policy&#39; argument to the command line utilities or by calling either X509_VERIFY_PARAM_add0_policy()' or `X509_VERIFY_PARAM_set1_policies()' functions.

      +

      Note: Versions mentioned in the description apply to the upstream patch package.

      +

      A double free exists in the another_hunk function in pch.c in GNU patch through 2.7.6.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 openssl.

      +

      There is no fixed version for Ubuntu:22.04 patch.

      References


    @@ -1361,7 +1611,7 @@

    CVE-2021-41617

  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and openssh/openssh-client@1:8.9p1-3ubuntu0.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 and openssh/openssh-client@1:8.9p1-3
  • @@ -1374,9 +1624,9 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - openssh/openssh-client@1:8.9p1-3ubuntu0.1 + openssh/openssh-client@1:8.9p1-3 @@ -1405,7 +1655,6 @@

      References

    • MISC
    • MISC
    • N/A
    • -
    • MISC

    @@ -1437,7 +1686,7 @@

    Information Exposure

  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and openssh/openssh-client@1:8.9p1-3ubuntu0.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 and openssh/openssh-client@1:8.9p1-3
  • @@ -1450,9 +1699,9 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - openssh/openssh-client@1:8.9p1-3ubuntu0.1 + openssh/openssh-client@1:8.9p1-3 @@ -1510,7 +1759,7 @@

      Out-of-bounds Read

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and ncurses/libtinfo6@6.3-2 + docker-image|quay.io/argoproj/argocd@v2.3.7 and ncurses/libtinfo6@6.3-2
    @@ -1523,7 +1772,7 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 ncurses/libtinfo6@6.3-2 @@ -1532,7 +1781,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 bash@5.1-6ubuntu1 @@ -1543,7 +1792,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 ncurses/libncursesw6@6.3-2 @@ -1554,7 +1803,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 less@590-1build1 @@ -1565,7 +1814,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 libedit/libedit2@3.1-20210910-1build1 @@ -1576,7 +1825,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 ncurses/libncurses6@6.3-2 @@ -1587,7 +1836,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 ncurses/ncurses-bin@6.3-2 @@ -1598,7 +1847,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 procps@2:3.3.17-6ubuntu2 @@ -1609,7 +1858,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 util-linux@2.37.2-4ubuntu3 @@ -1620,7 +1869,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 gnupg2/gpg@2.2.27-3ubuntu2.1 @@ -1635,7 +1884,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 gnupg2/gnupg@2.2.27-3ubuntu2.1 @@ -1650,7 +1899,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 ncurses/libncursesw6@6.3-2 @@ -1659,7 +1908,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 procps@2:3.3.17-6ubuntu2 @@ -1670,7 +1919,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 gnupg2/gnupg@2.2.27-3ubuntu2.1 @@ -1685,7 +1934,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 ncurses/libncurses6@6.3-2 @@ -1694,7 +1943,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 procps@2:3.3.17-6ubuntu2 @@ -1705,7 +1954,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 ncurses/ncurses-base@6.3-2 @@ -1714,7 +1963,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 ncurses/ncurses-bin@6.3-2 @@ -1737,9 +1986,6 @@

      References

    • ADVISORY
    • MISC
    • MISC
    • -
    • CONFIRM
    • -
    • MLIST
    • -
    • FULLDISC

    @@ -1771,7 +2017,7 @@

    Integer Overflow or Wraparound

  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and krb5/libk5crypto3@1.19.2-2 + docker-image|quay.io/argoproj/argocd@v2.3.7 and krb5/libk5crypto3@1.19.2-2
  • @@ -1784,7 +2030,7 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 krb5/libk5crypto3@1.19.2-2 @@ -1793,11 +2039,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 adduser@3.118ubuntu5 - shadow/passwd@1:4.8.1-2ubuntu2.1 + shadow/passwd@1:4.8.1-2ubuntu2 pam/libpam-modules@1.4.0-11ubuntu2 @@ -1814,11 +2060,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 adduser@3.118ubuntu5 - shadow/passwd@1:4.8.1-2ubuntu2.1 + shadow/passwd@1:4.8.1-2ubuntu2 pam/libpam-modules@1.4.0-11ubuntu2 @@ -1837,7 +2083,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 krb5/libkrb5-3@1.19.2-2 @@ -1846,11 +2092,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 adduser@3.118ubuntu5 - shadow/passwd@1:4.8.1-2ubuntu2.1 + shadow/passwd@1:4.8.1-2ubuntu2 pam/libpam-modules@1.4.0-11ubuntu2 @@ -1867,7 +2113,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 krb5/libgssapi-krb5-2@1.19.2-2 @@ -1876,9 +2122,9 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - openssh/openssh-client@1:8.9p1-3ubuntu0.1 + openssh/openssh-client@1:8.9p1-3 krb5/libgssapi-krb5-2@1.19.2-2 @@ -1887,11 +2133,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 krb5/libgssapi-krb5-2@1.19.2-2 @@ -1900,11 +2146,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 libssh/libssh-4@0.9.6-2build1 @@ -1915,11 +2161,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 adduser@3.118ubuntu5 - shadow/passwd@1:4.8.1-2ubuntu2.1 + shadow/passwd@1:4.8.1-2ubuntu2 pam/libpam-modules@1.4.0-11ubuntu2 @@ -1934,7 +2180,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 meta-common-packages@meta @@ -1971,7 +2217,7 @@

      References

    -

    CVE-2022-3219

    +

    Integer Overflow or Wraparound

    @@ -1987,12 +2233,12 @@

    CVE-2022-3219

  • Vulnerable module: - gnupg2/gpgv + gmp/libgmp10
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and gnupg2/gpgv@2.2.27-3ubuntu2.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 and gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1
  • @@ -2005,313 +2251,63 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - apt@2.4.8 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg-l10n@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gnupg-l10n@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg-utils@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gnupg-utils@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 + coreutils@8.32-4.1ubuntu1 - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 + apt@2.4.6 - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + gnutls28/libgnutls30@3.7.3-4ubuntu1 - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + apt@2.4.6 - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + gnutls28/libgnutls30@3.7.3-4ubuntu1 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + nettle/libhogweed6@3.7.3-1build2 - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + git@1:2.34.1-1ubuntu1.4 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + rtmpdump/librtmp1@2.4+20151223.gitfa8646d.1-2build4 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 @@ -2323,18 +2319,23 @@

      Detailed paths


      NVD Description

      -

      This vulnerability has not been analyzed by NVD yet.

      +

      Note: Versions mentioned in the description apply to the upstream gmp package.

      +

      GNU Multiple Precision Arithmetic Library (GMP) through 6.2.1 has an mpz/inp_raw.c integer overflow and resultant buffer overflow via crafted input, leading to a segmentation fault on 32-bit platforms.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 gnupg2.

      +

      There is no fixed version for Ubuntu:22.04 gmp.

      References


    @@ -2360,7 +2361,7 @@

    Allocation of Resources Without Limits or Throttling

    Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and glibc/libc-bin@2.35-0ubuntu3.1 + docker-image|quay.io/argoproj/argocd@v2.3.7 and glibc/libc-bin@2.35-0ubuntu3.1 @@ -2373,7 +2374,7 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 glibc/libc-bin@2.35-0ubuntu3.1 @@ -2382,7 +2383,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 meta-common-packages@meta @@ -2440,7 +2441,7 @@

      Improper Input Validation

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7, git@1:2.34.1-1ubuntu1.6 and others + docker-image|quay.io/argoproj/argocd@v2.3.7, git@1:2.34.1-1ubuntu1.4 and others
    @@ -2452,31 +2453,31 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 - git/git-man@1:2.34.1-1ubuntu1.6 + git/git-man@1:2.34.1-1ubuntu1.4
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 git-lfs@3.0.2-1 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 @@ -2494,9 +2495,9 @@

      Remediation

      There is no fixed version for Ubuntu:22.04 git.

      References


      @@ -2507,7 +2508,7 @@

      References

    -

    Improper Input Validation

    +

    CVE-2022-35252

    @@ -2523,13 +2524,13 @@

    Improper Input Validation

  • Vulnerable module: - coreutils + curl/libcurl3-gnutls
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and coreutils@8.32-4.1ubuntu1 + docker-image|quay.io/argoproj/argocd@v2.3.7, git@1:2.34.1-1ubuntu1.4 and others
  • @@ -2541,9 +2542,11 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - coreutils@8.32-4.1ubuntu1 + git@1:2.34.1-1ubuntu1.4 + + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 @@ -2555,28 +2558,23 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream coreutils package.

      -

      chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.

      +

      This vulnerability has not been analyzed by NVD yet.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 coreutils.

      +

      Upgrade Ubuntu:22.04 curl to version 7.81.0-1ubuntu1.4 or higher.

      References


    -

    Out-of-bounds Write

    +

    Improper Input Validation

    @@ -2592,12 +2590,12 @@

    Out-of-bounds Write

  • Vulnerable module: - bash + coreutils
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 and bash@5.1-6ubuntu1 + docker-image|quay.io/argoproj/argocd@v2.3.7 and coreutils@8.32-4.1ubuntu1
  • @@ -2610,9 +2608,9 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.5.7 + docker-image|quay.io/argoproj/argocd@v2.3.7 - bash@5.1-6ubuntu1 + coreutils@8.32-4.1ubuntu1 @@ -2624,20 +2622,23 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream bash package.

      -

      A flaw was found in the bash package, where a heap-buffer overflow can occur in valid parameter_transform. This issue may lead to memory problems.

      +

      Note: Versions mentioned in the description apply to the upstream coreutils package.

      +

      chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 bash.

      +

      There is no fixed version for Ubuntu:22.04 coreutils.

      References


    diff --git a/docs/snyk/v2.5.7/haproxy_2.6.2-alpine.html b/docs/snyk/v2.3.7/redis_6.2.7-alpine.html similarity index 70% rename from docs/snyk/v2.5.7/haproxy_2.6.2-alpine.html rename to docs/snyk/v2.3.7/redis_6.2.7-alpine.html index d05e999b1ab85..07776faa8557c 100644 --- a/docs/snyk/v2.5.7/haproxy_2.6.2-alpine.html +++ b/docs/snyk/v2.3.7/redis_6.2.7-alpine.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,18 +456,18 @@

    Snyk test report

    -

    January 22nd 2023, 12:20:05 am

    +

    September 7th 2022, 7:37:46 pm

    Scanned the following path:
      -
    • haproxy:2.6.2-alpine (apk)
    • +
    • redis:6.2.7-alpine (apk)
    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    +
    1 known vulnerabilities
    +
    2 vulnerable dependency paths
    17 dependencies
    @@ -476,15 +476,104 @@

    Snyk test report

    Project docker-image|quay.io/argoproj/argocd
    Path quay.io/argoproj/argocd:v2.5.7/argoproj/argocd
    Path quay.io/argoproj/argocd:v2.3.7/argoproj/argocd
    Package Manager deb
    Manifest Dockerfile
    - - + +
    Project docker-image|haproxy
    Path haproxy:2.6.2-alpine
    Project docker-image|redis
    Path redis:6.2.7-alpine
    Package Manager apk
    - No known vulnerabilities detected. +
    +
    +

    Out-of-bounds Write

    +
    + +
    + critical severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + zlib/zlib +
    • + +
    • Introduced through: + + docker-image|redis@6.2.7-alpine and zlib/zlib@1.2.12-r1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|redis@6.2.7-alpine + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|redis@6.2.7-alpine + + apk-tools/apk-tools@2.12.9-r3 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    Upgrade Alpine:3.16 zlib to version 1.2.12-r2 or higher.

    +

    References

    + + +
    + + + +
    +
    diff --git a/docs/snyk/v2.6.0-rc4/argocd-iac-install.html b/docs/snyk/v2.4.11/argocd-iac-install.html similarity index 97% rename from docs/snyk/v2.6.0-rc4/argocd-iac-install.html rename to docs/snyk/v2.4.11/argocd-iac-install.html index c40c5f73ed37f..11036e8d2b552 100644 --- a/docs/snyk/v2.6.0-rc4/argocd-iac-install.html +++ b/docs/snyk/v2.4.11/argocd-iac-install.html @@ -456,12 +456,12 @@

    Snyk test report

    -

    January 22nd 2023, 12:19:28 am

    +

    September 7th 2022, 7:36:46 pm

    Scanned the following path:
      -
    • /argo-cd/manifests/install.yaml (Kubernetes)
    • +
    • /private/argo-cd/manifests/install.yaml (Kubernetes)
    @@ -476,7 +476,7 @@

    Snyk test report

    - +
    Project manifests/install.yaml
    Path /argo-cd/manifests/install.yaml
    Path /private/argo-cd/manifests/install.yaml
    Project Type Kubernetes
    @@ -500,6 +500,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 10] + role + rules[0] resources @@ -507,7 +509,7 @@

    Role with dangerous permissions

  • - Line number: 15177 + Line number: 9052
  • @@ -546,6 +548,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 11] + role + rules[4] resources @@ -553,7 +557,7 @@

    Role with dangerous permissions

  • - Line number: 15254 + Line number: 9091
  • @@ -592,6 +596,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 12] + role + rules[0] resources @@ -599,7 +605,7 @@

    Role with dangerous permissions

  • - Line number: 15282 + Line number: 9157
  • @@ -638,14 +644,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 13] - rules[3] + role + + rules[1] resources
  • - Line number: 15326 + Line number: 9176
  • @@ -684,14 +692,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 13] - rules[1] + role + + rules[3] resources
  • - Line number: 15308 + Line number: 9176
  • @@ -730,6 +740,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 14] + role + rules[0] resources @@ -737,7 +749,7 @@

    Role with dangerous permissions

  • - Line number: 15342 + Line number: 9217
  • @@ -789,7 +801,7 @@

    Container could be running with outdated image

  • - Line number: 16346 + Line number: 10101
  • @@ -847,7 +859,7 @@

    Container has no CPU limit

  • - Line number: 15809 + Line number: 9687
  • @@ -905,7 +917,7 @@

    Container has no CPU limit

  • - Line number: 15982 + Line number: 9787
  • @@ -963,7 +975,7 @@

    Container has no CPU limit

  • - Line number: 15948 + Line number: 9764
  • @@ -1021,7 +1033,7 @@

    Container has no CPU limit

  • - Line number: 16038 + Line number: 9830
  • @@ -1079,7 +1091,7 @@

    Container has no CPU limit

  • - Line number: 16112 + Line number: 9902
  • @@ -1137,7 +1149,7 @@

    Container has no CPU limit

  • - Line number: 16346 + Line number: 10101
  • @@ -1195,7 +1207,7 @@

    Container has no CPU limit

  • - Line number: 16168 + Line number: 9956
  • @@ -1253,7 +1265,7 @@

    Container has no CPU limit

  • - Line number: 16431 + Line number: 10184
  • @@ -1311,7 +1323,7 @@

    Container has no CPU limit

  • - Line number: 16735 + Line number: 10444
  • @@ -1363,7 +1375,7 @@

    Container is running with multiple open ports

  • - Line number: 15962 + Line number: 9771
  • @@ -1419,7 +1431,7 @@

    Container is running with writable root filesystem

  • - Line number: 16122 + Line number: 9912
  • @@ -1471,7 +1483,7 @@

    Container is running without liveness probe

  • - Line number: 15809 + Line number: 9687
  • @@ -1523,7 +1535,7 @@

    Container is running without liveness probe

  • - Line number: 15948 + Line number: 9764
  • @@ -1575,7 +1587,7 @@

    Container is running without liveness probe

  • - Line number: 15982 + Line number: 9787
  • @@ -1627,7 +1639,7 @@

    Container is running without liveness probe

  • - Line number: 16112 + Line number: 9902
  • @@ -1679,7 +1691,7 @@

    Container is running without liveness probe

  • - Line number: 16346 + Line number: 10101
  • @@ -1737,7 +1749,7 @@

    Container is running without memory limit

  • - Line number: 15809 + Line number: 9687
  • @@ -1795,7 +1807,7 @@

    Container is running without memory limit

  • - Line number: 15948 + Line number: 9764
  • @@ -1853,7 +1865,7 @@

    Container is running without memory limit

  • - Line number: 15982 + Line number: 9787
  • @@ -1911,7 +1923,7 @@

    Container is running without memory limit

  • - Line number: 16038 + Line number: 9830
  • @@ -1969,7 +1981,7 @@

    Container is running without memory limit

  • - Line number: 16112 + Line number: 9902
  • @@ -2027,7 +2039,7 @@

    Container is running without memory limit

  • - Line number: 16346 + Line number: 10101
  • @@ -2085,7 +2097,7 @@

    Container is running without memory limit

  • - Line number: 16168 + Line number: 9956
  • @@ -2143,7 +2155,7 @@

    Container is running without memory limit

  • - Line number: 16431 + Line number: 10184
  • @@ -2201,7 +2213,7 @@

    Container is running without memory limit

  • - Line number: 16735 + Line number: 10444
  • diff --git a/docs/snyk/v2.4.19/argocd-iac-namespace-install.html b/docs/snyk/v2.4.11/argocd-iac-namespace-install.html similarity index 98% rename from docs/snyk/v2.4.19/argocd-iac-namespace-install.html rename to docs/snyk/v2.4.11/argocd-iac-namespace-install.html index 389075c733ec2..cb5e9039ec0af 100644 --- a/docs/snyk/v2.4.19/argocd-iac-namespace-install.html +++ b/docs/snyk/v2.4.11/argocd-iac-namespace-install.html @@ -456,12 +456,12 @@

    Snyk test report

    -

    January 22nd 2023, 12:23:01 am

    +

    September 7th 2022, 7:36:55 pm

    Scanned the following path:
      -
    • /argo-cd/manifests/namespace-install.yaml (Kubernetes)
    • +
    • /private/argo-cd/manifests/namespace-install.yaml (Kubernetes)
    @@ -476,7 +476,7 @@

    Snyk test report

    - +
    Project manifests/namespace-install.yaml
    Path /argo-cd/manifests/namespace-install.yaml
    Path /private/argo-cd/manifests/namespace-install.yaml
    Project Type Kubernetes
    @@ -500,6 +500,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 7] + role + rules[0] resources @@ -507,7 +509,7 @@

    Role with dangerous permissions

  • - Line number: 73 + Line number: 61
  • @@ -546,6 +548,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 8] + role + rules[4] resources @@ -553,7 +557,7 @@

    Role with dangerous permissions

  • - Line number: 150 + Line number: 100
  • @@ -592,6 +596,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 9] + role + rules[0] resources @@ -599,7 +605,7 @@

    Role with dangerous permissions

  • - Line number: 178 + Line number: 166
  • @@ -638,14 +644,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 10] - rules[3] + role + + rules[1] resources
  • - Line number: 222 + Line number: 185
  • @@ -684,14 +692,16 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 10] - rules[1] + role + + rules[3] resources
  • - Line number: 204 + Line number: 185
  • @@ -730,6 +740,8 @@

    Role with dangerous permissions

  • Introduced through: [DocId: 11] + role + rules[0] resources @@ -737,7 +749,7 @@

    Role with dangerous permissions

  • - Line number: 238 + Line number: 226
  • diff --git a/docs/snyk/v2.4.11/argocd-test.html b/docs/snyk/v2.4.11/argocd-test.html new file mode 100644 index 0000000000000..1d495ede54f7f --- /dev/null +++ b/docs/snyk/v2.4.11/argocd-test.html @@ -0,0 +1,815 @@ + + + + + + + + + Snyk test report + + + + + + + + + +
    +
    +
    +
    + + + Snyk - Open Source Security + + + + + + + +
    +

    Snyk test report

    + +

    September 7th 2022, 7:35:40 pm

    +
    +
    + Scanned the following paths: +
      +
    • /private/argo-cd/argoproj/argo-cd/v2 (gomodules)
    • /private/argo-cd (yarn)
    • +
    +
    + +
    +
    3 known vulnerabilities
    +
    8 vulnerable dependency paths
    +
    1648 dependencies
    +
    +
    +
    +
    + +
    +
    +
    +

    Improper Input Validation

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + go.mongodb.org/mongo-driver/bson/bsonrw +
    • + +
    • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, github.com/go-openapi/runtime/middleware@0.19.4 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/go-openapi/runtime/middleware@0.19.4 + + github.com/go-openapi/validate@0.19.5 + + github.com/go-openapi/strfmt@0.19.3 + + go.mongodb.org/mongo-driver/bson@1.1.2 + + go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/go-openapi/runtime/middleware@0.19.4 + + github.com/go-openapi/validate@0.19.5 + + github.com/go-openapi/strfmt@0.19.3 + + go.mongodb.org/mongo-driver/bson@1.1.2 + + go.mongodb.org/mongo-driver/bson/bsoncodec@1.1.2 + + go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    go.mongodb.org/mongo-driver/bson/bsonrw is a The MongoDB supported driver for Go.

    +

    Affected versions of this package are vulnerable to Improper Input Validation. Specific cstrings input may not be properly validated in the MongoDB Go Driver when marshalling Go objects into BSON. A malicious user could use a Go object with specific string to potentially inject additional fields into marshalled documents.

    +

    Remediation

    +

    Upgrade go.mongodb.org/mongo-driver/bson/bsonrw to version 1.5.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Denial of Service (DoS)

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + github.com/prometheus/client_golang/prometheus/promhttp +
    • + +
    • Introduced through: + + github.com/argoproj/argo-cd/v2@0.0.0 and github.com/prometheus/client_golang/prometheus/promhttp@1.11.0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/prometheus/client_golang/prometheus/promhttp@1.11.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + sigs.k8s.io/controller-runtime@0.11.0 + + sigs.k8s.io/controller-runtime/pkg/manager@0.11.0 + + github.com/prometheus/client_golang/prometheus/promhttp@1.11.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + sigs.k8s.io/controller-runtime@0.11.0 + + sigs.k8s.io/controller-runtime/pkg/manager@0.11.0 + + sigs.k8s.io/controller-runtime/pkg/webhook@0.11.0 + + sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics@0.11.0 + + github.com/prometheus/client_golang/prometheus/promhttp@1.11.0 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    Affected versions of this package are vulnerable to Denial of Service (DoS) when handling requests with non-standard HTTP methods.

    +

    Note: In order to be affected, an instrumented software must:

    +
      +
    1. use promhttp.InstrumentHandler* middleware except RequestsInFlight

      +
    2. +
    3. not filter any specific methods (e.g GET) before middleware

      +
    4. +
    5. pass metric with method label name to the middleware

      +
    6. +
    7. not have any firewall/LB/proxy that filters away requests with unknown method.

      +
    8. +
    +

    Workarounds:

    +
      +
    1. removing the method label name from counter/gauge used in the InstrumentHandler

      +
    2. +
    3. turning off affected promhttp handlers

      +
    4. +
    5. adding custom middleware before promhttp handler that will sanitize the request method given by Go http.Request

      +
    6. +
    7. using a reverse proxy or web application firewall, configured to only allow a limited set of methods.

      +
    8. +
    +

    Details

    +

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its intended and legitimate users.

    +

    Unlike other vulnerabilities, DoS attacks usually do not aim at breaching security. Rather, they are focused on making websites and services unavailable to genuine users resulting in downtime.

    +

    One popular Denial of Service vulnerability is DDoS (a Distributed Denial of Service), an attack that attempts to clog network pipes to the system by generating a large volume of traffic from many machines.

    +

    When it comes to open source libraries, DoS vulnerabilities allow attackers to trigger such a crash or crippling of the service by using a flaw either in the application code or from the use of open source libraries.

    +

    Two common types of DoS vulnerabilities:

    +
      +
    • High CPU/Memory Consumption- An attacker sending crafted requests that could cause the system to take a disproportionate amount of time to process. For example, commons-fileupload:commons-fileupload.

      +
    • +
    • Crash - An attacker sending crafted requests that could cause the system to crash. For Example, npm ws package

      +
    • +
    +

    Remediation

    +

    Upgrade github.com/prometheus/client_golang/prometheus/promhttp to version 1.11.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Insecure Randomness

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: golang +
    • +
    • + Vulnerable module: + + github.com/Masterminds/goutils +
    • + +
    • Introduced through: + + + github.com/argoproj/argo-cd/v2@0.0.0, github.com/argoproj/notifications-engine/pkg/api@#567361917320 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/argoproj/notifications-engine/pkg/api@#567361917320 + + github.com/argoproj/notifications-engine/pkg/templates@#567361917320 + + github.com/Masterminds/sprig@2.22.0 + + github.com/Masterminds/goutils@1.1.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/argoproj/notifications-engine/pkg/cmd@#567361917320 + + github.com/argoproj/notifications-engine/pkg/api@#567361917320 + + github.com/argoproj/notifications-engine/pkg/templates@#567361917320 + + github.com/Masterminds/sprig@2.22.0 + + github.com/Masterminds/goutils@1.1.0 + + + +
    • +
    • + Introduced through: + github.com/argoproj/argo-cd/v2@0.0.0 + + github.com/argoproj/notifications-engine/pkg/controller@#567361917320 + + github.com/argoproj/notifications-engine/pkg/api@#567361917320 + + github.com/argoproj/notifications-engine/pkg/templates@#567361917320 + + github.com/Masterminds/sprig@2.22.0 + + github.com/Masterminds/goutils@1.1.0 + + + +
    • +
    + +
    + +
    + +

    Overview

    +

    github.com/masterminds/goutils is a provides users with utility functions to manipulate strings in various ways.

    +

    Affected versions of this package are vulnerable to Insecure Randomness via the RandomAlphaNumeric(int) and CryptoRandomAlphaNumeric(int) functions. Small values of int in the functions above will return a smaller subset of results than they should. For example, RandomAlphaNumeric(1) would always return a digit in the 0-9 range, while RandomAlphaNumeric(4) return around ~7 million of the ~13M possible permutations.

    +

    Remediation

    +

    Upgrade github.com/masterminds/goutils to version 1.1.1 or higher.

    +

    References

    + + +
    + + + +
    +
    +
    +
    + + + diff --git a/docs/snyk/v2.4.11/ghcr.io_dexidp_dex_v2.32.0.html b/docs/snyk/v2.4.11/ghcr.io_dexidp_dex_v2.32.0.html new file mode 100644 index 0000000000000..472fc703a9116 --- /dev/null +++ b/docs/snyk/v2.4.11/ghcr.io_dexidp_dex_v2.32.0.html @@ -0,0 +1,805 @@ + + + + + + + + + Snyk test report + + + + + + + + + +
    +
    +
    +
    + + + Snyk - Open Source Security + + + + + + + +
    +

    Snyk test report

    + +

    September 7th 2022, 7:35:45 pm

    +
    +
    + Scanned the following path: +
      +
    • ghcr.io/dexidp/dex:v2.32.0/dexidp/dex (apk)
    • +
    +
    + +
    +
    3 known vulnerabilities
    +
    12 vulnerable dependency paths
    +
    14 dependencies
    +
    +
    +
    +
    +
    + + + + + + + +
    Project docker-image|ghcr.io/dexidp/dex
    Path ghcr.io/dexidp/dex:v2.32.0/dexidp/dex
    Package Manager apk
    +
    +
    +
    +
    +

    Out-of-bounds Write

    +
    + +
    + critical severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + zlib/zlib +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.32.0 and zlib/zlib@1.2.12-r1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + apk-tools/apk-tools@2.12.9-r3 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    Upgrade Alpine:3.16 zlib to version 1.2.12-r2 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Use After Free

    +
    + +
    + high severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + busybox/busybox +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.32.0 and busybox/busybox@1.35.0-r13 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/busybox@1.35.0-r13 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + alpine-baselayout/alpine-baselayout-data@3.2.0-r20 + + alpine-baselayout/alpine-baselayout@3.2.0-r20 + + busybox/busybox@1.35.0-r13 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/ssl_client@1.35.0-r13 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream busybox package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    A use-after-free in Busybox 1.35-x's awk applet leads to denial of service and possibly code execution when processing a crafted awk pattern in the copyvar function.

    +

    Remediation

    +

    Upgrade Alpine:3.16 busybox to version 1.35.0-r15 or higher.

    +

    References

    + + +
    + + + +
    +
    +

    Inadequate Encryption Strength

    +
    + +
    + medium severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + openssl/libcrypto1.1 +
    • + +
    • Introduced through: + + docker-image|ghcr.io/dexidp/dex@v2.32.0 and openssl/libcrypto1.1@1.1.1o-r0 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + openssl/libssl1.1@1.1.1o-r0 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + apk-tools/apk-tools@2.12.9-r3 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/ssl_client@1.35.0-r13 + + openssl/libcrypto1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + openssl/libssl1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + apk-tools/apk-tools@2.12.9-r3 + + openssl/libssl1.1@1.1.1o-r0 + + + +
    • +
    • + Introduced through: + docker-image|ghcr.io/dexidp/dex@v2.32.0 + + busybox/ssl_client@1.35.0-r13 + + openssl/libssl1.1@1.1.1o-r0 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream openssl package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    AES OCB mode for 32-bit x86 platforms using the AES-NI assembly optimised implementation will not encrypt the entirety of the data under some circumstances. This could reveal sixteen bytes of data that was preexisting in the memory that wasn't written. In the special case of "in place" encryption, sixteen bytes of the plaintext would be revealed. Since OpenSSL does not support OCB based cipher suites for TLS and DTLS, they are both unaffected. Fixed in OpenSSL 3.0.5 (Affected 3.0.0-3.0.4). Fixed in OpenSSL 1.1.1q (Affected 1.1.1-1.1.1p).

    +

    Remediation

    +

    Upgrade Alpine:3.16 openssl to version 1.1.1q-r0 or higher.

    +

    References

    + + +
    + + + +
    +
    +
    +
    + + + diff --git a/docs/snyk/v2.4.11/haproxy_2.0.29-alpine.html b/docs/snyk/v2.4.11/haproxy_2.0.29-alpine.html new file mode 100644 index 0000000000000..88f196901da96 --- /dev/null +++ b/docs/snyk/v2.4.11/haproxy_2.0.29-alpine.html @@ -0,0 +1,592 @@ + + + + + + + + + Snyk test report + + + + + + + + + +
    +
    +
    +
    + + + Snyk - Open Source Security + + + + + + + +
    +

    Snyk test report

    + +

    September 7th 2022, 7:35:49 pm

    +
    +
    + Scanned the following path: +
      +
    • haproxy:2.0.29-alpine (apk)
    • +
    +
    + +
    +
    1 known vulnerabilities
    +
    3 vulnerable dependency paths
    +
    17 dependencies
    +
    +
    +
    +
    +
    + + + + + + + +
    Project docker-image|haproxy
    Path haproxy:2.0.29-alpine
    Package Manager apk
    +
    +
    +
    +
    +

    Out-of-bounds Write

    +
    + +
    + critical severity +
    + +
    + +
      +
    • + Package Manager: alpine:3.16 +
    • +
    • + Vulnerable module: + + zlib/zlib +
    • + +
    • Introduced through: + + docker-image|haproxy@2.0.29-alpine and zlib/zlib@1.2.12-r1 + +
    • +
    + +
    + + +

    Detailed paths

    + +
      +
    • + Introduced through: + docker-image|haproxy@2.0.29-alpine + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.0.29-alpine + + .haproxy-rundeps@20220718.230945 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    • + Introduced through: + docker-image|haproxy@2.0.29-alpine + + apk-tools/apk-tools@2.12.9-r3 + + zlib/zlib@1.2.12-r1 + + + +
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package. + See How to fix? for Alpine:3.16 relevant versions.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    Upgrade Alpine:3.16 zlib to version 1.2.12-r2 or higher.

    +

    References

    + + +
    + + + +
    +
    +
    +
    + + + diff --git a/docs/snyk/v2.4.19/quay.io_argoproj_argocd_v2.4.19.html b/docs/snyk/v2.4.11/quay.io_argoproj_argocd_v2.4.11.html similarity index 70% rename from docs/snyk/v2.4.19/quay.io_argoproj_argocd_v2.4.19.html rename to docs/snyk/v2.4.11/quay.io_argoproj_argocd_v2.4.11.html index 5ea597bac98f3..bcac9a769de04 100644 --- a/docs/snyk/v2.4.19/quay.io_argoproj_argocd_v2.4.19.html +++ b/docs/snyk/v2.4.11/quay.io_argoproj_argocd_v2.4.11.html @@ -7,7 +7,7 @@ Snyk test report - + @@ -456,18 +456,18 @@

    Snyk test report

    -

    January 22nd 2023, 12:22:04 am

    +

    September 7th 2022, 7:36:00 pm

    Scanned the following path:
      -
    • quay.io/argoproj/argocd:v2.4.19/argoproj/argocd (deb)
    • +
    • quay.io/argoproj/argocd:v2.4.11/argoproj/argocd (deb)
    -
    16 known vulnerabilities
    -
    102 vulnerable dependency paths
    +
    21 known vulnerabilities
    +
    63 vulnerable dependency paths
    162 dependencies
    @@ -477,7 +477,7 @@

    Snyk test report

    - + @@ -486,7 +486,7 @@

    Snyk test report

    -

    Off-by-one Error

    +

    Out-of-bounds Write

    @@ -502,13 +502,13 @@

    Off-by-one Error

  • Vulnerable module: - systemd/libsystemd0 + zlib/zlib1g
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and systemd/libsystemd0@249.11-0ubuntu3.6 + docker-image|quay.io/argoproj/argocd@v2.4.11, meta-common-packages@meta and others
  • @@ -520,110 +520,90 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - apt@2.4.8 + meta-common-packages@meta - systemd/libsystemd0@249.11-0ubuntu3.6 + zlib/zlib1g@1:1.2.11.dfsg-2ubuntu9
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - procps/libprocps8@2:3.3.17-6ubuntu2 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
    - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - util-linux@2.37.2-4ubuntu3 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
  • - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - util-linux/bsdutils@1:2.37.2-4ubuntu3 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream zlib package.

    +

    zlib through 1.2.12 has a heap-based buffer over-read or buffer overflow in inflate in inflate.c via a large gzip header extra field. NOTE: only applications that call inflateGetHeader are affected. Some common applications bundle the affected zlib source code but may be unable to call inflateGetHeader (e.g., see the nodejs/node reference).

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 zlib.

    +

    References

    + -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - apt@2.4.8 - - apt/libapt-pkg6.0@2.4.8 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - +
    -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - systemd/libudev1@249.11-0ubuntu3.6 - - + -
  • -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - libfido2/libfido2-1@1.10.0-1 - - systemd/libudev1@249.11-0ubuntu3.6 - - +
  • +
    +

    Out-of-bounds Read

    +
    - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - util-linux@2.37.2-4ubuntu3 - - systemd/libudev1@249.11-0ubuntu3.6 - - +
    + medium severity +
    -
  • +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + sqlite3/libsqlite3-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.4.11, gnupg2/gpg@2.2.27-3ubuntu2.1 and others +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - apt@2.4.8 + docker-image|quay.io/argoproj/argocd@v2.4.11 - apt/libapt-pkg6.0@2.4.8 + gnupg2/gpg@2.2.27-3ubuntu2.1 - systemd/libudev1@249.11-0ubuntu3.6 + sqlite3/libsqlite3-0@3.37.2-2 @@ -635,29 +615,33 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream systemd package.

      -

      An off-by-one Error issue was discovered in Systemd in format_timespan() function of time-util.c. An attacker could supply specific values for time and accuracy that leads to buffer overrun in format_timespan(), leading to a Denial of Service.

      +

      Note: Versions mentioned in the description apply to the upstream sqlite3 package.

      +

      An out-of-bounds read was addressed with improved bounds checking. This issue is fixed in iOS 13.5 and iPadOS 13.5, macOS Catalina 10.15.5, tvOS 13.4.5, watchOS 6.2.5, iTunes 12.10.7 for Windows, iCloud for Windows 11.2, iCloud for Windows 7.19. A malicious application may cause a denial of service or potentially disclose memory contents.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 systemd.

      +

      There is no fixed version for Ubuntu:22.04 sqlite3.

      References


    -

    Integer Overflow or Wraparound

    +

    Improper Verification of Cryptographic Signature

    @@ -673,13 +657,13 @@

    Integer Overflow or Wraparound

  • Vulnerable module: - krb5/libk5crypto3 + perl/perl-modules-5.34
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and krb5/libk5crypto3@1.19.2-2 + docker-image|quay.io/argoproj/argocd@v2.4.11, git@1:2.34.1-1ubuntu1.4 and others
  • @@ -691,161 +675,63 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - adduser@3.118ubuntu5 + docker-image|quay.io/argoproj/argocd@v2.4.11 - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 + git@1:2.34.1-1ubuntu1.4 - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + perl@5.34.0-3ubuntu1 - krb5/libgssapi-krb5-2@1.19.2-2 + perl/perl-modules-5.34@5.34.0-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + git@1:2.34.1-1ubuntu1.4 - git@1:2.34.1-1ubuntu1.6 + perl@5.34.0-3ubuntu1 - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 + perl/libperl5.34@5.34.0-3ubuntu1 - krb5/libgssapi-krb5-2@1.19.2-2 + perl/perl-modules-5.34@5.34.0-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - git@1:2.34.1-1ubuntu1.6 + docker-image|quay.io/argoproj/argocd@v2.4.11 - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 + git@1:2.34.1-1ubuntu1.4 - libssh/libssh-4@0.9.6-2build1 + perl@5.34.0-3ubuntu1 - krb5/libgssapi-krb5-2@1.19.2-2 + perl/libperl5.34@5.34.0-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 + docker-image|quay.io/argoproj/argocd@v2.4.11 - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 + git@1:2.34.1-1ubuntu1.4 - krb5/libgssapi-krb5-2@1.19.2-2 + perl@5.34.0-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 meta-common-packages@meta - krb5/libkrb5support0@1.19.2-2 + perl/perl-base@5.34.0-3ubuntu1 @@ -857,31 +743,29 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream krb5 package.

      -

      PAC parsing in MIT Kerberos 5 (aka krb5) before 1.19.4 and 1.20.x before 1.20.1 has integer overflows that may lead to remote code execution (in KDC, kadmind, or a GSS or Kerberos application server) on 32-bit platforms (which have a resultant heap-based buffer overflow), and cause a denial of service on other platforms. This occurs in krb5_pac_parse in lib/krb5/krb/pac.c. Heimdal before 7.7.1 has "a similar bug."

      +

      Note: Versions mentioned in the description apply to the upstream perl package.

      +

      CPAN 2.28 allows Signature Verification Bypass.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 krb5.

      +

      There is no fixed version for Ubuntu:22.04 perl.

      References


    -

    CVE-2022-46908

    +

    NULL Pointer Dereference

    @@ -897,13 +781,13 @@

    CVE-2022-46908

  • Vulnerable module: - sqlite3/libsqlite3-0 + tar
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19, gnupg2/gpg@2.2.27-3ubuntu2.1 and others + docker-image|quay.io/argoproj/argocd@v2.4.11, meta-common-packages@meta and others
  • @@ -915,11 +799,11 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - gnupg2/gpg@2.2.27-3ubuntu2.1 + meta-common-packages@meta - sqlite3/libsqlite3-0@3.37.2-2ubuntu0.1 + tar@1.34+dfsg-1build3 @@ -931,27 +815,31 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream sqlite3 package.

      -

      SQLite through 3.40.0, when relying on --safe for execution of an untrusted CLI script, does not properly implement the azProhibitedFunctions protection mechanism, and instead allows UDF functions such as WRITEFILE.

      +

      Note: Versions mentioned in the description apply to the upstream tar package.

      +

      pax_decode_header in sparse.c in GNU Tar before 1.32 had a NULL pointer dereference when parsing certain archives that have malformed extended headers.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 sqlite3.

      +

      There is no fixed version for Ubuntu:22.04 tar.

      References


    -

    Uncontrolled Recursion

    +

    CVE-2020-9991

    @@ -967,13 +855,13 @@

    Uncontrolled Recursion

  • Vulnerable module: - pcre3/libpcre3 + sqlite3/libsqlite3-0
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 + docker-image|quay.io/argoproj/argocd@v2.4.11, gnupg2/gpg@2.2.27-3ubuntu2.1 and others
  • @@ -985,20 +873,11 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - grep@3.7-1build1 + gnupg2/gpg@2.2.27-3ubuntu2.1 - pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 + sqlite3/libsqlite3-0@3.37.2-2 @@ -1010,29 +889,32 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream pcre3 package.

      -

      In PCRE 8.41, the OP_KETRMAX feature in the match function in pcre_exec.c allows stack exhaustion (uncontrolled recursion) when processing a crafted regular expression.

      +

      Note: Versions mentioned in the description apply to the upstream sqlite3 package.

      +

      This issue was addressed with improved checks. This issue is fixed in macOS Big Sur 11.0.1, watchOS 7.0, iOS 14.0 and iPadOS 14.0, iCloud for Windows 7.21, tvOS 14.0. A remote attacker may be able to cause a denial of service.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 pcre3.

      +

      There is no fixed version for Ubuntu:22.04 sqlite3.

      References


    -

    Release of Invalid Pointer or Reference

    +

    Information Exposure

    @@ -1048,13 +930,13 @@

    Release of Invalid Pointer or Reference

  • Vulnerable module: - patch + sqlite3/libsqlite3-0
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and patch@2.7.6-7build2 + docker-image|quay.io/argoproj/argocd@v2.4.11, gnupg2/gpg@2.2.27-3ubuntu2.1 and others
  • @@ -1066,9 +948,11 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - patch@2.7.6-7build2 + gnupg2/gpg@2.2.27-3ubuntu2.1 + + sqlite3/libsqlite3-0@3.37.2-2 @@ -1080,25 +964,32 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream patch package.

      -

      An Invalid Pointer vulnerability exists in GNU patch 2.7 via the another_hunk function, which causes a Denial of Service.

      +

      Note: Versions mentioned in the description apply to the upstream sqlite3 package.

      +

      An information disclosure issue was addressed with improved state management. This issue is fixed in macOS Big Sur 11.0.1, watchOS 7.0, iOS 14.0 and iPadOS 14.0, iTunes for Windows 12.10.9, iCloud for Windows 11.5, tvOS 14.0. A remote attacker may be able to leak memory.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 patch.

      +

      There is no fixed version for Ubuntu:22.04 sqlite3.

      References


    -

    Double Free

    +

    Time-of-check Time-of-use (TOCTOU)

    @@ -1114,12 +1005,12 @@

    Double Free

  • Vulnerable module: - patch + shadow/passwd
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and patch@2.7.6-7build2 + docker-image|quay.io/argoproj/argocd@v2.4.11 and shadow/passwd@1:4.8.1-2ubuntu2
  • @@ -1132,9 +1023,40 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - patch@2.7.6-7build2 + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.4.11 + + adduser@3.118ubuntu5 + + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.4.11 + + openssh/openssh-client@1:8.9p1-3 + + shadow/passwd@1:4.8.1-2ubuntu2 + + + +
    • +
    • + Introduced through: + docker-image|quay.io/argoproj/argocd@v2.4.11 + + shadow/login@1:4.8.1-2ubuntu2 @@ -1146,30 +1068,28 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream patch package.

      -

      A double free exists in the another_hunk function in pch.c in GNU patch through 2.7.6.

      +

      Note: Versions mentioned in the description apply to the upstream shadow package.

      +

      shadow: TOCTOU (time-of-check time-of-use) race condition when copying and removing directory trees

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 patch.

      +

      There is no fixed version for Ubuntu:22.04 shadow.

      References


    -

    Improper Locking

    +

    Uncontrolled Recursion

    @@ -1185,12 +1105,12 @@

    Improper Locking

  • Vulnerable module: - openssl/libssl3 + pcre3/libpcre3
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and openssl/libssl3@3.0.2-0ubuntu1.7 + docker-image|quay.io/argoproj/argocd@v2.4.11 and pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1
  • @@ -1203,113 +1123,303 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - openssl/libssl3@3.0.2-0ubuntu1.7 + pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - cyrus-sasl2/libsasl2-modules@2.1.27+dfsg2-3ubuntu1.1 + grep@3.7-1build1 - openssl/libssl3@3.0.2-0ubuntu1.7 + pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - libfido2/libfido2-1@1.10.0-1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - +
    - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - +
  • - -
  • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - ca-certificates@20211016ubuntu0.22.04.1 - - openssl@3.0.2-0ubuntu1.7 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream pcre3 package.

    +

    In PCRE 8.41, the OP_KETRMAX feature in the match function in pcre_exec.c allows stack exhaustion (uncontrolled recursion) when processing a crafted regular expression.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 pcre3.

    +

    References

    + -
  • +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + pcre2/libpcre2-8-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.4.11, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 + docker-image|quay.io/argoproj/argocd@v2.4.11 - libssh/libssh-4@0.9.6-2build1 + meta-common-packages@meta - openssl/libssl3@3.0.2-0ubuntu1.7 + pcre2/libpcre2-8-0@10.39-3build1
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream pcre2 package.

    +

    An out-of-bounds read vulnerability was discovered in the PCRE2 library in the get_recurse_data_length() function of the pcre2_jit_compile.c file. This issue affects recursions in JIT-compiled regular expressions caused by duplicate data transfers.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 pcre2.

    +

    References

    + + +
    + + + +
    +
    +

    Out-of-bounds Read

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + pcre2/libpcre2-8-0 +
    • + +
    • Introduced through: + + + docker-image|quay.io/argoproj/argocd@v2.4.11, meta-common-packages@meta and others +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 + docker-image|quay.io/argoproj/argocd@v2.4.11 - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 + meta-common-packages@meta - openssl/libssl3@3.0.2-0ubuntu1.7 + pcre2/libpcre2-8-0@10.39-3build1
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream pcre2 package.

    +

    An out-of-bounds read vulnerability was discovered in the PCRE2 library in the compile_xclass_matchingpath() function of the pcre2_jit_compile.c file. This involves a unicode property matching issue in JIT-compiled regular expressions. The issue occurs because the character was not fully read in case-less matching within JIT.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 pcre2.

    +

    References

    + + +
    + + + +
    +
    +

    Release of Invalid Pointer or Reference

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + patch +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.4.11 and patch@2.7.6-7build2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - openssl@3.0.2-0ubuntu1.7 + patch@2.7.6-7build2
    • +
    + +
    + +
    + +

    NVD Description

    +

    Note: Versions mentioned in the description apply to the upstream patch package.

    +

    An Invalid Pointer vulnerability exists in GNU patch 2.7 via the another_hunk function, which causes a Denial of Service.

    +

    Remediation

    +

    There is no fixed version for Ubuntu:22.04 patch.

    +

    References

    + + +
    + + + +
    +
    +

    Double Free

    +
    + +
    + low severity +
    + +
    + +
      +
    • + Package Manager: ubuntu:22.04 +
    • +
    • + Vulnerable module: + + patch +
    • + +
    • Introduced through: + + docker-image|quay.io/argoproj/argocd@v2.4.11 and patch@2.7.6-7build2 + +
    • +
    + +
    + + +

    Detailed paths

    + +
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - ca-certificates@20211016ubuntu0.22.04.1 + docker-image|quay.io/argoproj/argocd@v2.4.11 - openssl@3.0.2-0ubuntu1.7 + patch@2.7.6-7build2 @@ -1321,21 +1431,25 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream openssl package.

      -

      If an X.509 certificate contains a malformed policy constraint and policy processing is enabled, then a write lock will be taken twice recursively. On some operating systems (most widely: Windows) this results in a denial of service when the affected process hangs. Policy processing being enabled on a publicly facing server is not considered to be a common setup. Policy processing is enabled by passing the -policy&#39; argument to the command line utilities or by calling either X509_VERIFY_PARAM_add0_policy()' or `X509_VERIFY_PARAM_set1_policies()' functions.

      +

      Note: Versions mentioned in the description apply to the upstream patch package.

      +

      A double free exists in the another_hunk function in pch.c in GNU patch through 2.7.6.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 openssl.

      +

      There is no fixed version for Ubuntu:22.04 patch.

      References


    @@ -1361,7 +1475,7 @@

    CVE-2021-41617

  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and openssh/openssh-client@1:8.9p1-3ubuntu0.1 + docker-image|quay.io/argoproj/argocd@v2.4.11 and openssh/openssh-client@1:8.9p1-3
  • @@ -1374,9 +1488,9 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - openssh/openssh-client@1:8.9p1-3ubuntu0.1 + openssh/openssh-client@1:8.9p1-3 @@ -1405,7 +1519,6 @@

      References

    • MISC
    • MISC
    • N/A
    • -
    • MISC

    @@ -1437,7 +1550,7 @@

    Information Exposure

  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and openssh/openssh-client@1:8.9p1-3ubuntu0.1 + docker-image|quay.io/argoproj/argocd@v2.4.11 and openssh/openssh-client@1:8.9p1-3
  • @@ -1450,9 +1563,9 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - openssh/openssh-client@1:8.9p1-3ubuntu0.1 + openssh/openssh-client@1:8.9p1-3 @@ -1510,7 +1623,7 @@

      Out-of-bounds Read

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and ncurses/libtinfo6@6.3-2 + docker-image|quay.io/argoproj/argocd@v2.4.11 and ncurses/libtinfo6@6.3-2
    @@ -1523,7 +1636,7 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 ncurses/libtinfo6@6.3-2 @@ -1532,7 +1645,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 bash@5.1-6ubuntu1 @@ -1543,7 +1656,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 ncurses/libncursesw6@6.3-2 @@ -1554,7 +1667,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 less@590-1build1 @@ -1565,7 +1678,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 libedit/libedit2@3.1-20210910-1build1 @@ -1576,7 +1689,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 ncurses/libncurses6@6.3-2 @@ -1587,7 +1700,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 ncurses/ncurses-bin@6.3-2 @@ -1598,7 +1711,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 procps@2:3.3.17-6ubuntu2 @@ -1609,7 +1722,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 util-linux@2.37.2-4ubuntu3 @@ -1620,7 +1733,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 gnupg2/gpg@2.2.27-3ubuntu2.1 @@ -1635,7 +1748,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 gnupg2/gnupg@2.2.27-3ubuntu2.1 @@ -1650,7 +1763,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 ncurses/libncursesw6@6.3-2 @@ -1659,7 +1772,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 procps@2:3.3.17-6ubuntu2 @@ -1670,7 +1783,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 gnupg2/gnupg@2.2.27-3ubuntu2.1 @@ -1685,7 +1798,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 ncurses/libncurses6@6.3-2 @@ -1694,7 +1807,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 procps@2:3.3.17-6ubuntu2 @@ -1705,7 +1818,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 ncurses/ncurses-base@6.3-2 @@ -1714,7 +1827,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 ncurses/ncurses-bin@6.3-2 @@ -1737,9 +1850,6 @@

      References

    • ADVISORY
    • MISC
    • MISC
    • -
    • CONFIRM
    • -
    • MLIST
    • -
    • FULLDISC

    @@ -1771,7 +1881,7 @@

    Integer Overflow or Wraparound

  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and krb5/libk5crypto3@1.19.2-2 + docker-image|quay.io/argoproj/argocd@v2.4.11 and krb5/libk5crypto3@1.19.2-2
  • @@ -1784,7 +1894,7 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 krb5/libk5crypto3@1.19.2-2 @@ -1793,11 +1903,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 adduser@3.118ubuntu5 - shadow/passwd@1:4.8.1-2ubuntu2.1 + shadow/passwd@1:4.8.1-2ubuntu2 pam/libpam-modules@1.4.0-11ubuntu2 @@ -1814,11 +1924,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 adduser@3.118ubuntu5 - shadow/passwd@1:4.8.1-2ubuntu2.1 + shadow/passwd@1:4.8.1-2ubuntu2 pam/libpam-modules@1.4.0-11ubuntu2 @@ -1837,7 +1947,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 krb5/libkrb5-3@1.19.2-2 @@ -1846,11 +1956,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 adduser@3.118ubuntu5 - shadow/passwd@1:4.8.1-2ubuntu2.1 + shadow/passwd@1:4.8.1-2ubuntu2 pam/libpam-modules@1.4.0-11ubuntu2 @@ -1867,7 +1977,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 krb5/libgssapi-krb5-2@1.19.2-2 @@ -1876,9 +1986,9 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - openssh/openssh-client@1:8.9p1-3ubuntu0.1 + openssh/openssh-client@1:8.9p1-3 krb5/libgssapi-krb5-2@1.19.2-2 @@ -1887,11 +1997,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 krb5/libgssapi-krb5-2@1.19.2-2 @@ -1900,11 +2010,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 libssh/libssh-4@0.9.6-2build1 @@ -1915,11 +2025,11 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 adduser@3.118ubuntu5 - shadow/passwd@1:4.8.1-2ubuntu2.1 + shadow/passwd@1:4.8.1-2ubuntu2 pam/libpam-modules@1.4.0-11ubuntu2 @@ -1934,7 +2044,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 meta-common-packages@meta @@ -1971,7 +2081,7 @@

      References

    -

    CVE-2022-3219

    +

    Integer Overflow or Wraparound

    @@ -1987,12 +2097,12 @@

    CVE-2022-3219

  • Vulnerable module: - gnupg2/gpgv + gmp/libgmp10
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and gnupg2/gpgv@2.2.27-3ubuntu2.1 + docker-image|quay.io/argoproj/argocd@v2.4.11 and gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1
  • @@ -2005,313 +2115,63 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - apt@2.4.8 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg-l10n@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gnupg-l10n@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg-utils@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gnupg-utils@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 + docker-image|quay.io/argoproj/argocd@v2.4.11 - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 + coreutils@8.32-4.1ubuntu1 - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 + docker-image|quay.io/argoproj/argocd@v2.4.11 - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 + apt@2.4.7 - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + gnutls28/libgnutls30@3.7.3-4ubuntu1.1 - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + apt@2.4.7 - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + gnutls28/libgnutls30@3.7.3-4ubuntu1.1 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + nettle/libhogweed6@3.7.3-1build2 - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + git@1:2.34.1-1ubuntu1.4 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + rtmpdump/librtmp1@2.4+20151223.gitfa8646d.1-2build4 - gnupg2/gnupg@2.2.27-3ubuntu2.1 + gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 @@ -2323,18 +2183,23 @@

      Detailed paths


      NVD Description

      -

      This vulnerability has not been analyzed by NVD yet.

      +

      Note: Versions mentioned in the description apply to the upstream gmp package.

      +

      GNU Multiple Precision Arithmetic Library (GMP) through 6.2.1 has an mpz/inp_raw.c integer overflow and resultant buffer overflow via crafted input, leading to a segmentation fault on 32-bit platforms.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 gnupg2.

      +

      There is no fixed version for Ubuntu:22.04 gmp.

      References


    @@ -2360,7 +2225,7 @@

    Allocation of Resources Without Limits or Throttling

    Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and glibc/libc-bin@2.35-0ubuntu3.1 + docker-image|quay.io/argoproj/argocd@v2.4.11 and glibc/libc-bin@2.35-0ubuntu3.1 @@ -2373,7 +2238,7 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 glibc/libc-bin@2.35-0ubuntu3.1 @@ -2382,7 +2247,7 @@

      Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 meta-common-packages@meta @@ -2440,7 +2305,7 @@

      Improper Input Validation

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19, git@1:2.34.1-1ubuntu1.6 and others + docker-image|quay.io/argoproj/argocd@v2.4.11, git@1:2.34.1-1ubuntu1.4 and others
    @@ -2452,31 +2317,31 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 - git/git-man@1:2.34.1-1ubuntu1.6 + git/git-man@1:2.34.1-1ubuntu1.4
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4
    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 git-lfs@3.0.2-1 - git@1:2.34.1-1ubuntu1.6 + git@1:2.34.1-1ubuntu1.4 @@ -2494,9 +2359,9 @@

      Remediation

      There is no fixed version for Ubuntu:22.04 git.

      References


      @@ -2507,7 +2372,7 @@

      References

    -

    Improper Input Validation

    +

    CVE-2022-35252

    @@ -2523,13 +2388,13 @@

    Improper Input Validation

  • Vulnerable module: - coreutils + curl/libcurl3-gnutls
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and coreutils@8.32-4.1ubuntu1 + docker-image|quay.io/argoproj/argocd@v2.4.11, git@1:2.34.1-1ubuntu1.4 and others
  • @@ -2541,9 +2406,11 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - coreutils@8.32-4.1ubuntu1 + git@1:2.34.1-1ubuntu1.4 + + curl/libcurl3-gnutls@7.81.0-1ubuntu1.3 @@ -2555,28 +2422,23 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream coreutils package.

      -

      chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.

      +

      This vulnerability has not been analyzed by NVD yet.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 coreutils.

      +

      Upgrade Ubuntu:22.04 curl to version 7.81.0-1ubuntu1.4 or higher.

      References


    -

    Out-of-bounds Write

    +

    Improper Input Validation

    @@ -2592,12 +2454,12 @@

    Out-of-bounds Write

  • Vulnerable module: - bash + coreutils
  • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 and bash@5.1-6ubuntu1 + docker-image|quay.io/argoproj/argocd@v2.4.11 and coreutils@8.32-4.1ubuntu1
  • @@ -2610,9 +2472,9 @@

    Detailed paths

    • Introduced through: - docker-image|quay.io/argoproj/argocd@v2.4.19 + docker-image|quay.io/argoproj/argocd@v2.4.11 - bash@5.1-6ubuntu1 + coreutils@8.32-4.1ubuntu1 @@ -2624,20 +2486,23 @@

      Detailed paths


      NVD Description

      -

      Note: Versions mentioned in the description apply to the upstream bash package.

      -

      A flaw was found in the bash package, where a heap-buffer overflow can occur in valid parameter_transform. This issue may lead to memory problems.

      +

      Note: Versions mentioned in the description apply to the upstream coreutils package.

      +

      chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.

      Remediation

      -

      There is no fixed version for Ubuntu:22.04 bash.

      +

      There is no fixed version for Ubuntu:22.04 coreutils.

      References


    diff --git a/docs/snyk/master/redis_7.0.7-alpine.html b/docs/snyk/v2.4.11/redis_7.0.4-alpine.html similarity index 98% rename from docs/snyk/master/redis_7.0.7-alpine.html rename to docs/snyk/v2.4.11/redis_7.0.4-alpine.html index 0cbbce3dd9b09..9b4bfadf65719 100644 --- a/docs/snyk/master/redis_7.0.7-alpine.html +++ b/docs/snyk/v2.4.11/redis_7.0.4-alpine.html @@ -456,19 +456,19 @@

    Snyk test report

    -

    January 22nd 2023, 12:16:03 am

    +

    September 7th 2022, 7:36:04 pm

    Scanned the following path:
      -
    • redis:7.0.7-alpine (apk)
    • +
    • redis:7.0.4-alpine (apk)
    0 known vulnerabilities
    0 vulnerable dependency paths
    -
    18 dependencies
    +
    17 dependencies
    @@ -477,7 +477,7 @@

    Snyk test report

    Project docker-image|quay.io/argoproj/argocd
    Path quay.io/argoproj/argocd:v2.4.19/argoproj/argocd
    Path quay.io/argoproj/argocd:v2.4.11/argoproj/argocd
    Package Manager deb
    Manifest Dockerfile
    - + diff --git a/docs/snyk/v2.4.19/argocd-iac-install.html b/docs/snyk/v2.4.19/argocd-iac-install.html deleted file mode 100644 index 0b3265dde5efc..0000000000000 --- a/docs/snyk/v2.4.19/argocd-iac-install.html +++ /dev/null @@ -1,2231 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:22:53 am

    -
    -
    - Scanned the following path: -
      -
    • /argo-cd/manifests/install.yaml (Kubernetes)
    • -
    -
    - -
    -
    32 total issues
    -
    -
    -
    -
    - -
    -
    Project docker-image|redis
    Path redis:7.0.7-alpine
    Path redis:7.0.4-alpine
    Package Manager apk
    - - - - - -
    Project manifests/install.yaml
    Path /argo-cd/manifests/install.yaml
    Project Type Kubernetes
    -
    -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 10] - - rules[0] - - resources - -
    • - -
    • - Line number: 9063 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 11] - - rules[4] - - resources - -
    • - -
    • - Line number: 9140 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 12] - - rules[0] - - resources - -
    • - -
    • - Line number: 9168 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 13] - - rules[3] - - resources - -
    • - -
    • - Line number: 9212 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 13] - - rules[1] - - resources - -
    • - -
    • - Line number: 9194 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 14] - - rules[0] - - resources - -
    • - -
    • - Line number: 9228 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Container could be running with outdated image

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-42 -
    • - -
    • Introduced through: - [DocId: 46] - - spec - - template - - spec - - initContainers[copyutil] - - imagePullPolicy - -
    • - -
    • - Line number: 10100 -
    • -
    - -
    - -

    Impact

    -

    The container may run with outdated or unauthorized image

    - -

    Remediation

    -

    Set `imagePullPolicy` attribute to `Always`

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 42] - - input - - spec - - template - - spec - - containers[argocd-applicationset-controller] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 9686 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 43] - - input - - spec - - template - - spec - - initContainers[copyutil] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 9786 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 43] - - input - - spec - - template - - spec - - containers[dex] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 9763 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 44] - - input - - spec - - template - - spec - - containers[argocd-notifications-controller] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 9829 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 45] - - input - - spec - - template - - spec - - containers[redis] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 9901 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 46] - - input - - spec - - template - - spec - - initContainers[copyutil] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10100 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 46] - - input - - spec - - template - - spec - - containers[argocd-repo-server] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 9955 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 47] - - input - - spec - - template - - spec - - containers[argocd-server] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10183 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 48] - - input - - spec - - template - - spec - - containers[argocd-application-controller] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10443 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container is running with multiple open ports

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-36 -
    • - -
    • Introduced through: - [DocId: 43] - - spec - - template - - spec - - containers[dex] - - ports - -
    • - -
    • - Line number: 9770 -
    • -
    - -
    - -

    Impact

    -

    Increases the attack surface of the application and the container.

    - -

    Remediation

    -

    Reduce `ports` count to 2

    - - -
    -
    - - - -
    -
    -

    Container is running with writable root filesystem

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-8 -
    • - -
    • Introduced through: - [DocId: 45] - - input - - spec - - template - - spec - - containers[redis] - - securityContext - - readOnlyRootFilesystem - -
    • - -
    • - Line number: 9911 -
    • -
    - -
    - -

    Impact

    -

    Compromised process could abuse writable root filesystem to elevate privileges

    - -

    Remediation

    -

    Set `securityContext.readOnlyRootFilesystem` to `true`

    - - -
    -
    - - - -
    -
    -

    Container is running without liveness probe

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-41 -
    • - -
    • Introduced through: - [DocId: 42] - - spec - - template - - spec - - containers[argocd-applicationset-controller] - - livenessProbe - -
    • - -
    • - Line number: 9686 -
    • -
    - -
    - -

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    - -

    Remediation

    -

    Add `livenessProbe` attribute

    - - -
    -
    - - - -
    -
    -

    Container is running without liveness probe

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-41 -
    • - -
    • Introduced through: - [DocId: 43] - - spec - - template - - spec - - containers[dex] - - livenessProbe - -
    • - -
    • - Line number: 9763 -
    • -
    - -
    - -

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    - -

    Remediation

    -

    Add `livenessProbe` attribute

    - - -
    -
    - - - -
    -
    -

    Container is running without liveness probe

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-41 -
    • - -
    • Introduced through: - [DocId: 43] - - spec - - template - - spec - - initContainers[copyutil] - - livenessProbe - -
    • - -
    • - Line number: 9786 -
    • -
    - -
    - -

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    - -

    Remediation

    -

    Add `livenessProbe` attribute

    - - -
    -
    - - - -
    -
    -

    Container is running without liveness probe

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-41 -
    • - -
    • Introduced through: - [DocId: 45] - - spec - - template - - spec - - containers[redis] - - livenessProbe - -
    • - -
    • - Line number: 9901 -
    • -
    - -
    - -

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    - -

    Remediation

    -

    Add `livenessProbe` attribute

    - - -
    -
    - - - -
    -
    -

    Container is running without liveness probe

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-41 -
    • - -
    • Introduced through: - [DocId: 46] - - spec - - template - - spec - - initContainers[copyutil] - - livenessProbe - -
    • - -
    • - Line number: 10100 -
    • -
    - -
    - -

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    - -

    Remediation

    -

    Add `livenessProbe` attribute

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 42] - - input - - spec - - template - - spec - - containers[argocd-applicationset-controller] - - resources - - limits - - memory - -
    • - -
    • - Line number: 9686 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 43] - - input - - spec - - template - - spec - - containers[dex] - - resources - - limits - - memory - -
    • - -
    • - Line number: 9763 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 43] - - input - - spec - - template - - spec - - initContainers[copyutil] - - resources - - limits - - memory - -
    • - -
    • - Line number: 9786 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 44] - - input - - spec - - template - - spec - - containers[argocd-notifications-controller] - - resources - - limits - - memory - -
    • - -
    • - Line number: 9829 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 45] - - input - - spec - - template - - spec - - containers[redis] - - resources - - limits - - memory - -
    • - -
    • - Line number: 9901 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 46] - - input - - spec - - template - - spec - - initContainers[copyutil] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10100 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 46] - - input - - spec - - template - - spec - - containers[argocd-repo-server] - - resources - - limits - - memory - -
    • - -
    • - Line number: 9955 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 47] - - input - - spec - - template - - spec - - containers[argocd-server] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10183 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 48] - - input - - spec - - template - - spec - - containers[argocd-application-controller] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10443 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -
    - - - - - diff --git a/docs/snyk/v2.4.19/argocd-test.html b/docs/snyk/v2.4.19/argocd-test.html deleted file mode 100644 index 4a113207d1bf2..0000000000000 --- a/docs/snyk/v2.4.19/argocd-test.html +++ /dev/null @@ -1,3404 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:21:39 am

    -
    -
    - Scanned the following paths: -
      -
    • /argo-cd/argoproj/argo-cd/v2 (gomodules)
    • /argo-cd (yarn)
    • -
    -
    - -
    -
    8 known vulnerabilities
    -
    128 vulnerable dependency paths
    -
    1656 dependencies
    -
    -
    -
    -
    - -
    -
    -
    -

    Server-side Request Forgery (SSRF)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - parse-url -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, git-url-parse@11.6.0 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - git-url-parse@11.6.0 - - git-up@4.0.5 - - parse-url@6.0.5 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    parse-url is an An advanced url parser supporting git urls too.

    -

    Affected versions of this package are vulnerable to Server-side Request Forgery (SSRF) due to improper detection of protocol, resource, and pathname fields. Exploiting this vulnerability results in bypassing protocol verification.

    -

    PoC:

    -
    import parseUrl from "parse-url";
    -        import fetch from 'node-fetch';
    -        var parsed=parseUrl("http://nnnn@localhost:808:/?id=xss")
    -        if(parsed.resource=="localhost"){
    -        console.log("internal network access is blocked")
    -        }
    -        else{
    -           const response = await fetch('http://'+parsed.resource+parsed.pathname);
    -                console.log(response)
    -         }
    -        
    -

    Remediation

    -

    Upgrade parse-url to version 8.1.0 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Improper Input Validation

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - parse-url -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, git-url-parse@11.6.0 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - git-url-parse@11.6.0 - - git-up@4.0.5 - - parse-url@6.0.5 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    parse-url is an An advanced url parser supporting git urls too.

    -

    Affected versions of this package are vulnerable to Improper Input Validation due to incorrect parsing of URLs. This allows the attacker to craft a malformed URL which can lead to a phishing attack.

    -
    
    -        const parseUrl = require("parse-url");
    -        const Url = require("url");
    -        
    -        const express = require('express');
    -        const app = express();
    -        
    -        var url = "https://www.google.com:x@fakesite.com:x";
    -        parsed = parseUrl(url);
    -        console.log("[*]`parse-url` output: ")
    -        console.log(parsed);
    -        
    -        parsed2 = Url.parse(url);
    -        console.log("[*]`url` output: ")
    -        console.log(parsed2)
    -        
    -        app.get('/', (req, res) => {
    -            if (parsed.host == "www.google.com") {
    -                res.send("<a href=\'" + parsed2.href + "\'>CLICK ME!</a>")
    -            }
    -        })
    -        
    -        app.listen(8888,"0.0.0.0");
    -        
    -

    Remediation

    -

    Upgrade parse-url to version 8.1.0 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Regular Expression Denial of Service (ReDoS)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - minimatch -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, redoc@2.0.0-rc.64 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - redoc@2.0.0-rc.64 - - @redocly/openapi-core@1.0.0-beta.82 - - minimatch@3.0.4 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    minimatch is a minimal matching utility.

    -

    Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the braceExpand function in minimatch.js.

    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

    -

    The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

    -

    Let’s take the following regular expression as an example:

    -
    regex = /A(B|C+)+D/
    -        
    -

    This regular expression accomplishes the following:

    -
      -
    • A The string must start with the letter 'A'
    • -
    • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
    • -
    • D Finally, we ensure this section of the string ends with a 'D'
    • -
    -

    The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

    -

    It most cases, it doesn't take very long for a regex engine to find a match:

    -
    $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
    -        0.04s user 0.01s system 95% cpu 0.052 total
    -        
    -        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
    -        1.79s user 0.02s system 99% cpu 1.812 total
    -        
    -

    The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

    -

    Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

    -

    Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

    -
      -
    1. CCC
    2. -
    3. CC+C
    4. -
    5. C+CC
    6. -
    7. C+C+C.
    8. -
    -

    The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

    -

    From there, the number of steps the engine must use to validate a string just continues to grow.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    StringNumber of C'sNumber of steps
    ACCCX338
    ACCCCX471
    ACCCCCX5136
    ACCCCCCCCCCCCCCX1465,553
    -

    By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

    -

    Remediation

    -

    Upgrade minimatch to version 3.0.5 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Denial of Service (DoS)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - golang.org/x/net/http2 -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, k8s.io/client-go/rest@0.23.1 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/improbable-eng/grpc-web/go/grpcweb@#16092bd1d58a - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/soheilhy/cmux@0.1.5 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/dynamic@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/pkg/kubeclientmetrics@#36c59d8fafe0 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/azure@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/gcp@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/oidc@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/record@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/listers/core/v1@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#567361917320 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers/core/v1@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/clientcmd@0.23.1 - - k8s.io/client-go/tools/auth@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#567361917320 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery/fake@0.23.1 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes/fake@0.23.1 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/remotecommand@0.23.1 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware@1.3.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/auth@1.3.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/retry@1.3.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-prometheus@1.2.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc/health/grpc_health_v1@1.45.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus@1.3.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/improbable-eng/grpc-web/go/grpcweb@#16092bd1d58a - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc@0.31.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc@1.6.3 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/cache@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#567361917320 - - k8s.io/client-go/tools/clientcmd@0.23.1 - - k8s.io/client-go/tools/auth@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/term@0.23.1 - - k8s.io/client-go/tools/remotecommand@0.23.1 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/api/rbac/v1@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/scheme@0.11.0 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/api/core/v1@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/api/errors@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/api/equality@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/dynamic@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/pkg/kubeclientmetrics@#36c59d8fafe0 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/azure@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/gcp@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/oidc@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc/reflection@1.45.0 - - google.golang.org/grpc/reflection/grpc_reflection_v1alpha@1.45.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc/health@1.45.0 - - google.golang.org/grpc/health/grpc_health_v1@1.45.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/health@0.7.3 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/common@0.7.3 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/controller/controllerutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/envtest@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/testing/controlplane@0.11.0 - - k8s.io/client-go/tools/clientcmd@0.23.1 - - k8s.io/client-go/tools/auth@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/util/managedfields@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/common@0.7.3 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/hook@0.7.3 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/resource@0.7.3 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/ignore@0.7.3 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/syncwaves@0.7.3 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/utils/testing@0.7.3 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/record@0.23.1 - - k8s.io/client-go/tools/reference@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/pkg/apis/clientauthentication/v1beta1@0.23.1 - - k8s.io/client-go/pkg/apis/clientauthentication@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/scheme@0.11.0 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/util/retry@0.23.1 - - k8s.io/apimachinery/pkg/api/errors@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/resource@0.23.1 - - k8s.io/api/core/v1@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/health@0.7.3 - - k8s.io/kubectl/pkg/util/podutils@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/api/validation@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/validation@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/portforward@0.23.1 - - k8s.io/api/core/v1@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery/fake@0.23.1 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes/fake@0.23.1 - - k8s.io/client-go/testing@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/remotecommand@0.23.1 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/tags/logrus@1.3.0 - - github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus@1.3.0 - - github.com/grpc-ecosystem/go-grpc-middleware/tags@1.3.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/cache@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/cache@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/runtime/serializer@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/listers/core/v1@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#567361917320 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers/core/v1@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers@0.23.1 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#567361917320 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/tools/pager@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/term@0.23.1 - - k8s.io/client-go/tools/remotecommand@0.23.1 - - k8s.io/client-go/transport/spdy@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/hook@0.7.3 - - github.com/argoproj/gitops-engine/pkg/sync/hook/helm@0.7.3 - - github.com/argoproj/gitops-engine/pkg/sync/common@0.7.3 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/syncwaves@0.7.3 - - github.com/argoproj/gitops-engine/pkg/sync/hook/helm@0.7.3 - - github.com/argoproj/gitops-engine/pkg/sync/common@0.7.3 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/manager@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/webhook@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/metrics@0.11.0 - - k8s.io/client-go/tools/cache@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/event@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes/scheme@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/clientcmd@0.23.1 - - k8s.io/client-go/tools/clientcmd/api/latest@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/controller/controllerutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/ignore@0.7.3 - - github.com/argoproj/gitops-engine/pkg/sync/hook@0.7.3 - - github.com/argoproj/gitops-engine/pkg/sync/hook/helm@0.7.3 - - github.com/argoproj/gitops-engine/pkg/sync/common@0.7.3 - - github.com/argoproj/gitops-engine/pkg/utils/kube@0.7.3 - - k8s.io/kubectl/pkg/util/openapi@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/handler@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/runtime/inject@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/diff@0.7.3 - - k8s.io/client-go/kubernetes/scheme@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/envtest@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/webhook/conversion@0.11.0 - - k8s.io/apimachinery/pkg/runtime/serializer@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#567361917320 - - k8s.io/client-go/tools/clientcmd@0.23.1 - - k8s.io/client-go/tools/clientcmd/api/latest@0.23.1 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.23.1 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.23.1 - - k8s.io/apimachinery/pkg/watch@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/cache@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/event@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/source@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/source/internal@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/predicate@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/event@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/handler@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/runtime/inject@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/source@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/source/internal@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/predicate@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/event@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.23.1 - - k8s.io/client-go/discovery@0.23.1 - - k8s.io/client-go/rest@0.23.1 - - k8s.io/client-go/transport@0.23.1 - - k8s.io/apimachinery/pkg/util/net@0.23.1 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

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

    -

    Affected versions of this package are vulnerable to Denial of Service (DoS) due to improper checks and limitations for the number of entries in the cache, which can allow an attacker to consume unbounded amounts of memory by sending a small number of very large keys.

    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its intended and legitimate users.

    -

    Unlike other vulnerabilities, DoS attacks usually do not aim at breaching security. Rather, they are focused on making websites and services unavailable to genuine users resulting in downtime.

    -

    One popular Denial of Service vulnerability is DDoS (a Distributed Denial of Service), an attack that attempts to clog network pipes to the system by generating a large volume of traffic from many machines.

    -

    When it comes to open source libraries, DoS vulnerabilities allow attackers to trigger such a crash or crippling of the service by using a flaw either in the application code or from the use of open source libraries.

    -

    Two common types of DoS vulnerabilities:

    -
      -
    • High CPU/Memory Consumption- An attacker sending crafted requests that could cause the system to take a disproportionate amount of time to process. For example, commons-fileupload:commons-fileupload.

      -
    • -
    • Crash - An attacker sending crafted requests that could cause the system to crash. For Example, npm ws package

      -
    • -
    -

    Remediation

    -

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

    -

    References

    - - -
    - - - -
    -
    -

    Improper Input Validation

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - go.mongodb.org/mongo-driver/bson/bsonrw -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, github.com/go-openapi/runtime/middleware@0.19.4 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/go-openapi/runtime/middleware@0.19.4 - - github.com/go-openapi/validate@0.19.5 - - github.com/go-openapi/strfmt@0.19.3 - - go.mongodb.org/mongo-driver/bson@1.1.2 - - go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/go-openapi/runtime/middleware@0.19.4 - - github.com/go-openapi/validate@0.19.5 - - github.com/go-openapi/strfmt@0.19.3 - - go.mongodb.org/mongo-driver/bson@1.1.2 - - go.mongodb.org/mongo-driver/bson/bsoncodec@1.1.2 - - go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    go.mongodb.org/mongo-driver/bson/bsonrw is a The MongoDB supported driver for Go.

    -

    Affected versions of this package are vulnerable to Improper Input Validation. Specific cstrings input may not be properly validated in the MongoDB Go Driver when marshalling Go objects into BSON. A malicious user could use a Go object with specific string to potentially inject additional fields into marshalled documents.

    -

    Remediation

    -

    Upgrade go.mongodb.org/mongo-driver/bson/bsonrw to version 1.5.1 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Insecure Randomness

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - github.com/Masterminds/goutils -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, github.com/argoproj/notifications-engine/pkg/api@#567361917320 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#567361917320 - - github.com/argoproj/notifications-engine/pkg/templates@#567361917320 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#567361917320 - - github.com/argoproj/notifications-engine/pkg/api@#567361917320 - - github.com/argoproj/notifications-engine/pkg/templates@#567361917320 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#567361917320 - - github.com/argoproj/notifications-engine/pkg/api@#567361917320 - - github.com/argoproj/notifications-engine/pkg/templates@#567361917320 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    github.com/masterminds/goutils is a provides users with utility functions to manipulate strings in various ways.

    -

    Affected versions of this package are vulnerable to Insecure Randomness via the RandomAlphaNumeric(int) and CryptoRandomAlphaNumeric(int) functions. Small values of int in the functions above will return a smaller subset of results than they should. For example, RandomAlphaNumeric(1) would always return a digit in the 0-9 range, while RandomAlphaNumeric(4) return around ~7 million of the ~13M possible permutations.

    -

    Remediation

    -

    Upgrade github.com/masterminds/goutils to version 1.1.1 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Insecure Randomness

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - github.com/Masterminds/goutils -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, github.com/argoproj/notifications-engine/pkg/api@#567361917320 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#567361917320 - - github.com/argoproj/notifications-engine/pkg/templates@#567361917320 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#567361917320 - - github.com/argoproj/notifications-engine/pkg/api@#567361917320 - - github.com/argoproj/notifications-engine/pkg/templates@#567361917320 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#567361917320 - - github.com/argoproj/notifications-engine/pkg/api@#567361917320 - - github.com/argoproj/notifications-engine/pkg/templates@#567361917320 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    github.com/masterminds/goutils is a provides users with utility functions to manipulate strings in various ways.

    -

    Affected versions of this package are vulnerable to Insecure Randomness when randomly-generated alphanumeric strings contain significantly less entropy than expected, the RandomAlphaNumeric and CryptoRandomAlphaNumeric functions always return strings containing at least one digit from 0 to 9. This significantly reduces the amount of entropy in short strings generated by these functions.

    -

    Remediation

    -

    Upgrade github.com/masterminds/goutils to version 1.1.1 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Regular Expression Denial of Service (ReDoS)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - cookiejar -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, superagent@7.1.3 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - superagent@7.1.3 - - cookiejar@2.1.3 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the Cookie.parse function, which uses an insecure regular expression.

    -

    PoC

    -
    const { CookieJar } = require("cookiejar");
    -        
    -        const jar = new CookieJar();
    -        
    -        const start = performance.now();
    -        const attack = "a" + "t".repeat(50_000);
    -        jar.setCookie(attack);
    -        console.log(`CookieJar.setCookie(): ${performance.now() - start}`);
    -        
    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

    -

    The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

    -

    Let’s take the following regular expression as an example:

    -
    regex = /A(B|C+)+D/
    -        
    -

    This regular expression accomplishes the following:

    -
      -
    • A The string must start with the letter 'A'
    • -
    • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
    • -
    • D Finally, we ensure this section of the string ends with a 'D'
    • -
    -

    The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

    -

    It most cases, it doesn't take very long for a regex engine to find a match:

    -
    $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
    -        0.04s user 0.01s system 95% cpu 0.052 total
    -        
    -        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
    -        1.79s user 0.02s system 99% cpu 1.812 total
    -        
    -

    The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

    -

    Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

    -

    Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

    -
      -
    1. CCC
    2. -
    3. CC+C
    4. -
    5. C+CC
    6. -
    7. C+C+C.
    8. -
    -

    The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

    -

    From there, the number of steps the engine must use to validate a string just continues to grow.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    StringNumber of C'sNumber of steps
    ACCCX338
    ACCCCX471
    ACCCCCX5136
    ACCCCCCCCCCCCCCX1465,553
    -

    By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

    -

    Remediation

    -

    Upgrade cookiejar to version 2.1.4 or higher.

    -

    References

    - - -
    - - - -
    -
    -
    -
    - - - diff --git a/docs/snyk/v2.4.19/ghcr.io_dexidp_dex_v2.35.3.html b/docs/snyk/v2.4.19/ghcr.io_dexidp_dex_v2.35.3.html deleted file mode 100644 index a7de0984fc218..0000000000000 --- a/docs/snyk/v2.4.19/ghcr.io_dexidp_dex_v2.35.3.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:21:42 am

    -
    -
    - Scanned the following path: -
      -
    • ghcr.io/dexidp/dex:v2.35.3/dexidp/dex (apk)
    • -
    -
    - -
    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    -
    14 dependencies
    -
    -
    -
    -
    -
    - - - - - - - -
    Project docker-image|ghcr.io/dexidp/dex
    Path ghcr.io/dexidp/dex:v2.35.3/dexidp/dex
    Package Manager apk
    -
    -
    - No known vulnerabilities detected. -
    -
    - - - diff --git a/docs/snyk/v2.4.19/redis_7.0.7-alpine.html b/docs/snyk/v2.4.19/redis_7.0.7-alpine.html deleted file mode 100644 index 8d5a799fcb574..0000000000000 --- a/docs/snyk/v2.4.19/redis_7.0.7-alpine.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:22:07 am

    -
    -
    - Scanned the following path: -
      -
    • redis:7.0.7-alpine (apk)
    • -
    -
    - -
    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    -
    18 dependencies
    -
    -
    -
    -
    -
    - - - - - - - -
    Project docker-image|redis
    Path redis:7.0.7-alpine
    Package Manager apk
    -
    -
    - No known vulnerabilities detected. -
    -
    - - - diff --git a/docs/snyk/v2.5.7/argocd-iac-install.html b/docs/snyk/v2.5.7/argocd-iac-install.html deleted file mode 100644 index b404470870cf4..0000000000000 --- a/docs/snyk/v2.5.7/argocd-iac-install.html +++ /dev/null @@ -1,2231 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:21:13 am

    -
    -
    - Scanned the following path: -
      -
    • /argo-cd/manifests/install.yaml (Kubernetes)
    • -
    -
    - -
    -
    32 total issues
    -
    -
    -
    -
    - -
    - - - - - - -
    Project manifests/install.yaml
    Path /argo-cd/manifests/install.yaml
    Project Type Kubernetes
    -
    -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 10] - - rules[0] - - resources - -
    • - -
    • - Line number: 9318 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 11] - - rules[4] - - resources - -
    • - -
    • - Line number: 9395 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 12] - - rules[0] - - resources - -
    • - -
    • - Line number: 9423 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 13] - - rules[3] - - resources - -
    • - -
    • - Line number: 9467 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 13] - - rules[1] - - resources - -
    • - -
    • - Line number: 9449 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Role with dangerous permissions

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-47 -
    • - -
    • Introduced through: - [DocId: 14] - - rules[0] - - resources - -
    • - -
    • - Line number: 9483 -
    • -
    - -
    - -

    Impact

    -

    Using this role grants dangerous permissions

    - -

    Remediation

    -

    Consider removing this permissions

    - - -
    -
    - - - -
    -
    -

    Container could be running with outdated image

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-42 -
    • - -
    • Introduced through: - [DocId: 46] - - spec - - template - - spec - - initContainers[copyutil] - - imagePullPolicy - -
    • - -
    • - Line number: 10420 -
    • -
    - -
    - -

    Impact

    -

    The container may run with outdated or unauthorized image

    - -

    Remediation

    -

    Set `imagePullPolicy` attribute to `Always`

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 42] - - input - - spec - - template - - spec - - containers[argocd-applicationset-controller] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 9950 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 43] - - input - - spec - - template - - spec - - initContainers[copyutil] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10063 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 43] - - input - - spec - - template - - spec - - containers[dex] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10029 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 44] - - input - - spec - - template - - spec - - containers[argocd-notifications-controller] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10119 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 45] - - input - - spec - - template - - spec - - containers[redis] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10193 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 46] - - input - - spec - - template - - spec - - initContainers[copyutil] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10420 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 46] - - input - - spec - - template - - spec - - containers[argocd-repo-server] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10249 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 47] - - input - - spec - - template - - spec - - containers[argocd-server] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10505 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container has no CPU limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-5 -
    • - -
    • Introduced through: - [DocId: 48] - - input - - spec - - template - - spec - - containers[argocd-application-controller] - - resources - - limits - - cpu - -
    • - -
    • - Line number: 10802 -
    • -
    - -
    - -

    Impact

    -

    CPU limits can prevent containers from consuming valuable compute time for no benefit (e.g. inefficient code) that might lead to unnecessary costs. It is advisable to also configure CPU requests to ensure application stability.

    - -

    Remediation

    -

    Add `resources.limits.cpu` field with required CPU limit value

    - - -
    -
    - - - -
    -
    -

    Container is running with multiple open ports

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-36 -
    • - -
    • Introduced through: - [DocId: 43] - - spec - - template - - spec - - containers[dex] - - ports - -
    • - -
    • - Line number: 10043 -
    • -
    - -
    - -

    Impact

    -

    Increases the attack surface of the application and the container.

    - -

    Remediation

    -

    Reduce `ports` count to 2

    - - -
    -
    - - - -
    -
    -

    Container is running with writable root filesystem

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-8 -
    • - -
    • Introduced through: - [DocId: 45] - - input - - spec - - template - - spec - - containers[redis] - - securityContext - - readOnlyRootFilesystem - -
    • - -
    • - Line number: 10203 -
    • -
    - -
    - -

    Impact

    -

    Compromised process could abuse writable root filesystem to elevate privileges

    - -

    Remediation

    -

    Set `securityContext.readOnlyRootFilesystem` to `true`

    - - -
    -
    - - - -
    -
    -

    Container is running without liveness probe

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-41 -
    • - -
    • Introduced through: - [DocId: 42] - - spec - - template - - spec - - containers[argocd-applicationset-controller] - - livenessProbe - -
    • - -
    • - Line number: 9950 -
    • -
    - -
    - -

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    - -

    Remediation

    -

    Add `livenessProbe` attribute

    - - -
    -
    - - - -
    -
    -

    Container is running without liveness probe

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-41 -
    • - -
    • Introduced through: - [DocId: 43] - - spec - - template - - spec - - containers[dex] - - livenessProbe - -
    • - -
    • - Line number: 10029 -
    • -
    - -
    - -

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    - -

    Remediation

    -

    Add `livenessProbe` attribute

    - - -
    -
    - - - -
    -
    -

    Container is running without liveness probe

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-41 -
    • - -
    • Introduced through: - [DocId: 43] - - spec - - template - - spec - - initContainers[copyutil] - - livenessProbe - -
    • - -
    • - Line number: 10063 -
    • -
    - -
    - -

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    - -

    Remediation

    -

    Add `livenessProbe` attribute

    - - -
    -
    - - - -
    -
    -

    Container is running without liveness probe

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-41 -
    • - -
    • Introduced through: - [DocId: 45] - - spec - - template - - spec - - containers[redis] - - livenessProbe - -
    • - -
    • - Line number: 10193 -
    • -
    - -
    - -

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    - -

    Remediation

    -

    Add `livenessProbe` attribute

    - - -
    -
    - - - -
    -
    -

    Container is running without liveness probe

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-41 -
    • - -
    • Introduced through: - [DocId: 46] - - spec - - template - - spec - - initContainers[copyutil] - - livenessProbe - -
    • - -
    • - Line number: 10420 -
    • -
    - -
    - -

    Impact

    -

    Kubernetes will not be able to detect if application is able to service requests, and will not restart unhealthy pods

    - -

    Remediation

    -

    Add `livenessProbe` attribute

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 42] - - input - - spec - - template - - spec - - containers[argocd-applicationset-controller] - - resources - - limits - - memory - -
    • - -
    • - Line number: 9950 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 43] - - input - - spec - - template - - spec - - containers[dex] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10029 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 43] - - input - - spec - - template - - spec - - initContainers[copyutil] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10063 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 44] - - input - - spec - - template - - spec - - containers[argocd-notifications-controller] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10119 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 45] - - input - - spec - - template - - spec - - containers[redis] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10193 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 46] - - input - - spec - - template - - spec - - initContainers[copyutil] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10420 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 46] - - input - - spec - - template - - spec - - containers[argocd-repo-server] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10249 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 47] - - input - - spec - - template - - spec - - containers[argocd-server] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10505 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -

    Container is running without memory limit

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Public ID: SNYK-CC-K8S-4 -
    • - -
    • Introduced through: - [DocId: 48] - - input - - spec - - template - - spec - - containers[argocd-application-controller] - - resources - - limits - - memory - -
    • - -
    • - Line number: 10802 -
    • -
    - -
    - -

    Impact

    -

    Containers without memory limits are more likely to be terminated when the node runs out of memory

    - -

    Remediation

    -

    Set `resources.limits.memory` value

    - - -
    -
    - - - -
    -
    -
    - -
    - - - diff --git a/docs/snyk/v2.5.7/argocd-test.html b/docs/snyk/v2.5.7/argocd-test.html deleted file mode 100644 index 98e81d5448610..0000000000000 --- a/docs/snyk/v2.5.7/argocd-test.html +++ /dev/null @@ -1,3434 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:19:59 am

    -
    -
    - Scanned the following paths: -
      -
    • /argo-cd/argoproj/argo-cd/v2 (gomodules)
    • /argo-cd (yarn)
    • -
    -
    - -
    -
    8 known vulnerabilities
    -
    130 vulnerable dependency paths
    -
    1720 dependencies
    -
    -
    -
    -
    - -
    -
    -
    -

    Server-side Request Forgery (SSRF)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - parse-url -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, git-url-parse@11.6.0 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - git-url-parse@11.6.0 - - git-up@4.0.5 - - parse-url@6.0.5 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    parse-url is an An advanced url parser supporting git urls too.

    -

    Affected versions of this package are vulnerable to Server-side Request Forgery (SSRF) due to improper detection of protocol, resource, and pathname fields. Exploiting this vulnerability results in bypassing protocol verification.

    -

    PoC:

    -
    import parseUrl from "parse-url";
    -        import fetch from 'node-fetch';
    -        var parsed=parseUrl("http://nnnn@localhost:808:/?id=xss")
    -        if(parsed.resource=="localhost"){
    -        console.log("internal network access is blocked")
    -        }
    -        else{
    -           const response = await fetch('http://'+parsed.resource+parsed.pathname);
    -                console.log(response)
    -         }
    -        
    -

    Remediation

    -

    Upgrade parse-url to version 8.1.0 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Improper Input Validation

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - parse-url -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, git-url-parse@11.6.0 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - git-url-parse@11.6.0 - - git-up@4.0.5 - - parse-url@6.0.5 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    parse-url is an An advanced url parser supporting git urls too.

    -

    Affected versions of this package are vulnerable to Improper Input Validation due to incorrect parsing of URLs. This allows the attacker to craft a malformed URL which can lead to a phishing attack.

    -
    
    -        const parseUrl = require("parse-url");
    -        const Url = require("url");
    -        
    -        const express = require('express');
    -        const app = express();
    -        
    -        var url = "https://www.google.com:x@fakesite.com:x";
    -        parsed = parseUrl(url);
    -        console.log("[*]`parse-url` output: ")
    -        console.log(parsed);
    -        
    -        parsed2 = Url.parse(url);
    -        console.log("[*]`url` output: ")
    -        console.log(parsed2)
    -        
    -        app.get('/', (req, res) => {
    -            if (parsed.host == "www.google.com") {
    -                res.send("<a href=\'" + parsed2.href + "\'>CLICK ME!</a>")
    -            }
    -        })
    -        
    -        app.listen(8888,"0.0.0.0");
    -        
    -

    Remediation

    -

    Upgrade parse-url to version 8.1.0 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Regular Expression Denial of Service (ReDoS)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - minimatch -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, redoc@2.0.0-rc.64 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - redoc@2.0.0-rc.64 - - @redocly/openapi-core@1.0.0-beta.82 - - minimatch@3.0.4 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    minimatch is a minimal matching utility.

    -

    Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the braceExpand function in minimatch.js.

    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

    -

    The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

    -

    Let’s take the following regular expression as an example:

    -
    regex = /A(B|C+)+D/
    -        
    -

    This regular expression accomplishes the following:

    -
      -
    • A The string must start with the letter 'A'
    • -
    • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
    • -
    • D Finally, we ensure this section of the string ends with a 'D'
    • -
    -

    The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

    -

    It most cases, it doesn't take very long for a regex engine to find a match:

    -
    $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
    -        0.04s user 0.01s system 95% cpu 0.052 total
    -        
    -        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
    -        1.79s user 0.02s system 99% cpu 1.812 total
    -        
    -

    The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

    -

    Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

    -

    Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

    -
      -
    1. CCC
    2. -
    3. CC+C
    4. -
    5. C+CC
    6. -
    7. C+C+C.
    8. -
    -

    The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

    -

    From there, the number of steps the engine must use to validate a string just continues to grow.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    StringNumber of C'sNumber of steps
    ACCCX338
    ACCCCX471
    ACCCCCX5136
    ACCCCCCCCCCCCCCX1465,553
    -

    By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

    -

    Remediation

    -

    Upgrade minimatch to version 3.0.5 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Denial of Service (DoS)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - golang.org/x/net/http2 -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, k8s.io/client-go/rest@0.24.2 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/improbable-eng/grpc-web/go/grpcweb@#16092bd1d58a - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/soheilhy/cmux@0.1.5 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/dynamic@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/transport/spdy@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/pkg/kubeclientmetrics@#36c59d8fafe0 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/testing@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/azure@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/gcp@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/oidc@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/record@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/listers/core/v1@0.24.2 - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers/core/v1@0.24.2 - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers@0.24.2 - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/clientcmd@0.24.2 - - k8s.io/client-go/tools/auth@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#4d8552b0775f - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery/fake@0.24.2 - - k8s.io/client-go/testing@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes/fake@0.24.2 - - k8s.io/client-go/testing@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/remotecommand@0.24.2 - - k8s.io/client-go/transport/spdy@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware@1.3.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/auth@1.3.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/retry@1.3.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-prometheus@1.2.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc/health/grpc_health_v1@1.45.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus@1.3.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/improbable-eng/grpc-web/go/grpcweb@#16092bd1d58a - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc@0.31.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc@1.6.3 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/cache@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/utils/kube@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#4d8552b0775f - - k8s.io/client-go/tools/clientcmd@0.24.2 - - k8s.io/client-go/tools/auth@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/term@0.24.2 - - k8s.io/client-go/tools/remotecommand@0.24.2 - - k8s.io/client-go/transport/spdy@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/api/rbac/v1@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/api/core/v1@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/api/errors@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/api/equality@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/dynamic@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/transport/spdy@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/pkg/kubeclientmetrics@#36c59d8fafe0 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/testing@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/azure@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/gcp@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/plugin/pkg/client/auth/oidc@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc/reflection@1.45.0 - - google.golang.org/grpc/reflection/grpc_reflection_v1alpha@1.45.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - google.golang.org/grpc/health@1.45.0 - - google.golang.org/grpc/health/grpc_health_v1@1.45.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/health@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/utils/kube@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/common@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/utils/kube@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/controller/controllerutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/envtest@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/testing/controlplane@0.11.0 - - k8s.io/client-go/tools/clientcmd@0.24.2 - - k8s.io/client-go/tools/auth@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/util/managedfields@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/resource@#98ccd3d43fd9 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/common@#98ccd3d43fd9 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/hook@#98ccd3d43fd9 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/ignore@#98ccd3d43fd9 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/syncwaves@#98ccd3d43fd9 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/utils/testing@#98ccd3d43fd9 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/record@0.24.2 - - k8s.io/client-go/tools/reference@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/tools/pager@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/pkg/apis/clientauthentication/v1beta1@0.24.2 - - k8s.io/client-go/pkg/apis/clientauthentication@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/scheme@0.11.0 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/util/retry@0.24.2 - - k8s.io/apimachinery/pkg/api/errors@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/resource@0.24.2 - - k8s.io/api/core/v1@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/health@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/podutils@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/api/validation@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/validation@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/portforward@0.24.2 - - k8s.io/api/core/v1@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/discovery/fake@0.24.2 - - k8s.io/client-go/testing@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes/fake@0.24.2 - - k8s.io/client-go/testing@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/remotecommand@0.24.2 - - k8s.io/client-go/transport/spdy@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/grpc-ecosystem/go-grpc-middleware/tags/logrus@1.3.0 - - github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus@1.3.0 - - github.com/grpc-ecosystem/go-grpc-middleware/tags@1.3.0 - - google.golang.org/grpc@1.45.0 - - google.golang.org/grpc/internal/transport@1.45.0 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/cache@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/cache@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/utils/kube@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/apimachinery/pkg/runtime/serializer@0.24.2 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/listers/core/v1@0.24.2 - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/tools/pager@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/tools/pager@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers/core/v1@0.24.2 - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/tools/pager@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/informers@0.24.2 - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/tools/pager@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#4d8552b0775f - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/tools/pager@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/kubectl/pkg/util/term@0.24.2 - - k8s.io/client-go/tools/remotecommand@0.24.2 - - k8s.io/client-go/transport/spdy@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/hook@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/sync/hook/helm@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/sync/common@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/utils/kube@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/syncwaves@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/sync/hook/helm@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/sync/common@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/utils/kube@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/manager@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/webhook@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/metrics@0.11.0 - - k8s.io/client-go/tools/cache@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/event@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/tools/clientcmd@0.24.2 - - k8s.io/client-go/tools/clientcmd/api/latest@0.24.2 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - k8s.io/client-go/kubernetes/scheme@0.24.2 - - k8s.io/apimachinery/pkg/runtime/serializer@0.24.2 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/controller/controllerutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/sync/ignore@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/sync/hook@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/sync/hook/helm@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/sync/common@#98ccd3d43fd9 - - github.com/argoproj/gitops-engine/pkg/utils/kube@#98ccd3d43fd9 - - k8s.io/kubectl/pkg/util/openapi@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/handler@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/runtime/inject@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/diff@#98ccd3d43fd9 - - k8s.io/client-go/kubernetes/scheme@0.24.2 - - k8s.io/apimachinery/pkg/runtime/serializer@0.24.2 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/envtest@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/webhook/conversion@0.11.0 - - k8s.io/apimachinery/pkg/runtime/serializer@0.24.2 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#4d8552b0775f - - k8s.io/client-go/tools/clientcmd@0.24.2 - - k8s.io/client-go/tools/clientcmd/api/latest@0.24.2 - - k8s.io/apimachinery/pkg/runtime/serializer/versioning@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1/unstructured@0.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/gitops-engine/pkg/utils/kube/scheme@#98ccd3d43fd9 - - k8s.io/kubernetes/pkg/apis/storage/install@1.24.2 - - k8s.io/kubernetes/pkg/apis/storage/v1beta1@1.24.2 - - k8s.io/kubernetes/pkg/apis/storage@1.24.2 - - k8s.io/kubernetes/pkg/apis/core@1.24.2 - - k8s.io/apimachinery/pkg/apis/meta/v1@0.24.2 - - k8s.io/apimachinery/pkg/watch@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/cache@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/event@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/source@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/source/internal@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/predicate@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/event@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/handler@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/runtime/inject@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - sigs.k8s.io/controller-runtime/pkg/source@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/source/internal@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/predicate@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/event@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/internal/objectutil@0.11.0 - - sigs.k8s.io/controller-runtime/pkg/client/apiutil@0.11.0 - - k8s.io/client-go/restmapper@0.24.2 - - k8s.io/client-go/discovery@0.24.2 - - k8s.io/client-go/rest@0.24.2 - - k8s.io/client-go/transport@0.24.2 - - k8s.io/apimachinery/pkg/util/net@0.24.2 - - golang.org/x/net/http2@#9d032be2e588 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

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

    -

    Affected versions of this package are vulnerable to Denial of Service (DoS) due to improper checks and limitations for the number of entries in the cache, which can allow an attacker to consume unbounded amounts of memory by sending a small number of very large keys.

    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its intended and legitimate users.

    -

    Unlike other vulnerabilities, DoS attacks usually do not aim at breaching security. Rather, they are focused on making websites and services unavailable to genuine users resulting in downtime.

    -

    One popular Denial of Service vulnerability is DDoS (a Distributed Denial of Service), an attack that attempts to clog network pipes to the system by generating a large volume of traffic from many machines.

    -

    When it comes to open source libraries, DoS vulnerabilities allow attackers to trigger such a crash or crippling of the service by using a flaw either in the application code or from the use of open source libraries.

    -

    Two common types of DoS vulnerabilities:

    -
      -
    • High CPU/Memory Consumption- An attacker sending crafted requests that could cause the system to take a disproportionate amount of time to process. For example, commons-fileupload:commons-fileupload.

      -
    • -
    • Crash - An attacker sending crafted requests that could cause the system to crash. For Example, npm ws package

      -
    • -
    -

    Remediation

    -

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

    -

    References

    - - -
    - - - -
    -
    -

    Improper Input Validation

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - go.mongodb.org/mongo-driver/bson/bsonrw -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, github.com/go-openapi/runtime/middleware@0.19.4 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/go-openapi/runtime/middleware@0.19.4 - - github.com/go-openapi/validate@0.19.5 - - github.com/go-openapi/strfmt@0.19.3 - - go.mongodb.org/mongo-driver/bson@1.1.2 - - go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/go-openapi/runtime/middleware@0.19.4 - - github.com/go-openapi/validate@0.19.5 - - github.com/go-openapi/strfmt@0.19.3 - - go.mongodb.org/mongo-driver/bson@1.1.2 - - go.mongodb.org/mongo-driver/bson/bsoncodec@1.1.2 - - go.mongodb.org/mongo-driver/bson/bsonrw@1.1.2 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    go.mongodb.org/mongo-driver/bson/bsonrw is a The MongoDB supported driver for Go.

    -

    Affected versions of this package are vulnerable to Improper Input Validation. Specific cstrings input may not be properly validated in the MongoDB Go Driver when marshalling Go objects into BSON. A malicious user could use a Go object with specific string to potentially inject additional fields into marshalled documents.

    -

    Remediation

    -

    Upgrade go.mongodb.org/mongo-driver/bson/bsonrw to version 1.5.1 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Insecure Randomness

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - github.com/Masterminds/goutils -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, github.com/Masterminds/sprig@2.22.0 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f - - github.com/argoproj/notifications-engine/pkg/templates@#4d8552b0775f - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#4d8552b0775f - - github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f - - github.com/argoproj/notifications-engine/pkg/templates@#4d8552b0775f - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#4d8552b0775f - - github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f - - github.com/argoproj/notifications-engine/pkg/templates@#4d8552b0775f - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    github.com/masterminds/goutils is a provides users with utility functions to manipulate strings in various ways.

    -

    Affected versions of this package are vulnerable to Insecure Randomness via the RandomAlphaNumeric(int) and CryptoRandomAlphaNumeric(int) functions. Small values of int in the functions above will return a smaller subset of results than they should. For example, RandomAlphaNumeric(1) would always return a digit in the 0-9 range, while RandomAlphaNumeric(4) return around ~7 million of the ~13M possible permutations.

    -

    Remediation

    -

    Upgrade github.com/masterminds/goutils to version 1.1.1 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Insecure Randomness

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: golang -
    • -
    • - Vulnerable module: - - github.com/Masterminds/goutils -
    • - -
    • Introduced through: - - - github.com/argoproj/argo-cd/v2@0.0.0, github.com/Masterminds/sprig@2.22.0 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f - - github.com/argoproj/notifications-engine/pkg/templates@#4d8552b0775f - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/cmd@#4d8552b0775f - - github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f - - github.com/argoproj/notifications-engine/pkg/templates@#4d8552b0775f - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    • - Introduced through: - github.com/argoproj/argo-cd/v2@0.0.0 - - github.com/argoproj/notifications-engine/pkg/controller@#4d8552b0775f - - github.com/argoproj/notifications-engine/pkg/api@#4d8552b0775f - - github.com/argoproj/notifications-engine/pkg/templates@#4d8552b0775f - - github.com/Masterminds/sprig@2.22.0 - - github.com/Masterminds/goutils@1.1.0 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    github.com/masterminds/goutils is a provides users with utility functions to manipulate strings in various ways.

    -

    Affected versions of this package are vulnerable to Insecure Randomness when randomly-generated alphanumeric strings contain significantly less entropy than expected, the RandomAlphaNumeric and CryptoRandomAlphaNumeric functions always return strings containing at least one digit from 0 to 9. This significantly reduces the amount of entropy in short strings generated by these functions.

    -

    Remediation

    -

    Upgrade github.com/masterminds/goutils to version 1.1.1 or higher.

    -

    References

    - - -
    - - - -
    -
    -

    Regular Expression Denial of Service (ReDoS)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - cookiejar -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, superagent@7.1.6 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - superagent@7.1.6 - - cookiejar@2.1.3 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the Cookie.parse function, which uses an insecure regular expression.

    -

    PoC

    -
    const { CookieJar } = require("cookiejar");
    -        
    -        const jar = new CookieJar();
    -        
    -        const start = performance.now();
    -        const attack = "a" + "t".repeat(50_000);
    -        jar.setCookie(attack);
    -        console.log(`CookieJar.setCookie(): ${performance.now() - start}`);
    -        
    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

    -

    The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

    -

    Let’s take the following regular expression as an example:

    -
    regex = /A(B|C+)+D/
    -        
    -

    This regular expression accomplishes the following:

    -
      -
    • A The string must start with the letter 'A'
    • -
    • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
    • -
    • D Finally, we ensure this section of the string ends with a 'D'
    • -
    -

    The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

    -

    It most cases, it doesn't take very long for a regex engine to find a match:

    -
    $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
    -        0.04s user 0.01s system 95% cpu 0.052 total
    -        
    -        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
    -        1.79s user 0.02s system 99% cpu 1.812 total
    -        
    -

    The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

    -

    Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

    -

    Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

    -
      -
    1. CCC
    2. -
    3. CC+C
    4. -
    5. C+CC
    6. -
    7. C+C+C.
    8. -
    -

    The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

    -

    From there, the number of steps the engine must use to validate a string just continues to grow.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    StringNumber of C'sNumber of steps
    ACCCX338
    ACCCCX471
    ACCCCCX5136
    ACCCCCCCCCCCCCCX1465,553
    -

    By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

    -

    Remediation

    -

    Upgrade cookiejar to version 2.1.4 or higher.

    -

    References

    - - -
    - - - -
    -
    -
    -
    - - - diff --git a/docs/snyk/v2.5.7/ghcr.io_dexidp_dex_v2.35.3.html b/docs/snyk/v2.5.7/ghcr.io_dexidp_dex_v2.35.3.html deleted file mode 100644 index 1462625622f11..0000000000000 --- a/docs/snyk/v2.5.7/ghcr.io_dexidp_dex_v2.35.3.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:20:03 am

    -
    -
    - Scanned the following path: -
      -
    • ghcr.io/dexidp/dex:v2.35.3/dexidp/dex (apk)
    • -
    -
    - -
    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    -
    14 dependencies
    -
    -
    -
    -
    -
    - - - - - - - -
    Project docker-image|ghcr.io/dexidp/dex
    Path ghcr.io/dexidp/dex:v2.35.3/dexidp/dex
    Package Manager apk
    -
    -
    - No known vulnerabilities detected. -
    -
    - - - diff --git a/docs/snyk/v2.5.7/redis_7.0.7-alpine.html b/docs/snyk/v2.5.7/redis_7.0.7-alpine.html deleted file mode 100644 index c875196a099f9..0000000000000 --- a/docs/snyk/v2.5.7/redis_7.0.7-alpine.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:20:24 am

    -
    -
    - Scanned the following path: -
      -
    • redis:7.0.7-alpine (apk)
    • -
    -
    - -
    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    -
    18 dependencies
    -
    -
    -
    -
    -
    - - - - - - - -
    Project docker-image|redis
    Path redis:7.0.7-alpine
    Package Manager apk
    -
    -
    - No known vulnerabilities detected. -
    -
    - - - diff --git a/docs/snyk/v2.6.0-rc4/argocd-test.html b/docs/snyk/v2.6.0-rc4/argocd-test.html deleted file mode 100644 index 805621ccfd351..0000000000000 --- a/docs/snyk/v2.6.0-rc4/argocd-test.html +++ /dev/null @@ -1,623 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:17:46 am

    -
    -
    - Scanned the following paths: -
      -
    • /argo-cd/argoproj/argo-cd/v2 (gomodules)
    • /argo-cd (yarn)
    • -
    -
    - -
    -
    1 known vulnerabilities
    -
    1 vulnerable dependency paths
    -
    1730 dependencies
    -
    -
    -
    -
    - -
    -
    -
    -

    Regular Expression Denial of Service (ReDoS)

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: npm -
    • -
    • - Vulnerable module: - - cookiejar -
    • - -
    • Introduced through: - - - argo-cd-ui@1.0.0, superagent@7.1.6 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - argo-cd-ui@1.0.0 - - superagent@7.1.6 - - cookiejar@2.1.3 - - - -
    • -
    - -
    - -
    - -

    Overview

    -

    Affected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the Cookie.parse function, which uses an insecure regular expression.

    -

    PoC

    -
    const { CookieJar } = require("cookiejar");
    -        
    -        const jar = new CookieJar();
    -        
    -        const start = performance.now();
    -        const attack = "a" + "t".repeat(50_000);
    -        jar.setCookie(attack);
    -        console.log(`CookieJar.setCookie(): ${performance.now() - start}`);
    -        
    -

    Details

    -

    Denial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.

    -

    The Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.

    -

    Let’s take the following regular expression as an example:

    -
    regex = /A(B|C+)+D/
    -        
    -

    This regular expression accomplishes the following:

    -
      -
    • A The string must start with the letter 'A'
    • -
    • (B|C+)+ The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the + matches one or more times). The + at the end of this section states that we can look for one or more matches of this section.
    • -
    • D Finally, we ensure this section of the string ends with a 'D'
    • -
    -

    The expression would match inputs such as ABBD, ABCCCCD, ABCBCCCD and ACCCCCD

    -

    It most cases, it doesn't take very long for a regex engine to find a match:

    -
    $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD")'
    -        0.04s user 0.01s system 95% cpu 0.052 total
    -        
    -        $ time node -e '/A(B|C+)+D/.test("ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX")'
    -        1.79s user 0.02s system 99% cpu 1.812 total
    -        
    -

    The entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.

    -

    Most Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as catastrophic backtracking.

    -

    Let's look at how our expression runs into this problem, using a shorter string: "ACCCX". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:

    -
      -
    1. CCC
    2. -
    3. CC+C
    4. -
    5. C+CC
    6. -
    7. C+C+C.
    8. -
    -

    The engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use RegEx 101 debugger to see the engine has to take a total of 38 steps before it can determine the string doesn't match.

    -

    From there, the number of steps the engine must use to validate a string just continues to grow.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    StringNumber of C'sNumber of steps
    ACCCX338
    ACCCCX471
    ACCCCCX5136
    ACCCCCCCCCCCCCCX1465,553
    -

    By the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.

    -

    Remediation

    -

    Upgrade cookiejar to version 2.1.4 or higher.

    -

    References

    - - -
    - - - -
    -
    -
    -
    - - - diff --git a/docs/snyk/v2.6.0-rc4/ghcr.io_dexidp_dex_v2.35.3.html b/docs/snyk/v2.6.0-rc4/ghcr.io_dexidp_dex_v2.35.3.html deleted file mode 100644 index b67180db9cea3..0000000000000 --- a/docs/snyk/v2.6.0-rc4/ghcr.io_dexidp_dex_v2.35.3.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:17:50 am

    -
    -
    - Scanned the following path: -
      -
    • ghcr.io/dexidp/dex:v2.35.3/dexidp/dex (apk)
    • -
    -
    - -
    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    -
    14 dependencies
    -
    -
    -
    -
    -
    - - - - - - - -
    Project docker-image|ghcr.io/dexidp/dex
    Path ghcr.io/dexidp/dex:v2.35.3/dexidp/dex
    Package Manager apk
    -
    -
    - No known vulnerabilities detected. -
    -
    - - - diff --git a/docs/snyk/v2.6.0-rc4/quay.io_argoproj_argocd_v2.6.0-rc4.html b/docs/snyk/v2.6.0-rc4/quay.io_argoproj_argocd_v2.6.0-rc4.html deleted file mode 100644 index 691d2db5efd00..0000000000000 --- a/docs/snyk/v2.6.0-rc4/quay.io_argoproj_argocd_v2.6.0-rc4.html +++ /dev/null @@ -1,2649 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:18:09 am

    -
    -
    - Scanned the following path: -
      -
    • quay.io/argoproj/argocd:v2.6.0-rc4/argoproj/argocd (deb)
    • -
    -
    - -
    -
    16 known vulnerabilities
    -
    102 vulnerable dependency paths
    -
    162 dependencies
    -
    -
    -
    -
    -
    - - - - - - - -
    Project docker-image|quay.io/argoproj/argocd
    Path quay.io/argoproj/argocd:v2.6.0-rc4/argoproj/argocd
    Package Manager deb
    Manifest Dockerfile
    -
    -
    -
    -
    -

    Off-by-one Error

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - systemd/libsystemd0 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and systemd/libsystemd0@249.11-0ubuntu3.6 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - apt@2.4.8 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - procps/libprocps8@2:3.3.17-6ubuntu2 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - util-linux@2.37.2-4ubuntu3 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - util-linux/bsdutils@1:2.37.2-4ubuntu3 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - apt@2.4.8 - - apt/libapt-pkg6.0@2.4.8 - - systemd/libsystemd0@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - systemd/libudev1@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - libfido2/libfido2-1@1.10.0-1 - - systemd/libudev1@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - util-linux@2.37.2-4ubuntu3 - - systemd/libudev1@249.11-0ubuntu3.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - apt@2.4.8 - - apt/libapt-pkg6.0@2.4.8 - - systemd/libudev1@249.11-0ubuntu3.6 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream systemd package.

    -

    An off-by-one Error issue was discovered in Systemd in format_timespan() function of time-util.c. An attacker could supply specific values for time and accuracy that leads to buffer overrun in format_timespan(), leading to a Denial of Service.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 systemd.

    -

    References

    - - -
    - - - -
    -
    -

    Integer Overflow or Wraparound

    -
    - -
    - medium severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - krb5/libk5crypto3 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and krb5/libk5crypto3@1.19.2-2 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - meta-common-packages@meta - - krb5/libkrb5support0@1.19.2-2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream krb5 package.

    -

    PAC parsing in MIT Kerberos 5 (aka krb5) before 1.19.4 and 1.20.x before 1.20.1 has integer overflows that may lead to remote code execution (in KDC, kadmind, or a GSS or Kerberos application server) on 32-bit platforms (which have a resultant heap-based buffer overflow), and cause a denial of service on other platforms. This occurs in krb5_pac_parse in lib/krb5/krb/pac.c. Heimdal before 7.7.1 has "a similar bug."

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 krb5.

    -

    References

    - - -
    - - - -
    -
    -

    CVE-2022-46908

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - sqlite3/libsqlite3-0 -
    • - -
    • Introduced through: - - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4, gnupg2/gpg@2.2.27-3ubuntu2.1 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - sqlite3/libsqlite3-0@3.37.2-2ubuntu0.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream sqlite3 package.

    -

    SQLite through 3.40.0, when relying on --safe for execution of an untrusted CLI script, does not properly implement the azProhibitedFunctions protection mechanism, and instead allows UDF functions such as WRITEFILE.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 sqlite3.

    -

    References

    - - -
    - - - -
    -
    -

    Uncontrolled Recursion

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - pcre3/libpcre3 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - grep@3.7-1build1 - - pcre3/libpcre3@2:8.39-13ubuntu0.22.04.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream pcre3 package.

    -

    In PCRE 8.41, the OP_KETRMAX feature in the match function in pcre_exec.c allows stack exhaustion (uncontrolled recursion) when processing a crafted regular expression.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 pcre3.

    -

    References

    - - -
    - - - -
    -
    -

    Release of Invalid Pointer or Reference

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - patch -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and patch@2.7.6-7build2 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - patch@2.7.6-7build2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream patch package.

    -

    An Invalid Pointer vulnerability exists in GNU patch 2.7 via the another_hunk function, which causes a Denial of Service.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 patch.

    -

    References

    - - -
    - - - -
    -
    -

    Double Free

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - patch -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and patch@2.7.6-7build2 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - patch@2.7.6-7build2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream patch package.

    -

    A double free exists in the another_hunk function in pch.c in GNU patch through 2.7.6.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 patch.

    -

    References

    - - -
    - - - -
    -
    -

    Improper Locking

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - openssl/libssl3 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and openssl/libssl3@3.0.2-0ubuntu1.7 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - cyrus-sasl2/libsasl2-modules@2.1.27+dfsg2-3ubuntu1.1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - libfido2/libfido2-1@1.10.0-1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - ca-certificates@20211016ubuntu0.22.04.1 - - openssl@3.0.2-0ubuntu1.7 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - openssl/libssl3@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - openssl@3.0.2-0ubuntu1.7 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - ca-certificates@20211016ubuntu0.22.04.1 - - openssl@3.0.2-0ubuntu1.7 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream openssl package.

    -

    If an X.509 certificate contains a malformed policy constraint and policy processing is enabled, then a write lock will be taken twice recursively. On some operating systems (most widely: Windows) this results in a denial of service when the affected process hangs. Policy processing being enabled on a publicly facing server is not considered to be a common setup. Policy processing is enabled by passing the -policy&#39; argument to the command line utilities or by calling either X509_VERIFY_PARAM_add0_policy()' or `X509_VERIFY_PARAM_set1_policies()' functions.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 openssl.

    -

    References

    - - -
    - - - -
    -
    -

    CVE-2021-41617

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - openssh/openssh-client -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and openssh/openssh-client@1:8.9p1-3ubuntu0.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream openssh package.

    -

    sshd in OpenSSH 6.2 through 8.x before 8.8, when certain non-default configurations are used, allows privilege escalation because supplemental groups are not initialized as expected. Helper programs for AuthorizedKeysCommand and AuthorizedPrincipalsCommand may run with privileges associated with group memberships of the sshd process, if the configuration specifies running the command as a different user.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 openssh.

    -

    References

    - - -
    - - - -
    -
    -

    Information Exposure

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - openssh/openssh-client -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and openssh/openssh-client@1:8.9p1-3ubuntu0.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream openssh package.

    -

    The client side in OpenSSH 5.7 through 8.4 has an Observable Discrepancy leading to an information leak in the algorithm negotiation. This allows man-in-the-middle attackers to target initial connection attempts (where no host key for the server has been cached by the client). NOTE: some reports state that 8.5 and 8.6 are also affected.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 openssh.

    -

    References

    - - -
    - - - -
    -
    -

    Out-of-bounds Read

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - ncurses/libtinfo6 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and ncurses/libtinfo6@6.3-2 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - bash@5.1-6ubuntu1 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - ncurses/libncursesw6@6.3-2 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - less@590-1build1 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - libedit/libedit2@3.1-20210910-1build1 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - ncurses/libncurses6@6.3-2 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - ncurses/ncurses-bin@6.3-2 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - procps@2:3.3.17-6ubuntu2 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - util-linux@2.37.2-4ubuntu3 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - readline/libreadline8@8.1.2-1 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - pinentry/pinentry-curses@1.1.1-1build2 - - ncurses/libtinfo6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - ncurses/libncursesw6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - procps@2:3.3.17-6ubuntu2 - - ncurses/libncursesw6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - pinentry/pinentry-curses@1.1.1-1build2 - - ncurses/libncursesw6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - ncurses/libncurses6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - procps@2:3.3.17-6ubuntu2 - - ncurses/libncurses6@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - ncurses/ncurses-base@6.3-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - ncurses/ncurses-bin@6.3-2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream ncurses package.

    -

    ncurses 6.3 before patch 20220416 has an out-of-bounds read and segmentation violation in convert_strings in tinfo/read_entry.c in the terminfo library.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 ncurses.

    -

    References

    - - -
    - - - -
    -
    -

    Integer Overflow or Wraparound

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - krb5/libk5crypto3 -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and krb5/libk5crypto3@1.19.2-2 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - krb5/libk5crypto3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - krb5/libkrb5-3@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - openssh/openssh-client@1:8.9p1-3ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - git@1:2.34.1-1ubuntu1.6 - - curl/libcurl3-gnutls@7.81.0-1ubuntu1.7 - - libssh/libssh-4@0.9.6-2build1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - adduser@3.118ubuntu5 - - shadow/passwd@1:4.8.1-2ubuntu2.1 - - pam/libpam-modules@1.4.0-11ubuntu2 - - libnsl/libnsl2@1.3.0-2build2 - - libtirpc/libtirpc3@1.3.2-2ubuntu0.1 - - krb5/libgssapi-krb5-2@1.19.2-2 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - meta-common-packages@meta - - krb5/libkrb5support0@1.19.2-2 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream krb5 package.

    -

    An issue was discovered in MIT Kerberos 5 (aka krb5) through 1.16. There is a variable "dbentry->n_key_data" in kadmin/dbutil/dump.c that can store 16-bit data but unknowingly the developer has assigned a "u4" variable to it, which is for 32-bit data. An attacker can use this vulnerability to affect other artifacts of the database as we know that a Kerberos database dump file contains trusted data.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 krb5.

    -

    References

    - - -
    - - - -
    -
    -

    CVE-2022-3219

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - gnupg2/gpgv -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and gnupg2/gpgv@2.2.27-3ubuntu2.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - apt@2.4.8 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgv@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - gnupg2/gpgconf@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - gnupg2/dirmngr@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg-l10n@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gnupg-l10n@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg-utils@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gnupg-utils@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - gnupg2/gpg@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - gnupg2/gpg-agent@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-client@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpg-wks-server@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - gnupg2/gpgsm@2.2.27-3ubuntu2.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - gnupg2/gnupg@2.2.27-3ubuntu2.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    This vulnerability has not been analyzed by NVD yet.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 gnupg2.

    -

    References

    - - -
    - - - -
    -
    -

    Allocation of Resources Without Limits or Throttling

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - glibc/libc-bin -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and glibc/libc-bin@2.35-0ubuntu3.1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - glibc/libc-bin@2.35-0ubuntu3.1 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - meta-common-packages@meta - - glibc/libc6@2.35-0ubuntu3.1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream glibc package.

    -

    sha256crypt and sha512crypt through 0.6 allow attackers to cause a denial of service (CPU consumption) because the algorithm's runtime is proportional to the square of the length of the password.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 glibc.

    -

    References

    - - -
    - - - -
    -
    -

    Improper Input Validation

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - git/git-man -
    • - -
    • Introduced through: - - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4, git@1:2.34.1-1ubuntu1.6 and others -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - git@1:2.34.1-1ubuntu1.6 - - git/git-man@1:2.34.1-1ubuntu1.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - git@1:2.34.1-1ubuntu1.6 - - - -
    • -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - git-lfs@3.0.2-1 - - git@1:2.34.1-1ubuntu1.6 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream git package.

    -

    GIT version 2.15.1 and earlier contains a Input Validation Error vulnerability in Client that can result in problems including messing up terminal configuration to RCE. This attack appear to be exploitable via The user must interact with a malicious git server, (or have their traffic modified in a MITM attack).

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 git.

    -

    References

    - - -
    - - - -
    -
    -

    Improper Input Validation

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - coreutils -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and coreutils@8.32-4.1ubuntu1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - coreutils@8.32-4.1ubuntu1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream coreutils package.

    -

    chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 coreutils.

    -

    References

    - - -
    - - - -
    -
    -

    Out-of-bounds Write

    -
    - -
    - low severity -
    - -
    - -
      -
    • - Package Manager: ubuntu:22.04 -
    • -
    • - Vulnerable module: - - bash -
    • - -
    • Introduced through: - - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 and bash@5.1-6ubuntu1 - -
    • -
    - -
    - - -

    Detailed paths

    - -
      -
    • - Introduced through: - docker-image|quay.io/argoproj/argocd@v2.6.0-rc4 - - bash@5.1-6ubuntu1 - - - -
    • -
    - -
    - -
    - -

    NVD Description

    -

    Note: Versions mentioned in the description apply to the upstream bash package.

    -

    A flaw was found in the bash package, where a heap-buffer overflow can occur in valid parameter_transform. This issue may lead to memory problems.

    -

    Remediation

    -

    There is no fixed version for Ubuntu:22.04 bash.

    -

    References

    - - -
    - - - -
    -
    -
    -
    - - - diff --git a/docs/snyk/v2.6.0-rc4/redis_7.0.7-alpine.html b/docs/snyk/v2.6.0-rc4/redis_7.0.7-alpine.html deleted file mode 100644 index e25016be291ae..0000000000000 --- a/docs/snyk/v2.6.0-rc4/redis_7.0.7-alpine.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - - - - Snyk test report - - - - - - - - - -
    -
    -
    -
    - - - Snyk - Open Source Security - - - - - - - -
    -

    Snyk test report

    - -

    January 22nd 2023, 12:18:12 am

    -
    -
    - Scanned the following path: -
      -
    • redis:7.0.7-alpine (apk)
    • -
    -
    - -
    -
    0 known vulnerabilities
    -
    0 vulnerable dependency paths
    -
    18 dependencies
    -
    -
    -
    -
    -
    - - - - - - - -
    Project docker-image|redis
    Path redis:7.0.7-alpine
    Package Manager apk
    -
    -
    - No known vulnerabilities detected. -
    -
    - - - diff --git a/docs/user-guide/app_deletion.md b/docs/user-guide/app_deletion.md index 6f7ca8d9caf06..f6dc731aca873 100644 --- a/docs/user-guide/app_deletion.md +++ b/docs/user-guide/app_deletion.md @@ -39,14 +39,14 @@ kubectl delete app APPNAME # About The Deletion Finalizer +For the technical amongst you, the Argo CD application controller watches for this finalizer: + ```yaml metadata: finalizers: - resources-finalizer.argocd.argoproj.io ``` -When deleting an Application with this finalizer, the Argo CD application controller will perform a cascading delete of the Application's resources. - -Adding the finalizer enables cascading deletes when implementing [the App of Apps pattern](../operator-manual/cluster-bootstrapping.md#cascading-deletion). +Argo CD's app controller watches for this and will then delete both the app and its resources. When you invoke `argocd app delete` with `--cascade`, the finalizer is added automatically. diff --git a/docs/user-guide/application_sources.md b/docs/user-guide/application_sources.md index 332136d618989..8288b0ea77125 100644 --- a/docs/user-guide/application_sources.md +++ b/docs/user-guide/application_sources.md @@ -7,7 +7,7 @@ Argo CD supports several different ways in which Kubernetes manifests can be def * [Kustomize](kustomize.md) applications * [Helm](helm.md) charts * A directory of YAML/JSON/Jsonnet manifests, including [Jsonnet](jsonnet.md). -* Any [custom config management tool](../operator-manual/config-management-plugins.md) configured as a config management plugin +* Any [custom config management tool](config-management-plugins.md) configured as a config management plugin ## Development Argo CD also supports uploading local manifests directly. Since this is an anti-pattern of the diff --git a/docs/user-guide/auto_sync.md b/docs/user-guide/auto_sync.md index 7dd9c3b5ac2e9..df39d2ef5d8c8 100644 --- a/docs/user-guide/auto_sync.md +++ b/docs/user-guide/auto_sync.md @@ -88,4 +88,3 @@ which is controlled by `--self-heal-timeout-seconds` flag of `argocd-application and parameters had failed. * Rollback cannot be performed against an application with automated sync enabled. -* The automatic sync interval is determined by [the `timeout.reconciliation` value in the `argocd-cm` ConfigMap](../faq.md#how-often-does-argo-cd-check-for-changes-to-my-git-or-helm-repository), which defaults to `180s` (3 minutes). diff --git a/docs/user-guide/build-environment.md b/docs/user-guide/build-environment.md index 56f6e6b436463..57b1a2bed14bb 100644 --- a/docs/user-guide/build-environment.md +++ b/docs/user-guide/build-environment.md @@ -1,6 +1,6 @@ # Build Environment -[Custom tools](../operator-manual/config-management-plugins.md), [Helm](helm.md), [Jsonnet](jsonnet.md), and [Kustomize](kustomize.md) support the following build env vars: +[Custom tools](config-management-plugins.md), [Helm](helm.md), [Jsonnet](jsonnet.md), and [Kustomize](kustomize.md) support the following build env vars: | Variable | Description | | ----------------------------------- | ----------------------------------------------------------------------- | diff --git a/docs/user-guide/commands/argocd_account.md b/docs/user-guide/commands/argocd_account.md index 3880bdb6fffc4..9912af33b1bf9 100644 --- a/docs/user-guide/commands/argocd_account.md +++ b/docs/user-guide/commands/argocd_account.md @@ -56,7 +56,6 @@ argocd account [flags] ### SEE ALSO * [argocd](argocd.md) - argocd controls a Argo CD server -* [argocd account bcrypt](argocd_account_bcrypt.md) - Generate bcrypt hash for the admin password * [argocd account can-i](argocd_account_can-i.md) - Can I * [argocd account delete-token](argocd_account_delete-token.md) - Deletes account token * [argocd account generate-token](argocd_account_generate-token.md) - Generate account token diff --git a/docs/user-guide/commands/argocd_account_bcrypt.md b/docs/user-guide/commands/argocd_account_bcrypt.md deleted file mode 100644 index 0e7d1a13a1735..0000000000000 --- a/docs/user-guide/commands/argocd_account_bcrypt.md +++ /dev/null @@ -1,42 +0,0 @@ -## argocd account bcrypt - -Generate bcrypt hash for the admin password - -``` -argocd account bcrypt [flags] -``` - -### Options - -``` - -h, --help help for bcrypt - --password string Password for which bcrypt hash is generated -``` - -### Options inherited from parent commands - -``` - --auth-token string Authentication token - --client-crt string Client certificate file - --client-crt-key string Client certificate key file - --config string Path to Argo CD config (default "/home/user/.config/argocd/config") - --core If set to true then CLI talks directly to Kubernetes instead of talking to Argo CD API server - --grpc-web Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. - --grpc-web-root-path string Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. Set web root. - -H, --header strings Sets additional header to all requests made by Argo CD CLI. (Can be repeated multiple times to add multiple headers, also supports comma separated headers) - --http-retry-max int Maximum number of retries to establish http connection to Argo CD server - --insecure Skip server certificate and domain verification - --kube-context string Directs the command to the given kube-context - --logformat string Set the logging format. One of: text|json (default "text") - --loglevel string Set the logging level. One of: debug|info|warn|error (default "info") - --plaintext Disable TLS - --port-forward Connect to a random argocd-server port using port forwarding - --port-forward-namespace string Namespace name which should be used for port forwarding - --server string Argo CD server address - --server-crt string Server certificate file -``` - -### SEE ALSO - -* [argocd account](argocd_account.md) - Manage account settings - diff --git a/docs/user-guide/commands/argocd_admin.md b/docs/user-guide/commands/argocd_admin.md index aff92561bdf7f..4d387884b7f54 100644 --- a/docs/user-guide/commands/argocd_admin.md +++ b/docs/user-guide/commands/argocd_admin.md @@ -9,9 +9,7 @@ argocd admin [flags] ### Options ``` - -h, --help help for admin - --logformat string Set the logging format. One of: text|json (default "text") - --loglevel string Set the logging level. One of: debug|info|warn|error (default "info") + -h, --help help for admin ``` ### Options inherited from parent commands @@ -28,6 +26,8 @@ argocd admin [flags] --http-retry-max int Maximum number of retries to establish http connection to Argo CD server --insecure Skip server certificate and domain verification --kube-context string Directs the command to the given kube-context + --logformat string Set the logging format. One of: text|json (default "text") + --loglevel string Set the logging level. One of: debug|info|warn|error (default "info") --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding @@ -43,7 +43,6 @@ argocd admin [flags] * [argocd admin dashboard](argocd_admin_dashboard.md) - Starts Argo CD Web UI locally * [argocd admin export](argocd_admin_export.md) - Export all Argo CD data to stdout (default) or a file * [argocd admin import](argocd_admin_import.md) - Import Argo CD data from stdin (specify `-') or a file -* [argocd admin initial-password](argocd_admin_initial-password.md) - Prints initial password to log in to Argo CD for the first time * [argocd admin notifications](argocd_admin_notifications.md) - Set of CLI commands that helps manage notifications settings * [argocd admin proj](argocd_admin_proj.md) - Manage projects configuration * [argocd admin repo](argocd_admin_repo.md) - Manage repositories configuration diff --git a/docs/user-guide/commands/argocd_admin_app_get-reconcile-results.md b/docs/user-guide/commands/argocd_admin_app_get-reconcile-results.md index 37aacbdfc65df..5d70f8bab7f28 100644 --- a/docs/user-guide/commands/argocd_admin_app_get-reconcile-results.md +++ b/docs/user-guide/commands/argocd_admin_app_get-reconcile-results.md @@ -28,7 +28,6 @@ argocd admin app get-reconcile-results PATH [flags] --refresh If set to true then recalculates apps reconciliation --repo-server string Repo server address. --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server --user string The name of the kubeconfig user to use @@ -54,6 +53,7 @@ argocd admin app get-reconcile-results PATH [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_cluster_kubeconfig.md b/docs/user-guide/commands/argocd_admin_cluster_kubeconfig.md index f1a8455af3256..7b3798ac1c9ba 100644 --- a/docs/user-guide/commands/argocd_admin_cluster_kubeconfig.md +++ b/docs/user-guide/commands/argocd_admin_cluster_kubeconfig.md @@ -24,7 +24,6 @@ argocd admin cluster kubeconfig CLUSTER_URL OUTPUT_PATH [flags] --password string Password for basic authentication to the API server --proxy-url string If provided, this URL will be used to connect via proxy --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server --user string The name of the kubeconfig user to use @@ -50,6 +49,7 @@ argocd admin cluster kubeconfig CLUSTER_URL OUTPUT_PATH [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_cluster_namespaces.md b/docs/user-guide/commands/argocd_admin_cluster_namespaces.md index f302f14ff8a90..9fe9e4f9b7179 100644 --- a/docs/user-guide/commands/argocd_admin_cluster_namespaces.md +++ b/docs/user-guide/commands/argocd_admin_cluster_namespaces.md @@ -24,7 +24,6 @@ argocd admin cluster namespaces [flags] --password string Password for basic authentication to the API server --proxy-url string If provided, this URL will be used to connect via proxy --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server --user string The name of the kubeconfig user to use @@ -50,6 +49,7 @@ argocd admin cluster namespaces [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_cluster_namespaces_disable-namespaced-mode.md b/docs/user-guide/commands/argocd_admin_cluster_namespaces_disable-namespaced-mode.md index 17b66a06d65a0..8af26d31c0c48 100644 --- a/docs/user-guide/commands/argocd_admin_cluster_namespaces_disable-namespaced-mode.md +++ b/docs/user-guide/commands/argocd_admin_cluster_namespaces_disable-namespaced-mode.md @@ -9,49 +9,49 @@ argocd admin cluster namespaces disable-namespaced-mode PATTERN [flags] ### Options ``` - --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 - --certificate-authority string Path to a cert file for the certificate authority - --client-certificate string Path to a client certificate file for TLS - --client-key string Path to a client key file for TLS - --cluster string The name of the kubeconfig cluster to use - --context string The name of the kubeconfig context to use - --dry-run Print what will be performed (default true) - -h, --help help for disable-namespaced-mode - --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure - --kubeconfig string Path to a kube config. Only required if out-of-cluster - -n, --namespace string If present, the namespace scope for this CLI request - --password string Password for basic authentication to the API server - --proxy-url string If provided, this URL will be used to connect via proxy - --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server - --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. - --token string Bearer token for authentication to the API server - --user string The name of the kubeconfig user to use - --username string Username for basic authentication to the API server + --dry-run Print what will be performed (default true) + -h, --help help for disable-namespaced-mode ``` ### Options inherited from parent commands ``` + --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 --auth-token string Authentication token + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS --client-crt string Client certificate file --client-crt-key string Client certificate key file + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use --config string Path to Argo CD config (default "/home/user/.config/argocd/config") + --context string The name of the kubeconfig context to use --core If set to true then CLI talks directly to Kubernetes instead of talking to Argo CD API server --grpc-web Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. --grpc-web-root-path string Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. Set web root. -H, --header strings Sets additional header to all requests made by Argo CD CLI. (Can be repeated multiple times to add multiple headers, also supports comma separated headers) --http-retry-max int Maximum number of retries to establish http connection to Argo CD server --insecure Skip server certificate and domain verification + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure --kube-context string Directs the command to the given kube-context + --kubeconfig string Path to a kube config. Only required if out-of-cluster --logformat string Set the logging format. One of: text|json (default "text") --loglevel string Set the logging level. One of: debug|info|warn|error (default "info") + -n, --namespace string If present, the namespace scope for this CLI request + --password string Password for basic authentication to the API server --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --proxy-url string If provided, this URL will be used to connect via proxy + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + --server string The address and port of the Kubernetes API server --server-crt string Server certificate file + --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use + --username string Username for basic authentication to the API server ``` ### SEE ALSO diff --git a/docs/user-guide/commands/argocd_admin_cluster_namespaces_enable-namespaced-mode.md b/docs/user-guide/commands/argocd_admin_cluster_namespaces_enable-namespaced-mode.md index b4a3f63c0d821..41b4d0546c94b 100644 --- a/docs/user-guide/commands/argocd_admin_cluster_namespaces_enable-namespaced-mode.md +++ b/docs/user-guide/commands/argocd_admin_cluster_namespaces_enable-namespaced-mode.md @@ -9,51 +9,51 @@ argocd admin cluster namespaces enable-namespaced-mode PATTERN [flags] ### Options ``` - --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 - --certificate-authority string Path to a cert file for the certificate authority - --client-certificate string Path to a client certificate file for TLS - --client-key string Path to a client key file for TLS - --cluster string The name of the kubeconfig cluster to use - --cluster-resources Indicates if cluster level resources should be managed. - --context string The name of the kubeconfig context to use - --dry-run Print what will be performed (default true) - -h, --help help for enable-namespaced-mode - --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure - --kubeconfig string Path to a kube config. Only required if out-of-cluster - --max-namespace-count int Max number of namespaces that cluster should managed managed namespaces is less or equal to specified count - -n, --namespace string If present, the namespace scope for this CLI request - --password string Password for basic authentication to the API server - --proxy-url string If provided, this URL will be used to connect via proxy - --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server - --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. - --token string Bearer token for authentication to the API server - --user string The name of the kubeconfig user to use - --username string Username for basic authentication to the API server + --cluster-resources Indicates if cluster level resources should be managed. + --dry-run Print what will be performed (default true) + -h, --help help for enable-namespaced-mode + --max-namespace-count int Max number of namespaces that cluster should managed managed namespaces is less or equal to specified count ``` ### Options inherited from parent commands ``` + --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 --auth-token string Authentication token + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS --client-crt string Client certificate file --client-crt-key string Client certificate key file + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use --config string Path to Argo CD config (default "/home/user/.config/argocd/config") + --context string The name of the kubeconfig context to use --core If set to true then CLI talks directly to Kubernetes instead of talking to Argo CD API server --grpc-web Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. --grpc-web-root-path string Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. Set web root. -H, --header strings Sets additional header to all requests made by Argo CD CLI. (Can be repeated multiple times to add multiple headers, also supports comma separated headers) --http-retry-max int Maximum number of retries to establish http connection to Argo CD server --insecure Skip server certificate and domain verification + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure --kube-context string Directs the command to the given kube-context + --kubeconfig string Path to a kube config. Only required if out-of-cluster --logformat string Set the logging format. One of: text|json (default "text") --loglevel string Set the logging level. One of: debug|info|warn|error (default "info") + -n, --namespace string If present, the namespace scope for this CLI request + --password string Password for basic authentication to the API server --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --proxy-url string If provided, this URL will be used to connect via proxy + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + --server string The address and port of the Kubernetes API server --server-crt string Server certificate file + --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use + --username string Username for basic authentication to the API server ``` ### SEE ALSO diff --git a/docs/user-guide/commands/argocd_admin_cluster_shards.md b/docs/user-guide/commands/argocd_admin_cluster_shards.md index be7cc36ccd662..299843052450b 100644 --- a/docs/user-guide/commands/argocd_admin_cluster_shards.md +++ b/docs/user-guide/commands/argocd_admin_cluster_shards.md @@ -38,7 +38,6 @@ argocd admin cluster shards [flags] --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") --sentinel stringArray Redis sentinel hostname and port (e.g. argocd-redis-ha-announce-0:6379). --sentinelmaster string Redis sentinel master group name. (default "master") - --server string The address and port of the Kubernetes API server --shard int Cluster shard filter (default -1) --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server @@ -65,6 +64,7 @@ argocd admin cluster shards [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_cluster_stats.md b/docs/user-guide/commands/argocd_admin_cluster_stats.md index 586069e08e688..f58be54cdc521 100644 --- a/docs/user-guide/commands/argocd_admin_cluster_stats.md +++ b/docs/user-guide/commands/argocd_admin_cluster_stats.md @@ -38,7 +38,6 @@ argocd admin cluster stats [flags] --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") --sentinel stringArray Redis sentinel hostname and port (e.g. argocd-redis-ha-announce-0:6379). --sentinelmaster string Redis sentinel master group name. (default "master") - --server string The address and port of the Kubernetes API server --shard int Cluster shard filter (default -1) --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server @@ -65,6 +64,7 @@ argocd admin cluster stats [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_export.md b/docs/user-guide/commands/argocd_admin_export.md index 27ff5ad1f9369..667919be78dcc 100644 --- a/docs/user-guide/commands/argocd_admin_export.md +++ b/docs/user-guide/commands/argocd_admin_export.md @@ -25,7 +25,6 @@ argocd admin export [flags] --password string Password for basic authentication to the API server --proxy-url string If provided, this URL will be used to connect via proxy --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server --user string The name of the kubeconfig user to use @@ -51,6 +50,7 @@ argocd admin export [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_import.md b/docs/user-guide/commands/argocd_admin_import.md index 62c9c9443e2e6..731dfad14f1b2 100644 --- a/docs/user-guide/commands/argocd_admin_import.md +++ b/docs/user-guide/commands/argocd_admin_import.md @@ -26,7 +26,6 @@ argocd admin import SOURCE [flags] --proxy-url string If provided, this URL will be used to connect via proxy --prune Prune secrets, applications and projects which do not appear in the backup --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server --stop-operation Stop any existing operations --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server @@ -54,6 +53,7 @@ argocd admin import SOURCE [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_initial-password.md b/docs/user-guide/commands/argocd_admin_initial-password.md deleted file mode 100644 index 2f997d25d46d1..0000000000000 --- a/docs/user-guide/commands/argocd_admin_initial-password.md +++ /dev/null @@ -1,59 +0,0 @@ -## argocd admin initial-password - -Prints initial password to log in to Argo CD for the first time - -``` -argocd admin initial-password [flags] -``` - -### Options - -``` - --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 - --certificate-authority string Path to a cert file for the certificate authority - --client-certificate string Path to a client certificate file for TLS - --client-key string Path to a client key file for TLS - --cluster string The name of the kubeconfig cluster to use - --context string The name of the kubeconfig context to use - -h, --help help for initial-password - --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure - --kubeconfig string Path to a kube config. Only required if out-of-cluster - -n, --namespace string If present, the namespace scope for this CLI request - --password string Password for basic authentication to the API server - --proxy-url string If provided, this URL will be used to connect via proxy - --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server - --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. - --token string Bearer token for authentication to the API server - --user string The name of the kubeconfig user to use - --username string Username for basic authentication to the API server -``` - -### Options inherited from parent commands - -``` - --auth-token string Authentication token - --client-crt string Client certificate file - --client-crt-key string Client certificate key file - --config string Path to Argo CD config (default "/home/user/.config/argocd/config") - --core If set to true then CLI talks directly to Kubernetes instead of talking to Argo CD API server - --grpc-web Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. - --grpc-web-root-path string Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. Set web root. - -H, --header strings Sets additional header to all requests made by Argo CD CLI. (Can be repeated multiple times to add multiple headers, also supports comma separated headers) - --http-retry-max int Maximum number of retries to establish http connection to Argo CD server - --insecure Skip server certificate and domain verification - --kube-context string Directs the command to the given kube-context - --logformat string Set the logging format. One of: text|json (default "text") - --loglevel string Set the logging level. One of: debug|info|warn|error (default "info") - --plaintext Disable TLS - --port-forward Connect to a random argocd-server port using port forwarding - --port-forward-namespace string Namespace name which should be used for port forwarding - --server-crt string Server certificate file -``` - -### SEE ALSO - -* [argocd admin](argocd_admin.md) - Contains a set of commands useful for Argo CD administrators and requires direct Kubernetes access - diff --git a/docs/user-guide/commands/argocd_admin_notifications.md b/docs/user-guide/commands/argocd_admin_notifications.md index f2bb15b50d306..9d257c44d85ca 100644 --- a/docs/user-guide/commands/argocd_admin_notifications.md +++ b/docs/user-guide/commands/argocd_admin_notifications.md @@ -29,7 +29,6 @@ argocd admin notifications [flags] --proxy-url string If provided, this URL will be used to connect via proxy --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") --secret string argocd-notifications-secret.yaml file path. Use empty secret if provided value is ':empty' - --server string The address and port of the Kubernetes API server --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server --user string The name of the kubeconfig user to use @@ -55,6 +54,7 @@ argocd admin notifications [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_proj_generate-allow-list.md b/docs/user-guide/commands/argocd_admin_proj_generate-allow-list.md index a16531a200ee4..251a3375b08eb 100644 --- a/docs/user-guide/commands/argocd_admin_proj_generate-allow-list.md +++ b/docs/user-guide/commands/argocd_admin_proj_generate-allow-list.md @@ -25,7 +25,6 @@ argocd admin proj generate-allow-list CLUSTERROLE_PATH PROJ_NAME [flags] --password string Password for basic authentication to the API server --proxy-url string If provided, this URL will be used to connect via proxy --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server --user string The name of the kubeconfig user to use @@ -51,6 +50,7 @@ argocd admin proj generate-allow-list CLUSTERROLE_PATH PROJ_NAME [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_proj_update-role-policy.md b/docs/user-guide/commands/argocd_admin_proj_update-role-policy.md index f26b4c511a39a..bbf182499a5a2 100644 --- a/docs/user-guide/commands/argocd_admin_proj_update-role-policy.md +++ b/docs/user-guide/commands/argocd_admin_proj_update-role-policy.md @@ -40,7 +40,6 @@ argocd admin proj update-role-policy PROJECT_GLOB MODIFICATION ACTION [flags] --resource string Resource e.g. 'applications' --role string Role name pattern e.g. '*deployer*' (default "*") --scope string Resource scope e.g. '*' - --server string The address and port of the Kubernetes API server --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server --user string The name of the kubeconfig user to use @@ -66,6 +65,7 @@ argocd admin proj update-role-policy PROJECT_GLOB MODIFICATION ACTION [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_repo_generate-spec.md b/docs/user-guide/commands/argocd_admin_repo_generate-spec.md index bf69b4016efcc..18cb7695d407f 100644 --- a/docs/user-guide/commands/argocd_admin_repo_generate-spec.md +++ b/docs/user-guide/commands/argocd_admin_repo_generate-spec.md @@ -38,7 +38,6 @@ argocd admin repo generate-spec REPOURL [flags] ``` --enable-lfs enable git-lfs (Large File Support) on this repository --enable-oci enable helm-oci (Helm OCI-Based Repository) - --gcp-service-account-key-path string service account key for the Google Cloud Platform --github-app-enterprise-base-url string base url to use when using GitHub Enterprise (e.g. https://ghe.example.com/api/v3 --github-app-id int id of the GitHub Application --github-app-installation-id int installation id of the GitHub Application diff --git a/docs/user-guide/commands/argocd_admin_settings.md b/docs/user-guide/commands/argocd_admin_settings.md index e1c9d36f28cd0..6f0e241d6a62a 100644 --- a/docs/user-guide/commands/argocd_admin_settings.md +++ b/docs/user-guide/commands/argocd_admin_settings.md @@ -27,7 +27,6 @@ argocd admin settings [flags] --password string Password for basic authentication to the API server --proxy-url string If provided, this URL will be used to connect via proxy --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. --token string Bearer token for authentication to the API server --user string The name of the kubeconfig user to use @@ -53,6 +52,7 @@ argocd admin settings [flags] --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --server string Argo CD server address --server-crt string Server certificate file ``` diff --git a/docs/user-guide/commands/argocd_admin_settings_rbac_can.md b/docs/user-guide/commands/argocd_admin_settings_rbac_can.md index 560539a5239d6..6ee5c2cdcb635 100644 --- a/docs/user-guide/commands/argocd_admin_settings_rbac_can.md +++ b/docs/user-guide/commands/argocd_admin_settings_rbac_can.md @@ -39,31 +39,12 @@ argocd admin settings rbac can someuser create application 'default/app' --defau ### Options ``` - --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 - --certificate-authority string Path to a cert file for the certificate authority - --client-certificate string Path to a client certificate file for TLS - --client-key string Path to a client key file for TLS - --cluster string The name of the kubeconfig cluster to use - --context string The name of the kubeconfig context to use - --default-role string name of the default role to use - -h, --help help for can - --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure - --kubeconfig string Path to a kube config. Only required if out-of-cluster - -n, --namespace string If present, the namespace scope for this CLI request - --password string Password for basic authentication to the API server - --policy-file string path to the policy file to use - --proxy-url string If provided, this URL will be used to connect via proxy - -q, --quiet quiet mode - do not print results to stdout - --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") - --server string The address and port of the Kubernetes API server - --strict whether to perform strict check on action and resource names (default true) - --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. - --token string Bearer token for authentication to the API server - --use-builtin-policy whether to also use builtin-policy (default true) - --user string The name of the kubeconfig user to use - --username string Username for basic authentication to the API server + --default-role string name of the default role to use + -h, --help help for can + --policy-file string path to the policy file to use + -q, --quiet quiet mode - do not print results to stdout + --strict whether to perform strict check on action and resource names (default true) + --use-builtin-policy whether to also use builtin-policy (default true) ``` ### Options inherited from parent commands @@ -71,24 +52,43 @@ argocd admin settings rbac can someuser create application 'default/app' --defau ``` --argocd-cm-path string Path to local argocd-cm.yaml file --argocd-secret-path string Path to local argocd-secret.yaml file + --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 --auth-token string Authentication token + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS --client-crt string Client certificate file --client-crt-key string Client certificate key file + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use --config string Path to Argo CD config (default "/home/user/.config/argocd/config") + --context string The name of the kubeconfig context to use --core If set to true then CLI talks directly to Kubernetes instead of talking to Argo CD API server --grpc-web Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. --grpc-web-root-path string Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. Set web root. -H, --header strings Sets additional header to all requests made by Argo CD CLI. (Can be repeated multiple times to add multiple headers, also supports comma separated headers) --http-retry-max int Maximum number of retries to establish http connection to Argo CD server --insecure Skip server certificate and domain verification + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure --kube-context string Directs the command to the given kube-context + --kubeconfig string Path to a kube config. Only required if out-of-cluster --load-cluster-settings Indicates that config map and secret should be loaded from cluster unless local file path is provided --logformat string Set the logging format. One of: text|json (default "text") --loglevel string Set the logging level. One of: debug|info|warn|error (default "info") + -n, --namespace string If present, the namespace scope for this CLI request + --password string Password for basic authentication to the API server --plaintext Disable TLS --port-forward Connect to a random argocd-server port using port forwarding --port-forward-namespace string Namespace name which should be used for port forwarding + --proxy-url string If provided, this URL will be used to connect via proxy + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + --server string The address and port of the Kubernetes API server --server-crt string Server certificate file + --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use + --username string Username for basic authentication to the API server ``` ### SEE ALSO diff --git a/docs/user-guide/commands/argocd_app_sync.md b/docs/user-guide/commands/argocd_app_sync.md index 798fcecdd8a03..a96229cff9151 100644 --- a/docs/user-guide/commands/argocd_app_sync.md +++ b/docs/user-guide/commands/argocd_app_sync.md @@ -26,9 +26,6 @@ argocd app sync [APPNAME... | -l selector | --project project-name] [flags] # Resource should be formatted as GROUP:KIND:NAME. If no GROUP is specified then :KIND:NAME argocd app sync my-app --resource :Service:my-service argocd app sync my-app --resource argoproj.io:Rollout:my-rollout - argocd app sync my-app --resource '!apps:Deployment:my-service' - argocd app sync my-app --resource apps:Deployment:my-service --resource :Service:my-service - argocd app sync my-app --resource '!*:Service:*' # Specify namespace if the application has resources with the same name in different namespaces argocd app sync my-app --resource argoproj.io:Rollout:my-namespace/my-rollout ``` @@ -49,7 +46,7 @@ argocd app sync [APPNAME... | -l selector | --project project-name] [flags] --project stringArray Sync apps that belong to the specified projects. This option may be specified repeatedly. --prune Allow deleting unexpected resources --replace Use a kubectl create/replace instead apply - --resource stringArray Sync only specific resources as GROUP:KIND:NAME or !GROUP:KIND:NAME. Fields may be blank and '*' can be used. This option may be specified repeatedly + --resource stringArray Sync only specific resources as GROUP:KIND:NAME. Fields may be blank. This option may be specified repeatedly --retry-backoff-duration duration Retry backoff base duration. Input needs to be a duration (e.g. 2m, 1h) (default 5s) --retry-backoff-factor int Factor multiplies the base duration after each failed retry (default 2) --retry-backoff-max-duration duration Max retry backoff duration. Input needs to be a duration (e.g. 2m, 1h) (default 3m0s) diff --git a/docs/user-guide/commands/argocd_app_wait.md b/docs/user-guide/commands/argocd_app_wait.md index 7bf911acde349..c8e48720d86af 100644 --- a/docs/user-guide/commands/argocd_app_wait.md +++ b/docs/user-guide/commands/argocd_app_wait.md @@ -15,16 +15,6 @@ argocd app wait [APPNAME.. | -l selector] [flags] # Wait for multiple apps argocd app wait my-app other-app - # Wait for apps by resource - # Resource should be formatted as GROUP:KIND:NAME. If no GROUP is specified then :KIND:NAME. - argocd app wait my-app --resource :Service:my-service - argocd app wait my-app --resource argoproj.io:Rollout:my-rollout - argocd app wait my-app --resource '!apps:Deployment:my-service' - argocd app wait my-app --resource apps:Deployment:my-service --resource :Service:my-service - argocd app wait my-app --resource '!*:Service:*' - # Specify namespace if the application has resources with the same name in different namespaces - argocd app wait my-app --resource argoproj.io:Rollout:my-namespace/my-rollout - # Wait for apps by label, in this example we waiting for apps that are children of another app (aka app-of-apps) argocd app wait -l app.kubernetes.io/instance=my-app argocd app wait -l app.kubernetes.io/instance!=my-app @@ -40,7 +30,7 @@ argocd app wait [APPNAME.. | -l selector] [flags] --health Wait for health -h, --help help for wait --operation Wait for pending operations - --resource stringArray Sync only specific resources as GROUP:KIND:NAME or !GROUP:KIND:NAME. Fields may be blank and '*' can be used. This option may be specified repeatedly + --resource stringArray Sync only specific resources as GROUP:KIND:NAME. Fields may be blank. This option may be specified repeatedly -l, --selector string Wait for apps by label. Supports '=', '==', '!=', in, notin, exists & not exists. Matching apps must satisfy all of the specified label constraints. --suspended Wait for suspended --sync Wait for sync diff --git a/docs/user-guide/commands/argocd_cluster.md b/docs/user-guide/commands/argocd_cluster.md index f9c1681a82475..3b40399c62da8 100644 --- a/docs/user-guide/commands/argocd_cluster.md +++ b/docs/user-guide/commands/argocd_cluster.md @@ -21,9 +21,6 @@ argocd cluster [flags] # Remove a target cluster context from ArgoCD argocd cluster rm example-cluster - # Set a target cluster context from ArgoCD - argocd cluster set CLUSTER_NAME --name new-cluster-name --namespace '*' - argocd cluster set CLUSTER_NAME --name new-cluster-name --namespace namespace-one --namespace namespace-two ``` ### Options @@ -81,5 +78,4 @@ argocd cluster [flags] * [argocd cluster list](argocd_cluster_list.md) - List configured clusters * [argocd cluster rm](argocd_cluster_rm.md) - Remove cluster credentials * [argocd cluster rotate-auth](argocd_cluster_rotate-auth.md) - argocd cluster rotate-auth SERVER/NAME -* [argocd cluster set](argocd_cluster_set.md) - Set cluster information diff --git a/docs/user-guide/commands/argocd_cluster_set.md b/docs/user-guide/commands/argocd_cluster_set.md deleted file mode 100644 index f1099fd6e3cc3..0000000000000 --- a/docs/user-guide/commands/argocd_cluster_set.md +++ /dev/null @@ -1,51 +0,0 @@ -## argocd cluster set - -Set cluster information - -``` -argocd cluster set NAME [flags] -``` - -### Examples - -``` - # Set cluster information - argocd cluster set CLUSTER_NAME --name new-cluster-name --namespace '*' - argocd cluster set CLUSTER_NAME --name new-cluster-name --namespace namespace-one --namespace namespace-two -``` - -### Options - -``` - -h, --help help for set - --name string Overwrite the cluster name - --namespace stringArray List of namespaces which are allowed to manage. Specify '*' to manage all namespaces -``` - -### Options inherited from parent commands - -``` - --auth-token string Authentication token - --client-crt string Client certificate file - --client-crt-key string Client certificate key file - --config string Path to Argo CD config (default "/home/user/.config/argocd/config") - --core If set to true then CLI talks directly to Kubernetes instead of talking to Argo CD API server - --grpc-web Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. - --grpc-web-root-path string Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. Set web root. - -H, --header strings Sets additional header to all requests made by Argo CD CLI. (Can be repeated multiple times to add multiple headers, also supports comma separated headers) - --http-retry-max int Maximum number of retries to establish http connection to Argo CD server - --insecure Skip server certificate and domain verification - --kube-context string Directs the command to the given kube-context - --logformat string Set the logging format. One of: text|json (default "text") - --loglevel string Set the logging level. One of: debug|info|warn|error (default "info") - --plaintext Disable TLS - --port-forward Connect to a random argocd-server port using port forwarding - --port-forward-namespace string Namespace name which should be used for port forwarding - --server string Argo CD server address - --server-crt string Server certificate file -``` - -### SEE ALSO - -* [argocd cluster](argocd_cluster.md) - Manage cluster credentials - diff --git a/docs/user-guide/commands/argocd_repo_add.md b/docs/user-guide/commands/argocd_repo_add.md index e6d64d6c06739..c4d818e6264d1 100644 --- a/docs/user-guide/commands/argocd_repo_add.md +++ b/docs/user-guide/commands/argocd_repo_add.md @@ -36,9 +36,6 @@ argocd repo add REPOURL [flags] # Add a private Git repository on GitHub Enterprise via GitHub App argocd repo add https://ghe.example.com/repos/repo --github-app-id 1 --github-app-installation-id 2 --github-app-private-key-path test.private-key.pem --github-app-enterprise-base-url https://ghe.example.com/api/v3 - # Add a private Git repository on Google Cloud Sources via GCP service account credentials - argocd repo add https://source.developers.google.com/p/my-google-cloud-project/r/my-repo --gcp-service-account-key-path service-account-key.json - ``` ### Options @@ -46,7 +43,6 @@ argocd repo add REPOURL [flags] ``` --enable-lfs enable git-lfs (Large File Support) on this repository --enable-oci enable helm-oci (Helm OCI-Based Repository) - --gcp-service-account-key-path string service account key for the Google Cloud Platform --github-app-enterprise-base-url string base url to use when using GitHub Enterprise (e.g. https://ghe.example.com/api/v3 --github-app-id int id of the GitHub Application --github-app-installation-id int installation id of the GitHub Application diff --git a/docs/user-guide/commands/argocd_repocreds_add.md b/docs/user-guide/commands/argocd_repocreds_add.md index 42e30d65e0618..bedfa6c484e01 100644 --- a/docs/user-guide/commands/argocd_repocreds_add.md +++ b/docs/user-guide/commands/argocd_repocreds_add.md @@ -24,16 +24,12 @@ argocd repocreds add REPOURL [flags] # Add credentials with helm oci registry so that these oci registry urls do not need to be added as repos individually. argocd repocreds add localhost:5000/myrepo --enable-oci --type helm - # Add credentials with GCP credentials for all repositories under https://source.developers.google.com/p/my-google-cloud-project/r/ - argocd repocreds add https://source.developers.google.com/p/my-google-cloud-project/r/ --gcp-service-account-key-path service-account-key.json - ``` ### Options ``` --enable-oci Specifies whether helm-oci support should be enabled for this repo - --gcp-service-account-key-path string service account key for the Google Cloud Platform --github-app-enterprise-base-url string base url to use when using GitHub Enterprise (e.g. https://ghe.example.com/api/v3 --github-app-id int id of the GitHub Application --github-app-installation-id int installation id of the GitHub Application diff --git a/docs/user-guide/config-management-plugins.md b/docs/user-guide/config-management-plugins.md new file mode 100644 index 0000000000000..b4779ba3fc451 --- /dev/null +++ b/docs/user-guide/config-management-plugins.md @@ -0,0 +1,287 @@ +# Plugins + +Argo CD allows integrating more config management tools using config management plugins. + +!!! warning + Plugins are granted a level of trust in the Argo CD system, so it is important to implement plugins securely. Argo + CD administrators should only install plugins from trusted sources, and they should audit plugins to weigh their + particular risks and benefits. + +## Installing a CMP + +There are two ways to install a Config Management Plugin (CMP): + +1. Add the plugin config to the Argo CD ConfigMap. The repo-server container will run your plugin's commands. + This is a good option for a simple plugin that requires only a few lines of code that fit nicely in the Argo CD ConfigMap. +2. Add the plugin as a sidecar to the repo-server Pod. + This is a good option for a more complex plugin that would clutter the Argo CD ConfigMap. A copy of the repository is sent to the sidecar container as a tarball and processed individually per application, which makes it a good option for [concurrent processing of monorepos](../operator-manual/high_availability.md#enable-concurrent-processing). + +### Option 1: Configure plugins via Argo CD configmap + +The following changes are required to configure a new plugin: + +1. Make sure required binaries are available in `argocd-repo-server` pod. The binaries can be added via volume mounts or + using a custom image (see [custom_tools](../operator-manual/custom_tools.md) for examples of both). +2. Register a new plugin in `argocd-cm` ConfigMap: + + :::yaml + data: + configManagementPlugins: | + - name: pluginName + init: # Optional command to initialize application source directory + command: ["sample command"] + args: ["sample args"] + generate: # Command to generate manifests YAML + command: ["sample command"] + args: ["sample args"] + lockRepo: true # Defaults to false. See below. + + The `generate` command must print a valid YAML or JSON stream to stdout. Both `init` and `generate` commands are executed inside the application source directory or in `path` when specified for the app. + +3. [Create an Application which uses your new CMP](#using-a-cmp). + +More CMP examples are available in [argocd-example-apps](https://github.com/argoproj/argocd-example-apps/tree/master/plugins). + +!!!note "Repository locking" + If your plugin makes use of `git` (e.g. `git crypt`), it is advised to set + `lockRepo` to `true` so that your plugin will have exclusive access to the + repository at the time it is executed. Otherwise, two applications synced + at the same time may result in a race condition and sync failure. + +### Option 2: Configure plugin via sidecar + +An operator can configure a plugin tool via a sidecar to repo-server. The following changes are required to configure a new plugin: + +#### 1. Write the plugin configuration file + +Plugins will be configured via a ConfigManagementPlugin manifest located inside the plugin container. + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: ConfigManagementPlugin +metadata: + name: cmp-plugin +spec: + version: v1.0 + init: + # Init always happens immediately before generate, but its output is not treated as manifests. + # This is a good place to, for example, download chart dependencies. + command: [sh, -c, 'echo "Initializing..."'] + generate: + command: [sh, -c] + args: + - | + echo "{\"kind\": \"ConfigMap\", \"apiVersion\": \"v1\", \"metadata\": { \"name\": \"$ARGOCD_APP_NAME\", \"namespace\": \"$ARGOCD_APP_NAMESPACE\", \"annotations\": {\"Foo\": \"$ARGOCD_ENV_FOO\", \"KubeVersion\": \"$KUBE_VERSION\", \"KubeApiVersion\": \"$KUBE_API_VERSIONS\",\"Bar\": \"baz\"}}}" + # The discovery config is applied to a repository. If every configured discovery tool matches, then the plugin may be + # used to generate manifests for Applications using the repository. + # Only one of fileName, find.glob, or find.command should be specified. If multiple are specified then only the + # first (in that order) is evaluated. + discover: + fileName: "./subdir/s*.yaml" +``` + +!!! note + While the ConfigManagementPlugin _looks like_ a Kubernetes object, it is not actually a custom resource. + It only follows kubernetes-style spec conventions. + +The `generate` command must print a valid YAML stream to stdout. Both `init` and `generate` commands are executed inside the application source directory. + +The `discover.fileName` is used as [glob](https://pkg.go.dev/path/filepath#Glob) pattern to determine whether an +application repository is supported by the plugin or not. + +```yaml + discover: + find: + command: [sh, -c, find . -name env.yaml] +``` + +If `discover.fileName` is not provided, the `discover.find.command` is executed in order to determine whether an +application repository is supported by the plugin or not. The `find` command should return a non-error exit code +and produce output to stdout when the application source type is supported. + +#### 2. Place the plugin configuration file in the sidecar + +Argo CD expects the plugin configuration file to be located at `/home/argocd/cmp-server/config/plugin.yaml` in the sidecar. + +If you use a custom image for the sidecar, you can add the file directly to that image. + +```dockerfile +WORKDIR /home/argocd/cmp-server/config/ +COPY plugin.yaml ./ +``` + +If you use a stock image for the sidecar or would rather maintain the plugin configuration in a ConfigMap, just nest the +plugin config file in a ConfigMap under the `plugin.yaml` key. + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: cmp-plugin +data: + plugin.yaml: | + apiVersion: argoproj.io/v1alpha1 + kind: ConfigManagementPlugin + metadata: + name: cmp-plugin + spec: + version: v1.0 + init: + command: [sh, -c, 'echo "Initializing..."'] + generate: + command: [sh, -c, 'echo "{\"kind\": \"ConfigMap\", \"apiVersion\": \"v1\", \"metadata\": { \"name\": \"$ARGOCD_APP_NAME\", \"namespace\": \"$ARGOCD_APP_NAMESPACE\", \"annotations\": {\"Foo\": \"$ARGOCD_ENV_FOO\", \"KubeVersion\": \"$KUBE_VERSION\", \"KubeApiVersion\": \"$KUBE_API_VERSIONS\",\"Bar\": \"baz\"}}}"'] + discover: + fileName: "./subdir/s*.yaml" +``` + +#### 3. Register the plugin sidecar + +To install a plugin, patch argocd-repo-server to run the CMP container as a sidecar, with argocd-cmp-server as its +entrypoint. You can use either off-the-shelf or custom-built plugin image as sidecar image. For example: + +```yaml +containers: +- name: cmp + command: [/var/run/argocd/argocd-cmp-server] # Entrypoint should be Argo CD lightweight CMP server i.e. argocd-cmp-server + image: busybox # This can be off-the-shelf or custom-built image + securityContext: + runAsNonRoot: true + runAsUser: 999 + volumeMounts: + - mountPath: /var/run/argocd + name: var-files + - mountPath: /home/argocd/cmp-server/plugins + name: plugins + # Remove this volumeMount if you've chosen to bake the config file into the sidecar image. + - mountPath: /home/argocd/cmp-server/config/plugin.yaml + subPath: plugin.yaml + name: cmp-plugin + # Starting with v2.4, do NOT mount the same tmp volume as the repo-server container. The filesystem separation helps + # mitigate path traversal attacks. + - mountPath: /tmp + name: cmp-tmp +volumes: + - configMap: + name: cmp-plugin + name: cmp-plugin + - emptyDir: {} + name: cmp-tmp +``` + +!!! important "Double-check these items" + 1. Make sure to use `/var/run/argocd/argocd-cmp-server` as an entrypoint. The `argocd-cmp-server` is a lightweight GRPC service that allows Argo CD to interact with the plugin. + 2. Make sure that sidecar container is running as user 999. + 3. Make sure that plugin configuration file is present at `/home/argocd/cmp-server/config/plugin.yaml`. It can either be volume mapped via configmap or baked into image. + +### Environment + +CMP commands have access to + +1. The system environment variables (of the repo-server container for argocd-cm plugins or of the sidecar for sidecar plugins) +2. [Standard build environment](build-environment.md) +3. Variables in the application spec (References to system and build variables will get interpolated in the variables' values): + +```yaml +spec: + source: + plugin: + env: + - name: FOO + value: bar + - name: REV + value: test-$ARGOCD_APP_REVISION +``` + +!!! note + The `discover.command` command only has access to the above environment starting with v2.4. + +Before reaching the `init.command`, `generate.command`, and `discover.command` commands, Argo CD prefixes all +user-supplied environment variables (#3 above) with `ARGOCD_ENV_`. This prevents users from directly setting +potentially-sensitive environment variables. + +If your plugin was written before 2.4 and depends on user-supplied environment variables, then you will need to update +your plugin's behavior to work with 2.4. If you use a third-party plugin, make sure they explicitly advertise support +for 2.4. + +## Using a CMP + +If your CMP is defined in the `argocd-cm` ConfigMap, you can create a new Application using the CLI. Replace +`` with the name configured in `argocd-cm`. + +```bash +argocd app create --config-management-plugin +``` + +If your CMP is defined as a sidecar, you must manually define the Application manifest. Do not configure a `name` field +in the `plugin` section. The plugin will be automatically matched with the Application based on its discovery rules. + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: guestbook + namespace: argocd +spec: + project: default + source: + repoURL: https://github.com/argoproj/argocd-example-apps.git + targetRevision: HEAD + path: guestbook + plugin: + # For either argocd-cm- or sidecar-installed CMPs, you can pass environment variables to the CMP. + env: + - name: FOO + value: bar +``` + +If you don't need to set any environment variables, you can set an empty plugin section. + +```yaml + plugin: {} +``` + +!!! important + If your sidecar CMP command runs too long, the command will be killed, and the UI will show an error. The CMP server + respects the timeouts set by the `server.repo.server.timeout.seconds` and `controller.repo.server.timeout.seconds` + items in `argocd-cm`. Increase their values from the default of 60s. + + Each CMP command will also independently timeout on the `ARGOCD_EXEC_TIMEOUT` set for the CMP sidecar. The default + is 90s. So if you increase the repo server timeout greater than 90s, be sure to set `ARGOCD_EXEC_TIMEOUT` on the + sidecar. + +!!! note + Each Application can only have one config management plugin configured at a time. If you're converting an existing + plugin configured through the `argocd-cm` ConfigMap to a sidecar, make sure the discovery mechanism only returns + true for Applications that have had their `name` field in the `plugin` section of their spec removed. + +## Debugging a CMP + +If you are actively developing a sidecar-installed CMP, keep a few things in mind: + +1) If you are mounting plugin.yaml from a ConfigMap, you will have to restart the repo-server Pod so the plugin will + pick up the changes. +2) If you have baked plugin.yaml into your image, you will have to build, push, and force a re-pull of that image on the + repo-server Pod so the plugin will pick up the changes. If you are using `:latest`, the Pod will always pull the new + image. If you're using a different, static tag, set `imagePullPolicy: Always` on the CMP's sidecar container. +3) CMP errors are cached by the repo-server in Redis. Restarting the repo-server Pod will not clear the cache. Always + do a "Hard Refresh" when actively developing a CMP so you have the latest output. + +!!! note + Each Application can only have one config management plugin configured at a time. If you're converting an existing + plugin configured through the `argocd-cm` ConfigMap to a sidecar, make sure the discovery mechanism only returns + true for Applications that have had their `name` field in the `plugin` section of their spec removed. + +## Plugin tar stream exclusions + +In order to increase the speed of manifest generation, certain files and folders can be excluded from being sent to your +plugin. We recommend excluding your `.git` folder if it isn't necessary. Use Go's +[filepatch.Match](https://pkg.go.dev/path/filepath#Match) syntax. For example, `.git/*` to exclude `.git` folder. + +You can set it one of three ways: + +1. The `--plugin-tar-exclude` argument on the repo server. +2. The `reposerver.plugin.tar.exclusions` key if you are using `argocd-cmd-params-cm` +3. Directly setting `ARGOCD_REPO_SERVER_PLUGIN_TAR_EXCLUSIONS` environment variable on the repo server. + +For option 1, the flag can be repeated multiple times. For option 2 and 3, you can specify multiple globs by separating +them with semicolons. \ No newline at end of file diff --git a/docs/user-guide/helm.md b/docs/user-guide/helm.md index b75cebc43078f..fda56320b7b09 100644 --- a/docs/user-guide/helm.md +++ b/docs/user-guide/helm.md @@ -37,15 +37,6 @@ argocd app set helm-guestbook --values values-production.yaml location in which case it can be accessed using a relative path relative to the root directory of the Helm chart. -In the declarative syntax: - -```yaml -source: - helm: - valueFiles: - - values-production.yaml -``` - ## Helm Parameters Helm has the ability to set parameter values, which override any values in @@ -62,16 +53,6 @@ in the form of `-p PARAM=VALUE`. For example: argocd app set helm-guestbook -p service.type=LoadBalancer ``` -In the declarative syntax: - -```yaml -source: - helm: - parameters: - - name: "service.type" - value: LoadBalancer -``` - ## Helm Release Name By default, the Helm release name is equal to the Application name to which it belongs. Sometimes, especially on a centralised ArgoCD, @@ -128,7 +109,7 @@ Unsupported hooks are ignored. In Argo CD, hooks are created by using `kubectl a * Annotate `pre-install` and `post-install` with `hook-weight: "-1"`. This will make sure it runs to success before any upgrade hooks. * Annotate `pre-upgrade` and `post-upgrade` with `hook-delete-policy: before-hook-creation` to make sure it runs on every sync. -Read more about [Argo hooks](resource_hooks.md) and [Helm hooks](https://helm.sh/docs/topics/charts_hooks/). +Read more about [Argo hooks](resource_hooks.md) and [Helm hooks](https://github.com/helm/helm/blob/dev-v2/docs/charts_hooks.md). ## Random Data diff --git a/docs/user-guide/kustomize.md b/docs/user-guide/kustomize.md index b940cc9a154e1..6c9475eb47b15 100644 --- a/docs/user-guide/kustomize.md +++ b/docs/user-guide/kustomize.md @@ -69,7 +69,7 @@ spec: source: repoURL: https://github.com/argoproj/argocd-example-apps.git targetRevision: HEAD - path: kustomize-guestbook + path: guestbook-kustomize kustomize: version: v3.5.4 @@ -84,7 +84,7 @@ argocd app set --kustomize-version v3.5.4 ## Build Environment -Kustomize apps have access to the [standard build environment](build-environment.md) which can be used in combination with a [config managment plugin](../operator-manual/config-management-plugins.md) to alter the rendered manifests. +Kustomize does not support parameters and therefore cannot support the standard [build environment](build-environment.md). ## Kustomizing Helm charts diff --git a/docs/user-guide/multiple_sources.md b/docs/user-guide/multiple_sources.md deleted file mode 100644 index 5aef3825389f7..0000000000000 --- a/docs/user-guide/multiple_sources.md +++ /dev/null @@ -1,73 +0,0 @@ -# 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. - -Argo CD has the ability to specify multiple sources for a single Application. Argo CD compiles all the sources -and reconciles the combined resources. - -You can provide multiple sources using the `sources` field. When you specify the `sources` field, Argo CD will ignore -the `source` (singular) field. - -See the below example for specifying multiple sources: - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: guestbook - namespace: argocd -spec: - project: default - destination: - server: https://kubernetes.default.svc - namespace: default - sources: - - chart: elasticsearch - repoURL: https://helm.elastic.co - targetRevision: 8.5.1 - - repoURL: https://github.com/argoproj/argocd-example-apps.git - path: guestbook - targetRevision: HEAD -``` - -The above example has two sources specified. Argo CD will generate the manifests for each source separately and combine -the resulting manifests. - -If multiple sources produce the same resource (same `group`, `kind`, `name`, and `namespace`), the last source to -produce the resource will take precedence. Argo CD will produce a `RepeatedResourceWarning` in this case, but it will -sync the resources. This provides a convenient way to override a resource from a chart with a resource from a Git repo. - -## Helm value files from external Git repository - -Helm sources can reference value files from git sources. This allows you to use a third-party Helm chart with custom, -git-hosted values. - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -spec: - sources: - - repoURL: 'https://prometheus-community.github.io/helm-charts' - chart: prometheus - targetRevision: 15.7.1 - helm: - valueFiles: - - $values/charts/prometheus/values.yaml - - repoURL: 'https://git.example.gom/org/value-files.git' - targetRevision: dev - ref: values -``` - -In the above example, the `prometheus` chart will use the value file from `git.example.gom/org/value-files.git`. -`$values` resolves to the root of the `value-files` repository. The `$values` variable may only be specified at the -beginning of the value file path. - -If the `path` field is set in the `$values` source, Argo CD will attempt to generate resources from the git repository -at that URL. If the `path` field is not set, Argo CD will use the repository solely as a source of value files. - -!!! note - Sources with the `ref` field set must not also specify the `chart` field. Argo CD does not currently support using - another Helm chart as a source for value files. diff --git a/docs/user-guide/parameters.md b/docs/user-guide/parameters.md index 3b892782b83c7..c66c9ca1bbe40 100644 --- a/docs/user-guide/parameters.md +++ b/docs/user-guide/parameters.md @@ -54,9 +54,14 @@ argocd app create redis --repo https://github.com/helm/charts.git --path stable/ ## Store Overrides In Git +> The following is available from v1.8 or later + The config management tool specific overrides can be specified in `.argocd-source.yaml` file stored in the source application directory in the Git repository. +!!! warn + The `.argocd-source` is a beta feature and subject to change. + The `.argocd-source.yaml` file is used during manifest generation and overrides application source fields, such as `kustomize`, `helm` etc. @@ -75,6 +80,8 @@ for projects like [argocd-image-updater](https://github.com/argoproj-labs/argocd - Support "discovering" applications in the Git repository by projects like [applicationset](https://github.com/argoproj/applicationset) (see [git files generator](https://github.com/argoproj/argo-cd/blob/master/applicationset/examples/git-generator-files-discovery/git-generator-files.yaml)) +> The following is available from v1.9 or later + You can also store parameter overrides in an application specific file, if you are sourcing multiple applications from a single path in your repository. diff --git a/docs/user-guide/private-repositories.md b/docs/user-guide/private-repositories.md index 04fedaea4f99d..3f6602a4f8fbc 100644 --- a/docs/user-guide/private-repositories.md +++ b/docs/user-guide/private-repositories.md @@ -134,33 +134,6 @@ Using the UI: !!!note When pasting GitHub App private key in the UI, make sure there are no unintended line breaks or additional characters in the text area -### Google Cloud Source - -Private repositories hosted on Google Cloud Source can be accessed using Google Cloud service account key in JSON format. Consult [Google Cloud documentation](https://cloud.google.com/iam/docs/creating-managing-service-accounts) on how to create a service account. - -!!!note - Ensure your application has at least `Source Repository Reader` permissions for the Google Cloud project. This is the minimum requirement. - -You can configure access to your Git repository hosted on Google Cloud Source using the CLI or the UI. - -Using the CLI: - -``` -argocd repo add https://source.developers.google.com/p/my-google-cloud-project/r/my-repo --gcp-service-account-key-path service-account-key.json -``` - -Using the UI: - -1. Navigate to `Settings/Repositories` - - ![connect repo overview](../assets/repo-add-overview.png) - -1. Click `Connect Repo using Google Cloud Source` button, enter the URL and the Google Cloud service account in JSON format. - - ![connect repo](../assets/repo-add-google-cloud-source.png) - -1. Click `Connect` to test the connection and have the repository added - ## Credential templates You can also set up credentials to serve as templates for connecting repositories, without having to repeat credential configuration. For example, if you setup credential templates for the URL prefix `https://github.com/argoproj`, these credentials will be used for all repositories with this URL as prefix (e.g. `https://github.com/argoproj/argocd-example-apps`) that do not have their own credentials configured. diff --git a/docs/user-guide/projects.md b/docs/user-guide/projects.md index 0973a19afe1fc..8b1d8850f238d 100644 --- a/docs/user-guide/projects.md +++ b/docs/user-guide/projects.md @@ -47,33 +47,6 @@ argocd proj add-source argocd proj remove-source ``` -We can also do negations of sources (i.e. do _not_ use this repo). - -```bash -argocd proj add-source ! -argocd proj remove-source ! -``` - -Declaratively we can do something like this: - -```yaml -spec: - sourceRepos: - # Do not use the test repo in argoproj - - '!ssh://git@GITHUB.com:argoproj/test' - # Nor any Gitlab repo under group/ - - '!https://gitlab.com/group/**' - # Any other repo is fine though - - '*' -``` - -A source repository is considered valid if the following conditions hold: - -1. _Any_ allow source rule (i.e. a rule which isn't prefixed with `!`) permits the source -2. AND *no* deny source (i.e. a rule which is prefixed with `!`) rejects the source - -Keep in mind that `!*` is an invalid rule, since it doesn't make any sense to disallow everything. - Permitted destination clusters and namespaces are managed with the commands (for clusters always provide server, the name is not used for matching): ```bash @@ -81,7 +54,7 @@ argocd proj add-destination , argocd proj remove-destination , ``` -As with sources, we can also do negations of destinations (i.e. install anywhere _apart from_). +We can also do negations of destinations (i.e. install anywhere _apart from_). ```bash argocd proj add-destination !,! @@ -104,10 +77,10 @@ spec: server: '*' ``` -As with sources, a destination is considered valid if the following conditions hold: +A destination is considered valid if the following conditions hold: -1. _Any_ allow destination rule (i.e. a rule which isn't prefixed with `!`) permits the destination -2. AND *no* deny destination (i.e. a rule which is prefixed with `!`) rejects the destination +1) _Any_ allow destination rule (i.e. a rule which isn't prefixed with `!`) permits the destination +2) AND *no* deny destination (i.e. a rule which is prefixed with `!`) rejects the destination Keep in mind that `!*` is an invalid rule, since it doesn't make any sense to disallow everything. diff --git a/docs/user-guide/sync-options.md b/docs/user-guide/sync-options.md index 098291e80d28b..387ce85341ab3 100644 --- a/docs/user-guide/sync-options.md +++ b/docs/user-guide/sync-options.md @@ -38,8 +38,8 @@ metadata: argocd.argoproj.io/sync-options: Validate=false ``` -If you want to exclude a whole class of objects globally, consider setting `resource.customizations` in [system level configuration](../user-guide/diffing.md#system-level-configuration). - +If you want to exclude a whole class of objects globally, consider setting `resource.customizations` in [system level configuration](../user-guide/diffing.md#system-level-configuration). + ## Skip Dry Run for new custom resources types When syncing a custom resource which is not yet known to the cluster, there are generally two options: @@ -60,9 +60,9 @@ The dry run will still be executed if the CRD is already present in the cluster. ## Selective Sync -Currently when syncing using auto sync Argo CD applies every object in the application. +Currently when syncing using auto sync Argo CD applies every object in the application. For applications containing thousands of objects this takes quite a long time and puts undue pressure on the api server. -Turning on selective sync option which will sync only out-of-sync resources. +Turning on selective sync option which will sync only out-of-sync resources. You can add this option by following ways @@ -77,7 +77,7 @@ spec: syncPolicy: syncOptions: - ApplyOutOfSyncOnly=true -``` +``` 2) Set sync option via argocd cli @@ -104,8 +104,8 @@ spec: ## Prune Last -This feature is to allow the ability for resource pruning to happen as a final, implicit wave of a sync operation, -after the other resources have been deployed and become healthy, and after all other waves completed successfully. +This feature is to allow the ability for resource pruning to happen as a final, implicit wave of a sync operation, +after the other resources have been deployed and become healthy, and after all other waves completed successfully. ```yaml apiVersion: argoproj.io/v1alpha1 @@ -142,10 +142,6 @@ spec: If the `Replace=true` sync option is set the Argo CD will use `kubectl replace` or `kubectl create` command to apply changes. -!!! warning - During the sync process, the resources will be synchronized using the 'kubectl replace/create' command. - This sync option has the potential to be destructive and might lead to resources having to be recreated, which could cause an outage for your application. - This can also be configured at individual resource level. ```yaml metadata: @@ -262,57 +258,6 @@ The example above shows how an Argo CD Application can be configured so it will ## Create Namespace -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - namespace: argocd -spec: - destination: - server: https://kubernetes.default.svc - namespace: some-namespace - syncPolicy: - syncOptions: - - CreateNamespace=true -``` - -The example above shows how an Argo CD Application can be configured so it will create the namespace specified in `spec.destination.namespace` if it doesn't exist already. Without this either declared in the Application manifest or passed in the CLI via `--sync-option CreateNamespace=true`, the Application will fail to sync if the namespace doesn't exist. - -Note that the namespace to be created must be informed in the `spec.destination.namespace` field of the Application resource. The `metadata.namespace` field in the Application's child manifests must match this value, or can be omitted, so resources are created in the proper destination. - -### Namespace Metadata - -We can also add labels and annotations to the namespace through `managedNamespaceMetadata`. If we extend the example above -we could potentially do something like below: - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - namespace: test -spec: - syncPolicy: - managedNamespaceMetadata: - labels: # The labels to set on the application namespace - any: label - you: like - annotations: # The annotations to set on the application namespace - the: same - applies: for - annotations: on-the-namespace - syncOptions: - - CreateNamespace=true -``` - -In order for ArgoCD to manage the labels and annotations on the namespace, `CreateNamespace=true` needs to be set as a -sync option, otherwise nothing will happen. If the namespace doesn't already exist, or if it already exists and doesn't -already have labels and/or annotations set on it, you're good to go. Using `managedNamespaceMetadata` will also set the -resource tracking label (or annotation) on the namespace, so you can easily track which namespaces are managed by ArgoCD. - -In the case you do not have any custom annotations or labels but would nonetheless want to have resource tracking set on -your namespace, that can be done by setting `managedNamespaceMetadata` with an empty `labels` and/or `annotations` map, -like the example below: - ```yaml apiVersion: argoproj.io/v1alpha1 kind: Application @@ -320,91 +265,7 @@ metadata: namespace: test spec: syncPolicy: - managedNamespaceMetadata: - labels: # The labels to set on the application namespace - annotations: # The annotations to set on the application namespace syncOptions: - CreateNamespace=true ``` - -In the case where ArgoCD is "adopting" an existing namespace which already has metadata set on it, we rely on using -Server Side Apply in order not to lose metadata which has already been set. The main implication here is that it takes -a few extra steps to get rid of an already preexisting field. - -Imagine we have a pre-existing namespace as below: - -```yaml -apiVersion: v1 -kind: Namespace -metadata: - name: foobar - annotations: - foo: bar - abc: "123" -``` - -If we want to manage the `foobar` namespace with ArgoCD and to then also remove the `foo: bar` annotation, in -`managedNamespaceMetadata` we'd need to first rename the `foo` value: - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -spec: - syncPolicy: - managedNamespaceMetadata: - annotations: - abc: 123 # adding this is informational with SSA; this would be sticking around in any case until we set a new value - foo: remove-me - syncOptions: - - CreateNamespace=true -``` - -Once that has been synced, we're ok to remove `foo` - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -spec: - syncPolicy: - managedNamespaceMetadata: - annotations: - abc: 123 # adding this is informational with SSA; this would be sticking around in any case until we set a new value - syncOptions: - - CreateNamespace=true -``` - -Another thing to keep mind of is that if you have a k8s manifest for the same namespace in your ArgoCD application, that -will take precedence and *overwrite whatever values that have been set in `managedNamespaceMetadata`*. In other words, if -you have an application that sets `managedNamespaceMetadata` - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Application -spec: - syncPolicy: - managedNamespaceMetadata: - annotations: - abc: 123 - syncOptions: - - CreateNamespace=true -``` - -But you also have a k8s manifest with a matching name - -```yaml -apiVersion: v1 -kind: Namespace -metadata: - name: foobar - annotations: - foo: bar - something: completely-different -``` - -The resulting namespace will have its annotations set to - -```yaml - annotations: - foo: bar - something: completely-different -``` +The example above shows how an Argo CD Application can be configured so it will create namespaces for the Application resources if the namespaces don't exist already. Without this either declared in the Application manifest or passed in the cli via `--sync-option CreateNamespace=true`, the Application will fail to sync if the resources' namespaces do not exist. diff --git a/docs/user-guide/tool_detection.md b/docs/user-guide/tool_detection.md index 06648df3e2cce..6c6829ea0c434 100644 --- a/docs/user-guide/tool_detection.md +++ b/docs/user-guide/tool_detection.md @@ -33,11 +33,9 @@ Otherwise it is assumed to be a plain **directory** application. ## Disable built-in tools -Built-in config management tools can be optionally disabled by setting one of the following -keys, in the `argocd-cm` ConfigMap, to `false`: `kustomize.enable`, `helm.enable` or `jsonnet.enable`. Once the -tool is disabled, Argo CD will assume the application target directory contains plain Kubernetes YAML manifests. - -Disabling unused config management tools can be a helpful security enhancement. Vulnerabilities are sometimes limited to certain config management tools. Even if there is no vulnerability, an attacker may use a certain tool to take advantage of a misconfiguration in an Argo CD instance. Disabling unused config management tools limits the tools available to malicious actors. +Optionally built-in config management tools might be disabled. In order to disable the tool add one of the following +keys to the `argocd-cm` ConfigMap: `kustomize.enable`, `helm.enable` or `jsonnet.enable`. Once the +tool is disabled Argo CD will assume the application target directory contains plain Kubernetes YAML manifests. ## References diff --git a/docs/user-guide/tracking_strategies.md b/docs/user-guide/tracking_strategies.md index e1abe85717724..9a4ada2e6d519 100644 --- a/docs/user-guide/tracking_strategies.md +++ b/docs/user-guide/tracking_strategies.md @@ -20,6 +20,8 @@ For Helm, all versions are [Semantic Versions](https://semver.org/). As a result | Track minor releases (e.g. in QA) | Use a range | `1.*` or `>=1.0.0 <2.0.0` | | Use the latest (e.g. in local development) | Use star range | `*` or `>=0.0.0` | +**Note for OCI Helm repositories**: the only available strategy is "Pin to a version". + [Read about version ranges](https://www.telerik.com/blogs/the-mystical-magical-semver-ranges-used-by-npm-bower) ## Git diff --git a/examples/plugins/helm/README.md b/examples/plugins/helm/README.md deleted file mode 100644 index 107d0da6808d7..0000000000000 --- a/examples/plugins/helm/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Simple Helm plugin - -The directory path to the shell scripts will need to be updated based on how you mount them -into the sidecar. - -## Installation - -```shell -kustomize build examples/plugins/helm/ | kubectl apply -n argocd -f - -``` diff --git a/examples/plugins/helm/argocd-repo-server-deployment-patch.yaml b/examples/plugins/helm/argocd-repo-server-deployment-patch.yaml deleted file mode 100644 index aa50ec2181a9f..0000000000000 --- a/examples/plugins/helm/argocd-repo-server-deployment-patch.yaml +++ /dev/null @@ -1,54 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: argocd-repo-server -spec: - template: - spec: - initContainers: - - name: helm-plugin-setup - image: busybox - command: - - sh - - -c - - | - wget https://get.helm.sh/helm-v3.8.2-linux-amd64.tar.gz -O - | tar xz && mv linux-amd64/helm /tools/helm && chmod +x /tools/helm - wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -O /tools/jq && chmod +x /tools/jq - wget https://github.com/mikefarah/yq/releases/download/v4.24.5/yq_linux_amd64 -O /tools/yq && chmod +x /tools/yq - volumeMounts: - - mountPath: /tools - name: helm-plugin-tools - containers: - - name: helm-plugin - command: [/var/run/argocd/argocd-cmp-server] - args: [--loglevel, debug] - image: busybox - securityContext: - runAsNonRoot: true - runAsUser: 999 - volumeMounts: - - mountPath: /var/run/argocd - name: var-files - - mountPath: /home/argocd/cmp-server/plugins - name: plugins - - mountPath: /helm-working-dir - name: helm-plugin-tmp - - mountPath: /home/argocd/cmp-server/config/plugin.yaml - subPath: plugin.yaml - name: helm-plugin-config - - mountPath: /var/run/argocd/helm-plugin/generate.sh - subPath: generate.sh - name: helm-plugin-config - - mountPath: /var/run/argocd/helm-plugin/get-parameters.sh - subPath: generate.sh - name: helm-plugin-config - - mountPath: /usr/local/bin - name: helm-plugin-tools - volumes: - - configMap: - name: helm-plugin-config - name: helm-plugin-config - - emptyDir: {} - name: helm-plugin-tmp - - emptyDir: {} - name: helm-plugin-tools diff --git a/examples/plugins/helm/generate.sh b/examples/plugins/helm/generate.sh deleted file mode 100755 index c382b78b1c6ad..0000000000000 --- a/examples/plugins/helm/generate.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -ARGUMENTS=$(echo "$ARGOCD_APP_PARAMETERS" | jq -r '.[] | select(.name == "values-files").array | .[] | "--values=" + .') -PARAMETERS=$(echo "$ARGOCD_APP_PARAMETERS" | jq -r '.[] | select(.name == "helm-parameters").map | to_entries | map("\(.key)=\(.value)") | .[] | "--set=" + .') - -echo ". $ARGUMENTS $PARAMETERS" | xargs helm template diff --git a/examples/plugins/helm/get-parameters.sh b/examples/plugins/helm/get-parameters.sh deleted file mode 100755 index d89c29c46656e..0000000000000 --- a/examples/plugins/helm/get-parameters.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -yq e -o=json values.yaml | jq '{ - name: "helm-parameters", - title: "Helm Parameters", - collectionType: "map", - map: [leaf_paths as $path | {"key": $path | join("."), "value": getpath($path)|tostring}] | from_entries -}' diff --git a/examples/plugins/helm/kustomization.yaml b/examples/plugins/helm/kustomization.yaml deleted file mode 100644 index 8b6e41b71c294..0000000000000 --- a/examples/plugins/helm/kustomization.yaml +++ /dev/null @@ -1,15 +0,0 @@ -bases: - - ../../../manifests/base - -configMapGenerator: - - name: helm-plugin-config - files: - - plugin.yaml - - generate.sh - - get-parameters.sh - -generatorOptions: - disableNameSuffixHash: true - -patchesStrategicMerge: - - argocd-repo-server-deployment-patch.yaml diff --git a/examples/plugins/helm/plugin.yaml b/examples/plugins/helm/plugin.yaml deleted file mode 100644 index a45d2d0d4dd9b..0000000000000 --- a/examples/plugins/helm/plugin.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: ConfigManagementPlugin -metadata: - name: simple-helm-cmp -spec: - version: v1.0 - generate: - command: [sh, /var/run/argocd/helm-plugin/generate.sh] - discover: - fileName: "./values.yaml" - parameters: - static: - - name: values-files - title: VALUES FILES - collectionType: array - dynamic: - command: [sh, /var/run/argocd/helm-plugin/get-parameters.sh] diff --git a/go.mod b/go.mod index f26a3f505bf6e..617d57fb4a5bc 100644 --- a/go.mod +++ b/go.mod @@ -5,81 +5,83 @@ go 1.18 require ( code.gitea.io/sdk/gitea v0.15.1 github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible - github.com/Masterminds/semver/v3 v3.2.0 + github.com/Masterminds/semver/v3 v3.1.1 github.com/TomOnTime/utfutil v0.0.0-20180511104225-09c41003ee1d - github.com/alicebob/miniredis/v2 v2.23.1 - github.com/argoproj/gitops-engine v0.7.1-0.20221208230615-917f5a0f16d5 - github.com/argoproj/notifications-engine v0.3.1-0.20221203221941-490d98afd1d6 - github.com/argoproj/pkg v0.13.7-0.20221115212233-27bd8ce31415 - github.com/aws/aws-sdk-go v1.44.164 + github.com/alicebob/miniredis/v2 v2.14.2 + github.com/argoproj/gitops-engine v0.7.1-0.20221004132320-98ccd3d43fd9 + github.com/argoproj/notifications-engine v0.3.1-0.20220812180936-4d8552b0775f + github.com/argoproj/pkg v0.11.1-0.20211203175135-36c59d8fafe0 + github.com/aws/aws-sdk-go v1.38.49 github.com/bombsimon/logrusr/v2 v2.0.1 - github.com/bradleyfalzon/ghinstallation/v2 v2.1.0 - github.com/casbin/casbin/v2 v2.60.0 + github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 + github.com/casbin/casbin/v2 v2.39.1 github.com/chai2010/gettext-go v0.0.0-20170215093142-bf70f2a70fb1 // indirect + github.com/coreos/go-oidc v2.2.1+incompatible github.com/dustin/go-humanize v1.0.0 - github.com/evanphx/json-patch v5.6.0+incompatible - github.com/fsnotify/fsnotify v1.6.0 + github.com/evanphx/json-patch v4.12.0+incompatible + github.com/fsnotify/fsnotify v1.5.1 github.com/ghodss/yaml v1.0.0 github.com/go-git/go-git/v5 v5.4.2 github.com/go-logr/logr v1.2.3 - github.com/go-openapi/loads v0.21.2 - github.com/go-openapi/runtime v0.25.0 - github.com/go-openapi/spec v0.20.6 // indirect - github.com/go-openapi/validate v0.21.0 // indirect + github.com/go-openapi/loads v0.19.4 + github.com/go-openapi/runtime v0.19.4 + github.com/go-openapi/spec v0.19.5 // indirect + github.com/go-openapi/validate v0.19.5 // indirect github.com/go-redis/cache/v8 v8.4.2 - github.com/go-redis/redis/v8 v8.11.5 + github.com/go-redis/redis/v8 v8.11.3 github.com/gobwas/glob v0.2.3 github.com/gogits/go-gogs-client v0.0.0-20190616193657-5a05380e4bc2 github.com/gogo/protobuf v1.3.2 - github.com/golang-jwt/jwt/v4 v4.4.3 + github.com/golang-jwt/jwt/v4 v4.2.0 github.com/golang/protobuf v1.5.2 - github.com/google/go-cmp v0.5.9 + github.com/google/go-cmp v0.5.7 github.com/google/go-github/v35 v35.3.0 - github.com/google/go-jsonnet v0.19.1 + github.com/google/go-jsonnet v0.18.0 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.1.2 github.com/gorilla/handlers v1.5.1 - github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.4.2 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-retryablehttp v0.7.0 - github.com/imdario/mergo v0.3.13 + github.com/imdario/mergo v0.3.12 github.com/improbable-eng/grpc-web v0.0.0-20181111100011-16092bd1d58a - github.com/itchyny/gojq v0.12.10 + github.com/itchyny/gojq v0.12.3 github.com/jeremywohl/flatten v1.0.1 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 - github.com/ktrysmt/go-bitbucket v0.9.55 + github.com/ktrysmt/go-bitbucket v0.9.40 github.com/malexdev/utfutil v0.0.0-20180510171754-00c8d4a8e7a8 // indirect - github.com/mattn/go-isatty v0.0.16 - github.com/mattn/go-zglob v0.0.4 + github.com/mattn/go-isatty v0.0.14 + github.com/mattn/go-zglob v0.0.3 github.com/olekukonko/tablewriter v0.0.5 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.14.0 + github.com/pkg/errors v0.9.1 + github.com/pquerna/cachecontrol v0.1.0 // indirect + github.com/prometheus/client_golang v1.12.1 github.com/r3labs/diff v1.1.0 + github.com/robfig/cron v1.2.0 github.com/rs/cors v1.8.0 // indirect - github.com/sirupsen/logrus v1.9.0 + github.com/sirupsen/logrus v1.8.1 github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c github.com/soheilhy/cmux v0.1.5 - github.com/spf13/cobra v1.6.1 + github.com/spf13/cobra v1.5.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.1 - github.com/valyala/fasttemplate v1.2.2 + github.com/stretchr/testify v1.7.1 + github.com/valyala/fasttemplate v1.2.1 github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 github.com/xanzy/go-gitlab v0.60.0 - github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 - golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa - golang.org/x/net v0.4.0 // indirect - golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 - golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 - golang.org/x/term v0.3.0 - google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90 - google.golang.org/grpc v1.51.0 - google.golang.org/protobuf v1.28.1 - gopkg.in/go-playground/webhooks.v5 v5.17.0 + github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e + golang.org/x/net v0.0.0-20220621193019-9d032be2e588 // indirect + golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 + google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 + google.golang.org/grpc v1.45.0 + google.golang.org/protobuf v1.28.0 + gopkg.in/go-playground/webhooks.v5 v5.11.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.24.2 k8s.io/apiextensions-apiserver v0.24.2 @@ -92,40 +94,30 @@ require ( k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 layeh.com/gopher-json v0.0.0-20190114024228-97fed8db8427 sigs.k8s.io/controller-runtime v0.11.0 - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 + sigs.k8s.io/structured-merge-diff/v4 v4.2.1 sigs.k8s.io/yaml v1.3.0 ) require ( github.com/gfleury/go-bitbucket-v1 v0.0.0-20220301131131-8e7ed04b843e - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.3.0 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect k8s.io/apiserver v0.24.2 ) require ( - github.com/Masterminds/sprig/v3 v3.2.2 - github.com/antonmedv/expr v1.9.0 - github.com/coreos/go-oidc/v3 v3.4.0 - github.com/gosimple/slug v1.13.1 + github.com/gosimple/slug v1.12.0 github.com/microsoft/azure-devops-go-api/azuredevops v1.0.0-b5 - github.com/robfig/cron/v3 v3.0.1 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.31.0 - go.opentelemetry.io/otel v1.11.1 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.1 - go.opentelemetry.io/otel/sdk v1.11.1 + go.opentelemetry.io/otel v1.6.3 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.3 + go.opentelemetry.io/otel/sdk v1.6.3 ) -require ( - github.com/emicklei/go-restful/v3 v3.8.0 // indirect - github.com/google/go-github/v45 v45.2.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/shopspring/decimal v1.2.0 // indirect - github.com/spf13/cast v1.4.1 // indirect -) +require github.com/emicklei/go-restful/v3 v3.8.0 // indirect require ( - cloud.google.com/go/compute v1.7.0 // indirect + cloud.google.com/go v0.99.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.18 // indirect @@ -134,18 +126,21 @@ require ( github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect - github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/goutils v1.1.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.22.0+incompatible // indirect + github.com/Masterminds/sprig v2.22.0+incompatible github.com/Microsoft/go-winio v0.4.17 // indirect - github.com/PagerDuty/go-pagerduty v1.6.0 // indirect + github.com/PagerDuty/go-pagerduty v1.5.0 // indirect github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20210112200207-10ab4d695d60 // indirect github.com/acomagu/bufpipe v1.0.3 // indirect github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect + github.com/antonmedv/expr v1.8.9 // indirect + github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/cenkalti/backoff/v4 v4.1.2 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -154,20 +149,21 @@ require ( github.com/emirpasic/gods v1.12.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect github.com/fatih/camelcase v1.0.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/felixge/httpsnoop v1.0.1 // indirect github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect github.com/fvbommel/sortorder v1.0.1 // indirect github.com/go-errors/errors v1.0.1 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.3.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/analysis v0.21.4 // indirect - github.com/go-openapi/errors v0.20.2 // indirect + github.com/go-openapi/analysis v0.19.5 // indirect + github.com/go-openapi/errors v0.19.2 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/strfmt v0.21.3 // indirect - github.com/go-openapi/swag v0.21.1 // indirect - github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 // indirect + github.com/go-openapi/jsonreference v0.19.5 // indirect + github.com/go-openapi/strfmt v0.19.3 // indirect + github.com/go-openapi/swag v0.19.14 // indirect + github.com/go-stack/stack v1.8.0 // indirect + github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.4.0 // indirect github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/btree v1.0.1 // indirect @@ -180,19 +176,19 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-version v1.2.1 // indirect - github.com/huandu/xstrings v1.3.1 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/itchyny/timefmt-go v0.1.5 // indirect + github.com/huandu/xstrings v1.3.0 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/itchyny/timefmt-go v0.1.2 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jonboulle/clockwork v0.2.2 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect - github.com/klauspost/compress v1.15.9 // indirect + github.com/klauspost/compress v1.13.5 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mailru/easyjson v0.7.6 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -205,14 +201,13 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opsgenie/opsgenie-go-sdk-v2 v1.0.5 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect github.com/russross/blackfriday v1.5.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sergi/go-diff v1.1.0 // indirect @@ -223,27 +218,28 @@ require ( github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/xanzy/ssh-agent v0.3.0 // indirect github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect - go.mongodb.org/mongo-driver v1.10.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.1 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.1 // indirect - go.opentelemetry.io/otel/trace v1.11.1 // indirect - go.opentelemetry.io/proto/otlp v0.19.0 // indirect + go.mongodb.org/mongo-driver v1.1.2 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.3 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3 // indirect + go.opentelemetry.io/otel/trace v1.6.3 // indirect + go.opentelemetry.io/proto/otlp v0.15.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect golang.org/x/exp v0.0.0-20210901193431-a062eea981d2 // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/sys v0.3.0 // indirect - golang.org/x/text v0.5.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect + golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect - golang.org/x/tools v0.1.12 // indirect + golang.org/x/tools v0.1.10 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - gomodules.xyz/notify v0.1.1 // indirect + gomodules.xyz/notify v0.1.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect 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 - gopkg.in/yaml.v3 v3.0.1 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect k8s.io/cli-runtime v0.24.2 // indirect k8s.io/component-base v0.24.2 // indirect k8s.io/component-helpers v0.24.2 // indirect @@ -260,6 +256,7 @@ replace ( github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 github.com/golang/protobuf => github.com/golang/protobuf v1.4.2 + github.com/gorilla/websocket => github.com/gorilla/websocket v1.4.2 github.com/grpc-ecosystem/grpc-gateway => github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/improbable-eng/grpc-web => github.com/improbable-eng/grpc-web v0.0.0-20181111100011-16092bd1d58a diff --git a/go.sum b/go.sum index d67a1250468cf..c233f7ce4f9fd 100644 --- a/go.sum +++ b/go.sum @@ -27,26 +27,19 @@ cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aD cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= +cloud.google.com/go v0.99.0 h1:y/cM2iqGgGi5D5DQZl6D9STN/3dR/Vx5Mp8s752oJTY= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -56,7 +49,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= code.gitea.io/gitea-vet v0.2.1/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFjGGfE= code.gitea.io/sdk/gitea v0.15.1 h1:WJreC7YYuxbn0UDaPuWIe/mtiNKTvLN8MLkaw71yx/M= code.gitea.io/sdk/gitea v0.15.1/go.mod h1:klY2LVI3s3NChzIk/MzMn7G1FHrfU7qd63iSMVoHRBA= @@ -84,6 +76,7 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/GoogleCloudPlatform/k8s-cloud-provider v1.16.1-0.20210702024009-ea6160c1d0e3/go.mod h1:8XasY4ymP2V/tn2OOV9ZadmiTE1FIB/h3W+yNlPttKw= github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo= @@ -92,17 +85,14 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1 github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= -github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= @@ -112,11 +102,14 @@ github.com/Microsoft/hcsshim v0.8.22/go.mod h1:91uVCVzvX2QD16sMCenoxxXo6L1wJnLMX github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PagerDuty/go-pagerduty v1.6.0 h1:am81SzvG5Pw+s3JZ5yEy6kGvsXXklTNRrGr3d8WKpsU= -github.com/PagerDuty/go-pagerduty v1.6.0/go.mod h1:7eaBLzsDpK7VUvU0SJ5mohczQkoWrrr5CjDaw5gh1as= +github.com/PagerDuty/go-pagerduty v1.5.0 h1:/p8FGD32G8HGm7MQIjlTPTGXRJ62Qkm8Lmt5BcUVJOo= +github.com/PagerDuty/go-pagerduty v1.5.0/go.mod h1:txr8VbObXdk2RkqF+C2an4qWssdGY99fK26XYUDjh+4= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20210112200207-10ab4d695d60 h1:prBTRx78AQnXzivNT9Crhu564W/zPPr3ibSlpT9xKcE= github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20210112200207-10ab4d695d60/go.mod h1:rjP7sIipbZcagro/6TCk6X0ZeFT2eyudH5+fve/cbBA= @@ -128,6 +121,7 @@ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/ github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -136,42 +130,43 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= -github.com/alicebob/miniredis/v2 v2.23.1 h1:jR6wZggBxwWygeXcdNyguCOCIjPsZyNUNlAkTx2fu0U= -github.com/alicebob/miniredis/v2 v2.23.1/go.mod h1:84TWKZlxYkfgMucPBf5SOQBYJceZeQRFIaQgNMiCX6Q= +github.com/alicebob/miniredis/v2 v2.14.2 h1:VeoqKUAsJfT2af61nDE7qhBzqn3J6xjnt9MFAbdrEtg= +github.com/alicebob/miniredis/v2 v2.14.2/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/antonmedv/expr v1.9.0 h1:j4HI3NHEdgDnN9p6oI6Ndr0G5QryMY0FNxT4ONrFDGU= -github.com/antonmedv/expr v1.9.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.9 h1:O9stiHmHHww9b4ozhPx7T6BK7fXfOCHJ8ybxf0833zw= +github.com/antonmedv/expr v1.8.9/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= -github.com/argoproj/gitops-engine v0.7.1-0.20221208230615-917f5a0f16d5 h1:iRpHi7X3q9G55KTaMjxKicgNnS2blFHaEfOOgsmP8lE= -github.com/argoproj/gitops-engine v0.7.1-0.20221208230615-917f5a0f16d5/go.mod h1:WpA/B7tgwfz+sdNE3LqrTrb7ArEY1FOPI2pAGI0hfPc= -github.com/argoproj/notifications-engine v0.3.1-0.20221203221941-490d98afd1d6 h1:b92Xft7MQv/SP56FW08zt5CMTE1rySH8UPDKOAgSzOM= -github.com/argoproj/notifications-engine v0.3.1-0.20221203221941-490d98afd1d6/go.mod h1:pgPU59KCsBOMhyw9amRWPoSuBmUWvx3Xsc5r0mUriLg= -github.com/argoproj/pkg v0.13.7-0.20221115212233-27bd8ce31415 h1:/5UtDHntvwPxbe/j2+xmQgvG83PQueGHko+9sf8+FA0= -github.com/argoproj/pkg v0.13.7-0.20221115212233-27bd8ce31415/go.mod h1:vqTRUU8ATWVtKog5bVg0zDrKxEjUaFnObZaqpY0oprQ= +github.com/appscode/go v0.0.0-20190808133642-1d4ef1f1c1e0/go.mod h1:iy07dV61Z7QQdCKJCIvUoDL21u6AIceRhZzyleh2ymc= +github.com/argoproj/gitops-engine v0.7.1-0.20221004132320-98ccd3d43fd9 h1:pXN64mJfrg8qx4mgWDnJ9E2T5ikZupvVRSXYMoe39Y8= +github.com/argoproj/gitops-engine v0.7.1-0.20221004132320-98ccd3d43fd9/go.mod h1:WpA/B7tgwfz+sdNE3LqrTrb7ArEY1FOPI2pAGI0hfPc= +github.com/argoproj/notifications-engine v0.3.1-0.20220812180936-4d8552b0775f h1:xTts6TJ/SBbY9zV8qpueokUd3+SlJN6Abt4W6lAjOKM= +github.com/argoproj/notifications-engine v0.3.1-0.20220812180936-4d8552b0775f/go.mod h1:R3zlopt+/juYlebQc9Jarn9vBQ2xZruWOWjUNkfGY9M= +github.com/argoproj/pkg v0.11.1-0.20211203175135-36c59d8fafe0 h1:Cfp7rO/HpVxnwlRqJe0jHiBbZ77ZgXhB6HWlYD02Xdc= +github.com/argoproj/pkg v0.11.1-0.20211203175135-36c59d8fafe0/go.mod h1:ra+bQPmbVAoEL+gYSKesuigt4m49i3Qa3mE/xQcjCiA= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/auth0/go-jwt-middleware v1.0.1/go.mod h1:YSeUX3z6+TF2H+7padiEqNJ73Zy9vXW72U//IgN0BIM= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.33.16/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= +github.com/aws/aws-sdk-go v1.38.49 h1:E31vxjCe6a5I+mJLmUGaZobiWmg9KdWaud9IfceYeYQ= github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.129/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.44.164 h1:qDj0RutF2Ut0HZYyUJxFdReLxpYrjupsu2JmDIgCvX8= -github.com/aws/aws-sdk-go v1.44.164/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= @@ -188,17 +183,18 @@ github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2y github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bombsimon/logrusr/v2 v2.0.1 h1:1VgxVNQMCvjirZIYaT9JYn6sAVGVEcNtRE0y4mvaOAM= github.com/bombsimon/logrusr/v2 v2.0.1/go.mod h1:ByVAX+vHdLGAfdroiMg6q0zgq2FODY2lc5YJvzmOJio= -github.com/bradleyfalzon/ghinstallation/v2 v2.1.0 h1:5+NghM1Zred9Z078QEZtm28G/kfDfZN/92gkDlLwGVA= -github.com/bradleyfalzon/ghinstallation/v2 v2.1.0/go.mod h1:Xg3xPRN5Mcq6GDqeUVhFbjEWMb4JHCyWEeeBGEYQoTU= +github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 h1:tXKVfhE7FcSkhkv0UwkLvPDeZ4kz6OXd0PKPlFqf81M= +github.com/bradleyfalzon/ghinstallation/v2 v2.0.4/go.mod h1:B40qPqJxWE0jDZgOR1JmaMy+4AY1eBP+IByOvqyAKp0= github.com/bwmarrin/discordgo v0.19.0/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/casbin/casbin/v2 v2.60.0 h1:ZmC0/t4wolfEsDpDxTEsu2z6dfbMNpc11F52ceLs2Eo= -github.com/casbin/casbin/v2 v2.60.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/casbin/casbin/v2 v2.39.1 h1:TatfPL1hByffzPs610HL8+gBjCisAtEhjVhpIsbZ+ws= +github.com/casbin/casbin/v2 v2.39.1/go.mod h1:sEL80qBYTbd+BPeL4iyvwYzFT3qwLaESq5aFKVLbLfA= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -214,6 +210,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= @@ -226,6 +224,7 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= @@ -251,8 +250,8 @@ github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkE github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-oidc/v3 v3.4.0 h1:xz7elHb/LDwm/ERpwHd+5nb7wFHL32rsr6bBOgaeu6g= -github.com/coreos/go-oidc/v3 v3.4.0/go.mod h1:eHUXhZtXPQLgEaDrOVTgwbgmz1xGOkJNye6h3zkD2Pw= +github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= +github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -287,6 +286,7 @@ github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6 github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -313,14 +313,14 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= @@ -329,10 +329,13 @@ github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+ne github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flosch/pongo2 v0.0.0-20181225140029-79872a7b2769/go.mod h1:tbAXHifHQWNSpWbiJHpJTZH5fi3XHhDMdP//vuz9WS4= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -343,8 +346,8 @@ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2 github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= @@ -359,6 +362,9 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= @@ -377,11 +383,9 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= @@ -394,79 +398,76 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= -github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc= -github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= -github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.2 h1:dxy7PGTqEh94zj2E3h1cUmQQWiM1+aeCROfAr02EmK8= -github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= -github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro= -github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= -github.com/go-openapi/runtime v0.25.0 h1:7yQTCdRbWhX8vnIjdzU8S00tBYf7Sg71EBeorlPHvhc= -github.com/go-openapi/runtime v0.25.0/go.mod h1:Ux6fikcHXyyob6LNWxtE96hWwjBPYF0DXgVFuMTneOs= -github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= -github.com/go-openapi/spec v0.20.6 h1:ich1RQ3WDbfoeTqTAb+5EIxNmpKVJZWBNah9RAT0jIQ= -github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= -github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= -github.com/go-openapi/strfmt v0.21.3 h1:xwhj5X6CjXEZZHMWy1zKJxvW9AfHC9pkyUjLvHtKG7o= -github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= +github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/validate v0.21.0 h1:+Wqk39yKOhfpLqNLEC0/eViCkzM5FVXVqrvt526+wcI= -github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.5 h1:QhCBKRYqZR+SKo4gl1lPhPahope8/RLt6EVgY8X80w0= +github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= github.com/go-redis/cache/v8 v8.4.2 h1:8YbsmnU1Ws3TKS6T+qALzYE/MlGE+A/lrlx1XTA3p6M= github.com/go-redis/cache/v8 v8.4.2/go.mod h1:X7Jjd69Ssbrf3xBQLtIDE0g3WcSbFoQiSGeb8QfEJ+g= +github.com/go-redis/redis/v8 v8.11.3 h1:GCjoYp8c+yQTJfc0n69iwSiHjvuAdruxl7elnZCxgt8= github.com/go-redis/redis/v8 v8.11.3/go.mod h1:xNJ9xDG09FsIPwh3bWdk+0oDWHbtF9rPN0F/oD9XeKc= -github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= -github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.4.0 h1:Mr3JcvBjQEhCN9wld6OHKHuHxWaoXTaQfYKmj7QwP18= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.4.0/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -482,9 +483,9 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= @@ -509,7 +510,6 @@ github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+Licev github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -533,18 +533,14 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v35 v35.3.0 h1:fU+WBzuukn0VssbayTT+Zo3/ESKX9JYWjbZTLOTEyho= github.com/google/go-github/v35 v35.3.0/go.mod h1:yWB7uCcVWaUbUP74Aq3whuMySRMatyRmq5U9FTNlbio= github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg= github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= -github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= -github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= -github.com/google/go-jsonnet v0.19.1 h1:MORxkrG0elylUqh36R4AcSPX0oZQa9hvI3lroN+kDhs= -github.com/google/go-jsonnet v0.19.1/go.mod h1:5JVT33JVCoehdTj5Z2KJq1eIdt3Nb8PCmZ+W5D8U350= +github.com/google/go-jsonnet v0.18.0 h1:/6pTy6g+Jh1a1I2UMoAODkqELFiVIdOxbNwv0DDzoOg= +github.com/google/go-jsonnet v0.18.0/go.mod h1:C3fTzyVJDslXdiTqw/bTFk7vSGyCtH3MGRbDfvEwGd0= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= @@ -574,19 +570,13 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 h1:4EZlYQIiyecYJlUbVkFXCXHz1QPhVXcHnQKAzBTPfQo= github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4/go.mod h1:lEO7XoHJ/xNRBCxrn4h/CEB67h0kW1B0t4ooP2yrjUA= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -598,14 +588,11 @@ github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q= -github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= +github.com/gosimple/slug v1.12.0 h1:xzuhj7G7cGtd34NXnW/yF0l+AGNfWqwgh/IXgFy7dnc= +github.com/gosimple/slug v1.12.0/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= github.com/gregdel/pushover v1.1.0 h1:dwHyvrcpZCOS9V1fAnKPaGRRI5OC55cVaKhMybqNsKQ= @@ -625,22 +612,30 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QG github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0 h1:bkKf0BeBXcSYa7f5Fyi9gMuQ8gNsxeiNpZjR6VxNZeo= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.0 h1:eu1EI/mbirUgP5C8hVsTNaGZreBDlYiwC1FZWkvQPQ4= github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -651,36 +646,43 @@ github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/heketi/heketi v10.3.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= -github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.0 h1:gvV6jG9dTgFEncxo+AF7PH6MZXi/vZl25owA/8Dg8Wo= +github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/improbable-eng/grpc-web v0.0.0-20181111100011-16092bd1d58a h1:RweVA0vnEyStwtAelyGmnU8ENDnwd1Q7pQr7U3J/rXo= github.com/improbable-eng/grpc-web v0.0.0-20181111100011-16092bd1d58a/go.mod h1:6hRR09jOEG81ADP5wCQju1z71g6OL4eEvELdran/3cs= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8= -github.com/itchyny/gojq v0.12.10 h1:6TcS0VYWS6wgntpF/4tnrzwdCMjiTxRAxIqZWfDsDQU= -github.com/itchyny/gojq v0.12.10/go.mod h1:o3FT8Gkbg/geT4pLI0tF3hvip5F3Y/uskjRz9OYa38g= -github.com/itchyny/timefmt-go v0.1.5 h1:G0INE2la8S6ru/ZI5JecgyzbbJNs5lG1RcBqa7Jm6GE= -github.com/itchyny/timefmt-go v0.1.5/go.mod h1:nEP7L+2YmAbT2kZ2HfSs1d8Xtw9LY8D2stDBckWakZ8= +github.com/itchyny/go-flags v1.5.0/go.mod h1:lenkYuCobuxLBAd/HGFE4LRoW8D3B6iXRQfWYJ+MNbA= +github.com/itchyny/gojq v0.12.3 h1:s7jTCyOk/dy5bnDIScj24YX4Cr1yhEO2iW/bQT4Pm2s= +github.com/itchyny/gojq v0.12.3/go.mod h1:mi4PdXSlFllHyByM68JKUrbiArtEdEnNEmjbwxcQKAg= +github.com/itchyny/timefmt-go v0.1.2 h1:q0Xa4P5it6K6D7ISsbLAMwx1PnWlixDcJL6/sFs93Hs= +github.com/itchyny/timefmt-go v0.1.2/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A= github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= @@ -689,6 +691,7 @@ github.com/jeremywohl/flatten v1.0.1/go.mod h1:4AmD/VxjWcI5SRB0n6szE2A6s2fsNHDLO github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -703,6 +706,7 @@ github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -710,13 +714,14 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= @@ -726,13 +731,9 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.13.5 h1:9O69jUPDcsT9fEm74W92rZL9FQY7rCdaXVneq+yyzl4= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -743,11 +744,12 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/ktrysmt/go-bitbucket v0.9.55 h1:eOrF7wWmG4wz5iPr7ymgyWLoti2OfmrhU2tmT6yhAu8= -github.com/ktrysmt/go-bitbucket v0.9.55/go.mod h1:y5wrrDHCGUFAtuC43GyLBeFigq7rwrh4HqeDOOyZT+A= +github.com/ktrysmt/go-bitbucket v0.9.40 h1:LcvdyW7u58vfbUi9bCQB+ihyqDzoy+9WBq/odmBsXrg= +github.com/ktrysmt/go-bitbucket v0.9.40/go.mod h1:FWxy2UK7GlK5b0NSJGc5hPqnssVlkNnsChvyuOf/Xno= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= @@ -760,54 +762,64 @@ github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1 github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5/go.mod h1:c2mYKRyMb1BPkO5St0c/ps62L4S0W2NAkaTXj9qEI+0= github.com/lusis/slack-test v0.0.0-20190426140909-c40012f20018/go.mod h1:sFlOUpQL1YcjhFVXhg1CG8ZASEs/Mf1oVb6H75JL/zg= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailgun/mailgun-go v2.0.0+incompatible/go.mod h1:NWTyU+O4aczg/nsGhQnvHL6v2n5Gy6Sv5tNDVvC6FbU= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/malexdev/utfutil v0.0.0-20180510171754-00c8d4a8e7a8 h1:A6SLdFpRzUUF5v9F/7T1fu3DERmOCgTwwP6x54eyFfU= github.com/malexdev/utfutil v0.0.0-20180510171754-00c8d4a8e7a8/go.mod h1:UtpLyb/EupVKXF/N0b4NRe1DNg+QYJsnsHQ038romhM= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-zglob v0.0.4 h1:LQi2iOm0/fGgu80AioIJ/1j9w9Oh+9DZ39J4VAGzHQM= -github.com/mattn/go-zglob v0.0.4/go.mod h1:MxxjyoXXnMxfIpxTK2GAkw1w8glPsQILx3N5wrKakiY= +github.com/mattn/go-zglob v0.0.3 h1:6Ry4EYsScDyt5di4OI6xw1bYhOqfE5S33Z1OPy+d+To= +github.com/mattn/go-zglob v0.0.3/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/microsoft/azure-devops-go-api/azuredevops v1.0.0-b5 h1:YH424zrwLTlyHSH/GzLMJeu5zhYVZSx5RQxGKm1h96s= github.com/microsoft/azure-devops-go-api/azuredevops v1.0.0-b5/go.mod h1:PoGiBqKSQK1vIfQ+yVaFcGjDySHvym6FM1cNYnwzbrY= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.43/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= +github.com/minio/minio-go/v7 v7.0.2/go.mod h1:dJ80Mv2HeGkYLH1sqS/ksz07ON6csH3S6JUMSQ2zAns= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -821,7 +833,6 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -844,7 +855,6 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= @@ -870,7 +880,6 @@ github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -918,12 +927,13 @@ github.com/opsgenie/opsgenie-go-sdk-v2 v1.0.5 h1:AnS8ZCC5dle8P4X4FZ+IOlX9v0jAkCM github.com/opsgenie/opsgenie-go-sdk-v2 v1.0.5/go.mod h1:f0ezb0R/mrB9Hpm5RrIS6EX3ydjsR2nAB88nYYXZcNY= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -939,35 +949,37 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= +github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -976,9 +988,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/quobyte/api v0.1.8/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/r3labs/diff v1.1.0 h1:V53xhrbTHrWFWq3gI4b94AjgEJOerO1+1l0xyHOBi8M= @@ -987,18 +998,15 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= +github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so= github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= @@ -1007,30 +1015,29 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c h1:fyKiXKO1/I/B6Y2U8T7WdQGWzwehOuGIrljPtt7YTTI= github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/slack-go/slack v0.10.1 h1:BGbxa0kMsGEvLOEoZmYs8T1wWfoZXwmQFBb6FgYCXUA= github.com/slack-go/slack v0.10.1/go.mod h1:wWL//kk0ho+FcQXcBTmEafUI5dz4qz5f4mMk8oIkioQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1042,18 +1049,19 @@ github.com/sony/sonyflake v1.0.0/go.mod h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5Pse github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -1064,6 +1072,7 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/storageos/go-api v2.2.0+incompatible/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= @@ -1073,9 +1082,8 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1083,10 +1091,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= @@ -1094,6 +1100,7 @@ github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhV github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= @@ -1103,8 +1110,9 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= @@ -1121,25 +1129,18 @@ github.com/xanzy/go-gitlab v0.60.0 h1:HaIlc14k4t9eJjAhY0Gmq2fBHgKd1MthBn3+vzDtsb github.com/xanzy/go-gitlab v0.60.0/go.mod h1:F0QEXwmqiBUxCgJm8fE9S+1veX4XC9Z4cfaAbqwk4YM= github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 h1:5mLPGnFdSsevFRFc9q3yYbBkB6tsm4aCwwQV/j1JQAQ= -github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da h1:NimzV1aGyq29m5ukMK0AMWEhFaL/lrEOaephfuoiARg= +github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= @@ -1149,15 +1150,16 @@ go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQc go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= -go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= -go.mongodb.org/mongo-driver v1.10.0 h1:UtV6N5k14upNp4LTduX0QCufG124fSu25Wz9tu94GLg= -go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2 h1:jxcFYjlkl8xaERsgLo+RNquI0epW6zuy/ZRQs6jnrFA= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1174,29 +1176,29 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.3 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwkAtrWQ= -go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4= -go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE= +go.opentelemetry.io/otel v1.6.3 h1:FLOfo8f9JzFVFVyU+MSRJc2HdEAXQgm7pIv2uFKRSZE= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.1 h1:X2GndnMCsUPh6CiY2a+frAbNsXaPLbB0soHRYhAZ5Ig= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.1/go.mod h1:i8vjiSzbiUC7wOQplijSXMYUpNM93DtlS5CbUT+C6oQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.1 h1:MEQNafcNCB0uQIti/oHgU7CZpUMYQ7qigBwMVKycHvc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.1/go.mod h1:19O5I2U5iys38SsmT2uDJja/300woyzE1KPIQxEUBUc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.1 h1:LYyG/f1W/jzAix16jbksJfMQFpOH/Ma6T639pVPMgfI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.1/go.mod h1:QrRRQiY3kzAoYPNLP0W/Ikg0gR6V3LMc+ODSxr7yyvg= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.3 h1:nAmg1WgsUXoXf46dJG9eS/AzOcvkCTK4xJSUYpWyHYg= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.3/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3 h1:4/UjHWMVVc5VwX/KAtqJOHErKigMCH8NexChMuanb/o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3/go.mod h1:UJmXdiVVBaZ63umRUTwJuCMAV//GCMvDiQwn703/GoY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.3 h1:leYDq5psbM3K4QNcZ2juCj30LjUnvxjuYQj1mkGjXFM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.3/go.mod h1:ycItY/esVj8c0dKgYTOztTERXtPzcfDU/0o8EdwCjoA= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs= -go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys= +go.opentelemetry.io/otel/sdk v1.6.3 h1:prSHYdwCQOX5DrsEzxowH3nLhoAzEBdZhvrR79scfLs= +go.opentelemetry.io/otel/sdk v1.6.3/go.mod h1:A4iWF7HTXa+GWL/AaqESz28VuSBIcZ+0CV+IzJ5NMiQ= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.6.1/go.mod h1:RkFRM1m0puWIq10oxImnGEduNBzxiN7TXluRBtE+5j0= -go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ= -go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk= +go.opentelemetry.io/otel/trace v1.6.3 h1:IqN4L+5b0mPNjdXIiZ90Ni4Bl5BRkDQywePLWemd9bc= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.15.0 h1:h0bKrvdrT/9sBwEJ6iWUqT/N/xPcS66bL4u3isneJ6w= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1206,7 +1208,8 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1225,15 +1228,17 @@ golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -1241,9 +1246,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1291,14 +1295,15 @@ golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hM golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1-0.20210830214625-1b1db11ec8f4/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1306,6 +1311,7 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1318,6 +1324,7 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1345,25 +1352,17 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.0.0-20220621193019-9d032be2e588 h1:9ubFuySsnAJYGyJrZ3koiEv8FyqofCBdz3G9Mbf2YFc= +golang.org/x/net v0.0.0-20220621193019-9d032be2e588/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1382,28 +1381,22 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb h1:8tDJ3aechhddbdPAxpycgXHJRMLpk/Ab+aa4OgdN5/g= golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1419,15 +1412,14 @@ golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1435,9 +1427,12 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1450,6 +1445,7 @@ golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1476,14 +1472,16 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210301091718-77cc2087c03b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1495,41 +1493,26 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220406155245-289d7a0edf71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1538,15 +1521,14 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1554,25 +1536,26 @@ golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1623,22 +1606,19 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 h1:juzzlx91nWAOsHuOVfXZPMXHtJEKouZvY9bBbwlOeYs= gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45/go.mod h1:41y72mzHT7+jFNgyBpJRrZWuZJcLmLrTpq6iGgOFJMQ= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -gomodules.xyz/notify v0.1.1 h1:1tTuoyswmPvzqPCTEDQK8SZ3ukCxLsonAAwst2+y1a0= -gomodules.xyz/notify v0.1.1/go.mod h1:QgQyU4xEA/plJcDeT66J2Go2V7U4c0pD9wjo7HfFil4= -gomodules.xyz/version v0.1.0/go.mod h1:Y8xuV02mL/45psyPKG3NCVOwvAOy6T5Kx0l3rCjKSjU= +gomodules.xyz/notify v0.1.0 h1:lN7CAFKIWxaXJXm3F/7KTbgw3lUy9peh6iyjgj1skvA= +gomodules.xyz/notify v0.1.0/go.mod h1:wGy0vLXGpabCg0j9WbjzXf7pM7Khz11FqCLtBbTujP0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= @@ -1677,16 +1657,9 @@ google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1741,7 +1714,6 @@ google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= @@ -1760,29 +1732,15 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 h1:Et6SkiuvnBn+SgrSYXs/BrUpGB4mbdwt4R3vaPIlicA= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90 h1:4SPz2GL2CXJt28MTF8V6Ap/9ZiVbQlJeGSd9qtA7DLs= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1815,13 +1773,8 @@ google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= @@ -1831,9 +1784,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= @@ -1850,15 +1802,17 @@ gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= -gopkg.in/go-playground/webhooks.v5 v5.17.0 h1:truBced5ZmkiNKK47cM8bMe86wUSjNks7SFMuNKwzlc= -gopkg.in/go-playground/webhooks.v5 v5.17.0/go.mod h1:LZbya/qLVdbqDR1aKrGuWV6qbia2zCYSR5dpom2SInQ= +gopkg.in/go-playground/webhooks.v5 v5.11.0 h1:V3vej+ZXrVvO2EmBTKlhClEbpTqXH44K5OyLUMOkHMg= +gopkg.in/go-playground/webhooks.v5 v5.11.0/go.mod h1:LZbya/qLVdbqDR1aKrGuWV6qbia2zCYSR5dpom2SInQ= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= @@ -1973,9 +1927,8 @@ sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVY sigs.k8s.io/kustomize/kyaml v0.13.6 h1:eF+wsn4J7GOAXlvajv6OknSunxpcOBQQqsnPxObtkGs= sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/hack/gen-resources/generators/application_generator.go b/hack/gen-resources/generators/application_generator.go index b19280ae688b9..7810513faea79 100644 --- a/hack/gen-resources/generators/application_generator.go +++ b/hack/gen-resources/generators/application_generator.go @@ -98,7 +98,7 @@ func (pg *ApplicationGenerator) Generate(opts *util.GenerateOpts) error { Spec: v1alpha1.ApplicationSpec{ Project: "default", Destination: *destination, - Source: source, + Source: *source, }, }, v1.CreateOptions{}) if err != nil { diff --git a/hack/gen-resources/generators/cluster_generator.go b/hack/gen-resources/generators/cluster_generator.go index eec1cdfe3cc2e..4c2c593bffb7b 100644 --- a/hack/gen-resources/generators/cluster_generator.go +++ b/hack/gen-resources/generators/cluster_generator.go @@ -137,14 +137,14 @@ func (cg *ClusterGenerator) getClusterCredentials(namespace string, releaseSuffi return caData, cert, key, nil } -// TODO: also should provision service for vcluster pod +//TODO: also should provision service for vcluster pod func (cg *ClusterGenerator) installVCluster(opts *util.GenerateOpts, namespace string, releaseName string) error { cmd, err := helm.NewCmd("/tmp", "v3", "") if err != nil { return err } log.Print("Execute helm install command") - _, err = cmd.Freestyle("upgrade", "--install", releaseName, "vcluster", "--values", opts.ClusterOpts.ValuesFilePath, "--repo", "https://charts.loft.sh", "--namespace", namespace, "--repository-config", "", "--create-namespace", "--wait") + _, err = cmd.Freestyle("install", releaseName, "vcluster", "--values", opts.ClusterOpts.ValuesFilePath, "--repo", "https://charts.loft.sh", "--namespace", namespace, "--repository-config", "", "--create-namespace", "--wait") if err != nil { return err } @@ -157,13 +157,11 @@ func (cg *ClusterGenerator) getClusterServerUri(namespace string, releaseSuffix return "", err } // TODO: should be moved to service instead pod - log.Printf("Get service for https://" + pod.Status.PodIP + ":8443") return "https://" + pod.Status.PodIP + ":8443", nil } func (cg *ClusterGenerator) retrieveClusterUri(namespace, releaseSuffix string) (string, error) { - for i := 0; i < 10; i++ { - log.Printf("Attempting to get cluster uri") + for i := 0; i < 3; i++ { uri, err := cg.getClusterServerUri(namespace, releaseSuffix) if err != nil { log.Printf("Failed to get cluster uri due to %s", err.Error()) @@ -175,85 +173,61 @@ func (cg *ClusterGenerator) retrieveClusterUri(namespace, releaseSuffix string) return "", nil } -func (cg *ClusterGenerator) generate(i int, opts *util.GenerateOpts) error { - log.Printf("Generate cluster #%v of #%v", i, opts.ClusterOpts.Samples) - - namespace := opts.ClusterOpts.NamespacePrefix + "-" + util.GetRandomString() +func (cg *ClusterGenerator) Generate(opts *util.GenerateOpts) error { + for i := 0; i < opts.ClusterOpts.Samples; i++ { + log.Printf("Generate cluster #%v", i) - log.Printf("Namespace is %s", namespace) + namespace := opts.ClusterOpts.NamespacePrefix + "-" + util.GetRandomString() - releaseSuffix := util.GetRandomString() + log.Printf("Namespace is %s", namespace) - log.Printf("Release suffix is %s", namespace) + releaseSuffix := util.GetRandomString() - err := cg.installVCluster(opts, namespace, POD_PREFIX+"-"+releaseSuffix) - if err != nil { - log.Printf("Skip cluster installation due error %v", err.Error()) - } + log.Printf("Release suffix is %s", namespace) - log.Print("Get cluster credentials") - caData, cert, key, err := cg.getClusterCredentials(namespace, releaseSuffix) + err := cg.installVCluster(opts, namespace, POD_PREFIX+"-"+releaseSuffix) + if err != nil { + log.Printf("Skip cluster installation due error %v", err.Error()) + continue + } - for o := 0; o < 5; o++ { - if err == nil { - break + log.Print("Get cluster credentials") + caData, cert, key, err := cg.getClusterCredentials(namespace, releaseSuffix) + if err != nil { + return err } - log.Printf("Failed to get cluster credentials %s, retrying...", releaseSuffix) - time.Sleep(10 * time.Second) - caData, cert, key, err = cg.getClusterCredentials(namespace, releaseSuffix) - } - if err != nil { - return err - } - log.Print("Get cluster server uri") + log.Print("Get cluster server uri") - uri, err := cg.retrieveClusterUri(namespace, releaseSuffix) - if err != nil { - return err - } + uri, err := cg.retrieveClusterUri(namespace, releaseSuffix) + if err != nil { + return err + } - log.Printf("Cluster server uri is %s", uri) - - log.Print("Create cluster") - _, err = cg.db.CreateCluster(context.TODO(), &argoappv1.Cluster{ - Server: uri, - Name: opts.ClusterOpts.ClusterNamePrefix + "-" + util.GetRandomString(), - Config: argoappv1.ClusterConfig{ - TLSClientConfig: argoappv1.TLSClientConfig{ - Insecure: false, - ServerName: "kubernetes.default.svc", - CAData: caData, - CertData: cert, - KeyData: key, + log.Printf("Cluster server uri is %s", uri) + + log.Print("Create cluster") + _, err = cg.db.CreateCluster(context.TODO(), &argoappv1.Cluster{ + Server: uri, + Name: opts.ClusterOpts.ClusterNamePrefix + "-" + util.GetRandomString(), + Config: argoappv1.ClusterConfig{ + TLSClientConfig: argoappv1.TLSClientConfig{ + Insecure: false, + ServerName: "kubernetes.default.svc", + CAData: caData, + CertData: cert, + KeyData: key, + }, }, - }, - ConnectionState: argoappv1.ConnectionState{}, - ServerVersion: "1.18", - Namespaces: []string{opts.ClusterOpts.DestinationNamespace}, - Labels: labels, - }) - if err != nil { - return err - } - return nil -} - -func (cg *ClusterGenerator) Generate(opts *util.GenerateOpts) error { - log.Printf("Excute in parallel with %v", opts.ClusterOpts.Concurrency) - - wg := util.New(opts.ClusterOpts.Concurrency) - for l := 1; l <= opts.ClusterOpts.Samples; l++ { - wg.Add() - go func(i int) { - defer wg.Done() - err := cg.generate(i, opts) - if err != nil { - log.Printf("Failed to generate cluster #%v due to : %s", i, err.Error()) - } - }(l) + ConnectionState: argoappv1.ConnectionState{}, + ServerVersion: "1.18", + Namespaces: []string{opts.ClusterOpts.DestinationNamespace}, + Labels: labels, + }) + if err != nil { + return err + } } - wg.Wait() return nil } diff --git a/hack/gen-resources/generators/project_generator.go b/hack/gen-resources/generators/project_generator.go index 9f07cea1de9a1..a86dca0d86c22 100644 --- a/hack/gen-resources/generators/project_generator.go +++ b/hack/gen-resources/generators/project_generator.go @@ -3,7 +3,7 @@ package generator import ( "context" "log" - "fmt" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/argoproj/argo-cd/v2/hack/gen-resources/util" @@ -35,7 +35,7 @@ func (pg *ProjectGenerator) Generate(opts *util.GenerateOpts) error { }, v1.CreateOptions{}) if err != nil { log.Printf("Project #%v failed to generate", i) - return fmt.Errorf("error in generated-project: %w", err) + return err } } return nil diff --git a/hack/gen-resources/util/gen_options_parser.go b/hack/gen-resources/util/gen_options_parser.go index b352305f55437..4a39703c3d03d 100644 --- a/hack/gen-resources/util/gen_options_parser.go +++ b/hack/gen-resources/util/gen_options_parser.go @@ -2,6 +2,7 @@ package util import ( "os" + "gopkg.in/yaml.v2" ) @@ -33,7 +34,6 @@ type ClusterOpts struct { ValuesFilePath string `yaml:"valuesFilePath"` DestinationNamespace string `yaml:"destinationNamespace"` ClusterNamePrefix string `yaml:"clusterNamePrefix"` - Concurrency int `yaml:"parallel"` } type GenerateOpts struct { @@ -45,12 +45,6 @@ type GenerateOpts struct { Namespace string `yaml:"namespace"` } -func setDefaults(opts *GenerateOpts) { - if opts.ClusterOpts.Concurrency == 0 { - opts.ClusterOpts.Concurrency = 2 - } -} - func Parse(opts *GenerateOpts, file string) error { fp, err := os.ReadFile(file) if err != nil { @@ -61,7 +55,5 @@ func Parse(opts *GenerateOpts, file string) error { return e } - setDefaults(opts) - return nil } diff --git a/hack/gen-resources/util/sizedwaitgroup.go b/hack/gen-resources/util/sizedwaitgroup.go deleted file mode 100644 index b43011ff802c9..0000000000000 --- a/hack/gen-resources/util/sizedwaitgroup.go +++ /dev/null @@ -1,107 +0,0 @@ -// The MIT License (MIT) - -// Copyright (c) 2018 Rémy Mathieu - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// https://github.com/remeh/sizedwaitgroup - -// Based upon sync.WaitGroup, SizedWaitGroup allows to start multiple -// routines and to wait for their end using the simple API. - -// SizedWaitGroup adds the feature of limiting the maximum number of -// concurrently started routines. It could for example be used to start -// multiples routines querying a database but without sending too much -// queries in order to not overload the given database. -// -// Rémy Mathieu © 2016 -package util - -import ( - "context" - "math" - "sync" -) - -// SizedWaitGroup has the same role and close to the -// same API as the Golang sync.WaitGroup but adds a limit of -// the amount of goroutines started concurrently. -type SizedWaitGroup struct { - Size int - - current chan struct{} - wg sync.WaitGroup -} - -// New creates a SizedWaitGroup. -// The limit parameter is the maximum amount of -// goroutines which can be started concurrently. -func New(limit int) SizedWaitGroup { - size := math.MaxInt32 // 2^31 - 1 - if limit > 0 { - size = limit - } - return SizedWaitGroup{ - Size: size, - - current: make(chan struct{}, size), - wg: sync.WaitGroup{}, - } -} - -// Add increments the internal WaitGroup counter. -// It can be blocking if the limit of spawned goroutines -// has been reached. It will stop blocking when Done is -// been called. -// -// See sync.WaitGroup documentation for more information. -func (s *SizedWaitGroup) Add() { - _ = s.AddWithContext(context.Background()) -} - -// AddWithContext increments the internal WaitGroup counter. -// It can be blocking if the limit of spawned goroutines -// has been reached. It will stop blocking when Done is -// been called, or when the context is canceled. Returns nil on -// success or an error if the context is canceled before the lock -// is acquired. -// -// See sync.WaitGroup documentation for more information. -func (s *SizedWaitGroup) AddWithContext(ctx context.Context) error { - select { - case <-ctx.Done(): - return ctx.Err() - case s.current <- struct{}{}: - break - } - s.wg.Add(1) - return nil -} - -// Done decrements the SizedWaitGroup counter. -// See sync.WaitGroup documentation for more information. -func (s *SizedWaitGroup) Done() { - <-s.current - s.wg.Done() -} - -// Wait blocks until the SizedWaitGroup counter is zero. -// See sync.WaitGroup documentation for more information. -func (s *SizedWaitGroup) Wait() { - s.wg.Wait() -} diff --git a/hack/generate-proto.sh b/hack/generate-proto.sh index d544bd045904f..c93f8bb473c2d 100755 --- a/hack/generate-proto.sh +++ b/hack/generate-proto.sh @@ -9,8 +9,7 @@ set -o errexit set -o nounset set -o pipefail -# shellcheck disable=SC2128 -PROJECT_ROOT=$(cd "$(dirname "${BASH_SOURCE}")"/..; pwd) +PROJECT_ROOT=$(cd $(dirname ${BASH_SOURCE})/..; pwd) PATH="${PROJECT_ROOT}/dist:${PATH}" GOPATH=$(go env GOPATH) @@ -52,11 +51,11 @@ else fi go-to-protobuf \ - --go-header-file="${PROJECT_ROOT}"/hack/custom-boilerplate.go.txt \ - --packages="$(IFS=, ; echo "${PACKAGES[*]}")" \ - --apimachinery-packages="$(IFS=, ; echo "${APIMACHINERY_PKGS[*]}")" \ + --go-header-file=${PROJECT_ROOT}/hack/custom-boilerplate.go.txt \ + --packages=$(IFS=, ; echo "${PACKAGES[*]}") \ + --apimachinery-packages=$(IFS=, ; echo "${APIMACHINERY_PKGS[*]}") \ --proto-import=./vendor \ - --proto-import="${protoc_include}" + --proto-import=${protoc_include} # Either protoc-gen-go, protoc-gen-gofast, or protoc-gen-gogofast can be used to build # server/*/.pb.go from .proto files. golang/protobuf and gogo/protobuf can be used @@ -74,17 +73,17 @@ MOD_ROOT=${GOPATH}/pkg/mod grpc_gateway_version=$(go list -m github.com/grpc-ecosystem/grpc-gateway | awk '{print $NF}' | head -1) GOOGLE_PROTO_API_PATH=${MOD_ROOT}/github.com/grpc-ecosystem/grpc-gateway@${grpc_gateway_version}/third_party/googleapis GOGO_PROTOBUF_PATH=${PROJECT_ROOT}/vendor/github.com/gogo/protobuf -PROTO_FILES=$(find "$PROJECT_ROOT" \( -name "*.proto" -and -path '*/server/*' -or -path '*/reposerver/*' -and -name "*.proto" -or -path '*/cmpserver/*' -and -name "*.proto" \) | sort) +PROTO_FILES=$(find $PROJECT_ROOT \( -name "*.proto" -and -path '*/server/*' -or -path '*/reposerver/*' -and -name "*.proto" -or -path '*/cmpserver/*' -and -name "*.proto" \) | sort) for i in ${PROTO_FILES}; do protoc \ - -I"${PROJECT_ROOT}" \ - -I"${protoc_include}" \ + -I${PROJECT_ROOT} \ + -I${protoc_include} \ -I./vendor \ - -I"$GOPATH"/src \ - -I"${GOOGLE_PROTO_API_PATH}" \ - -I"${GOGO_PROTOBUF_PATH}" \ - --${GOPROTOBINARY}_out=plugins=grpc:"$GOPATH"/src \ - --grpc-gateway_out=logtostderr=true:"$GOPATH"/src \ + -I$GOPATH/src \ + -I${GOOGLE_PROTO_API_PATH} \ + -I${GOGO_PROTOBUF_PATH} \ + --${GOPROTOBINARY}_out=plugins=grpc:$GOPATH/src \ + --grpc-gateway_out=logtostderr=true:$GOPATH/src \ --swagger_out=logtostderr=true:. \ $i done @@ -95,8 +94,8 @@ collect_swagger() { SWAGGER_ROOT="$1" EXPECTED_COLLISIONS="$2" SWAGGER_OUT="${PROJECT_ROOT}/assets/swagger.json" - PRIMARY_SWAGGER=$(mktemp) - COMBINED_SWAGGER=$(mktemp) + PRIMARY_SWAGGER=`mktemp` + COMBINED_SWAGGER=`mktemp` cat < "${PRIMARY_SWAGGER}" { @@ -125,7 +124,7 @@ clean_swagger() { } echo "If additional types are added, the number of expected collisions may need to be increased" -EXPECTED_COLLISION_COUNT=95 +EXPECTED_COLLISION_COUNT=90 collect_swagger server ${EXPECTED_COLLISION_COUNT} clean_swagger server clean_swagger reposerver diff --git a/hack/generate-release-notes.sh b/hack/generate-release-notes.sh index 279c4c191c04b..cc0d4829cc930 100755 --- a/hack/generate-release-notes.sh +++ b/hack/generate-release-notes.sh @@ -56,7 +56,7 @@ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/$v ## Release signatures -All Argo CD container images and CLI binaries are signed by cosign. See the [documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/signed-release-assets/) on how to verify the signatures. +All Argo CD container images and CLI binaries are signed by cosign. See the [documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/signed-release-assets.md/) on how to verify the signatures. \`\`\`shell -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEesHEB7vX5Y2RxXypjMy1nI1z7iRG @@ -76,18 +76,12 @@ more_log=$(git log --pretty="format:%s %ae" "$new_ref..$old_ref") new_commits=$(diff --new-line-format="" --unchanged-line-format="" <(echo "$less_log") <(echo "$more_log") | grep -v "Merge pull request from GHSA") new_commits_no_email=$(echo "$new_commits" | strip_last_word) -features=$(echo "$new_commits_no_email" | grep '^feat' | to_list_items) -fixes=$(echo "$new_commits_no_email" | grep '^fix' | to_list_items) -docs=$(echo "$new_commits_no_email" | grep '^docs' | to_list_items) -other=$(echo "$new_commits_no_email" | grep -v -e '^feat' -e '^fix' -e '^docs' -e '^\[Bot\]' | to_list_items) contributors_num=$(echo "$new_commits" | only_last_word | sort -u | nonempty_line_count) new_commits_num=$(echo "$new_commits" | nonempty_line_count) -features_num=$(echo "$features" | nonempty_line_count) -fixes_num=$(echo "$fixes" | nonempty_line_count) -docs_num=$(echo "$docs" | nonempty_line_count) -other_num=$(echo "$other" | nonempty_line_count) +features_num=$(echo "$new_commits_no_email" | grep '^feat' | nonempty_line_count) +fixes_num=$(echo "$new_commits_no_email" | grep '^fix' | nonempty_line_count) previous_contributors=$(git log --pretty="format:%an %ae" "$old_ref" | sort -uf) all_contributors=$(git log --pretty="format:%an %ae" "$new_ref" | sort -uf) @@ -109,27 +103,3 @@ if [ "$new_contributors_num" -lt 20 ] && [ "$new_contributors_num" -gt 0 ]; then echo "$new_contributors_names" echo fi -if [ "$features_num" -gt 0 ]; then - echo "### Features ($features_num)" - echo - echo "$features" - echo -fi -if [ "$fixes_num" -gt 0 ]; then - echo "### Bug fixes ($fixes_num)" - echo - echo "$fixes" - echo -fi -if [ "$docs_num" -gt 0 ]; then - echo "### Documentation ($docs_num)" - echo - echo "$docs" - echo -fi -if [ "$other_num" -gt 0 ]; then - echo "### Other ($other_num)" - echo - echo "$other" - echo -fi diff --git a/hack/installers/checksums/helm-v3.10.3-linux-amd64.tar.gz.sha256 b/hack/installers/checksums/helm-v3.10.3-linux-amd64.tar.gz.sha256 deleted file mode 100644 index 18831ba421ffd..0000000000000 --- a/hack/installers/checksums/helm-v3.10.3-linux-amd64.tar.gz.sha256 +++ /dev/null @@ -1 +0,0 @@ -950439759ece902157cf915b209b8d694e6f675eaab5099fb7894f30eeaee9a2 helm-v3.10.3-linux-amd64.tar.gz diff --git a/hack/installers/checksums/helm-v3.10.3-linux-arm64.tar.gz.sha256 b/hack/installers/checksums/helm-v3.10.3-linux-arm64.tar.gz.sha256 deleted file mode 100644 index c09dbf65a4d41..0000000000000 --- a/hack/installers/checksums/helm-v3.10.3-linux-arm64.tar.gz.sha256 +++ /dev/null @@ -1 +0,0 @@ -260cda5ff2ed5d01dd0fd6e7e09bc80126e00d8bdc55f3269d05129e32f6f99d helm-v3.10.3-linux-arm64.tar.gz diff --git a/hack/installers/checksums/helm-v3.10.3-linux-ppc64le.tar.gz.sha256 b/hack/installers/checksums/helm-v3.10.3-linux-ppc64le.tar.gz.sha256 deleted file mode 100644 index 745833532235f..0000000000000 --- a/hack/installers/checksums/helm-v3.10.3-linux-ppc64le.tar.gz.sha256 +++ /dev/null @@ -1 +0,0 @@ -93cdf398abc68e388d1b46d49d8e1197544930ecd3e81cc58d0a87a4579d60ed helm-v3.10.3-linux-ppc64le.tar.gz diff --git a/hack/installers/checksums/helm-v3.10.3-linux-s390x.tar.gz.sha256 b/hack/installers/checksums/helm-v3.10.3-linux-s390x.tar.gz.sha256 deleted file mode 100644 index 6c874d75f1f3c..0000000000000 --- a/hack/installers/checksums/helm-v3.10.3-linux-s390x.tar.gz.sha256 +++ /dev/null @@ -1 +0,0 @@ -6cfa0b9078221f980ef400dc40c95eb71be81d14fdf247ca55efedb068e1d4fa helm-v3.10.3-linux-s390x.tar.gz diff --git a/hack/snyk-report.sh b/hack/snyk-report.sh index 074f218289c43..3e6c35c548e2e 100755 --- a/hack/snyk-report.sh +++ b/hack/snyk-report.sh @@ -38,23 +38,17 @@ cd argo-cd git checkout master minor_version=$(git tag -l | sort -g | tail -n 1 | grep -Eo '[0-9]+\.[0-9]+') -patch_num=$(git tag -l | grep "v$minor_version." | grep -o "[a-z[:digit:]-]*$" | sort -g | tail -n 1) +patch_num=$(git tag -l | grep "v$minor_version." | grep -o "[[:digit:]]*$" | sort -g | tail -n 1) version="v$minor_version.$patch_num" versions="master " - -version_count=3 -# When the most recent version is still a release candidate, get reports for 4 versions (so the 3 most recent stable -# releases are included). -if [[ $patch_num == "0-rc"* ]]; then version_count=4; fi - -for i in $(seq "$version_count"); do +for i in 1 2 3; do if [ "$version" == "" ]; then break; fi # Nightmare code to get the most recent patches of the three most recent minor versions. versions+="$version " minor_num=$(printf '%s' "$minor_version" | sed -E 's/[0-9]+\.//') minor_num=$((minor_num-1)) minor_version=$(printf '%s' "$minor_version" | sed -E "s/\.[0-9]+$/.$minor_num/g") - patch_num=$(git tag -l | grep "v$minor_version." | grep -o "[a-z[:digit:]-]*$" | sort -g | tail -n 1) + patch_num=$(git tag -l | grep "v$minor_version." | grep -o "[[:digit:]]*$" | sort -g | tail -n 1) version="v$minor_version.$patch_num" done diff --git a/hack/tool-versions.sh b/hack/tool-versions.sh index dd342c1e2af6c..b51dcfecb218e 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.10.3 +helm3_version=3.10.1 kubectl_version=1.17.8 kubectx_version=0.6.3 kustomize4_version=4.5.7 diff --git a/manifests/base/applicationset-controller/argocd-applicationset-controller-deployment.yaml b/manifests/base/applicationset-controller/argocd-applicationset-controller-deployment.yaml index da67ac8433e84..c27d77b2921ff 100644 --- a/manifests/base/applicationset-controller/argocd-applicationset-controller-deployment.yaml +++ b/manifests/base/applicationset-controller/argocd-applicationset-controller-deployment.yaml @@ -28,70 +28,10 @@ spec: - containerPort: 8080 name: metrics env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_LEADER_ELECTION - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.leader.election - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACE - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.namespace - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER - valueFrom: - configMapKeyRef: - key: repo.server - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_POLICY - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.policy - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.debug - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DRY_RUN - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.dryrun - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_PROGRESSIVE_ROLLOUTS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.progressive.rollouts - name: argocd-cmd-params-cm - optional: true + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace volumeMounts: - mountPath: /app/config/ssh name: ssh-known-hosts diff --git a/manifests/base/kustomization.yaml b/manifests/base/kustomization.yaml index e80274cddc620..23c454a507955 100644 --- a/manifests/base/kustomization.yaml +++ b/manifests/base/kustomization.yaml @@ -5,7 +5,7 @@ kind: Kustomization images: - name: quay.io/argoproj/argocd newName: quay.io/argoproj/argocd - newTag: latest + newTag: v2.5.4 resources: - ./application-controller - ./dex diff --git a/manifests/base/redis/argocd-redis-deployment.yaml b/manifests/base/redis/argocd-redis-deployment.yaml index 02c18192a76ed..2193d971d84ac 100644 --- a/manifests/base/redis/argocd-redis-deployment.yaml +++ b/manifests/base/redis/argocd-redis-deployment.yaml @@ -23,7 +23,7 @@ spec: serviceAccountName: argocd-redis containers: - name: redis - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: Always args: - "--save" diff --git a/manifests/base/repo-server/argocd-repo-server-deployment.yaml b/manifests/base/repo-server/argocd-repo-server-deployment.yaml index 4966ff9e65ae8..76dc9ab682525 100644 --- a/manifests/base/repo-server/argocd-repo-server-deployment.yaml +++ b/manifests/base/repo-server/argocd-repo-server-deployment.yaml @@ -137,12 +137,6 @@ spec: key: reposerver.streamed.manifest.max.extracted.size name: argocd-cmd-params-cm optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: reposerver.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - name: HELM_CACHE_HOME value: /helm-working-dir - name: HELM_CONFIG_HOME @@ -157,9 +151,8 @@ spec: path: /healthz?full=true port: 8084 initialDelaySeconds: 30 - periodSeconds: 30 + periodSeconds: 5 failureThreshold: 3 - timeoutSeconds: 5 readinessProbe: httpGet: path: /healthz diff --git a/manifests/base/server/argocd-server-deployment.yaml b/manifests/base/server/argocd-server-deployment.yaml index b5a9e405bd4d0..9036691528fac 100644 --- a/manifests/base/server/argocd-server-deployment.yaml +++ b/manifests/base/server/argocd-server-deployment.yaml @@ -208,12 +208,6 @@ spec: 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 volumeMounts: - name: ssh-known-hosts mountPath: /app/config/ssh @@ -236,7 +230,6 @@ spec: port: 8080 initialDelaySeconds: 3 periodSeconds: 30 - timeoutSeconds: 5 readinessProbe: httpGet: path: /healthz diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index 304e5b2a0f06e..6adfe21f11ee5 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -144,14 +144,6 @@ spec: which to sync the application to If omitted, will use the revision specified in app spec. type: string - revisions: - description: Revisions is the list of revision (Git) or chart - version (Helm) which to sync each source in sources field for - the application to If omitted, will use the revision specified - in app spec. - items: - type: string - type: array source: description: Source overrides the source definition set in the application. This is typically set in a Rollback operation and @@ -367,35 +359,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type - parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -409,1027 +373,467 @@ spec: required: - repoURL type: object - sources: - description: Sources overrides the source definition set in the - application. This is typically set in a Rollback operation and - is nil during a Sync operation + syncOptions: + description: SyncOptions provide per-sync sync-options, e.g. Validate=false items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options + type: string + type: array + syncStrategy: + description: SyncStrategy describes how to perform the sync + properties: + apply: + description: Apply will perform a `kubectl apply` to perform + the sync. + properties: + force: + description: Force indicates whether or not to supply + the --force flag to `kubectl apply`. The --force flag + deletes and re-create the resource, when PATCH encounters + conflict and has retried for 5 times. + type: boolean + type: object + hook: + description: Hook will submit any referenced resources to + perform the sync. This is the default strategy + properties: + force: + description: Force indicates whether or not to supply + the --force flag to `kubectl apply`. The --force flag + deletes and re-create the resource, when PATCH encounters + conflict and has retried for 5 times. + type: boolean + type: object + type: object + type: object + type: object + spec: + description: ApplicationSpec represents desired application state. Contains + link to repository with application definition and additional parameters + link definition revision. + properties: + destination: + description: Destination is a reference to the target Kubernetes server + and namespace + properties: + name: + description: Name is an alternate way of specifying the target + cluster by its symbolic name + type: string + namespace: + description: Namespace specifies the target namespace for the + application's resources. The namespace will only be set for + namespace-scoped resources that have not set a value for .metadata.namespace + type: string + server: + description: Server specifies the URL of the target cluster and + must be set to the Kubernetes control plane API + type: string + type: object + ignoreDifferences: + description: IgnoreDifferences is a list of resources and their fields + which should be ignored during comparison + items: + description: ResourceIgnoreDifferences contains resource filter + and list of json paths which should be ignored during comparison + with live state. + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + description: ManagedFieldsManagers is a list of trusted managers. + Fields mutated by those managers will take precedence over + the desired state defined in the SCM and won't be displayed + in diffs + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + description: Info contains a list of information (URLs, email addresses, + and plain text) that relates to the application + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + description: Project is a reference to the project this application + belongs to. The empty string means that application belongs to the + 'default' project. + type: string + revisionHistoryLimit: + description: RevisionHistoryLimit limits the number of items kept + in the application's revision history, which is used for informational + purposes as well as for rollbacks to previous versions. This should + only be changed in exceptional circumstances. Setting to zero will + store no history. This will reduce storage used. Increasing will + increase the space used to store the history, so we do not recommend + increasing it. Default is 10. + format: int64 + type: integer + source: + description: Source is a reference to the location of the application's + manifests or chart + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match paths + against that should be explicitly excluded from being used + during manifest generation + type: string + include: + description: Include contains a glob pattern to match paths + against that should be explicitly included during manifest + generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External Variables + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level Arguments + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + fileParameters: + description: FileParameters are file parameters to the helm + template + items: + description: HelmFileParameter is a file parameter that's + passed to helm template during manifest generation properties: - exclude: - description: Exclude contains a glob pattern to match - paths against that should be explicitly excluded from - being used during manifest generation + name: + description: Name is the name of the Helm parameter type: string - include: - description: Include contains a glob pattern to match - paths against that should be explicitly included during - manifest generation + path: + description: Path is the path to the file containing + the values for the Helm parameter type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean type: object - helm: - description: Helm holds helm specific options + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally by not + appending them to helm template --values + type: boolean + parameters: + description: Parameters is a list of Helm parameters which + are passed to the helm template command upon manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation properties: - fileParameters: - description: FileParameters are file parameters to the - helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally - by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to - tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to - use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) + forceString: + description: ForceString determines whether to tell + Helm to interpret booleans and numbers as strings type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + name: + description: Name is the name of the Helm parameter type: string - version: - description: Version is the Helm version to use for - templating ("3") + value: + description: Value is the value for the Helm parameter type: string type: object - kustomize: - description: Kustomize holds kustomize specific options + type: array + passCredentials: + description: PassCredentials pass credentials to all domains + (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to use. + If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition installation + step (Helm's --skip-crds) + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files to + use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed to + helm template, typically defined as a block + type: string + version: + description: Version is the Helm version to use for templating + ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional annotations + to add to rendered manifests + type: object + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional labels to + add to rendered manifests + type: object + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether to force + applying common annotations to resources for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to force + applying common labels to resources for Kustomize apps + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize image + definition in the format [old_image_name=]: + type: string + type: array + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + version: + description: Version controls which version of Kustomize to + use for rendering manifests + type: string + type: object + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps + name: + description: Name is the name of the variable, usually + expressed in uppercase type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests + value: + description: Value is the value of the variable type: string + required: + - name + - value type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or - Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - type: array - syncOptions: - description: SyncOptions provide per-sync sync-options, e.g. Validate=false - items: - type: string - type: array - syncStrategy: - description: SyncStrategy describes how to perform the sync + type: array + name: + type: string + type: object + repoURL: + description: RepoURL is the URL to the repository (Git or Helm) + that contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of the source + to sync the application to. In case of Git, this can be commit, + tag, or branch. If omitted, will equal to HEAD. In case of Helm, + this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + syncPolicy: + description: SyncPolicy controls when and how a sync will be performed + properties: + automated: + description: Automated will keep an application synced to the + target revision properties: - apply: - description: Apply will perform a `kubectl apply` to perform - the sync. - properties: - force: - description: Force indicates whether or not to supply - the --force flag to `kubectl apply`. The --force flag - deletes and re-create the resource, when PATCH encounters - conflict and has retried for 5 times. - type: boolean - type: object - hook: - description: Hook will submit any referenced resources to - perform the sync. This is the default strategy + allowEmpty: + description: 'AllowEmpty allows apps have zero live resources + (default: false)' + type: boolean + prune: + description: 'Prune specifies whether to delete resources + from the cluster that are not found in the sources anymore + as part of automated sync (default: false)' + type: boolean + selfHeal: + description: 'SelfHeal specifes whether to revert resources + back to their desired state upon modification in the cluster + (default: false)' + type: boolean + type: object + retry: + description: Retry controls failed sync retry behavior + properties: + backoff: + description: Backoff controls how to backoff on subsequent + retries of failed syncs properties: - force: - description: Force indicates whether or not to supply - the --force flag to `kubectl apply`. The --force flag - deletes and re-create the resource, when PATCH encounters - conflict and has retried for 5 times. - type: boolean + duration: + description: Duration is the amount to back off. Default + unit is seconds, but could also be a duration (e.g. + "2m", "1h") + type: string + factor: + description: Factor is a factor to multiply the base duration + after each failed retry + format: int64 + type: integer + maxDuration: + description: MaxDuration is the maximum amount of time + allowed for the backoff strategy + type: string type: object + limit: + description: Limit is the maximum number of attempts for retrying + a failed sync. If set to 0, no retries will be performed. + format: int64 + type: integer type: object + syncOptions: + description: Options allow you to specify whole app sync-options + items: + type: string + type: array type: object + required: + - destination + - project + - source type: object - spec: - description: ApplicationSpec represents desired application state. Contains - link to repository with application definition and additional parameters - link definition revision. + status: + description: ApplicationStatus contains status information for the application properties: - destination: - description: Destination is a reference to the target Kubernetes server - and namespace - properties: - name: - description: Name is an alternate way of specifying the target - cluster by its symbolic name - type: string - namespace: - description: Namespace specifies the target namespace for the - application's resources. The namespace will only be set for - namespace-scoped resources that have not set a value for .metadata.namespace - type: string - server: - description: Server specifies the URL of the target cluster and - must be set to the Kubernetes control plane API - type: string - type: object - ignoreDifferences: - description: IgnoreDifferences is a list of resources and their fields - which should be ignored during comparison + conditions: + description: Conditions is a list of currently observed application + conditions items: - description: ResourceIgnoreDifferences contains resource filter - and list of json paths which should be ignored during comparison - with live state. + description: ApplicationCondition contains details about an application + condition, which is usally an error or warning properties: - group: - type: string - jqPathExpressions: - items: - type: string - type: array - jsonPointers: - items: - type: string - type: array - kind: + lastTransitionTime: + description: LastTransitionTime is the time the condition was + last observed + format: date-time type: string - managedFieldsManagers: - description: ManagedFieldsManagers is a list of trusted managers. - Fields mutated by those managers will take precedence over - the desired state defined in the SCM and won't be displayed - in diffs - items: - type: string - type: array - name: + message: + description: Message contains human-readable message indicating + details about condition type: string - namespace: + type: + description: Type is an application condition type type: string required: - - kind + - message + - type type: object type: array - info: - description: Info contains a list of information (URLs, email addresses, - and plain text) that relates to the application + health: + description: Health contains information about the application's current + health status + properties: + message: + description: Message is a human-readable informational message + describing the health status + type: string + status: + description: Status holds the status code of the application or + resource + type: string + type: object + history: + description: History contains information about the application's + sync history items: + description: RevisionHistory contains history information about + a previous sync properties: - name: + deployStartedAt: + description: DeployStartedAt holds the time the sync operation + started + format: date-time type: string - value: - type: string - required: - - name - - value - type: object - type: array - project: - description: Project is a reference to the project this application - belongs to. The empty string means that application belongs to the - 'default' project. - type: string - revisionHistoryLimit: - description: RevisionHistoryLimit limits the number of items kept - in the application's revision history, which is used for informational - purposes as well as for rollbacks to previous versions. This should - only be changed in exceptional circumstances. Setting to zero will - store no history. This will reduce storage used. Increasing will - increase the space used to store the history, so we do not recommend - increasing it. Default is 10. - format: int64 - type: integer - source: - description: Source is a reference to the location of the application's - manifests or chart - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match paths - against that should be explicitly excluded from being used - during manifest generation - type: string - include: - description: Include contains a glob pattern to match paths - against that should be explicitly included during manifest - generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External Variables - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level Arguments - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the helm - template - items: - description: HelmFileParameter is a file parameter that's - passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally by not - appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters which - are passed to the helm template command upon manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to tell - Helm to interpret booleans and numbers as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all domains - (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to use. - If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition installation - step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files to - use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for templating - ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional annotations - to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels to - add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether to force - applying common annotations to resources for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to force - applying common labels to resources for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize image - definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize to - use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, usually - expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or Helm) - that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the source - to sync the application to. In case of Git, this can be commit, - tag, or branch. If omitted, will equal to HEAD. In case of Helm, - this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Sources is a reference to the location of the application's - manifests or chart - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match paths - against that should be explicitly excluded from being - used during manifest generation - type: string - include: - description: Include contains a glob pattern to match paths - against that should be explicitly included during manifest - generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External Variables - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level Arguments - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the helm - template - items: - description: HelmFileParameter is a file parameter that's - passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally by not - appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters which - are passed to the helm template command upon manifest - generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to tell - Helm to interpret booleans and numbers as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all domains - (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to use. - If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition installation - step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files to - use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for templating - ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional annotations - to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether to - force applying common annotations to resources for Kustomize - apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to force - applying common labels to resources for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize image - definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, usually - expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type - parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or Helm) - that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the source - to sync the application to. In case of Git, this can be commit, - tag, or branch. If omitted, will equal to HEAD. In case of - Helm, this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array - syncPolicy: - description: SyncPolicy controls when and how a sync will be performed - properties: - automated: - description: Automated will keep an application synced to the - target revision - properties: - allowEmpty: - description: 'AllowEmpty allows apps have zero live resources - (default: false)' - type: boolean - prune: - description: 'Prune specifies whether to delete resources - from the cluster that are not found in the sources anymore - as part of automated sync (default: false)' - type: boolean - selfHeal: - description: 'SelfHeal specifes whether to revert resources - back to their desired state upon modification in the cluster - (default: false)' - type: boolean - type: object - managedNamespaceMetadata: - description: ManagedNamespaceMetadata controls metadata in the - given namespace (if CreateNamespace=true) - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object - retry: - description: Retry controls failed sync retry behavior - properties: - backoff: - description: Backoff controls how to backoff on subsequent - retries of failed syncs - properties: - duration: - description: Duration is the amount to back off. Default - unit is seconds, but could also be a duration (e.g. - "2m", "1h") - type: string - factor: - description: Factor is a factor to multiply the base duration - after each failed retry - format: int64 - type: integer - maxDuration: - description: MaxDuration is the maximum amount of time - allowed for the backoff strategy - type: string - type: object - limit: - description: Limit is the maximum number of attempts for retrying - a failed sync. If set to 0, no retries will be performed. - format: int64 - type: integer - type: object - syncOptions: - description: Options allow you to specify whole app sync-options - items: - type: string - type: array - type: object - required: - - destination - - project - type: object - status: - description: ApplicationStatus contains status information for the application - properties: - conditions: - description: Conditions is a list of currently observed application - conditions - items: - description: ApplicationCondition contains details about an application - condition, which is usally an error or warning - properties: - lastTransitionTime: - description: LastTransitionTime is the time the condition was - last observed - format: date-time - type: string - message: - description: Message contains human-readable message indicating - details about condition - type: string - type: - description: Type is an application condition type - type: string - required: - - message - - type - type: object - type: array - health: - description: Health contains information about the application's current - health status - properties: - message: - description: Message is a human-readable informational message - describing the health status - type: string - status: - description: Status holds the status code of the application or - resource - type: string - type: object - history: - description: History contains information about the application's - sync history - items: - description: RevisionHistory contains history information about - a previous sync - properties: - deployStartedAt: - description: DeployStartedAt holds the time the sync operation - started - format: date-time - type: string - deployedAt: - description: DeployedAt holds the time the sync operation completed - format: date-time + deployedAt: + description: DeployedAt holds the time the sync operation completed + format: date-time type: string id: description: ID is an auto incrementing identifier of the RevisionHistory @@ -1439,12 +843,6 @@ spec: description: Revision holds the revision the sync was performed against type: string - revisions: - description: Revisions holds the revision of each source in - sources field the sync was performed against - items: - type: string - type: array source: description: Source is a reference to the application source used for the sync operation @@ -1501,482 +899,186 @@ spec: properties: code: type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the - helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally - by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to - tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to - use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for - templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options + helm: + description: Helm holds helm specific options properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: + fileParameters: + description: FileParameters are file parameters to the + helm template items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest generation properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter type: string type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or - Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Sources is a reference to the application sources - used for the sync operation - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match - paths against that should be explicitly excluded - from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to match - paths against that should be explicitly included - during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to - the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for - templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally + by not appending them to helm template --values + type: boolean + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command upon + manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether to + tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm parameter + type: string type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps + type: array + passCredentials: + description: PassCredentials pass credentials to all + domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to + use. If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files + to use when generating a template + items: type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps + type: array + values: + description: Values specifies Helm values to be passed + to helm template, typically defined as a block + type: string + version: + description: Version is the Helm version to use for + templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + commonAnnotations: + additionalProperties: type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonLabels: + additionalProperties: type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: + description: CommonLabels is a list of additional labels + to add to rendered manifests + type: object + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to + force applying common labels to resources for Kustomize + apps + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - type: array + type: array + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + description: RepoURL is the URL to the repository (Git or + Helm) that contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of the + source to sync the application to. In case of Git, this + can be commit, tag, or branch. If omitted, will equal + to HEAD. In case of Helm, this is a semver tag for the + Chart's version. + type: string + required: + - repoURL + type: object required: - deployedAt - id + - revision type: object type: array observedAt: @@ -2099,14 +1201,6 @@ spec: (Helm) which to sync the application to If omitted, will use the revision specified in app spec. type: string - revisions: - description: Revisions is the list of revision (Git) or - chart version (Helm) which to sync each source in sources - field for the application to If omitted, will use the - revision specified in app spec. - items: - type: string - type: array source: description: Source overrides the source definition set in the application. This is typically set in a Rollback @@ -2327,49 +1421,19 @@ spec: properties: name: description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying - a parameter. + usually expressed in uppercase type: string - string: - description: String_ is the value of a string - type parameter. + value: + description: Value is the value of the variable type: string + required: + - name + - value type: object type: array + name: + type: string type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -2384,291 +1448,6 @@ spec: required: - repoURL type: object - sources: - description: Sources overrides the source definition set - in the application. This is typically set in a Rollback - operation and is nil during a Sync operation - items: - description: ApplicationSource contains all required - information about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must - be specified for applications sourced from a Helm - repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern - to match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern - to match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific - to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet - External Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan - a directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents - helm template from failing when valueFiles - do not exist locally by not appending them - to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter - that's passed to helm template during manifest - generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and - numbers as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the - Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials - to all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release - name to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource - definition installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to - be passed to helm template, typically defined - as a block - type: string - version: - description: Version is the Helm version to - use for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific - options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of - additional annotations to add to rendered - manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies - whether to force applying common annotations - to resources for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources - for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended - to resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended - to resources for Kustomize apps - type: string - version: - description: Version controls which version - of Kustomize to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the - Git repository, and is only valid for applications - sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin - specific options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry - in the application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the - variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an - array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map - type parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a - string type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source - within sources field. This field will not be used - if used with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository - (Git or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision - of the source to sync the application to. In case - of Git, this can be commit, tag, or branch. If - omitted, will equal to HEAD. In case of Helm, - this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array syncOptions: description: SyncOptions provide per-sync sync-options, e.g. Validate=false @@ -2778,12 +1557,6 @@ spec: description: Revision holds the revision this sync operation was performed to type: string - revisions: - description: Revisions holds the revision this sync operation - was performed for respective indexed source in sources field - items: - type: string - type: array source: description: Source records the application source information of the sync, used for comparing auto-sync @@ -3004,329 +1777,21 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests type: string targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Source records the application source information - of the sync, used for comparing auto-sync - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be - specified for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern to - match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to - match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a - directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template - --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to - all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block - type: string - version: - description: Version is the Helm version to use - for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources for - Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to - resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to - resources for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git - repository, and is only valid for applications sourced - from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of - the source to sync the application to. In case of - Git, this can be commit, tag, or branch. If omitted, - will equal to HEAD. In case of Helm, this is a semver - tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array + description: TargetRevision defines the revision of the + source to sync the application to. In case of Git, this + can be commit, tag, or branch. If omitted, will equal + to HEAD. In case of Helm, this is a semver tag for the + Chart's version. + type: string + required: + - repoURL + type: object required: - revision type: object @@ -3390,14 +1855,6 @@ spec: sourceType: description: SourceType specifies the type of this application type: string - sourceTypes: - description: SourceTypes specifies the type of the sources included - in the application - items: - description: ApplicationSourceType specifies the type of the application's - source - type: string - type: array summary: description: Summary contains a list of URLs and container images used by this application @@ -3661,37 +2118,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -3706,297 +2133,14 @@ spec: required: - repoURL type: object - sources: - description: Sources is a reference to the application's multiple - sources used for comparison - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be - specified for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern to - match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to - match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a - directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template - --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to - all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block - type: string - version: - description: Version is the Helm version to use - for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources for - Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to - resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to - resources for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git - repository, and is only valid for applications sourced - from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of - the source to sync the application to. In case of - Git, this can be commit, tag, or branch. If omitted, - will equal to HEAD. In case of Helm, this is a semver - tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array required: - destination + - source type: object revision: description: Revision contains information about the revision the comparison has been performed to type: string - revisions: - description: Revisions contains information about the revisions - of multiple sources the comparison has been performed to - items: - type: string - type: array status: description: Status is the sync state of the comparison type: string @@ -4277,199 +2421,21 @@ spec: type: string value: type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -4481,17 +2447,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -4516,6 +2471,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -4759,26 +2715,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -4786,165 +2723,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -4956,17 +2734,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -4991,6 +2758,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -5023,8 +2791,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -5194,236 +2960,58 @@ spec: type: string version: type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: + type: object + kustomize: + properties: + commonAnnotations: + additionalProperties: type: string - version: + type: object + commonLabels: + additionalProperties: type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: + type: object + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + images: + items: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + type: array + namePrefix: + type: string + nameSuffix: + type: string + version: + type: string + type: object + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -5435,17 +3023,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -5470,6 +3047,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -5691,26 +3269,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -5718,165 +3277,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -5888,17 +3288,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -5923,6 +3312,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6174,26 +3564,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -6201,186 +3572,16 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: - properties: - allowEmpty: - type: boolean - prune: - type: boolean - selfHeal: - type: boolean - type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object + properties: + allowEmpty: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean type: object retry: properties: @@ -6406,6 +3607,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6649,26 +3851,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -6676,165 +3859,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -6846,17 +3870,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -6881,6 +3894,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6913,8 +3927,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -7128,26 +4140,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -7155,165 +4148,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -7325,17 +4159,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -7360,6 +4183,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -7581,26 +4405,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -7608,165 +4413,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -7778,17 +4424,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -7813,6 +4448,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -8152,26 +4788,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -8179,165 +4796,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -8349,17 +4807,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -8384,6 +4831,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -8770,26 +5218,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -8797,165 +5226,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -8967,17 +5237,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9002,6 +5261,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -9239,26 +5499,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -9266,165 +5507,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -9436,17 +5518,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9471,6 +5542,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -9722,26 +5794,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -9749,165 +5802,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -9919,17 +5813,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9954,6 +5837,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -10197,26 +6081,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -10224,165 +6089,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -10394,17 +6100,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -10429,6 +6124,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -10461,8 +6157,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -10676,26 +6370,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -10703,165 +6378,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -10873,17 +6389,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -10908,6 +6413,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -11115,40 +6621,21 @@ spec: type: string plugin: properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: + env: items: properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object name: type: string - string: + value: type: string + required: + - name + - value type: object type: array + name: + type: string type: object - ref: - type: string repoURL: type: string targetRevision: @@ -11156,165 +6643,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -11326,17 +6654,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -11361,6 +6678,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -11700,26 +7018,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -11727,165 +7026,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -11897,17 +7037,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -11932,6 +7061,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -12318,26 +7448,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -12345,165 +7456,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -12515,17 +7467,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -12550,6 +7491,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -12791,26 +7733,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -12818,186 +7741,16 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: properties: allowEmpty: type: boolean - prune: - type: boolean - selfHeal: - type: boolean - type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object + prune: + type: boolean + selfHeal: + type: boolean type: object retry: properties: @@ -13023,6 +7776,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -13359,26 +8113,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -13386,165 +8121,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -13556,17 +8132,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -13591,6 +8156,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -13949,220 +8515,42 @@ spec: forceCommonLabels: type: boolean images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + items: + type: string + type: array + namePrefix: + type: string + nameSuffix: + type: string + version: + type: string + type: object + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -14174,17 +8562,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -14209,6 +8586,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -14242,37 +8620,6 @@ spec: type: array goTemplate: type: boolean - strategy: - properties: - rollingSync: - properties: - steps: - items: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - type: string - values: - items: - type: string - type: array - type: object - type: array - maxUpdate: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - type: object - type: array - type: object - type: - type: string - type: object syncPolicy: properties: preserveResourcesOnDeletion: @@ -14484,26 +8831,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -14511,165 +8839,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -14681,17 +8850,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -14716,6 +8874,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -14727,24 +8886,6 @@ spec: type: object status: properties: - applicationStatus: - items: - properties: - application: - type: string - lastTransitionTime: - format: date-time - type: string - message: - type: string - status: - type: string - required: - - application - - message - - status - type: object - type: array conditions: items: properties: @@ -15494,67 +9635,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_LEADER_ELECTION - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.leader.election - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACE - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.namespace - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER - valueFrom: - configMapKeyRef: - key: repo.server - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_POLICY - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.policy - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.debug - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DRY_RUN - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.dryrun - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_PROGRESSIVE_ROLLOUTS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.progressive.rollouts - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -15636,7 +9717,7 @@ spec: - "" - --appendonly - "no" - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: Always name: redis ports: @@ -15806,19 +9887,13 @@ spec: key: reposerver.streamed.manifest.max.extracted.size name: argocd-cmd-params-cm optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: reposerver.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - name: HELM_CACHE_HOME value: /helm-working-dir - name: HELM_CONFIG_HOME value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -15826,8 +9901,7 @@ spec: path: /healthz?full=true port: 8084 initialDelaySeconds: 30 - periodSeconds: 30 - timeoutSeconds: 5 + periodSeconds: 5 name: argocd-repo-server ports: - containerPort: 8081 @@ -15870,7 +9944,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -16077,7 +10151,7 @@ spec: key: application.namespaces name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/core-install/kustomization.yaml b/manifests/core-install/kustomization.yaml index 07a82b3707700..5569b462e79c8 100644 --- a/manifests/core-install/kustomization.yaml +++ b/manifests/core-install/kustomization.yaml @@ -12,4 +12,4 @@ resources: images: - name: quay.io/argoproj/argocd newName: quay.io/argoproj/argocd - newTag: latest + newTag: v2.5.4 diff --git a/manifests/crds/application-crd.yaml b/manifests/crds/application-crd.yaml index d19394e84f8fd..911fbc01e249d 100644 --- a/manifests/crds/application-crd.yaml +++ b/manifests/crds/application-crd.yaml @@ -143,14 +143,6 @@ spec: which to sync the application to If omitted, will use the revision specified in app spec. type: string - revisions: - description: Revisions is the list of revision (Git) or chart - version (Helm) which to sync each source in sources field for - the application to If omitted, will use the revision specified - in app spec. - items: - type: string - type: array source: description: Source overrides the source definition set in the application. This is typically set in a Rollback operation and @@ -366,35 +358,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type - parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -408,1027 +372,467 @@ spec: required: - repoURL type: object - sources: - description: Sources overrides the source definition set in the - application. This is typically set in a Rollback operation and - is nil during a Sync operation + syncOptions: + description: SyncOptions provide per-sync sync-options, e.g. Validate=false items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options + type: string + type: array + syncStrategy: + description: SyncStrategy describes how to perform the sync + properties: + apply: + description: Apply will perform a `kubectl apply` to perform + the sync. + properties: + force: + description: Force indicates whether or not to supply + the --force flag to `kubectl apply`. The --force flag + deletes and re-create the resource, when PATCH encounters + conflict and has retried for 5 times. + type: boolean + type: object + hook: + description: Hook will submit any referenced resources to + perform the sync. This is the default strategy + properties: + force: + description: Force indicates whether or not to supply + the --force flag to `kubectl apply`. The --force flag + deletes and re-create the resource, when PATCH encounters + conflict and has retried for 5 times. + type: boolean + type: object + type: object + type: object + type: object + spec: + description: ApplicationSpec represents desired application state. Contains + link to repository with application definition and additional parameters + link definition revision. + properties: + destination: + description: Destination is a reference to the target Kubernetes server + and namespace + properties: + name: + description: Name is an alternate way of specifying the target + cluster by its symbolic name + type: string + namespace: + description: Namespace specifies the target namespace for the + application's resources. The namespace will only be set for + namespace-scoped resources that have not set a value for .metadata.namespace + type: string + server: + description: Server specifies the URL of the target cluster and + must be set to the Kubernetes control plane API + type: string + type: object + ignoreDifferences: + description: IgnoreDifferences is a list of resources and their fields + which should be ignored during comparison + items: + description: ResourceIgnoreDifferences contains resource filter + and list of json paths which should be ignored during comparison + with live state. + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + description: ManagedFieldsManagers is a list of trusted managers. + Fields mutated by those managers will take precedence over + the desired state defined in the SCM and won't be displayed + in diffs + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + description: Info contains a list of information (URLs, email addresses, + and plain text) that relates to the application + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + description: Project is a reference to the project this application + belongs to. The empty string means that application belongs to the + 'default' project. + type: string + revisionHistoryLimit: + description: RevisionHistoryLimit limits the number of items kept + in the application's revision history, which is used for informational + purposes as well as for rollbacks to previous versions. This should + only be changed in exceptional circumstances. Setting to zero will + store no history. This will reduce storage used. Increasing will + increase the space used to store the history, so we do not recommend + increasing it. Default is 10. + format: int64 + type: integer + source: + description: Source is a reference to the location of the application's + manifests or chart + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match paths + against that should be explicitly excluded from being used + during manifest generation + type: string + include: + description: Include contains a glob pattern to match paths + against that should be explicitly included during manifest + generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External Variables + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level Arguments + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + fileParameters: + description: FileParameters are file parameters to the helm + template + items: + description: HelmFileParameter is a file parameter that's + passed to helm template during manifest generation properties: - exclude: - description: Exclude contains a glob pattern to match - paths against that should be explicitly excluded from - being used during manifest generation + name: + description: Name is the name of the Helm parameter type: string - include: - description: Include contains a glob pattern to match - paths against that should be explicitly included during - manifest generation + path: + description: Path is the path to the file containing + the values for the Helm parameter type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean type: object - helm: - description: Helm holds helm specific options + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally by not + appending them to helm template --values + type: boolean + parameters: + description: Parameters is a list of Helm parameters which + are passed to the helm template command upon manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation properties: - fileParameters: - description: FileParameters are file parameters to the - helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally - by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to - tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to - use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) + forceString: + description: ForceString determines whether to tell + Helm to interpret booleans and numbers as strings type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + name: + description: Name is the name of the Helm parameter type: string - version: - description: Version is the Helm version to use for - templating ("3") + value: + description: Value is the value for the Helm parameter type: string type: object - kustomize: - description: Kustomize holds kustomize specific options + type: array + passCredentials: + description: PassCredentials pass credentials to all domains + (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to use. + If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition installation + step (Helm's --skip-crds) + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files to + use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed to + helm template, typically defined as a block + type: string + version: + description: Version is the Helm version to use for templating + ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional annotations + to add to rendered manifests + type: object + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional labels to + add to rendered manifests + type: object + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether to force + applying common annotations to resources for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to force + applying common labels to resources for Kustomize apps + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize image + definition in the format [old_image_name=]: + type: string + type: array + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + version: + description: Version controls which version of Kustomize to + use for rendering manifests + type: string + type: object + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps + name: + description: Name is the name of the variable, usually + expressed in uppercase type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests + value: + description: Value is the value of the variable type: string + required: + - name + - value type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or - Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - type: array - syncOptions: - description: SyncOptions provide per-sync sync-options, e.g. Validate=false - items: - type: string - type: array - syncStrategy: - description: SyncStrategy describes how to perform the sync + type: array + name: + type: string + type: object + repoURL: + description: RepoURL is the URL to the repository (Git or Helm) + that contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of the source + to sync the application to. In case of Git, this can be commit, + tag, or branch. If omitted, will equal to HEAD. In case of Helm, + this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + syncPolicy: + description: SyncPolicy controls when and how a sync will be performed + properties: + automated: + description: Automated will keep an application synced to the + target revision properties: - apply: - description: Apply will perform a `kubectl apply` to perform - the sync. - properties: - force: - description: Force indicates whether or not to supply - the --force flag to `kubectl apply`. The --force flag - deletes and re-create the resource, when PATCH encounters - conflict and has retried for 5 times. - type: boolean - type: object - hook: - description: Hook will submit any referenced resources to - perform the sync. This is the default strategy + allowEmpty: + description: 'AllowEmpty allows apps have zero live resources + (default: false)' + type: boolean + prune: + description: 'Prune specifies whether to delete resources + from the cluster that are not found in the sources anymore + as part of automated sync (default: false)' + type: boolean + selfHeal: + description: 'SelfHeal specifes whether to revert resources + back to their desired state upon modification in the cluster + (default: false)' + type: boolean + type: object + retry: + description: Retry controls failed sync retry behavior + properties: + backoff: + description: Backoff controls how to backoff on subsequent + retries of failed syncs properties: - force: - description: Force indicates whether or not to supply - the --force flag to `kubectl apply`. The --force flag - deletes and re-create the resource, when PATCH encounters - conflict and has retried for 5 times. - type: boolean + duration: + description: Duration is the amount to back off. Default + unit is seconds, but could also be a duration (e.g. + "2m", "1h") + type: string + factor: + description: Factor is a factor to multiply the base duration + after each failed retry + format: int64 + type: integer + maxDuration: + description: MaxDuration is the maximum amount of time + allowed for the backoff strategy + type: string type: object + limit: + description: Limit is the maximum number of attempts for retrying + a failed sync. If set to 0, no retries will be performed. + format: int64 + type: integer type: object + syncOptions: + description: Options allow you to specify whole app sync-options + items: + type: string + type: array type: object + required: + - destination + - project + - source type: object - spec: - description: ApplicationSpec represents desired application state. Contains - link to repository with application definition and additional parameters - link definition revision. + status: + description: ApplicationStatus contains status information for the application properties: - destination: - description: Destination is a reference to the target Kubernetes server - and namespace - properties: - name: - description: Name is an alternate way of specifying the target - cluster by its symbolic name - type: string - namespace: - description: Namespace specifies the target namespace for the - application's resources. The namespace will only be set for - namespace-scoped resources that have not set a value for .metadata.namespace - type: string - server: - description: Server specifies the URL of the target cluster and - must be set to the Kubernetes control plane API - type: string - type: object - ignoreDifferences: - description: IgnoreDifferences is a list of resources and their fields - which should be ignored during comparison + conditions: + description: Conditions is a list of currently observed application + conditions items: - description: ResourceIgnoreDifferences contains resource filter - and list of json paths which should be ignored during comparison - with live state. + description: ApplicationCondition contains details about an application + condition, which is usally an error or warning properties: - group: - type: string - jqPathExpressions: - items: - type: string - type: array - jsonPointers: - items: - type: string - type: array - kind: + lastTransitionTime: + description: LastTransitionTime is the time the condition was + last observed + format: date-time type: string - managedFieldsManagers: - description: ManagedFieldsManagers is a list of trusted managers. - Fields mutated by those managers will take precedence over - the desired state defined in the SCM and won't be displayed - in diffs - items: - type: string - type: array - name: + message: + description: Message contains human-readable message indicating + details about condition type: string - namespace: + type: + description: Type is an application condition type type: string required: - - kind + - message + - type type: object type: array - info: - description: Info contains a list of information (URLs, email addresses, - and plain text) that relates to the application + health: + description: Health contains information about the application's current + health status + properties: + message: + description: Message is a human-readable informational message + describing the health status + type: string + status: + description: Status holds the status code of the application or + resource + type: string + type: object + history: + description: History contains information about the application's + sync history items: + description: RevisionHistory contains history information about + a previous sync properties: - name: + deployStartedAt: + description: DeployStartedAt holds the time the sync operation + started + format: date-time type: string - value: - type: string - required: - - name - - value - type: object - type: array - project: - description: Project is a reference to the project this application - belongs to. The empty string means that application belongs to the - 'default' project. - type: string - revisionHistoryLimit: - description: RevisionHistoryLimit limits the number of items kept - in the application's revision history, which is used for informational - purposes as well as for rollbacks to previous versions. This should - only be changed in exceptional circumstances. Setting to zero will - store no history. This will reduce storage used. Increasing will - increase the space used to store the history, so we do not recommend - increasing it. Default is 10. - format: int64 - type: integer - source: - description: Source is a reference to the location of the application's - manifests or chart - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match paths - against that should be explicitly excluded from being used - during manifest generation - type: string - include: - description: Include contains a glob pattern to match paths - against that should be explicitly included during manifest - generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External Variables - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level Arguments - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the helm - template - items: - description: HelmFileParameter is a file parameter that's - passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally by not - appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters which - are passed to the helm template command upon manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to tell - Helm to interpret booleans and numbers as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all domains - (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to use. - If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition installation - step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files to - use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for templating - ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional annotations - to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels to - add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether to force - applying common annotations to resources for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to force - applying common labels to resources for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize image - definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize to - use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, usually - expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or Helm) - that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the source - to sync the application to. In case of Git, this can be commit, - tag, or branch. If omitted, will equal to HEAD. In case of Helm, - this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Sources is a reference to the location of the application's - manifests or chart - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match paths - against that should be explicitly excluded from being - used during manifest generation - type: string - include: - description: Include contains a glob pattern to match paths - against that should be explicitly included during manifest - generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External Variables - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level Arguments - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the helm - template - items: - description: HelmFileParameter is a file parameter that's - passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally by not - appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters which - are passed to the helm template command upon manifest - generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to tell - Helm to interpret booleans and numbers as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all domains - (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to use. - If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition installation - step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files to - use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for templating - ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional annotations - to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether to - force applying common annotations to resources for Kustomize - apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to force - applying common labels to resources for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize image - definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, usually - expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type - parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or Helm) - that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the source - to sync the application to. In case of Git, this can be commit, - tag, or branch. If omitted, will equal to HEAD. In case of - Helm, this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array - syncPolicy: - description: SyncPolicy controls when and how a sync will be performed - properties: - automated: - description: Automated will keep an application synced to the - target revision - properties: - allowEmpty: - description: 'AllowEmpty allows apps have zero live resources - (default: false)' - type: boolean - prune: - description: 'Prune specifies whether to delete resources - from the cluster that are not found in the sources anymore - as part of automated sync (default: false)' - type: boolean - selfHeal: - description: 'SelfHeal specifes whether to revert resources - back to their desired state upon modification in the cluster - (default: false)' - type: boolean - type: object - managedNamespaceMetadata: - description: ManagedNamespaceMetadata controls metadata in the - given namespace (if CreateNamespace=true) - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object - retry: - description: Retry controls failed sync retry behavior - properties: - backoff: - description: Backoff controls how to backoff on subsequent - retries of failed syncs - properties: - duration: - description: Duration is the amount to back off. Default - unit is seconds, but could also be a duration (e.g. - "2m", "1h") - type: string - factor: - description: Factor is a factor to multiply the base duration - after each failed retry - format: int64 - type: integer - maxDuration: - description: MaxDuration is the maximum amount of time - allowed for the backoff strategy - type: string - type: object - limit: - description: Limit is the maximum number of attempts for retrying - a failed sync. If set to 0, no retries will be performed. - format: int64 - type: integer - type: object - syncOptions: - description: Options allow you to specify whole app sync-options - items: - type: string - type: array - type: object - required: - - destination - - project - type: object - status: - description: ApplicationStatus contains status information for the application - properties: - conditions: - description: Conditions is a list of currently observed application - conditions - items: - description: ApplicationCondition contains details about an application - condition, which is usally an error or warning - properties: - lastTransitionTime: - description: LastTransitionTime is the time the condition was - last observed - format: date-time - type: string - message: - description: Message contains human-readable message indicating - details about condition - type: string - type: - description: Type is an application condition type - type: string - required: - - message - - type - type: object - type: array - health: - description: Health contains information about the application's current - health status - properties: - message: - description: Message is a human-readable informational message - describing the health status - type: string - status: - description: Status holds the status code of the application or - resource - type: string - type: object - history: - description: History contains information about the application's - sync history - items: - description: RevisionHistory contains history information about - a previous sync - properties: - deployStartedAt: - description: DeployStartedAt holds the time the sync operation - started - format: date-time - type: string - deployedAt: - description: DeployedAt holds the time the sync operation completed - format: date-time + deployedAt: + description: DeployedAt holds the time the sync operation completed + format: date-time type: string id: description: ID is an auto incrementing identifier of the RevisionHistory @@ -1438,12 +842,6 @@ spec: description: Revision holds the revision the sync was performed against type: string - revisions: - description: Revisions holds the revision of each source in - sources field the sync was performed against - items: - type: string - type: array source: description: Source is a reference to the application source used for the sync operation @@ -1455,527 +853,231 @@ spec: directory: description: Directory holds path/directory specific options properties: - exclude: - description: Exclude contains a glob pattern to match - paths against that should be explicitly excluded from - being used during manifest generation - type: string - include: - description: Include contains a glob pattern to match - paths against that should be explicitly included during - manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the - helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally - by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to - tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to - use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for - templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: + exclude: + description: Exclude contains a glob pattern to match + paths against that should be explicitly excluded from + being used during manifest generation type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. + include: + description: Include contains a glob pattern to match + paths against that should be explicitly included during + manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External + Variables + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. + type: array + libs: + description: Additional library search dirs + items: type: string - type: object - type: array + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level + Arguments + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or - Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Sources is a reference to the application sources - used for the sync operation - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match - paths against that should be explicitly excluded - from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to match - paths against that should be explicitly included - during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to - the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for - templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests + helm: + description: Helm holds helm specific options + properties: + fileParameters: + description: FileParameters are file parameters to the + helm template + items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest generation + properties: + name: + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter + type: string type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally + by not appending them to helm template --values + type: boolean + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command upon + manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether to + tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm parameter + type: string type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps + type: array + passCredentials: + description: PassCredentials pass credentials to all + domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to + use. If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files + to use when generating a template + items: type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps + type: array + values: + description: Values specifies Helm values to be passed + to helm template, typically defined as a block + type: string + version: + description: Version is the Helm version to use for + templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + commonAnnotations: + additionalProperties: type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonLabels: + additionalProperties: type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: + description: CommonLabels is a list of additional labels + to add to rendered manifests + type: object + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to + force applying common labels to resources for Kustomize + apps + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - type: array + type: array + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + description: RepoURL is the URL to the repository (Git or + Helm) that contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of the + source to sync the application to. In case of Git, this + can be commit, tag, or branch. If omitted, will equal + to HEAD. In case of Helm, this is a semver tag for the + Chart's version. + type: string + required: + - repoURL + type: object required: - deployedAt - id + - revision type: object type: array observedAt: @@ -2098,14 +1200,6 @@ spec: (Helm) which to sync the application to If omitted, will use the revision specified in app spec. type: string - revisions: - description: Revisions is the list of revision (Git) or - chart version (Helm) which to sync each source in sources - field for the application to If omitted, will use the - revision specified in app spec. - items: - type: string - type: array source: description: Source overrides the source definition set in the application. This is typically set in a Rollback @@ -2336,39 +1430,9 @@ spec: - value type: object type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array + name: + type: string type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -2383,291 +1447,6 @@ spec: required: - repoURL type: object - sources: - description: Sources overrides the source definition set - in the application. This is typically set in a Rollback - operation and is nil during a Sync operation - items: - description: ApplicationSource contains all required - information about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must - be specified for applications sourced from a Helm - repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern - to match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern - to match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific - to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet - External Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan - a directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents - helm template from failing when valueFiles - do not exist locally by not appending them - to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter - that's passed to helm template during manifest - generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and - numbers as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the - Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials - to all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release - name to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource - definition installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to - be passed to helm template, typically defined - as a block - type: string - version: - description: Version is the Helm version to - use for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific - options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of - additional annotations to add to rendered - manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies - whether to force applying common annotations - to resources for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources - for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended - to resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended - to resources for Kustomize apps - type: string - version: - description: Version controls which version - of Kustomize to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the - Git repository, and is only valid for applications - sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin - specific options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry - in the application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the - variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an - array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map - type parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a - string type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source - within sources field. This field will not be used - if used with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository - (Git or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision - of the source to sync the application to. In case - of Git, this can be commit, tag, or branch. If - omitted, will equal to HEAD. In case of Helm, - this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array syncOptions: description: SyncOptions provide per-sync sync-options, e.g. Validate=false @@ -2777,12 +1556,6 @@ spec: description: Revision holds the revision this sync operation was performed to type: string - revisions: - description: Revisions holds the revision this sync operation - was performed for respective indexed source in sources field - items: - type: string - type: array source: description: Source records the application source information of the sync, used for comparing auto-sync @@ -3003,37 +1776,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -3048,284 +1791,6 @@ spec: required: - repoURL type: object - sources: - description: Source records the application source information - of the sync, used for comparing auto-sync - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be - specified for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern to - match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to - match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a - directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template - --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to - all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block - type: string - version: - description: Version is the Helm version to use - for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources for - Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to - resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to - resources for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git - repository, and is only valid for applications sourced - from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of - the source to sync the application to. In case of - Git, this can be commit, tag, or branch. If omitted, - will equal to HEAD. In case of Helm, this is a semver - tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array required: - revision type: object @@ -3389,14 +1854,6 @@ spec: sourceType: description: SourceType specifies the type of this application type: string - sourceTypes: - description: SourceTypes specifies the type of the sources included - in the application - items: - description: ApplicationSourceType specifies the type of the application's - source - type: string - type: array summary: description: Summary contains a list of URLs and container images used by this application @@ -3660,37 +2117,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -3705,297 +2132,14 @@ spec: required: - repoURL type: object - sources: - description: Sources is a reference to the application's multiple - sources used for comparison - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be - specified for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern to - match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to - match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a - directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template - --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to - all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block - type: string - version: - description: Version is the Helm version to use - for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources for - Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to - resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to - resources for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git - repository, and is only valid for applications sourced - from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of - the source to sync the application to. In case of - Git, this can be commit, tag, or branch. If omitted, - will equal to HEAD. In case of Helm, this is a semver - tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array required: - destination + - source type: object revision: description: Revision contains information about the revision the comparison has been performed to type: string - revisions: - description: Revisions contains information about the revisions - of multiple sources the comparison has been performed to - items: - type: string - type: array status: description: Status is the sync state of the comparison type: string diff --git a/manifests/crds/applicationset-crd.yaml b/manifests/crds/applicationset-crd.yaml index 7f8c3e0251972..5e654ad2e7a4e 100644 --- a/manifests/crds/applicationset-crd.yaml +++ b/manifests/crds/applicationset-crd.yaml @@ -270,26 +270,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -297,165 +278,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -467,17 +289,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -502,6 +313,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -745,26 +557,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -772,165 +565,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -942,17 +576,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -977,6 +600,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -1009,8 +633,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -1224,26 +846,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -1251,165 +854,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -1421,17 +865,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -1456,6 +889,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -1677,26 +1111,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -1704,165 +1119,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -1874,17 +1130,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -1909,6 +1154,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -2160,26 +1406,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -2187,165 +1414,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -2357,17 +1425,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -2392,6 +1449,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -2635,26 +1693,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -2662,165 +1701,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -2832,17 +1712,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -2867,6 +1736,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -2899,8 +1769,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -3114,26 +1982,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -3141,165 +1990,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -3311,17 +2001,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -3346,6 +2025,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -3567,26 +2247,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -3594,165 +2255,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -3764,17 +2266,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -3799,6 +2290,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -4138,26 +2630,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -4165,165 +2638,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -4335,17 +2649,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -4370,6 +2673,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -4756,26 +3060,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -4783,165 +3068,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -4953,17 +3079,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -4988,6 +3103,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -5225,26 +3341,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -5252,165 +3349,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -5422,17 +3360,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -5457,6 +3384,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -5708,26 +3636,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -5735,165 +3644,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -5905,17 +3655,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -5940,6 +3679,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6183,26 +3923,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -6210,165 +3931,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -6380,17 +3942,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -6415,6 +3966,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6447,8 +3999,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -6662,26 +4212,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -6689,165 +4220,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -6859,17 +4231,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -6894,6 +4255,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -7115,26 +4477,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -7142,192 +4485,22 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array - syncPolicy: - properties: - automated: - properties: - allowEmpty: - type: boolean - prune: - type: boolean - selfHeal: - type: boolean - type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object - retry: - properties: - backoff: - properties: - duration: + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + retry: + properties: + backoff: + properties: + duration: type: string factor: format: int64 @@ -7347,6 +4520,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -7686,26 +4860,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -7713,165 +4868,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -7883,17 +4879,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -7918,6 +4903,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -8304,26 +5290,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -8331,165 +5298,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -8501,17 +5309,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -8536,6 +5333,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -8777,26 +5575,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -8804,165 +5583,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -8974,17 +5594,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9009,6 +5618,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -9345,26 +5955,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -9372,165 +5963,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -9542,17 +5974,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9577,6 +5998,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -9963,26 +6385,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -9990,165 +6393,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -10160,17 +6404,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -10195,6 +6428,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -10228,37 +6462,6 @@ spec: type: array goTemplate: type: boolean - strategy: - properties: - rollingSync: - properties: - steps: - items: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - type: string - values: - items: - type: string - type: array - type: object - type: array - maxUpdate: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - type: object - type: array - type: object - type: - type: string - type: object syncPolicy: properties: preserveResourcesOnDeletion: @@ -10470,26 +6673,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -10497,165 +6681,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -10667,17 +6692,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -10702,6 +6716,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -10713,24 +6728,6 @@ spec: type: object status: properties: - applicationStatus: - items: - properties: - application: - type: string - lastTransitionTime: - format: date-time - type: string - message: - type: string - status: - type: string - required: - - application - - message - - status - type: object - type: array conditions: items: properties: diff --git a/manifests/ha/base/kustomization.yaml b/manifests/ha/base/kustomization.yaml index c8f8e9e8f5b9b..834d9e894f8fe 100644 --- a/manifests/ha/base/kustomization.yaml +++ b/manifests/ha/base/kustomization.yaml @@ -11,7 +11,7 @@ patchesStrategicMerge: images: - name: quay.io/argoproj/argocd newName: quay.io/argoproj/argocd - newTag: latest + newTag: v2.5.4 resources: - ../../base/application-controller - ../../base/applicationset-controller diff --git a/manifests/ha/base/redis-ha/chart/upstream.yaml b/manifests/ha/base/redis-ha/chart/upstream.yaml index cd890ba33dc4c..918bba8a78d77 100644 --- a/manifests/ha/base/redis-ha/chart/upstream.yaml +++ b/manifests/ha/base/redis-ha/chart/upstream.yaml @@ -41,7 +41,6 @@ data: port 6379 rename-command FLUSHDB "" rename-command FLUSHALL "" - bind 0.0.0.0 maxmemory 0 maxmemory-policy volatile-lru min-replicas-max-lag 5 @@ -54,7 +53,6 @@ data: sentinel.conf: | dir "/data" port 26379 - bind 0.0.0.0 sentinel down-after-milliseconds argocd 10000 sentinel failover-timeout argocd 180000 maxclients 10000 @@ -620,7 +618,7 @@ data: timeout check 2s listen health_check_http_url - bind :8888 + bind [::]:8888 v4v6 mode http monitor-uri /healthz option dontlognull @@ -667,7 +665,7 @@ data: # decide redis backend to use #master frontend ft_redis_master - bind :6379 + bind [::]:6379 v4v6 use_backend bk_redis_master # Check all redis servers to see if they think they are master backend bk_redis_master @@ -1047,7 +1045,7 @@ spec: release: argocd revision: "1" annotations: - checksum/config: 718bbb277da8610063a7c0fd810984577c2e8ab215815a71211dfa6e20f67321 + checksum/config: 1f7a9ffcacb3871ceb9b0741c0714e3f7fa656d426a398c1f727fffb01073f35 spec: # Needed when using unmodified rbac-setup.yml @@ -1155,7 +1153,7 @@ spec: template: metadata: annotations: - checksum/init-config: 69130412bda04eacad3530cb7bcf26cf121401e725e15d0959dd71a7380afe75 + checksum/init-config: 84ccf6a9b8a7fa3ae5b62a8f17d6c65a5197e9605da9b2761179bf942828eefe labels: release: argocd app: redis-ha @@ -1179,7 +1177,7 @@ spec: automountServiceAccountToken: false initContainers: - name: config-init - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent resources: {} @@ -1206,7 +1204,7 @@ spec: containers: - name: redis - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent command: - redis-server @@ -1256,7 +1254,7 @@ spec: - /bin/sh - /readonly-config/trigger-failover-if-master.sh - name: sentinel - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent command: - redis-sentinel @@ -1300,7 +1298,7 @@ spec: {} - name: split-brain-fix - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent command: - sh diff --git a/manifests/ha/base/redis-ha/chart/values.yaml b/manifests/ha/base/redis-ha/chart/values.yaml index db8973b575627..ca2e7295e00d7 100644 --- a/manifests/ha/base/redis-ha/chart/values.yaml +++ b/manifests/ha/base/redis-ha/chart/values.yaml @@ -5,11 +5,8 @@ redis-ha: masterGroupName: argocd config: save: "\"\"" - bind: "0.0.0.0" haproxy: enabled: true - IPv6: - enabled: false image: tag: 2.6.2-alpine containerSecurityContext: null @@ -18,7 +15,5 @@ redis-ha: client: 6m checkInterval: 3s image: - tag: 7.0.7-alpine + tag: 7.0.5-alpine containerSecurityContext: null - sentinel: - bind: "0.0.0.0" diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index 62461d59ffa66..950a648be7208 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -144,14 +144,6 @@ spec: which to sync the application to If omitted, will use the revision specified in app spec. type: string - revisions: - description: Revisions is the list of revision (Git) or chart - version (Helm) which to sync each source in sources field for - the application to If omitted, will use the revision specified - in app spec. - items: - type: string - type: array source: description: Source overrides the source definition set in the application. This is typically set in a Rollback operation and @@ -367,35 +359,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type - parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -409,1027 +373,467 @@ spec: required: - repoURL type: object - sources: - description: Sources overrides the source definition set in the - application. This is typically set in a Rollback operation and - is nil during a Sync operation + syncOptions: + description: SyncOptions provide per-sync sync-options, e.g. Validate=false items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options + type: string + type: array + syncStrategy: + description: SyncStrategy describes how to perform the sync + properties: + apply: + description: Apply will perform a `kubectl apply` to perform + the sync. + properties: + force: + description: Force indicates whether or not to supply + the --force flag to `kubectl apply`. The --force flag + deletes and re-create the resource, when PATCH encounters + conflict and has retried for 5 times. + type: boolean + type: object + hook: + description: Hook will submit any referenced resources to + perform the sync. This is the default strategy + properties: + force: + description: Force indicates whether or not to supply + the --force flag to `kubectl apply`. The --force flag + deletes and re-create the resource, when PATCH encounters + conflict and has retried for 5 times. + type: boolean + type: object + type: object + type: object + type: object + spec: + description: ApplicationSpec represents desired application state. Contains + link to repository with application definition and additional parameters + link definition revision. + properties: + destination: + description: Destination is a reference to the target Kubernetes server + and namespace + properties: + name: + description: Name is an alternate way of specifying the target + cluster by its symbolic name + type: string + namespace: + description: Namespace specifies the target namespace for the + application's resources. The namespace will only be set for + namespace-scoped resources that have not set a value for .metadata.namespace + type: string + server: + description: Server specifies the URL of the target cluster and + must be set to the Kubernetes control plane API + type: string + type: object + ignoreDifferences: + description: IgnoreDifferences is a list of resources and their fields + which should be ignored during comparison + items: + description: ResourceIgnoreDifferences contains resource filter + and list of json paths which should be ignored during comparison + with live state. + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + description: ManagedFieldsManagers is a list of trusted managers. + Fields mutated by those managers will take precedence over + the desired state defined in the SCM and won't be displayed + in diffs + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + description: Info contains a list of information (URLs, email addresses, + and plain text) that relates to the application + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + description: Project is a reference to the project this application + belongs to. The empty string means that application belongs to the + 'default' project. + type: string + revisionHistoryLimit: + description: RevisionHistoryLimit limits the number of items kept + in the application's revision history, which is used for informational + purposes as well as for rollbacks to previous versions. This should + only be changed in exceptional circumstances. Setting to zero will + store no history. This will reduce storage used. Increasing will + increase the space used to store the history, so we do not recommend + increasing it. Default is 10. + format: int64 + type: integer + source: + description: Source is a reference to the location of the application's + manifests or chart + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match paths + against that should be explicitly excluded from being used + during manifest generation + type: string + include: + description: Include contains a glob pattern to match paths + against that should be explicitly included during manifest + generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External Variables + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level Arguments + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + fileParameters: + description: FileParameters are file parameters to the helm + template + items: + description: HelmFileParameter is a file parameter that's + passed to helm template during manifest generation properties: - exclude: - description: Exclude contains a glob pattern to match - paths against that should be explicitly excluded from - being used during manifest generation + name: + description: Name is the name of the Helm parameter type: string - include: - description: Include contains a glob pattern to match - paths against that should be explicitly included during - manifest generation + path: + description: Path is the path to the file containing + the values for the Helm parameter type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean type: object - helm: - description: Helm holds helm specific options + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally by not + appending them to helm template --values + type: boolean + parameters: + description: Parameters is a list of Helm parameters which + are passed to the helm template command upon manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation properties: - fileParameters: - description: FileParameters are file parameters to the - helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally - by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to - tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to - use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) + forceString: + description: ForceString determines whether to tell + Helm to interpret booleans and numbers as strings type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + name: + description: Name is the name of the Helm parameter type: string - version: - description: Version is the Helm version to use for - templating ("3") + value: + description: Value is the value for the Helm parameter type: string type: object - kustomize: - description: Kustomize holds kustomize specific options + type: array + passCredentials: + description: PassCredentials pass credentials to all domains + (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to use. + If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition installation + step (Helm's --skip-crds) + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files to + use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed to + helm template, typically defined as a block + type: string + version: + description: Version is the Helm version to use for templating + ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional annotations + to add to rendered manifests + type: object + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional labels to + add to rendered manifests + type: object + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether to force + applying common annotations to resources for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to force + applying common labels to resources for Kustomize apps + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize image + definition in the format [old_image_name=]: + type: string + type: array + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + version: + description: Version controls which version of Kustomize to + use for rendering manifests + type: string + type: object + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps + name: + description: Name is the name of the variable, usually + expressed in uppercase type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests + value: + description: Value is the value of the variable type: string + required: + - name + - value type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or - Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - type: array - syncOptions: - description: SyncOptions provide per-sync sync-options, e.g. Validate=false - items: - type: string - type: array - syncStrategy: - description: SyncStrategy describes how to perform the sync + type: array + name: + type: string + type: object + repoURL: + description: RepoURL is the URL to the repository (Git or Helm) + that contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of the source + to sync the application to. In case of Git, this can be commit, + tag, or branch. If omitted, will equal to HEAD. In case of Helm, + this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + syncPolicy: + description: SyncPolicy controls when and how a sync will be performed + properties: + automated: + description: Automated will keep an application synced to the + target revision properties: - apply: - description: Apply will perform a `kubectl apply` to perform - the sync. - properties: - force: - description: Force indicates whether or not to supply - the --force flag to `kubectl apply`. The --force flag - deletes and re-create the resource, when PATCH encounters - conflict and has retried for 5 times. - type: boolean - type: object - hook: - description: Hook will submit any referenced resources to - perform the sync. This is the default strategy + allowEmpty: + description: 'AllowEmpty allows apps have zero live resources + (default: false)' + type: boolean + prune: + description: 'Prune specifies whether to delete resources + from the cluster that are not found in the sources anymore + as part of automated sync (default: false)' + type: boolean + selfHeal: + description: 'SelfHeal specifes whether to revert resources + back to their desired state upon modification in the cluster + (default: false)' + type: boolean + type: object + retry: + description: Retry controls failed sync retry behavior + properties: + backoff: + description: Backoff controls how to backoff on subsequent + retries of failed syncs properties: - force: - description: Force indicates whether or not to supply - the --force flag to `kubectl apply`. The --force flag - deletes and re-create the resource, when PATCH encounters - conflict and has retried for 5 times. - type: boolean + duration: + description: Duration is the amount to back off. Default + unit is seconds, but could also be a duration (e.g. + "2m", "1h") + type: string + factor: + description: Factor is a factor to multiply the base duration + after each failed retry + format: int64 + type: integer + maxDuration: + description: MaxDuration is the maximum amount of time + allowed for the backoff strategy + type: string type: object + limit: + description: Limit is the maximum number of attempts for retrying + a failed sync. If set to 0, no retries will be performed. + format: int64 + type: integer type: object + syncOptions: + description: Options allow you to specify whole app sync-options + items: + type: string + type: array type: object + required: + - destination + - project + - source type: object - spec: - description: ApplicationSpec represents desired application state. Contains - link to repository with application definition and additional parameters - link definition revision. + status: + description: ApplicationStatus contains status information for the application properties: - destination: - description: Destination is a reference to the target Kubernetes server - and namespace - properties: - name: - description: Name is an alternate way of specifying the target - cluster by its symbolic name - type: string - namespace: - description: Namespace specifies the target namespace for the - application's resources. The namespace will only be set for - namespace-scoped resources that have not set a value for .metadata.namespace - type: string - server: - description: Server specifies the URL of the target cluster and - must be set to the Kubernetes control plane API - type: string - type: object - ignoreDifferences: - description: IgnoreDifferences is a list of resources and their fields - which should be ignored during comparison + conditions: + description: Conditions is a list of currently observed application + conditions items: - description: ResourceIgnoreDifferences contains resource filter - and list of json paths which should be ignored during comparison - with live state. + description: ApplicationCondition contains details about an application + condition, which is usally an error or warning properties: - group: - type: string - jqPathExpressions: - items: - type: string - type: array - jsonPointers: - items: - type: string - type: array - kind: + lastTransitionTime: + description: LastTransitionTime is the time the condition was + last observed + format: date-time type: string - managedFieldsManagers: - description: ManagedFieldsManagers is a list of trusted managers. - Fields mutated by those managers will take precedence over - the desired state defined in the SCM and won't be displayed - in diffs - items: - type: string - type: array - name: + message: + description: Message contains human-readable message indicating + details about condition type: string - namespace: + type: + description: Type is an application condition type type: string required: - - kind + - message + - type type: object type: array - info: - description: Info contains a list of information (URLs, email addresses, - and plain text) that relates to the application + health: + description: Health contains information about the application's current + health status + properties: + message: + description: Message is a human-readable informational message + describing the health status + type: string + status: + description: Status holds the status code of the application or + resource + type: string + type: object + history: + description: History contains information about the application's + sync history items: + description: RevisionHistory contains history information about + a previous sync properties: - name: + deployStartedAt: + description: DeployStartedAt holds the time the sync operation + started + format: date-time type: string - value: - type: string - required: - - name - - value - type: object - type: array - project: - description: Project is a reference to the project this application - belongs to. The empty string means that application belongs to the - 'default' project. - type: string - revisionHistoryLimit: - description: RevisionHistoryLimit limits the number of items kept - in the application's revision history, which is used for informational - purposes as well as for rollbacks to previous versions. This should - only be changed in exceptional circumstances. Setting to zero will - store no history. This will reduce storage used. Increasing will - increase the space used to store the history, so we do not recommend - increasing it. Default is 10. - format: int64 - type: integer - source: - description: Source is a reference to the location of the application's - manifests or chart - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match paths - against that should be explicitly excluded from being used - during manifest generation - type: string - include: - description: Include contains a glob pattern to match paths - against that should be explicitly included during manifest - generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External Variables - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level Arguments - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the helm - template - items: - description: HelmFileParameter is a file parameter that's - passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally by not - appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters which - are passed to the helm template command upon manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to tell - Helm to interpret booleans and numbers as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all domains - (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to use. - If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition installation - step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files to - use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for templating - ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional annotations - to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels to - add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether to force - applying common annotations to resources for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to force - applying common labels to resources for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize image - definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize to - use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, usually - expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or Helm) - that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the source - to sync the application to. In case of Git, this can be commit, - tag, or branch. If omitted, will equal to HEAD. In case of Helm, - this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Sources is a reference to the location of the application's - manifests or chart - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match paths - against that should be explicitly excluded from being - used during manifest generation - type: string - include: - description: Include contains a glob pattern to match paths - against that should be explicitly included during manifest - generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External Variables - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level Arguments - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the helm - template - items: - description: HelmFileParameter is a file parameter that's - passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally by not - appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters which - are passed to the helm template command upon manifest - generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to tell - Helm to interpret booleans and numbers as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all domains - (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to use. - If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition installation - step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files to - use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for templating - ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional annotations - to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether to - force applying common annotations to resources for Kustomize - apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to force - applying common labels to resources for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize image - definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, usually - expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type - parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or Helm) - that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the source - to sync the application to. In case of Git, this can be commit, - tag, or branch. If omitted, will equal to HEAD. In case of - Helm, this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array - syncPolicy: - description: SyncPolicy controls when and how a sync will be performed - properties: - automated: - description: Automated will keep an application synced to the - target revision - properties: - allowEmpty: - description: 'AllowEmpty allows apps have zero live resources - (default: false)' - type: boolean - prune: - description: 'Prune specifies whether to delete resources - from the cluster that are not found in the sources anymore - as part of automated sync (default: false)' - type: boolean - selfHeal: - description: 'SelfHeal specifes whether to revert resources - back to their desired state upon modification in the cluster - (default: false)' - type: boolean - type: object - managedNamespaceMetadata: - description: ManagedNamespaceMetadata controls metadata in the - given namespace (if CreateNamespace=true) - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object - retry: - description: Retry controls failed sync retry behavior - properties: - backoff: - description: Backoff controls how to backoff on subsequent - retries of failed syncs - properties: - duration: - description: Duration is the amount to back off. Default - unit is seconds, but could also be a duration (e.g. - "2m", "1h") - type: string - factor: - description: Factor is a factor to multiply the base duration - after each failed retry - format: int64 - type: integer - maxDuration: - description: MaxDuration is the maximum amount of time - allowed for the backoff strategy - type: string - type: object - limit: - description: Limit is the maximum number of attempts for retrying - a failed sync. If set to 0, no retries will be performed. - format: int64 - type: integer - type: object - syncOptions: - description: Options allow you to specify whole app sync-options - items: - type: string - type: array - type: object - required: - - destination - - project - type: object - status: - description: ApplicationStatus contains status information for the application - properties: - conditions: - description: Conditions is a list of currently observed application - conditions - items: - description: ApplicationCondition contains details about an application - condition, which is usally an error or warning - properties: - lastTransitionTime: - description: LastTransitionTime is the time the condition was - last observed - format: date-time - type: string - message: - description: Message contains human-readable message indicating - details about condition - type: string - type: - description: Type is an application condition type - type: string - required: - - message - - type - type: object - type: array - health: - description: Health contains information about the application's current - health status - properties: - message: - description: Message is a human-readable informational message - describing the health status - type: string - status: - description: Status holds the status code of the application or - resource - type: string - type: object - history: - description: History contains information about the application's - sync history - items: - description: RevisionHistory contains history information about - a previous sync - properties: - deployStartedAt: - description: DeployStartedAt holds the time the sync operation - started - format: date-time - type: string - deployedAt: - description: DeployedAt holds the time the sync operation completed - format: date-time + deployedAt: + description: DeployedAt holds the time the sync operation completed + format: date-time type: string id: description: ID is an auto incrementing identifier of the RevisionHistory @@ -1439,12 +843,6 @@ spec: description: Revision holds the revision the sync was performed against type: string - revisions: - description: Revisions holds the revision of each source in - sources field the sync was performed against - items: - type: string - type: array source: description: Source is a reference to the application source used for the sync operation @@ -1506,477 +904,181 @@ spec: value: type: string required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the - helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally - by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to - tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to - use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for - templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests + - name + - value + type: object + type: array type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options + helm: + description: Helm holds helm specific options properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: + fileParameters: + description: FileParameters are file parameters to the + helm template items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest generation properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter type: string type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or - Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Sources is a reference to the application sources - used for the sync operation - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match - paths against that should be explicitly excluded - from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to match - paths against that should be explicitly included - during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to - the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for - templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally + by not appending them to helm template --values + type: boolean + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command upon + manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether to + tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to all + domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to + use. If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files + to use when generating a template + items: type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps + type: array + values: + description: Values specifies Helm values to be passed + to helm template, typically defined as a block + type: string + version: + description: Version is the Helm version to use for + templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + commonAnnotations: + additionalProperties: type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonLabels: + additionalProperties: type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: + description: CommonLabels is a list of additional labels + to add to rendered manifests + type: object + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to + force applying common labels to resources for Kustomize + apps + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - type: array + type: array + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + description: RepoURL is the URL to the repository (Git or + Helm) that contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of the + source to sync the application to. In case of Git, this + can be commit, tag, or branch. If omitted, will equal + to HEAD. In case of Helm, this is a semver tag for the + Chart's version. + type: string + required: + - repoURL + type: object required: - deployedAt - id + - revision type: object type: array observedAt: @@ -2099,14 +1201,6 @@ spec: (Helm) which to sync the application to If omitted, will use the revision specified in app spec. type: string - revisions: - description: Revisions is the list of revision (Git) or - chart version (Helm) which to sync each source in sources - field for the application to If omitted, will use the - revision specified in app spec. - items: - type: string - type: array source: description: Source overrides the source definition set in the application. This is typically set in a Rollback @@ -2323,53 +1417,23 @@ spec: entries items: description: EnvEntry represents an entry in - the application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object + the application's environment + properties: name: - description: Name is the name identifying - a parameter. + description: Name is the name of the variable, + usually expressed in uppercase type: string - string: - description: String_ is the value of a string - type parameter. + value: + description: Value is the value of the variable type: string + required: + - name + - value type: object type: array + name: + type: string type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -2384,291 +1448,6 @@ spec: required: - repoURL type: object - sources: - description: Sources overrides the source definition set - in the application. This is typically set in a Rollback - operation and is nil during a Sync operation - items: - description: ApplicationSource contains all required - information about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must - be specified for applications sourced from a Helm - repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern - to match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern - to match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific - to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet - External Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan - a directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents - helm template from failing when valueFiles - do not exist locally by not appending them - to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter - that's passed to helm template during manifest - generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and - numbers as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the - Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials - to all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release - name to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource - definition installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to - be passed to helm template, typically defined - as a block - type: string - version: - description: Version is the Helm version to - use for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific - options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of - additional annotations to add to rendered - manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies - whether to force applying common annotations - to resources for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources - for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended - to resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended - to resources for Kustomize apps - type: string - version: - description: Version controls which version - of Kustomize to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the - Git repository, and is only valid for applications - sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin - specific options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry - in the application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the - variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an - array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map - type parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a - string type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source - within sources field. This field will not be used - if used with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository - (Git or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision - of the source to sync the application to. In case - of Git, this can be commit, tag, or branch. If - omitted, will equal to HEAD. In case of Helm, - this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array syncOptions: description: SyncOptions provide per-sync sync-options, e.g. Validate=false @@ -2778,12 +1557,6 @@ spec: description: Revision holds the revision this sync operation was performed to type: string - revisions: - description: Revisions holds the revision this sync operation - was performed for respective indexed source in sources field - items: - type: string - type: array source: description: Source records the application source information of the sync, used for comparing auto-sync @@ -3004,37 +1777,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -3043,290 +1786,12 @@ spec: description: TargetRevision defines the revision of the source to sync the application to. In case of Git, this can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Source records the application source information - of the sync, used for comparing auto-sync - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be - specified for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern to - match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to - match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a - directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template - --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to - all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block - type: string - version: - description: Version is the Helm version to use - for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources for - Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to - resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to - resources for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git - repository, and is only valid for applications sourced - from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of - the source to sync the application to. In case of - Git, this can be commit, tag, or branch. If omitted, - will equal to HEAD. In case of Helm, this is a semver - tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array + to HEAD. In case of Helm, this is a semver tag for the + Chart's version. + type: string + required: + - repoURL + type: object required: - revision type: object @@ -3390,14 +1855,6 @@ spec: sourceType: description: SourceType specifies the type of this application type: string - sourceTypes: - description: SourceTypes specifies the type of the sources included - in the application - items: - description: ApplicationSourceType specifies the type of the application's - source - type: string - type: array summary: description: Summary contains a list of URLs and container images used by this application @@ -3661,37 +2118,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -3706,297 +2133,14 @@ spec: required: - repoURL type: object - sources: - description: Sources is a reference to the application's multiple - sources used for comparison - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be - specified for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern to - match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to - match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a - directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template - --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to - all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block - type: string - version: - description: Version is the Helm version to use - for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources for - Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to - resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to - resources for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git - repository, and is only valid for applications sourced - from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of - the source to sync the application to. In case of - Git, this can be commit, tag, or branch. If omitted, - will equal to HEAD. In case of Helm, this is a semver - tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array required: - destination + - source type: object revision: description: Revision contains information about the revision the comparison has been performed to type: string - revisions: - description: Revisions contains information about the revisions - of multiple sources the comparison has been performed to - items: - type: string - type: array status: description: Status is the sync state of the comparison type: string @@ -4274,202 +2418,24 @@ spec: items: properties: name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -4481,17 +2447,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -4516,6 +2471,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -4759,26 +2715,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -4786,165 +2723,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -4956,17 +2734,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -4991,6 +2758,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -5023,8 +2791,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -5197,233 +2963,55 @@ spec: type: object kustomize: properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: + commonAnnotations: + additionalProperties: type: string - version: + type: object + commonLabels: + additionalProperties: type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: + type: object + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + images: + items: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + type: array + namePrefix: + type: string + nameSuffix: + type: string + version: + type: string + type: object + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -5435,17 +3023,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -5470,6 +3047,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -5691,26 +3269,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -5718,165 +3277,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -5888,17 +3288,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -5923,6 +3312,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6164,202 +3554,24 @@ spec: items: properties: name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -6371,17 +3583,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -6406,6 +3607,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6649,26 +3851,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -6676,165 +3859,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -6846,17 +3870,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -6881,6 +3894,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6913,8 +3927,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -7128,26 +4140,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -7155,165 +4148,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -7325,17 +4159,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -7360,6 +4183,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -7581,26 +4405,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -7608,165 +4413,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -7778,17 +4424,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -7813,6 +4448,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -8152,26 +4788,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -8179,165 +4796,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -8349,17 +4807,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -8384,6 +4831,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -8770,192 +5218,14 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: type: string required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + - repoURL + type: object syncPolicy: properties: automated: @@ -8967,17 +5237,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9002,6 +5261,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -9239,26 +5499,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -9266,165 +5507,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -9436,17 +5518,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9471,6 +5542,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -9722,26 +5794,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -9749,165 +5802,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -9919,17 +5813,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9954,6 +5837,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -10197,26 +6081,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -10224,165 +6089,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -10394,17 +6100,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -10429,6 +6124,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -10461,8 +6157,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -10676,26 +6370,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -10703,165 +6378,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -10873,17 +6389,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -10908,6 +6413,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -11129,26 +6635,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -11156,165 +6643,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -11326,17 +6654,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -11361,6 +6678,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -11700,26 +7018,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -11727,165 +7026,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -11897,17 +7037,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -11932,6 +7061,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -12318,26 +7448,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -12345,165 +7456,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -12515,17 +7467,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -12550,6 +7491,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -12791,192 +7733,14 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -12988,17 +7752,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -13023,6 +7776,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -13359,26 +8113,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -13386,165 +8121,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -13556,17 +8132,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -13591,6 +8156,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -13956,213 +8522,35 @@ spec: type: string nameSuffix: type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + version: + type: string + type: object + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -14174,17 +8562,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -14209,6 +8586,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -14242,37 +8620,6 @@ spec: type: array goTemplate: type: boolean - strategy: - properties: - rollingSync: - properties: - steps: - items: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - type: string - values: - items: - type: string - type: array - type: object - type: array - maxUpdate: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - type: object - type: array - type: object - type: - type: string - type: object syncPolicy: properties: preserveResourcesOnDeletion: @@ -14484,26 +8831,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -14511,165 +8839,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -14681,17 +8850,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -14716,6 +8874,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -14727,24 +8886,6 @@ spec: type: object status: properties: - applicationStatus: - items: - properties: - application: - type: string - lastTransitionTime: - format: date-time - type: string - message: - type: string - status: - type: string - required: - - application - - message - - status - type: object - type: array conditions: items: properties: @@ -15940,38 +10081,81 @@ data: fi fi done - haproxy.cfg: "defaults REDIS\n mode tcp\n timeout connect 4s\n timeout server - 6m\n timeout client 6m\n timeout check 2s\n\nlisten health_check_http_url\n - \ bind :8888 \n mode http\n monitor-uri /healthz\n option dontlognull\n# - Check Sentinel and whether they are nominated master\nbackend check_if_redis_is_master_0\n - \ mode tcp\n option tcp-check\n tcp-check connect\n tcp-check send PING\\r\\n\n - \ tcp-check expect string +PONG\n tcp-check send SENTINEL\\ get-master-addr-by-name\\ - argocd\\r\\n\n tcp-check expect string REPLACE_ANNOUNCE0\n tcp-check send QUIT\\r\\n\n - \ server R0 argocd-redis-ha-announce-0:26379 check inter 3s\n server R1 argocd-redis-ha-announce-1:26379 - check inter 3s\n server R2 argocd-redis-ha-announce-2:26379 check inter 3s\n# - Check Sentinel and whether they are nominated master\nbackend check_if_redis_is_master_1\n - \ mode tcp\n option tcp-check\n tcp-check connect\n tcp-check send PING\\r\\n\n - \ tcp-check expect string +PONG\n tcp-check send SENTINEL\\ get-master-addr-by-name\\ - argocd\\r\\n\n tcp-check expect string REPLACE_ANNOUNCE1\n tcp-check send QUIT\\r\\n\n - \ server R0 argocd-redis-ha-announce-0:26379 check inter 3s\n server R1 argocd-redis-ha-announce-1:26379 - check inter 3s\n server R2 argocd-redis-ha-announce-2:26379 check inter 3s\n# - Check Sentinel and whether they are nominated master\nbackend check_if_redis_is_master_2\n - \ mode tcp\n option tcp-check\n tcp-check connect\n tcp-check send PING\\r\\n\n - \ tcp-check expect string +PONG\n tcp-check send SENTINEL\\ get-master-addr-by-name\\ - argocd\\r\\n\n tcp-check expect string REPLACE_ANNOUNCE2\n tcp-check send QUIT\\r\\n\n - \ server R0 argocd-redis-ha-announce-0:26379 check inter 3s\n server R1 argocd-redis-ha-announce-1:26379 - check inter 3s\n server R2 argocd-redis-ha-announce-2:26379 check inter 3s\n\n# - decide redis backend to use\n#master\nfrontend ft_redis_master\n bind :6379 \n - \ use_backend bk_redis_master\n# Check all redis servers to see if they think - they are master\nbackend bk_redis_master\n mode tcp\n option tcp-check\n tcp-check - connect\n tcp-check send PING\\r\\n\n tcp-check expect string +PONG\n tcp-check - send info\\ replication\\r\\n\n tcp-check expect string role:master\n tcp-check - send QUIT\\r\\n\n tcp-check expect string +OK\n use-server R0 if { srv_is_up(R0) - } { nbsrv(check_if_redis_is_master_0) ge 2 }\n server R0 argocd-redis-ha-announce-0:6379 - check inter 3s fall 1 rise 1\n use-server R1 if { srv_is_up(R1) } { nbsrv(check_if_redis_is_master_1) - ge 2 }\n server R1 argocd-redis-ha-announce-1:6379 check inter 3s fall 1 rise - 1\n use-server R2 if { srv_is_up(R2) } { nbsrv(check_if_redis_is_master_2) ge - 2 }\n server R2 argocd-redis-ha-announce-2:6379 check inter 3s fall 1 rise 1\n" + haproxy.cfg: | + defaults REDIS + mode tcp + timeout connect 4s + timeout server 6m + timeout client 6m + timeout check 2s + + listen health_check_http_url + bind [::]:8888 v4v6 + mode http + monitor-uri /healthz + option dontlognull + # Check Sentinel and whether they are nominated master + backend check_if_redis_is_master_0 + mode tcp + option tcp-check + tcp-check connect + tcp-check send PING\r\n + tcp-check expect string +PONG + tcp-check send SENTINEL\ get-master-addr-by-name\ argocd\r\n + tcp-check expect string REPLACE_ANNOUNCE0 + tcp-check send QUIT\r\n + server R0 argocd-redis-ha-announce-0:26379 check inter 3s + server R1 argocd-redis-ha-announce-1:26379 check inter 3s + server R2 argocd-redis-ha-announce-2:26379 check inter 3s + # Check Sentinel and whether they are nominated master + backend check_if_redis_is_master_1 + mode tcp + option tcp-check + tcp-check connect + tcp-check send PING\r\n + tcp-check expect string +PONG + tcp-check send SENTINEL\ get-master-addr-by-name\ argocd\r\n + tcp-check expect string REPLACE_ANNOUNCE1 + tcp-check send QUIT\r\n + server R0 argocd-redis-ha-announce-0:26379 check inter 3s + server R1 argocd-redis-ha-announce-1:26379 check inter 3s + server R2 argocd-redis-ha-announce-2:26379 check inter 3s + # Check Sentinel and whether they are nominated master + backend check_if_redis_is_master_2 + mode tcp + option tcp-check + tcp-check connect + tcp-check send PING\r\n + tcp-check expect string +PONG + tcp-check send SENTINEL\ get-master-addr-by-name\ argocd\r\n + tcp-check expect string REPLACE_ANNOUNCE2 + tcp-check send QUIT\r\n + server R0 argocd-redis-ha-announce-0:26379 check inter 3s + server R1 argocd-redis-ha-announce-1:26379 check inter 3s + server R2 argocd-redis-ha-announce-2:26379 check inter 3s + + # decide redis backend to use + #master + frontend ft_redis_master + bind [::]:6379 v4v6 + use_backend bk_redis_master + # Check all redis servers to see if they think they are master + backend bk_redis_master + mode tcp + option tcp-check + tcp-check connect + tcp-check send PING\r\n + tcp-check expect string +PONG + tcp-check send info\ replication\r\n + tcp-check expect string role:master + tcp-check send QUIT\r\n + tcp-check expect string +OK + use-server R0 if { srv_is_up(R0) } { nbsrv(check_if_redis_is_master_0) ge 2 } + server R0 argocd-redis-ha-announce-0:6379 check inter 3s fall 1 rise 1 + use-server R1 if { srv_is_up(R1) } { nbsrv(check_if_redis_is_master_1) ge 2 } + server R1 argocd-redis-ha-announce-1:6379 check inter 3s fall 1 rise 1 + use-server R2 if { srv_is_up(R2) } { nbsrv(check_if_redis_is_master_2) ge 2 } + server R2 argocd-redis-ha-announce-2:6379 check inter 3s fall 1 rise 1 haproxy_init.sh: | HAPROXY_CONF=/data/haproxy.cfg cp /readonly/haproxy.cfg "$HAPROXY_CONF" @@ -16270,7 +10454,6 @@ data: port 6379 rename-command FLUSHDB "" rename-command FLUSHALL "" - bind 0.0.0.0 maxmemory 0 maxmemory-policy volatile-lru min-replicas-max-lag 5 @@ -16282,7 +10465,6 @@ data: sentinel.conf: | dir "/data" port 26379 - bind 0.0.0.0 sentinel down-after-milliseconds argocd 10000 sentinel failover-timeout argocd 180000 maxclients 10000 @@ -16695,67 +10877,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_LEADER_ELECTION - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.leader.election - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACE - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.namespace - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER - valueFrom: - configMapKeyRef: - key: repo.server - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_POLICY - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.policy - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.debug - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DRY_RUN - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.dryrun - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_PROGRESSIVE_ROLLOUTS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.progressive.rollouts - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -16865,7 +10987,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: copyutil securityContext: @@ -16918,7 +11040,7 @@ spec: containers: - command: - argocd-notifications - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -16976,7 +11098,7 @@ spec: template: metadata: annotations: - checksum/config: 718bbb277da8610063a7c0fd810984577c2e8ab215815a71211dfa6e20f67321 + checksum/config: 1f7a9ffcacb3871ceb9b0741c0714e3f7fa656d426a398c1f727fffb01073f35 labels: app.kubernetes.io/name: argocd-redis-ha-haproxy name: argocd-redis-ha-haproxy @@ -17209,19 +11331,13 @@ spec: key: reposerver.streamed.manifest.max.extracted.size name: argocd-cmd-params-cm optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: reposerver.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - name: HELM_CACHE_HOME value: /helm-working-dir - name: HELM_CONFIG_HOME value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -17229,8 +11345,7 @@ spec: path: /healthz?full=true port: 8084 initialDelaySeconds: 30 - periodSeconds: 30 - timeoutSeconds: 5 + periodSeconds: 5 name: argocd-repo-server ports: - containerPort: 8081 @@ -17273,7 +11388,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -17546,13 +11661,7 @@ spec: key: application.namespaces name: argocd-cmd-params-cm optional: true - - name: ARGOCD_SERVER_ENABLE_PROXY_EXTENSION - valueFrom: - configMapKeyRef: - key: server.enable.proxy.extension - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: httpGet: @@ -17560,7 +11669,6 @@ spec: port: 8080 initialDelaySeconds: 3 periodSeconds: 30 - timeoutSeconds: 5 name: argocd-server ports: - containerPort: 8080 @@ -17788,7 +11896,7 @@ spec: key: application.namespaces name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: argocd-application-controller ports: @@ -17848,7 +11956,7 @@ spec: template: metadata: annotations: - checksum/init-config: 69130412bda04eacad3530cb7bcf26cf121401e725e15d0959dd71a7380afe75 + checksum/init-config: 84ccf6a9b8a7fa3ae5b62a8f17d6c65a5197e9605da9b2761179bf942828eefe labels: app.kubernetes.io/name: argocd-redis-ha spec: @@ -17865,7 +11973,7 @@ spec: - /data/conf/redis.conf command: - redis-server - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -17918,7 +12026,7 @@ spec: - /data/conf/sentinel.conf command: - redis-sentinel - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent lifecycle: {} livenessProbe: @@ -17970,7 +12078,7 @@ spec: value: 40000915ab58c3fa8fd888fb8b24711944e6cbb4 - name: SENTINEL_ID_2 value: 2bbec7894d954a8af3bb54d13eaec53cb024e2ca - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent name: split-brain-fix resources: {} @@ -17999,7 +12107,7 @@ spec: value: 40000915ab58c3fa8fd888fb8b24711944e6cbb4 - name: SENTINEL_ID_2 value: 2bbec7894d954a8af3bb54d13eaec53cb024e2ca - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent name: config-init securityContext: diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml index 0f56433f0b492..369f3b1645d82 100644 --- a/manifests/ha/namespace-install.yaml +++ b/manifests/ha/namespace-install.yaml @@ -747,38 +747,81 @@ data: fi fi done - haproxy.cfg: "defaults REDIS\n mode tcp\n timeout connect 4s\n timeout server - 6m\n timeout client 6m\n timeout check 2s\n\nlisten health_check_http_url\n - \ bind :8888 \n mode http\n monitor-uri /healthz\n option dontlognull\n# - Check Sentinel and whether they are nominated master\nbackend check_if_redis_is_master_0\n - \ mode tcp\n option tcp-check\n tcp-check connect\n tcp-check send PING\\r\\n\n - \ tcp-check expect string +PONG\n tcp-check send SENTINEL\\ get-master-addr-by-name\\ - argocd\\r\\n\n tcp-check expect string REPLACE_ANNOUNCE0\n tcp-check send QUIT\\r\\n\n - \ server R0 argocd-redis-ha-announce-0:26379 check inter 3s\n server R1 argocd-redis-ha-announce-1:26379 - check inter 3s\n server R2 argocd-redis-ha-announce-2:26379 check inter 3s\n# - Check Sentinel and whether they are nominated master\nbackend check_if_redis_is_master_1\n - \ mode tcp\n option tcp-check\n tcp-check connect\n tcp-check send PING\\r\\n\n - \ tcp-check expect string +PONG\n tcp-check send SENTINEL\\ get-master-addr-by-name\\ - argocd\\r\\n\n tcp-check expect string REPLACE_ANNOUNCE1\n tcp-check send QUIT\\r\\n\n - \ server R0 argocd-redis-ha-announce-0:26379 check inter 3s\n server R1 argocd-redis-ha-announce-1:26379 - check inter 3s\n server R2 argocd-redis-ha-announce-2:26379 check inter 3s\n# - Check Sentinel and whether they are nominated master\nbackend check_if_redis_is_master_2\n - \ mode tcp\n option tcp-check\n tcp-check connect\n tcp-check send PING\\r\\n\n - \ tcp-check expect string +PONG\n tcp-check send SENTINEL\\ get-master-addr-by-name\\ - argocd\\r\\n\n tcp-check expect string REPLACE_ANNOUNCE2\n tcp-check send QUIT\\r\\n\n - \ server R0 argocd-redis-ha-announce-0:26379 check inter 3s\n server R1 argocd-redis-ha-announce-1:26379 - check inter 3s\n server R2 argocd-redis-ha-announce-2:26379 check inter 3s\n\n# - decide redis backend to use\n#master\nfrontend ft_redis_master\n bind :6379 \n - \ use_backend bk_redis_master\n# Check all redis servers to see if they think - they are master\nbackend bk_redis_master\n mode tcp\n option tcp-check\n tcp-check - connect\n tcp-check send PING\\r\\n\n tcp-check expect string +PONG\n tcp-check - send info\\ replication\\r\\n\n tcp-check expect string role:master\n tcp-check - send QUIT\\r\\n\n tcp-check expect string +OK\n use-server R0 if { srv_is_up(R0) - } { nbsrv(check_if_redis_is_master_0) ge 2 }\n server R0 argocd-redis-ha-announce-0:6379 - check inter 3s fall 1 rise 1\n use-server R1 if { srv_is_up(R1) } { nbsrv(check_if_redis_is_master_1) - ge 2 }\n server R1 argocd-redis-ha-announce-1:6379 check inter 3s fall 1 rise - 1\n use-server R2 if { srv_is_up(R2) } { nbsrv(check_if_redis_is_master_2) ge - 2 }\n server R2 argocd-redis-ha-announce-2:6379 check inter 3s fall 1 rise 1\n" + haproxy.cfg: | + defaults REDIS + mode tcp + timeout connect 4s + timeout server 6m + timeout client 6m + timeout check 2s + + listen health_check_http_url + bind [::]:8888 v4v6 + mode http + monitor-uri /healthz + option dontlognull + # Check Sentinel and whether they are nominated master + backend check_if_redis_is_master_0 + mode tcp + option tcp-check + tcp-check connect + tcp-check send PING\r\n + tcp-check expect string +PONG + tcp-check send SENTINEL\ get-master-addr-by-name\ argocd\r\n + tcp-check expect string REPLACE_ANNOUNCE0 + tcp-check send QUIT\r\n + server R0 argocd-redis-ha-announce-0:26379 check inter 3s + server R1 argocd-redis-ha-announce-1:26379 check inter 3s + server R2 argocd-redis-ha-announce-2:26379 check inter 3s + # Check Sentinel and whether they are nominated master + backend check_if_redis_is_master_1 + mode tcp + option tcp-check + tcp-check connect + tcp-check send PING\r\n + tcp-check expect string +PONG + tcp-check send SENTINEL\ get-master-addr-by-name\ argocd\r\n + tcp-check expect string REPLACE_ANNOUNCE1 + tcp-check send QUIT\r\n + server R0 argocd-redis-ha-announce-0:26379 check inter 3s + server R1 argocd-redis-ha-announce-1:26379 check inter 3s + server R2 argocd-redis-ha-announce-2:26379 check inter 3s + # Check Sentinel and whether they are nominated master + backend check_if_redis_is_master_2 + mode tcp + option tcp-check + tcp-check connect + tcp-check send PING\r\n + tcp-check expect string +PONG + tcp-check send SENTINEL\ get-master-addr-by-name\ argocd\r\n + tcp-check expect string REPLACE_ANNOUNCE2 + tcp-check send QUIT\r\n + server R0 argocd-redis-ha-announce-0:26379 check inter 3s + server R1 argocd-redis-ha-announce-1:26379 check inter 3s + server R2 argocd-redis-ha-announce-2:26379 check inter 3s + + # decide redis backend to use + #master + frontend ft_redis_master + bind [::]:6379 v4v6 + use_backend bk_redis_master + # Check all redis servers to see if they think they are master + backend bk_redis_master + mode tcp + option tcp-check + tcp-check connect + tcp-check send PING\r\n + tcp-check expect string +PONG + tcp-check send info\ replication\r\n + tcp-check expect string role:master + tcp-check send QUIT\r\n + tcp-check expect string +OK + use-server R0 if { srv_is_up(R0) } { nbsrv(check_if_redis_is_master_0) ge 2 } + server R0 argocd-redis-ha-announce-0:6379 check inter 3s fall 1 rise 1 + use-server R1 if { srv_is_up(R1) } { nbsrv(check_if_redis_is_master_1) ge 2 } + server R1 argocd-redis-ha-announce-1:6379 check inter 3s fall 1 rise 1 + use-server R2 if { srv_is_up(R2) } { nbsrv(check_if_redis_is_master_2) ge 2 } + server R2 argocd-redis-ha-announce-2:6379 check inter 3s fall 1 rise 1 haproxy_init.sh: | HAPROXY_CONF=/data/haproxy.cfg cp /readonly/haproxy.cfg "$HAPROXY_CONF" @@ -1077,7 +1120,6 @@ data: port 6379 rename-command FLUSHDB "" rename-command FLUSHALL "" - bind 0.0.0.0 maxmemory 0 maxmemory-policy volatile-lru min-replicas-max-lag 5 @@ -1089,7 +1131,6 @@ data: sentinel.conf: | dir "/data" port 26379 - bind 0.0.0.0 sentinel down-after-milliseconds argocd 10000 sentinel failover-timeout argocd 180000 maxclients 10000 @@ -1502,67 +1543,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_LEADER_ELECTION - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.leader.election - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACE - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.namespace - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER - valueFrom: - configMapKeyRef: - key: repo.server - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_POLICY - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.policy - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.debug - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DRY_RUN - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.dryrun - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_PROGRESSIVE_ROLLOUTS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.progressive.rollouts - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -1672,7 +1653,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: copyutil securityContext: @@ -1725,7 +1706,7 @@ spec: containers: - command: - argocd-notifications - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -1783,7 +1764,7 @@ spec: template: metadata: annotations: - checksum/config: 718bbb277da8610063a7c0fd810984577c2e8ab215815a71211dfa6e20f67321 + checksum/config: 1f7a9ffcacb3871ceb9b0741c0714e3f7fa656d426a398c1f727fffb01073f35 labels: app.kubernetes.io/name: argocd-redis-ha-haproxy name: argocd-redis-ha-haproxy @@ -2016,19 +1997,13 @@ spec: key: reposerver.streamed.manifest.max.extracted.size name: argocd-cmd-params-cm optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: reposerver.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - name: HELM_CACHE_HOME value: /helm-working-dir - name: HELM_CONFIG_HOME value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -2036,8 +2011,7 @@ spec: path: /healthz?full=true port: 8084 initialDelaySeconds: 30 - periodSeconds: 30 - timeoutSeconds: 5 + periodSeconds: 5 name: argocd-repo-server ports: - containerPort: 8081 @@ -2080,7 +2054,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -2353,13 +2327,7 @@ spec: key: application.namespaces name: argocd-cmd-params-cm optional: true - - name: ARGOCD_SERVER_ENABLE_PROXY_EXTENSION - valueFrom: - configMapKeyRef: - key: server.enable.proxy.extension - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: httpGet: @@ -2367,7 +2335,6 @@ spec: port: 8080 initialDelaySeconds: 3 periodSeconds: 30 - timeoutSeconds: 5 name: argocd-server ports: - containerPort: 8080 @@ -2595,7 +2562,7 @@ spec: key: application.namespaces name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: argocd-application-controller ports: @@ -2655,7 +2622,7 @@ spec: template: metadata: annotations: - checksum/init-config: 69130412bda04eacad3530cb7bcf26cf121401e725e15d0959dd71a7380afe75 + checksum/init-config: 84ccf6a9b8a7fa3ae5b62a8f17d6c65a5197e9605da9b2761179bf942828eefe labels: app.kubernetes.io/name: argocd-redis-ha spec: @@ -2672,7 +2639,7 @@ spec: - /data/conf/redis.conf command: - redis-server - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -2725,7 +2692,7 @@ spec: - /data/conf/sentinel.conf command: - redis-sentinel - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent lifecycle: {} livenessProbe: @@ -2777,7 +2744,7 @@ spec: value: 40000915ab58c3fa8fd888fb8b24711944e6cbb4 - name: SENTINEL_ID_2 value: 2bbec7894d954a8af3bb54d13eaec53cb024e2ca - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent name: split-brain-fix resources: {} @@ -2806,7 +2773,7 @@ spec: value: 40000915ab58c3fa8fd888fb8b24711944e6cbb4 - name: SENTINEL_ID_2 value: 2bbec7894d954a8af3bb54d13eaec53cb024e2ca - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: IfNotPresent name: config-init securityContext: diff --git a/manifests/install.yaml b/manifests/install.yaml index ce867269fafaa..ec3a07416ef2b 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -144,14 +144,6 @@ spec: which to sync the application to If omitted, will use the revision specified in app spec. type: string - revisions: - description: Revisions is the list of revision (Git) or chart - version (Helm) which to sync each source in sources field for - the application to If omitted, will use the revision specified - in app spec. - items: - type: string - type: array source: description: Source overrides the source definition set in the application. This is typically set in a Rollback operation and @@ -367,35 +359,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type - parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -409,1027 +373,467 @@ spec: required: - repoURL type: object - sources: - description: Sources overrides the source definition set in the - application. This is typically set in a Rollback operation and - is nil during a Sync operation + syncOptions: + description: SyncOptions provide per-sync sync-options, e.g. Validate=false items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options + type: string + type: array + syncStrategy: + description: SyncStrategy describes how to perform the sync + properties: + apply: + description: Apply will perform a `kubectl apply` to perform + the sync. + properties: + force: + description: Force indicates whether or not to supply + the --force flag to `kubectl apply`. The --force flag + deletes and re-create the resource, when PATCH encounters + conflict and has retried for 5 times. + type: boolean + type: object + hook: + description: Hook will submit any referenced resources to + perform the sync. This is the default strategy + properties: + force: + description: Force indicates whether or not to supply + the --force flag to `kubectl apply`. The --force flag + deletes and re-create the resource, when PATCH encounters + conflict and has retried for 5 times. + type: boolean + type: object + type: object + type: object + type: object + spec: + description: ApplicationSpec represents desired application state. Contains + link to repository with application definition and additional parameters + link definition revision. + properties: + destination: + description: Destination is a reference to the target Kubernetes server + and namespace + properties: + name: + description: Name is an alternate way of specifying the target + cluster by its symbolic name + type: string + namespace: + description: Namespace specifies the target namespace for the + application's resources. The namespace will only be set for + namespace-scoped resources that have not set a value for .metadata.namespace + type: string + server: + description: Server specifies the URL of the target cluster and + must be set to the Kubernetes control plane API + type: string + type: object + ignoreDifferences: + description: IgnoreDifferences is a list of resources and their fields + which should be ignored during comparison + items: + description: ResourceIgnoreDifferences contains resource filter + and list of json paths which should be ignored during comparison + with live state. + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + description: ManagedFieldsManagers is a list of trusted managers. + Fields mutated by those managers will take precedence over + the desired state defined in the SCM and won't be displayed + in diffs + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + description: Info contains a list of information (URLs, email addresses, + and plain text) that relates to the application + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + description: Project is a reference to the project this application + belongs to. The empty string means that application belongs to the + 'default' project. + type: string + revisionHistoryLimit: + description: RevisionHistoryLimit limits the number of items kept + in the application's revision history, which is used for informational + purposes as well as for rollbacks to previous versions. This should + only be changed in exceptional circumstances. Setting to zero will + store no history. This will reduce storage used. Increasing will + increase the space used to store the history, so we do not recommend + increasing it. Default is 10. + format: int64 + type: integer + source: + description: Source is a reference to the location of the application's + manifests or chart + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match paths + against that should be explicitly excluded from being used + during manifest generation + type: string + include: + description: Include contains a glob pattern to match paths + against that should be explicitly included during manifest + generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External Variables + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level Arguments + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + fileParameters: + description: FileParameters are file parameters to the helm + template + items: + description: HelmFileParameter is a file parameter that's + passed to helm template during manifest generation properties: - exclude: - description: Exclude contains a glob pattern to match - paths against that should be explicitly excluded from - being used during manifest generation + name: + description: Name is the name of the Helm parameter type: string - include: - description: Include contains a glob pattern to match - paths against that should be explicitly included during - manifest generation + path: + description: Path is the path to the file containing + the values for the Helm parameter type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean type: object - helm: - description: Helm holds helm specific options + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally by not + appending them to helm template --values + type: boolean + parameters: + description: Parameters is a list of Helm parameters which + are passed to the helm template command upon manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation properties: - fileParameters: - description: FileParameters are file parameters to the - helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally - by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to - tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to - use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) + forceString: + description: ForceString determines whether to tell + Helm to interpret booleans and numbers as strings type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + name: + description: Name is the name of the Helm parameter type: string - version: - description: Version is the Helm version to use for - templating ("3") + value: + description: Value is the value for the Helm parameter type: string type: object - kustomize: - description: Kustomize holds kustomize specific options + type: array + passCredentials: + description: PassCredentials pass credentials to all domains + (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to use. + If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition installation + step (Helm's --skip-crds) + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files to + use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed to + helm template, typically defined as a block + type: string + version: + description: Version is the Helm version to use for templating + ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional annotations + to add to rendered manifests + type: object + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional labels to + add to rendered manifests + type: object + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether to force + applying common annotations to resources for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to force + applying common labels to resources for Kustomize apps + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize image + definition in the format [old_image_name=]: + type: string + type: array + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + version: + description: Version controls which version of Kustomize to + use for rendering manifests + type: string + type: object + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps + name: + description: Name is the name of the variable, usually + expressed in uppercase type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests + value: + description: Value is the value of the variable type: string + required: + - name + - value type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or - Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - type: array - syncOptions: - description: SyncOptions provide per-sync sync-options, e.g. Validate=false - items: - type: string - type: array - syncStrategy: - description: SyncStrategy describes how to perform the sync + type: array + name: + type: string + type: object + repoURL: + description: RepoURL is the URL to the repository (Git or Helm) + that contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of the source + to sync the application to. In case of Git, this can be commit, + tag, or branch. If omitted, will equal to HEAD. In case of Helm, + this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + syncPolicy: + description: SyncPolicy controls when and how a sync will be performed + properties: + automated: + description: Automated will keep an application synced to the + target revision properties: - apply: - description: Apply will perform a `kubectl apply` to perform - the sync. - properties: - force: - description: Force indicates whether or not to supply - the --force flag to `kubectl apply`. The --force flag - deletes and re-create the resource, when PATCH encounters - conflict and has retried for 5 times. - type: boolean - type: object - hook: - description: Hook will submit any referenced resources to - perform the sync. This is the default strategy + allowEmpty: + description: 'AllowEmpty allows apps have zero live resources + (default: false)' + type: boolean + prune: + description: 'Prune specifies whether to delete resources + from the cluster that are not found in the sources anymore + as part of automated sync (default: false)' + type: boolean + selfHeal: + description: 'SelfHeal specifes whether to revert resources + back to their desired state upon modification in the cluster + (default: false)' + type: boolean + type: object + retry: + description: Retry controls failed sync retry behavior + properties: + backoff: + description: Backoff controls how to backoff on subsequent + retries of failed syncs properties: - force: - description: Force indicates whether or not to supply - the --force flag to `kubectl apply`. The --force flag - deletes and re-create the resource, when PATCH encounters - conflict and has retried for 5 times. - type: boolean + duration: + description: Duration is the amount to back off. Default + unit is seconds, but could also be a duration (e.g. + "2m", "1h") + type: string + factor: + description: Factor is a factor to multiply the base duration + after each failed retry + format: int64 + type: integer + maxDuration: + description: MaxDuration is the maximum amount of time + allowed for the backoff strategy + type: string type: object + limit: + description: Limit is the maximum number of attempts for retrying + a failed sync. If set to 0, no retries will be performed. + format: int64 + type: integer type: object + syncOptions: + description: Options allow you to specify whole app sync-options + items: + type: string + type: array type: object + required: + - destination + - project + - source type: object - spec: - description: ApplicationSpec represents desired application state. Contains - link to repository with application definition and additional parameters - link definition revision. + status: + description: ApplicationStatus contains status information for the application properties: - destination: - description: Destination is a reference to the target Kubernetes server - and namespace - properties: - name: - description: Name is an alternate way of specifying the target - cluster by its symbolic name - type: string - namespace: - description: Namespace specifies the target namespace for the - application's resources. The namespace will only be set for - namespace-scoped resources that have not set a value for .metadata.namespace - type: string - server: - description: Server specifies the URL of the target cluster and - must be set to the Kubernetes control plane API - type: string - type: object - ignoreDifferences: - description: IgnoreDifferences is a list of resources and their fields - which should be ignored during comparison + conditions: + description: Conditions is a list of currently observed application + conditions items: - description: ResourceIgnoreDifferences contains resource filter - and list of json paths which should be ignored during comparison - with live state. + description: ApplicationCondition contains details about an application + condition, which is usally an error or warning properties: - group: - type: string - jqPathExpressions: - items: - type: string - type: array - jsonPointers: - items: - type: string - type: array - kind: + lastTransitionTime: + description: LastTransitionTime is the time the condition was + last observed + format: date-time type: string - managedFieldsManagers: - description: ManagedFieldsManagers is a list of trusted managers. - Fields mutated by those managers will take precedence over - the desired state defined in the SCM and won't be displayed - in diffs - items: - type: string - type: array - name: + message: + description: Message contains human-readable message indicating + details about condition type: string - namespace: + type: + description: Type is an application condition type type: string required: - - kind + - message + - type type: object type: array - info: - description: Info contains a list of information (URLs, email addresses, - and plain text) that relates to the application + health: + description: Health contains information about the application's current + health status + properties: + message: + description: Message is a human-readable informational message + describing the health status + type: string + status: + description: Status holds the status code of the application or + resource + type: string + type: object + history: + description: History contains information about the application's + sync history items: + description: RevisionHistory contains history information about + a previous sync properties: - name: + deployStartedAt: + description: DeployStartedAt holds the time the sync operation + started + format: date-time type: string - value: - type: string - required: - - name - - value - type: object - type: array - project: - description: Project is a reference to the project this application - belongs to. The empty string means that application belongs to the - 'default' project. - type: string - revisionHistoryLimit: - description: RevisionHistoryLimit limits the number of items kept - in the application's revision history, which is used for informational - purposes as well as for rollbacks to previous versions. This should - only be changed in exceptional circumstances. Setting to zero will - store no history. This will reduce storage used. Increasing will - increase the space used to store the history, so we do not recommend - increasing it. Default is 10. - format: int64 - type: integer - source: - description: Source is a reference to the location of the application's - manifests or chart - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match paths - against that should be explicitly excluded from being used - during manifest generation - type: string - include: - description: Include contains a glob pattern to match paths - against that should be explicitly included during manifest - generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External Variables - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level Arguments - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the helm - template - items: - description: HelmFileParameter is a file parameter that's - passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally by not - appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters which - are passed to the helm template command upon manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to tell - Helm to interpret booleans and numbers as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all domains - (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to use. - If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition installation - step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files to - use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for templating - ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional annotations - to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels to - add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether to force - applying common annotations to resources for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to force - applying common labels to resources for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize image - definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize to - use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, usually - expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or Helm) - that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the source - to sync the application to. In case of Git, this can be commit, - tag, or branch. If omitted, will equal to HEAD. In case of Helm, - this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Sources is a reference to the location of the application's - manifests or chart - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match paths - against that should be explicitly excluded from being - used during manifest generation - type: string - include: - description: Include contains a glob pattern to match paths - against that should be explicitly included during manifest - generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External Variables - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level Arguments - items: - description: JsonnetVar represents a variable to be - passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the helm - template - items: - description: HelmFileParameter is a file parameter that's - passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally by not - appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters which - are passed to the helm template command upon manifest - generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to tell - Helm to interpret booleans and numbers as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all domains - (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to use. - If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition installation - step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files to - use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for templating - ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional annotations - to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether to - force applying common annotations to resources for Kustomize - apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to force - applying common labels to resources for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize image - definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, usually - expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object - name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string type - parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or Helm) - that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the source - to sync the application to. In case of Git, this can be commit, - tag, or branch. If omitted, will equal to HEAD. In case of - Helm, this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array - syncPolicy: - description: SyncPolicy controls when and how a sync will be performed - properties: - automated: - description: Automated will keep an application synced to the - target revision - properties: - allowEmpty: - description: 'AllowEmpty allows apps have zero live resources - (default: false)' - type: boolean - prune: - description: 'Prune specifies whether to delete resources - from the cluster that are not found in the sources anymore - as part of automated sync (default: false)' - type: boolean - selfHeal: - description: 'SelfHeal specifes whether to revert resources - back to their desired state upon modification in the cluster - (default: false)' - type: boolean - type: object - managedNamespaceMetadata: - description: ManagedNamespaceMetadata controls metadata in the - given namespace (if CreateNamespace=true) - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object - retry: - description: Retry controls failed sync retry behavior - properties: - backoff: - description: Backoff controls how to backoff on subsequent - retries of failed syncs - properties: - duration: - description: Duration is the amount to back off. Default - unit is seconds, but could also be a duration (e.g. - "2m", "1h") - type: string - factor: - description: Factor is a factor to multiply the base duration - after each failed retry - format: int64 - type: integer - maxDuration: - description: MaxDuration is the maximum amount of time - allowed for the backoff strategy - type: string - type: object - limit: - description: Limit is the maximum number of attempts for retrying - a failed sync. If set to 0, no retries will be performed. - format: int64 - type: integer - type: object - syncOptions: - description: Options allow you to specify whole app sync-options - items: - type: string - type: array - type: object - required: - - destination - - project - type: object - status: - description: ApplicationStatus contains status information for the application - properties: - conditions: - description: Conditions is a list of currently observed application - conditions - items: - description: ApplicationCondition contains details about an application - condition, which is usally an error or warning - properties: - lastTransitionTime: - description: LastTransitionTime is the time the condition was - last observed - format: date-time - type: string - message: - description: Message contains human-readable message indicating - details about condition - type: string - type: - description: Type is an application condition type - type: string - required: - - message - - type - type: object - type: array - health: - description: Health contains information about the application's current - health status - properties: - message: - description: Message is a human-readable informational message - describing the health status - type: string - status: - description: Status holds the status code of the application or - resource - type: string - type: object - history: - description: History contains information about the application's - sync history - items: - description: RevisionHistory contains history information about - a previous sync - properties: - deployStartedAt: - description: DeployStartedAt holds the time the sync operation - started - format: date-time - type: string - deployedAt: - description: DeployedAt holds the time the sync operation completed - format: date-time + deployedAt: + description: DeployedAt holds the time the sync operation completed + format: date-time type: string id: description: ID is an auto incrementing identifier of the RevisionHistory @@ -1439,12 +843,6 @@ spec: description: Revision holds the revision the sync was performed against type: string - revisions: - description: Revisions holds the revision of each source in - sources field the sync was performed against - items: - type: string - type: array source: description: Source is a reference to the application source used for the sync operation @@ -1508,475 +906,179 @@ spec: required: - name - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to the - helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm template - from failing when valueFiles do not exist locally - by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's passed - to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether to - tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name to - use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for - templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional labels - to add to rendered manifests + type: object + type: array type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options + helm: + description: Helm holds helm specific options properties: - env: - description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in the application's - environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: + fileParameters: + description: FileParameters are file parameters to the + helm template items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest generation properties: - array: - description: Array is the value of an array type - parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type parameter. - type: object name: - description: Name is the name identifying a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter type: string type: object - type: array - type: object - ref: - description: Ref is reference to another source within sources - field. This field will not be used if used with a `source` - tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git or - Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Sources is a reference to the application sources - used for the sync operation - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be specified - for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific options - properties: - exclude: - description: Exclude contains a glob pattern to match - paths against that should be explicitly excluded - from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to match - paths against that should be explicitly included - during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a directory - recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters to - the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm parameter - type: string - path: - description: Path is the path to the file containing - the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command upon - manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to all - domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value files - to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block - type: string - version: - description: Version is the Helm version to use for - templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether to - force applying common labels to resources for Kustomize - apps - type: boolean - images: - description: Images is a list of Kustomize image override - specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to resources - for Kustomize apps + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally + by not appending them to helm template --values + type: boolean + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command upon + manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether to + tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to all + domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to + use. If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files + to use when generating a template + items: type: string - nameSuffix: - description: NameSuffix is a suffix appended to resources - for Kustomize apps + type: array + values: + description: Values specifies Helm values to be passed + to helm template, typically defined as a block + type: string + version: + description: Version is the Helm version to use for + templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + commonAnnotations: + additionalProperties: type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonLabels: + additionalProperties: type: string - type: object - path: - description: Path is a directory path within the Git repository, - and is only valid for applications sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: + description: CommonLabels is a list of additional labels + to add to rendered manifests + type: object + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to + force applying common labels to resources for Kustomize + apps + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of the - source to sync the application to. In case of Git, this - can be commit, tag, or branch. If omitted, will equal - to HEAD. In case of Helm, this is a semver tag for the - Chart's version. - type: string - required: - - repoURL - type: object - type: array + type: array + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + description: RepoURL is the URL to the repository (Git or + Helm) that contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of the + source to sync the application to. In case of Git, this + can be commit, tag, or branch. If omitted, will equal + to HEAD. In case of Helm, this is a semver tag for the + Chart's version. + type: string + required: + - repoURL + type: object required: - deployedAt - id + - revision type: object type: array observedAt: @@ -2099,14 +1201,6 @@ spec: (Helm) which to sync the application to If omitted, will use the revision specified in app spec. type: string - revisions: - description: Revisions is the list of revision (Git) or - chart version (Helm) which to sync each source in sources - field for the application to If omitted, will use the - revision specified in app spec. - items: - type: string - type: array source: description: Source overrides the source definition set in the application. This is typically set in a Rollback @@ -2321,55 +1415,25 @@ spec: env: description: Env is a list of environment variable entries - items: - description: EnvEntry represents an entry in - the application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object + items: + description: EnvEntry represents an entry in + the application's environment + properties: name: - description: Name is the name identifying - a parameter. + description: Name is the name of the variable, + usually expressed in uppercase type: string - string: - description: String_ is the value of a string - type parameter. + value: + description: Value is the value of the variable type: string + required: + - name + - value type: object type: array + name: + type: string type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -2384,291 +1448,6 @@ spec: required: - repoURL type: object - sources: - description: Sources overrides the source definition set - in the application. This is typically set in a Rollback - operation and is nil during a Sync operation - items: - description: ApplicationSource contains all required - information about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must - be specified for applications sourced from a Helm - repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern - to match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern - to match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific - to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet - External Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan - a directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents - helm template from failing when valueFiles - do not exist locally by not appending them - to helm template --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter - that's passed to helm template during manifest - generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and - numbers as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the - Helm parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials - to all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release - name to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource - definition installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to - be passed to helm template, typically defined - as a block - type: string - version: - description: Version is the Helm version to - use for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific - options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of - additional annotations to add to rendered - manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies - whether to force applying common annotations - to resources for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources - for Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended - to resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended - to resources for Kustomize apps - type: string - version: - description: Version controls which version - of Kustomize to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the - Git repository, and is only valid for applications - sourced from Git. - type: string - plugin: - description: Plugin holds config management plugin - specific options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry - in the application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the - variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an - array type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map - type parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a - string type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source - within sources field. This field will not be used - if used with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository - (Git or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision - of the source to sync the application to. In case - of Git, this can be commit, tag, or branch. If - omitted, will equal to HEAD. In case of Helm, - this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array syncOptions: description: SyncOptions provide per-sync sync-options, e.g. Validate=false @@ -2778,12 +1557,6 @@ spec: description: Revision holds the revision this sync operation was performed to type: string - revisions: - description: Revisions holds the revision this sync operation - was performed for respective indexed source in sources field - items: - type: string - type: array source: description: Source records the application source information of the sync, used for comparing auto-sync @@ -3004,37 +1777,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -3045,288 +1788,10 @@ spec: can be commit, tag, or branch. If omitted, will equal to HEAD. In case of Helm, this is a semver tag for the Chart's version. - type: string - required: - - repoURL - type: object - sources: - description: Source records the application source information - of the sync, used for comparing auto-sync - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be - specified for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern to - match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to - match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a - directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template - --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to - all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block - type: string - version: - description: Version is the Helm version to use - for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources for - Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to - resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to - resources for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git - repository, and is only valid for applications sourced - from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of - the source to sync the application to. In case of - Git, this can be commit, tag, or branch. If omitted, - will equal to HEAD. In case of Helm, this is a semver - tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array + type: string + required: + - repoURL + type: object required: - revision type: object @@ -3390,14 +1855,6 @@ spec: sourceType: description: SourceType specifies the type of this application type: string - sourceTypes: - description: SourceTypes specifies the type of the sources included - in the application - items: - description: ApplicationSourceType specifies the type of the application's - source - type: string - type: array summary: description: Summary contains a list of URLs and container images used by this application @@ -3661,37 +2118,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying a - parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used with - a `source` tag. - type: string repoURL: description: RepoURL is the URL to the repository (Git or Helm) that contains the application manifests @@ -3706,297 +2133,14 @@ spec: required: - repoURL type: object - sources: - description: Sources is a reference to the application's multiple - sources used for comparison - items: - description: ApplicationSource contains all required information - about the source of an application - properties: - chart: - description: Chart is a Helm chart name, and must be - specified for applications sourced from a Helm repo. - type: string - directory: - description: Directory holds path/directory specific - options - properties: - exclude: - description: Exclude contains a glob pattern to - match paths against that should be explicitly - excluded from being used during manifest generation - type: string - include: - description: Include contains a glob pattern to - match paths against that should be explicitly - included during manifest generation - type: string - jsonnet: - description: Jsonnet holds options specific to Jsonnet - properties: - extVars: - description: ExtVars is a list of Jsonnet External - Variables - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - description: Additional library search dirs - items: - type: string - type: array - tlas: - description: TLAS is a list of Jsonnet Top-level - Arguments - items: - description: JsonnetVar represents a variable - to be passed to jsonnet during manifest - generation - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - description: Recurse specifies whether to scan a - directory recursively for manifests - type: boolean - type: object - helm: - description: Helm holds helm specific options - properties: - fileParameters: - description: FileParameters are file parameters - to the helm template - items: - description: HelmFileParameter is a file parameter - that's passed to helm template during manifest - generation - properties: - name: - description: Name is the name of the Helm - parameter - type: string - path: - description: Path is the path to the file - containing the values for the Helm parameter - type: string - type: object - type: array - ignoreMissingValueFiles: - description: IgnoreMissingValueFiles prevents helm - template from failing when valueFiles do not exist - locally by not appending them to helm template - --values - type: boolean - parameters: - description: Parameters is a list of Helm parameters - which are passed to the helm template command - upon manifest generation - items: - description: HelmParameter is a parameter that's - passed to helm template during manifest generation - properties: - forceString: - description: ForceString determines whether - to tell Helm to interpret booleans and numbers - as strings - type: boolean - name: - description: Name is the name of the Helm - parameter - type: string - value: - description: Value is the value for the Helm - parameter - type: string - type: object - type: array - passCredentials: - description: PassCredentials pass credentials to - all domains (Helm's --pass-credentials) - type: boolean - releaseName: - description: ReleaseName is the Helm release name - to use. If omitted it will use the application - name - type: string - skipCrds: - description: SkipCrds skips custom resource definition - installation step (Helm's --skip-crds) - type: boolean - valueFiles: - description: ValuesFiles is a list of Helm value - files to use when generating a template - items: - type: string - type: array - values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block - type: string - version: - description: Version is the Helm version to use - for templating ("3") - type: string - type: object - kustomize: - description: Kustomize holds kustomize specific options - properties: - commonAnnotations: - additionalProperties: - type: string - description: CommonAnnotations is a list of additional - annotations to add to rendered manifests - type: object - commonLabels: - additionalProperties: - type: string - description: CommonLabels is a list of additional - labels to add to rendered manifests - type: object - forceCommonAnnotations: - description: ForceCommonAnnotations specifies whether - to force applying common annotations to resources - for Kustomize apps - type: boolean - forceCommonLabels: - description: ForceCommonLabels specifies whether - to force applying common labels to resources for - Kustomize apps - type: boolean - images: - description: Images is a list of Kustomize image - override specifications - items: - description: KustomizeImage represents a Kustomize - image definition in the format [old_image_name=]: - type: string - type: array - namePrefix: - description: NamePrefix is a prefix appended to - resources for Kustomize apps - type: string - nameSuffix: - description: NameSuffix is a suffix appended to - resources for Kustomize apps - type: string - version: - description: Version controls which version of Kustomize - to use for rendering manifests - type: string - type: object - path: - description: Path is a directory path within the Git - repository, and is only valid for applications sourced - from Git. - type: string - plugin: - description: Plugin holds config management plugin specific - options - properties: - env: - description: Env is a list of environment variable - entries - items: - description: EnvEntry represents an entry in the - application's environment - properties: - name: - description: Name is the name of the variable, - usually expressed in uppercase - type: string - value: - description: Value is the value of the variable - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - description: Array is the value of an array - type parameter. - items: - type: string - type: array - map: - additionalProperties: - type: string - description: Map is the value of a map type - parameter. - type: object - name: - description: Name is the name identifying - a parameter. - type: string - string: - description: String_ is the value of a string - type parameter. - type: string - type: object - type: array - type: object - ref: - description: Ref is reference to another source within - sources field. This field will not be used if used - with a `source` tag. - type: string - repoURL: - description: RepoURL is the URL to the repository (Git - or Helm) that contains the application manifests - type: string - targetRevision: - description: TargetRevision defines the revision of - the source to sync the application to. In case of - Git, this can be commit, tag, or branch. If omitted, - will equal to HEAD. In case of Helm, this is a semver - tag for the Chart's version. - type: string - required: - - repoURL - type: object - type: array required: - destination + - source type: object revision: description: Revision contains information about the revision the comparison has been performed to type: string - revisions: - description: Revisions contains information about the revisions - of multiple sources the comparison has been performed to - items: - type: string - type: array status: description: Status is the sync state of the comparison type: string @@ -4272,204 +2416,26 @@ spec: properties: env: items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -4481,17 +2447,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -4516,6 +2471,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -4759,26 +2715,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -4786,165 +2723,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -4956,17 +2734,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -4991,6 +2758,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -5023,8 +2791,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -5200,230 +2966,52 @@ spec: commonAnnotations: additionalProperties: type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: + type: object + commonLabels: + additionalProperties: type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: + type: object + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + images: + items: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + type: array + namePrefix: + type: string + nameSuffix: + type: string + version: + type: string + type: object + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -5435,17 +3023,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -5470,6 +3047,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -5691,26 +3269,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -5718,165 +3277,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -5888,17 +3288,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -5923,6 +3312,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6162,204 +3552,26 @@ spec: properties: env: items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -6371,17 +3583,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -6406,6 +3607,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6649,26 +3851,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -6676,165 +3859,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -6846,17 +3870,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -6881,6 +3894,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -6913,8 +3927,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -7128,26 +4140,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -7155,165 +4148,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -7325,17 +4159,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -7360,6 +4183,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -7581,26 +4405,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -7608,165 +4413,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -7778,17 +4424,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -7813,6 +4448,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -8152,26 +4788,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -8179,165 +4796,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -8349,17 +4807,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -8384,6 +4831,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -8770,26 +5218,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -8797,165 +5226,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -8967,17 +5237,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9002,6 +5261,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -9239,26 +5499,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -9266,165 +5507,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -9436,17 +5518,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9471,6 +5542,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -9722,26 +5794,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -9749,165 +5802,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -9919,17 +5813,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -9954,6 +5837,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -10197,26 +6081,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -10224,165 +6089,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -10394,17 +6100,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -10429,6 +6124,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -10461,8 +6157,6 @@ spec: - path type: object type: array - pathParamPrefix: - type: string repoURL: type: string requeueAfterSeconds: @@ -10676,192 +6370,14 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: type: string required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + - repoURL + type: object syncPolicy: properties: automated: @@ -10873,17 +6389,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -10908,6 +6413,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -11129,26 +6635,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -11156,165 +6643,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -11326,17 +6654,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -11361,6 +6678,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -11700,26 +7018,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -11727,165 +7026,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -11897,17 +7037,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -11932,6 +7061,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -12318,26 +7448,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -12345,165 +7456,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -12515,17 +7467,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -12550,6 +7491,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -12791,192 +7733,14 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: type: string required: - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + type: object syncPolicy: properties: automated: @@ -12988,17 +7752,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -13023,6 +7776,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -13359,26 +8113,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -13386,165 +8121,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -13556,17 +8132,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -13591,6 +8156,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -13954,215 +8520,37 @@ spec: type: array namePrefix: type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array + nameSuffix: + type: string + version: + type: string + type: object + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + type: object + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object syncPolicy: properties: automated: @@ -14174,17 +8562,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -14209,6 +8586,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -14242,37 +8620,6 @@ spec: type: array goTemplate: type: boolean - strategy: - properties: - rollingSync: - properties: - steps: - items: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - type: string - values: - items: - type: string - type: array - type: object - type: array - maxUpdate: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - type: object - type: array - type: object - type: - type: string - type: object syncPolicy: properties: preserveResourcesOnDeletion: @@ -14484,26 +8831,7 @@ spec: type: array name: type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array type: object - ref: - type: string repoURL: type: string targetRevision: @@ -14511,165 +8839,6 @@ spec: required: - repoURL type: object - sources: - items: - properties: - chart: - type: string - directory: - properties: - exclude: - type: string - include: - type: string - jsonnet: - properties: - extVars: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - libs: - items: - type: string - type: array - tlas: - items: - properties: - code: - type: boolean - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - type: object - recurse: - type: boolean - type: object - helm: - properties: - fileParameters: - items: - properties: - name: - type: string - path: - type: string - type: object - type: array - ignoreMissingValueFiles: - type: boolean - parameters: - items: - properties: - forceString: - type: boolean - name: - type: string - value: - type: string - type: object - type: array - passCredentials: - type: boolean - releaseName: - type: string - skipCrds: - type: boolean - valueFiles: - items: - type: string - type: array - values: - type: string - version: - type: string - type: object - kustomize: - properties: - commonAnnotations: - additionalProperties: - type: string - type: object - commonLabels: - additionalProperties: - type: string - type: object - forceCommonAnnotations: - type: boolean - forceCommonLabels: - type: boolean - images: - items: - type: string - type: array - namePrefix: - type: string - nameSuffix: - type: string - version: - type: string - type: object - path: - type: string - plugin: - properties: - env: - items: - properties: - name: - type: string - value: - type: string - required: - - name - - value - type: object - type: array - name: - type: string - parameters: - items: - properties: - array: - items: - type: string - type: array - map: - additionalProperties: - type: string - type: object - name: - type: string - string: - type: string - type: object - type: array - type: object - ref: - type: string - repoURL: - type: string - targetRevision: - type: string - required: - - repoURL - type: object - type: array syncPolicy: properties: automated: @@ -14681,17 +8850,6 @@ spec: selfHeal: type: boolean type: object - managedNamespaceMetadata: - properties: - annotations: - additionalProperties: - type: string - type: object - labels: - additionalProperties: - type: string - type: object - type: object retry: properties: backoff: @@ -14716,6 +8874,7 @@ spec: required: - destination - project + - source type: object required: - metadata @@ -14727,24 +8886,6 @@ spec: type: object status: properties: - applicationStatus: - items: - properties: - application: - type: string - lastTransitionTime: - format: date-time - type: string - message: - type: string - status: - type: string - required: - - application - - message - - status - type: object - type: array conditions: items: properties: @@ -15814,67 +9955,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_LEADER_ELECTION - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.leader.election - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACE - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.namespace - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER - valueFrom: - configMapKeyRef: - key: repo.server - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_POLICY - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.policy - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.debug - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DRY_RUN - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.dryrun - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_PROGRESSIVE_ROLLOUTS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.progressive.rollouts - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -15984,7 +10065,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: copyutil securityContext: @@ -16037,7 +10118,7 @@ spec: containers: - command: - argocd-notifications - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -16114,7 +10195,7 @@ spec: - "" - --appendonly - "no" - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: Always name: redis ports: @@ -16284,19 +10365,13 @@ spec: key: reposerver.streamed.manifest.max.extracted.size name: argocd-cmd-params-cm optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: reposerver.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - name: HELM_CACHE_HOME value: /helm-working-dir - name: HELM_CONFIG_HOME value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -16304,8 +10379,7 @@ spec: path: /healthz?full=true port: 8084 initialDelaySeconds: 30 - periodSeconds: 30 - timeoutSeconds: 5 + periodSeconds: 5 name: argocd-repo-server ports: - containerPort: 8081 @@ -16348,7 +10422,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -16617,13 +10691,7 @@ spec: key: application.namespaces name: argocd-cmd-params-cm optional: true - - name: ARGOCD_SERVER_ENABLE_PROXY_EXTENSION - valueFrom: - configMapKeyRef: - key: server.enable.proxy.extension - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: httpGet: @@ -16631,7 +10699,6 @@ spec: port: 8080 initialDelaySeconds: 3 periodSeconds: 30 - timeoutSeconds: 5 name: argocd-server ports: - containerPort: 8080 @@ -16857,7 +10924,7 @@ spec: key: application.namespaces name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 606045c259df2..554f52a7be230 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -621,67 +621,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_LEADER_ELECTION - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.leader.election - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACE - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.namespace - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER - valueFrom: - configMapKeyRef: - key: repo.server - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_POLICY - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.policy - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.debug - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DRY_RUN - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.dryrun - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_PROGRESSIVE_ROLLOUTS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.progressive.rollouts - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -791,7 +731,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: copyutil securityContext: @@ -844,7 +784,7 @@ spec: containers: - command: - argocd-notifications - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -921,7 +861,7 @@ spec: - "" - --appendonly - "no" - image: redis:7.0.7-alpine + image: redis:7.0.5-alpine imagePullPolicy: Always name: redis ports: @@ -1091,19 +1031,13 @@ spec: key: reposerver.streamed.manifest.max.extracted.size name: argocd-cmd-params-cm optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: reposerver.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - name: HELM_CACHE_HOME value: /helm-working-dir - name: HELM_CONFIG_HOME value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -1111,8 +1045,7 @@ spec: path: /healthz?full=true port: 8084 initialDelaySeconds: 30 - periodSeconds: 30 - timeoutSeconds: 5 + periodSeconds: 5 name: argocd-repo-server ports: - containerPort: 8081 @@ -1155,7 +1088,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -1424,13 +1357,7 @@ spec: key: application.namespaces name: argocd-cmd-params-cm optional: true - - name: ARGOCD_SERVER_ENABLE_PROXY_EXTENSION - valueFrom: - configMapKeyRef: - key: server.enable.proxy.extension - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always livenessProbe: httpGet: @@ -1438,7 +1365,6 @@ spec: port: 8080 initialDelaySeconds: 3 periodSeconds: 30 - timeoutSeconds: 5 name: argocd-server ports: - containerPort: 8080 @@ -1664,7 +1590,7 @@ spec: key: application.namespaces name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:latest + image: quay.io/argoproj/argocd:v2.5.4 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/mkdocs.yml b/mkdocs.yml index ec626be23bb1c..0a1da71832d2a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -22,7 +22,6 @@ nav: - operator-manual/architecture.md - operator-manual/installation.md - operator-manual/declarative-setup.md - - operator-manual/app-any-namespace.md - operator-manual/ingress.md - User Management: - operator-manual/user-management/index.md @@ -50,8 +49,6 @@ nav: - operator-manual/custom-styles.md - operator-manual/metrics.md - operator-manual/web_based_terminal.md - - operator-manual/config-management-plugins.md - - operator-manual/deep_links.md - Notification: - Overview: operator-manual/notifications/index.md - operator-manual/notifications/triggers.md @@ -70,7 +67,6 @@ nav: - operator-manual/notifications/services/googlechat.md - operator-manual/notifications/services/grafana.md - operator-manual/notifications/services/mattermost.md - - operator-manual/notifications/services/newrelic.md - operator-manual/notifications/services/opsgenie.md - operator-manual/notifications/services/overview.md - operator-manual/notifications/services/pagerduty.md @@ -79,7 +75,6 @@ nav: - operator-manual/notifications/services/slack.md - operator-manual/notifications/services/teams.md - operator-manual/notifications/services/telegram.md - - operator-manual/notifications/services/webex.md - operator-manual/notifications/services/webhook.md - operator-manual/troubleshooting.md - ApplicationSet: @@ -103,7 +98,6 @@ nav: - operator-manual/applicationset/GoTemplate.md - Controlling Resource Modification: operator-manual/applicationset/Controlling-Resource-Modification.md - Application Pruning & Resource Deletion: operator-manual/applicationset/Application-Deletion.md - - Progressive Rollouts: operator-manual/applicationset/Progressive-Rollouts.md - Server Configuration Parameters: - operator-manual/server-commands/argocd-server.md - operator-manual/server-commands/argocd-application-controller.md @@ -134,10 +128,10 @@ nav: - user-guide/import.md - user-guide/jsonnet.md - user-guide/directory.md + - user-guide/config-management-plugins.md - user-guide/tool_detection.md - user-guide/projects.md - user-guide/private-repositories.md - - user-guide/multiple_sources.md - GnuPG verification: user-guide/gpg-verification.md - user-guide/auto_sync.md - user-guide/diffing.md diff --git a/pkg/apiclient/apiclient.go b/pkg/apiclient/apiclient.go index 5f122433ee285..d09c2d024a148 100644 --- a/pkg/apiclient/apiclient.go +++ b/pkg/apiclient/apiclient.go @@ -15,14 +15,13 @@ import ( "sync" "time" - "github.com/coreos/go-oidc/v3/oidc" + "github.com/coreos/go-oidc" "github.com/golang-jwt/jwt/v4" "github.com/golang/protobuf/ptypes/empty" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_retry "github.com/grpc-ecosystem/go-grpc-middleware/retry" - "github.com/hashicorp/go-retryablehttp" + retryablehttp "github.com/hashicorp/go-retryablehttp" log "github.com/sirupsen/logrus" - "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "golang.org/x/oauth2" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -34,6 +33,7 @@ import ( "github.com/argoproj/argo-cd/v2/common" accountpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/account" applicationpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" + applicationsetpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/applicationset" certificatepkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/certificate" clusterpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/cluster" @@ -233,7 +233,7 @@ func NewClient(opts *ClientOptions) (Client, error) { c.AuthToken = authFromEnv } if opts.AuthToken != "" { - c.AuthToken = strings.TrimSpace(opts.AuthToken) + c.AuthToken = opts.AuthToken } // Override certificate data if specified from CLI flag if opts.CertFile != "" { @@ -524,8 +524,6 @@ func (c *client) newConn() (*grpc.ClientConn, io.Closer, error) { dialOpts = append(dialOpts, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(MaxGRPCMessageSize), grpc.MaxCallSendMsgSize(MaxGRPCMessageSize))) dialOpts = append(dialOpts, grpc.WithStreamInterceptor(grpc_retry.StreamClientInterceptor(retryOpts...))) dialOpts = append(dialOpts, grpc.WithUnaryInterceptor(grpc_middleware.ChainUnaryClient(grpc_retry.UnaryClientInterceptor(retryOpts...)))) - dialOpts = append(dialOpts, grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor())) - dialOpts = append(dialOpts, grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor())) ctx := context.Background() diff --git a/pkg/apiclient/application/application.pb.go b/pkg/apiclient/application/application.pb.go index 0de79ae034d70..60f4b7aa4de03 100644 --- a/pkg/apiclient/application/application.pb.go +++ b/pkg/apiclient/application/application.pb.go @@ -2411,179 +2411,6 @@ func (m *ManagedResourcesResponse) GetItems() []*v1alpha1.ResourceDiff { return nil } -type LinkInfo struct { - Title *string `protobuf:"bytes,1,req,name=title" json:"title,omitempty"` - Url *string `protobuf:"bytes,2,req,name=url" json:"url,omitempty"` - Description *string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` - IconClass *string `protobuf:"bytes,4,opt,name=iconClass" json:"iconClass,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LinkInfo) Reset() { *m = LinkInfo{} } -func (m *LinkInfo) String() string { return proto.CompactTextString(m) } -func (*LinkInfo) ProtoMessage() {} -func (*LinkInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{32} -} -func (m *LinkInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *LinkInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_LinkInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *LinkInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_LinkInfo.Merge(m, src) -} -func (m *LinkInfo) XXX_Size() int { - return m.Size() -} -func (m *LinkInfo) XXX_DiscardUnknown() { - xxx_messageInfo_LinkInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_LinkInfo proto.InternalMessageInfo - -func (m *LinkInfo) GetTitle() string { - if m != nil && m.Title != nil { - return *m.Title - } - return "" -} - -func (m *LinkInfo) GetUrl() string { - if m != nil && m.Url != nil { - return *m.Url - } - return "" -} - -func (m *LinkInfo) GetDescription() string { - if m != nil && m.Description != nil { - return *m.Description - } - return "" -} - -func (m *LinkInfo) GetIconClass() string { - if m != nil && m.IconClass != nil { - return *m.IconClass - } - return "" -} - -type LinksResponse struct { - Items []*LinkInfo `protobuf:"bytes,1,rep,name=items" json:"items,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LinksResponse) Reset() { *m = LinksResponse{} } -func (m *LinksResponse) String() string { return proto.CompactTextString(m) } -func (*LinksResponse) ProtoMessage() {} -func (*LinksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{33} -} -func (m *LinksResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *LinksResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_LinksResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *LinksResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_LinksResponse.Merge(m, src) -} -func (m *LinksResponse) XXX_Size() int { - return m.Size() -} -func (m *LinksResponse) XXX_DiscardUnknown() { - xxx_messageInfo_LinksResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_LinksResponse proto.InternalMessageInfo - -func (m *LinksResponse) GetItems() []*LinkInfo { - if m != nil { - return m.Items - } - return nil -} - -type ListAppLinksRequest struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - Namespace *string `protobuf:"bytes,3,opt,name=namespace" json:"namespace,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListAppLinksRequest) Reset() { *m = ListAppLinksRequest{} } -func (m *ListAppLinksRequest) String() string { return proto.CompactTextString(m) } -func (*ListAppLinksRequest) ProtoMessage() {} -func (*ListAppLinksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{34} -} -func (m *ListAppLinksRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListAppLinksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListAppLinksRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ListAppLinksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListAppLinksRequest.Merge(m, src) -} -func (m *ListAppLinksRequest) XXX_Size() int { - return m.Size() -} -func (m *ListAppLinksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListAppLinksRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListAppLinksRequest proto.InternalMessageInfo - -func (m *ListAppLinksRequest) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *ListAppLinksRequest) GetNamespace() string { - if m != nil && m.Namespace != nil { - return *m.Namespace - } - return "" -} - func init() { proto.RegisterType((*ApplicationQuery)(nil), "application.ApplicationQuery") proto.RegisterType((*NodeQuery)(nil), "application.NodeQuery") @@ -2617,9 +2444,6 @@ func init() { proto.RegisterType((*OperationTerminateResponse)(nil), "application.OperationTerminateResponse") proto.RegisterType((*ResourcesQuery)(nil), "application.ResourcesQuery") proto.RegisterType((*ManagedResourcesResponse)(nil), "application.ManagedResourcesResponse") - proto.RegisterType((*LinkInfo)(nil), "application.LinkInfo") - proto.RegisterType((*LinksResponse)(nil), "application.LinksResponse") - proto.RegisterType((*ListAppLinksRequest)(nil), "application.ListAppLinksRequest") } func init() { @@ -2627,169 +2451,160 @@ func init() { } var fileDescriptor_df6e82b174b5eaec = []byte{ - // 2581 bytes of a gzipped FileDescriptorProto + // 2444 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x8f, 0x1c, 0x47, - 0x15, 0xa7, 0x66, 0xbf, 0x66, 0xde, 0xac, 0xbf, 0x2a, 0xf1, 0xd2, 0x69, 0xaf, 0xcd, 0xba, 0xfd, - 0xb5, 0x5e, 0x7b, 0x67, 0xec, 0xc1, 0x20, 0x67, 0x13, 0x04, 0xb6, 0xe3, 0x2f, 0x58, 0x3b, 0xa6, - 0xd7, 0xc6, 0x28, 0x1c, 0xa0, 0xd2, 0x53, 0x3b, 0xdb, 0x6c, 0x4f, 0x77, 0xbb, 0xbb, 0x67, 0xac, - 0x91, 0xf1, 0x25, 0x88, 0x13, 0x51, 0x90, 0x92, 0x1c, 0x50, 0x14, 0x21, 0x94, 0x28, 0x17, 0x2e, - 0xdc, 0x10, 0x12, 0x17, 0xb8, 0x20, 0x90, 0x38, 0x20, 0x3e, 0x2e, 0x39, 0x21, 0x8b, 0x1b, 0x17, - 0xfe, 0x04, 0x54, 0xd5, 0x55, 0xdd, 0xd5, 0x33, 0x3d, 0x3d, 0xbd, 0xec, 0x46, 0xf1, 0xad, 0x5e, - 0x4d, 0xd5, 0x7b, 0xbf, 0x7a, 0xf5, 0xbe, 0xea, 0xf5, 0xc0, 0xc9, 0x90, 0x06, 0x7d, 0x1a, 0x34, - 0x89, 0xef, 0x3b, 0xb6, 0x45, 0x22, 0xdb, 0x73, 0xd5, 0x71, 0xc3, 0x0f, 0xbc, 0xc8, 0xc3, 0x75, - 0x65, 0x4a, 0x5f, 0xec, 0x78, 0x5e, 0xc7, 0xa1, 0x4d, 0xe2, 0xdb, 0x4d, 0xe2, 0xba, 0x5e, 0xc4, - 0xa7, 0xc3, 0x78, 0xa9, 0x6e, 0x6c, 0x5f, 0x0e, 0x1b, 0xb6, 0xc7, 0x7f, 0xb5, 0xbc, 0x80, 0x36, - 0xfb, 0x17, 0x9b, 0x1d, 0xea, 0xd2, 0x80, 0x44, 0xb4, 0x2d, 0xd6, 0x5c, 0x4a, 0xd7, 0x74, 0x89, - 0xb5, 0x65, 0xbb, 0x34, 0x18, 0x34, 0xfd, 0xed, 0x0e, 0x9b, 0x08, 0x9b, 0x5d, 0x1a, 0x91, 0xbc, - 0x5d, 0xeb, 0x1d, 0x3b, 0xda, 0xea, 0xbd, 0xd9, 0xb0, 0xbc, 0x6e, 0x93, 0x04, 0x1d, 0xcf, 0x0f, - 0xbc, 0x1f, 0xf2, 0xc1, 0xaa, 0xd5, 0x6e, 0xf6, 0x5b, 0x29, 0x03, 0xf5, 0x2c, 0xfd, 0x8b, 0xc4, - 0xf1, 0xb7, 0xc8, 0x28, 0xb7, 0xeb, 0x13, 0xb8, 0x05, 0xd4, 0xf7, 0x84, 0x6e, 0xf8, 0xd0, 0x8e, - 0xbc, 0x60, 0xa0, 0x0c, 0x63, 0x36, 0xc6, 0xa7, 0x08, 0x0e, 0x5e, 0x49, 0xe5, 0x7d, 0xbb, 0x47, - 0x83, 0x01, 0xc6, 0x30, 0xed, 0x92, 0x2e, 0xd5, 0xd0, 0x12, 0x5a, 0xae, 0x99, 0x7c, 0x8c, 0x35, - 0x98, 0x0b, 0xe8, 0x66, 0x40, 0xc3, 0x2d, 0xad, 0xc2, 0xa7, 0x25, 0x89, 0x75, 0xa8, 0x32, 0xe1, - 0xd4, 0x8a, 0x42, 0x6d, 0x6a, 0x69, 0x6a, 0xb9, 0x66, 0x26, 0x34, 0x5e, 0x86, 0x03, 0x01, 0x0d, - 0xbd, 0x5e, 0x60, 0xd1, 0xef, 0xd0, 0x20, 0xb4, 0x3d, 0x57, 0x9b, 0xe6, 0xbb, 0x87, 0xa7, 0x19, - 0x97, 0x90, 0x3a, 0xd4, 0x8a, 0xbc, 0x40, 0x9b, 0xe1, 0x4b, 0x12, 0x9a, 0xe1, 0x61, 0xc0, 0xb5, - 0xd9, 0x18, 0x0f, 0x1b, 0x63, 0x03, 0xe6, 0x89, 0xef, 0xdf, 0x25, 0x5d, 0x1a, 0xfa, 0xc4, 0xa2, - 0xda, 0x1c, 0xff, 0x2d, 0x33, 0x67, 0x5c, 0x83, 0xda, 0x5d, 0xaf, 0x4d, 0xc7, 0x1f, 0x6a, 0x98, - 0x49, 0x25, 0x87, 0xc9, 0x36, 0x1c, 0x36, 0x69, 0xdf, 0x66, 0x20, 0xef, 0xd0, 0x88, 0xb4, 0x49, - 0x44, 0x86, 0x19, 0x56, 0x12, 0x86, 0x3a, 0x54, 0x03, 0xb1, 0x58, 0xab, 0xf0, 0xf9, 0x84, 0x1e, - 0x11, 0x36, 0x95, 0x23, 0xec, 0x2f, 0x08, 0x8e, 0x29, 0xd7, 0x61, 0x0a, 0x25, 0x5d, 0xef, 0x53, - 0x37, 0x0a, 0xc7, 0x8b, 0x3d, 0x0f, 0x87, 0xa4, 0x3e, 0x87, 0x0f, 0x33, 0xfa, 0x03, 0x03, 0xa2, - 0x4e, 0x4a, 0x20, 0xea, 0x1c, 0x5e, 0x82, 0xba, 0xa4, 0x1f, 0xdc, 0x7e, 0x4d, 0x5c, 0x9a, 0x3a, - 0x35, 0x72, 0x9c, 0x99, 0x9c, 0xe3, 0xb8, 0xa0, 0x29, 0xa7, 0xb9, 0x43, 0x5c, 0x7b, 0x93, 0x86, - 0x51, 0x59, 0xf5, 0xa1, 0x1d, 0xab, 0xef, 0x38, 0xd4, 0x6e, 0xd8, 0x0e, 0xbd, 0xb6, 0xd5, 0x73, - 0xb7, 0xf1, 0x8b, 0x30, 0x63, 0xb1, 0x01, 0x97, 0x30, 0x6f, 0xc6, 0x84, 0xf1, 0x18, 0x8e, 0x8f, - 0x83, 0xf4, 0xd0, 0x8e, 0xb6, 0xd8, 0xf6, 0x70, 0x1c, 0x36, 0x6b, 0x8b, 0x5a, 0xdb, 0x61, 0xaf, - 0x2b, 0xaf, 0x56, 0xd2, 0xa5, 0xb0, 0xfd, 0x0a, 0xc1, 0xf2, 0x44, 0xc9, 0x0f, 0x03, 0xe2, 0xfb, - 0x34, 0xc0, 0x37, 0x60, 0xe6, 0x11, 0xfb, 0x81, 0x5b, 0x6b, 0xbd, 0xd5, 0x68, 0xa8, 0x31, 0x6d, - 0x22, 0x97, 0x5b, 0x5f, 0x30, 0xe3, 0xed, 0xb8, 0x21, 0x75, 0x50, 0xe1, 0x7c, 0x16, 0x32, 0x7c, - 0x12, 0x55, 0xb1, 0xf5, 0x7c, 0xd9, 0xd5, 0x59, 0x98, 0xf6, 0x49, 0x10, 0x19, 0x87, 0xe1, 0x85, - 0xac, 0x19, 0xfa, 0x9e, 0x1b, 0x52, 0xe3, 0x77, 0x28, 0x73, 0xa1, 0xd7, 0x02, 0x4a, 0x22, 0x6a, - 0xd2, 0x47, 0x3d, 0x1a, 0x46, 0x78, 0x1b, 0xd4, 0x30, 0xcb, 0x75, 0x57, 0x6f, 0xdd, 0x6e, 0xa4, - 0x71, 0xaa, 0x21, 0xe3, 0x14, 0x1f, 0x7c, 0xdf, 0x6a, 0x37, 0xfa, 0xad, 0x86, 0xbf, 0xdd, 0x69, - 0xb0, 0xa8, 0x97, 0x41, 0x26, 0xa3, 0x9e, 0x7a, 0x54, 0x53, 0xe5, 0x8e, 0x17, 0x60, 0xb6, 0xe7, - 0x87, 0x34, 0x88, 0xf8, 0xc9, 0xaa, 0xa6, 0xa0, 0xd8, 0x2d, 0xf5, 0x89, 0x63, 0xb7, 0x49, 0x14, - 0xdf, 0x42, 0xd5, 0x4c, 0x68, 0xe3, 0xe3, 0x2c, 0xfa, 0x07, 0x7e, 0xfb, 0xf3, 0x42, 0xaf, 0xa2, - 0xac, 0x0c, 0xa1, 0xfc, 0x20, 0x8b, 0xf2, 0x35, 0xea, 0xd0, 0x14, 0x65, 0x9e, 0x61, 0x6a, 0x30, - 0x67, 0x91, 0xd0, 0x22, 0x6d, 0xc9, 0x4b, 0x92, 0x2c, 0x2c, 0xf8, 0x81, 0xe7, 0x93, 0x0e, 0xe7, - 0x74, 0xcf, 0x73, 0x6c, 0x6b, 0x20, 0x6c, 0x73, 0xf4, 0x87, 0x11, 0x23, 0x9e, 0xce, 0x31, 0xe2, - 0x13, 0x50, 0xdf, 0x18, 0xb8, 0xd6, 0xeb, 0x3e, 0x4f, 0x99, 0xcc, 0xc5, 0xec, 0x88, 0x76, 0x43, - 0x0d, 0xf1, 0xb8, 0x1f, 0x13, 0xc6, 0x87, 0x33, 0xb0, 0xa0, 0x9c, 0x80, 0x6d, 0x28, 0xc2, 0x5f, - 0xe4, 0xf4, 0x0b, 0x30, 0xdb, 0x0e, 0x06, 0x66, 0xcf, 0x15, 0x97, 0x29, 0x28, 0x26, 0xd8, 0x0f, - 0x7a, 0x6e, 0x0c, 0xb2, 0x6a, 0xc6, 0x04, 0xde, 0x84, 0x6a, 0x18, 0xb1, 0x24, 0xd9, 0x19, 0xf0, - 0x70, 0x54, 0x6f, 0x7d, 0x73, 0x77, 0x17, 0xc8, 0xa0, 0x6f, 0x08, 0x8e, 0x66, 0xc2, 0x1b, 0x3f, - 0x82, 0x9a, 0x8c, 0x84, 0xa1, 0x36, 0xb7, 0x34, 0xb5, 0x5c, 0x6f, 0x6d, 0xec, 0x5e, 0xd0, 0xeb, - 0x3e, 0x4b, 0xf0, 0x4a, 0xd4, 0x37, 0x53, 0x29, 0x78, 0x11, 0x6a, 0x5d, 0xe1, 0xeb, 0xa1, 0x56, - 0xe5, 0xda, 0x4e, 0x27, 0xf0, 0x77, 0x61, 0xc6, 0x76, 0x37, 0xbd, 0x50, 0xab, 0x71, 0x30, 0x57, - 0x77, 0x07, 0xe6, 0xb6, 0xbb, 0xe9, 0x99, 0x31, 0x43, 0xfc, 0x08, 0xf6, 0x05, 0x34, 0x0a, 0x06, - 0x52, 0x0b, 0x1a, 0x70, 0xbd, 0x7e, 0x6b, 0x77, 0x12, 0x4c, 0x95, 0xa5, 0x99, 0x95, 0x80, 0xd7, - 0xa0, 0x1e, 0xa6, 0x36, 0xa6, 0xd5, 0xb9, 0x40, 0x2d, 0xc3, 0x48, 0xb1, 0x41, 0x53, 0x5d, 0x3c, - 0x62, 0xc3, 0xf3, 0x39, 0x36, 0xfc, 0x4f, 0x04, 0x8b, 0x23, 0x61, 0x60, 0xc3, 0xa7, 0x85, 0x46, - 0x4a, 0x60, 0x3a, 0xf4, 0xa9, 0xc5, 0x23, 0x7f, 0xbd, 0x75, 0x67, 0xcf, 0xe2, 0x02, 0x97, 0xcb, - 0x59, 0x17, 0x85, 0xae, 0x52, 0xbe, 0xf9, 0x13, 0x04, 0x5f, 0x54, 0x38, 0xdf, 0x23, 0x91, 0xb5, - 0x55, 0x74, 0x24, 0xe6, 0x43, 0x6c, 0x8d, 0xc8, 0x66, 0x31, 0xc1, 0x0c, 0x8d, 0x0f, 0xee, 0x0f, - 0x7c, 0x06, 0x83, 0xfd, 0x92, 0x4e, 0x94, 0x4a, 0xfa, 0xef, 0x22, 0xd0, 0xd5, 0xc8, 0xe7, 0x39, - 0xce, 0x9b, 0xc4, 0xda, 0x2e, 0x82, 0xb2, 0x1f, 0x2a, 0x76, 0x9b, 0xe3, 0x98, 0x32, 0x2b, 0x76, - 0x7b, 0x87, 0x6e, 0x3f, 0x0c, 0x6a, 0x36, 0x07, 0xd4, 0xa7, 0x43, 0xa0, 0xa4, 0x8b, 0x15, 0x80, - 0x5a, 0x84, 0x9a, 0x3b, 0x54, 0x4c, 0xa5, 0x13, 0x39, 0x45, 0x54, 0x65, 0xa4, 0x88, 0xd2, 0x60, - 0xae, 0x9f, 0x54, 0xbd, 0xec, 0x67, 0x49, 0xb2, 0x83, 0x74, 0x02, 0xaf, 0xe7, 0x0b, 0x05, 0xc6, - 0x04, 0x43, 0xb1, 0x6d, 0xbb, 0x6d, 0x6d, 0x36, 0x46, 0xc1, 0xc6, 0xa5, 0xea, 0xdc, 0xf7, 0x2a, - 0xf0, 0xa5, 0x9c, 0xc3, 0x4d, 0xb4, 0x80, 0xe7, 0xe3, 0x84, 0x89, 0x1d, 0xce, 0x8d, 0xb5, 0xc3, - 0xea, 0x24, 0x3b, 0xac, 0xe5, 0x68, 0xe5, 0x9d, 0x0a, 0x2c, 0xe5, 0x68, 0x65, 0x72, 0x42, 0x7d, - 0x6e, 0xd4, 0xb2, 0xe9, 0x05, 0xe2, 0xc6, 0xab, 0x66, 0x4c, 0x30, 0xcf, 0xf0, 0x02, 0x7f, 0x8b, - 0xb8, 0x5a, 0x35, 0xf6, 0x8c, 0x98, 0x2a, 0xa5, 0x90, 0xff, 0x22, 0xd0, 0xa4, 0x16, 0xae, 0x58, - 0x5c, 0x27, 0x3d, 0xf7, 0xf9, 0x57, 0xc4, 0x02, 0xcc, 0x12, 0x8e, 0x56, 0x18, 0x88, 0xa0, 0x46, - 0x8e, 0x5c, 0xcd, 0x8f, 0x89, 0x47, 0xb2, 0x47, 0x0e, 0xd7, 0xed, 0x30, 0x92, 0x05, 0x2d, 0xde, - 0x84, 0xb9, 0x98, 0x5b, 0x5c, 0xc2, 0xd4, 0x5b, 0xeb, 0xbb, 0x4d, 0x6c, 0x19, 0xf5, 0x4a, 0xe6, - 0xc6, 0xcb, 0x70, 0x24, 0x37, 0xfa, 0x08, 0x18, 0x3a, 0x54, 0x65, 0x32, 0x17, 0x17, 0x90, 0xd0, - 0xc6, 0x7f, 0xa6, 0xb2, 0x61, 0xdd, 0x6b, 0xaf, 0x7b, 0x9d, 0x82, 0xb7, 0x60, 0xf1, 0xa5, 0x69, - 0x30, 0xe7, 0x7b, 0x6d, 0xe5, 0xd9, 0x27, 0x49, 0xb6, 0xcf, 0xf2, 0xdc, 0x88, 0xd8, 0x2e, 0x0d, - 0x44, 0x7e, 0x49, 0x27, 0x98, 0xb2, 0x43, 0xdb, 0xb5, 0xe8, 0x06, 0xb5, 0x3c, 0xb7, 0x1d, 0xf2, - 0x5b, 0x9b, 0x32, 0x33, 0x73, 0xf8, 0x16, 0xd4, 0x38, 0x7d, 0xdf, 0xee, 0xc6, 0x41, 0xb8, 0xde, - 0x5a, 0x69, 0xc4, 0xad, 0x92, 0x86, 0xda, 0x2a, 0x49, 0x75, 0xd8, 0xa5, 0x11, 0x69, 0xf4, 0x2f, - 0x36, 0xd8, 0x0e, 0x33, 0xdd, 0xcc, 0xb0, 0x44, 0xc4, 0x76, 0xd6, 0x6d, 0x97, 0x17, 0x58, 0x4c, - 0x54, 0x3a, 0xc1, 0x0c, 0x62, 0xd3, 0x73, 0x1c, 0xef, 0xb1, 0xf4, 0x81, 0x98, 0x62, 0xbb, 0x7a, - 0x6e, 0x64, 0x3b, 0x5c, 0x7e, 0xec, 0x00, 0xe9, 0x04, 0xdf, 0x65, 0x3b, 0x11, 0x0d, 0x78, 0x09, - 0x53, 0x33, 0x05, 0x95, 0x98, 0x5c, 0x3d, 0xee, 0x0b, 0x48, 0xdf, 0x8b, 0x8d, 0x73, 0x5e, 0x35, - 0xce, 0x61, 0x83, 0xdf, 0x97, 0xf3, 0x6e, 0xe6, 0xcd, 0x10, 0xda, 0xb7, 0xbd, 0x5e, 0xa8, 0xed, - 0x8f, 0x93, 0xb8, 0xa4, 0x47, 0x0c, 0xf6, 0x40, 0x8e, 0xc1, 0xfe, 0x1e, 0x41, 0x75, 0xdd, 0xeb, - 0x5c, 0x77, 0xa3, 0x60, 0xc0, 0x2b, 0x7b, 0xcf, 0x8d, 0xa8, 0x2b, 0xad, 0x42, 0x92, 0x4c, 0xd5, - 0x91, 0xdd, 0xa5, 0x1b, 0x11, 0xe9, 0xfa, 0xa2, 0x26, 0xd9, 0x91, 0xaa, 0x93, 0xcd, 0xec, 0xf8, - 0x0e, 0x09, 0x23, 0xee, 0xbd, 0x55, 0x93, 0x8f, 0x19, 0xd0, 0x64, 0xc1, 0x46, 0x14, 0x08, 0xd7, - 0xcd, 0xcc, 0xa9, 0x86, 0x34, 0x13, 0x63, 0x13, 0xa4, 0xb1, 0x01, 0x2f, 0x25, 0xa5, 0xec, 0x7d, - 0x1a, 0x74, 0x6d, 0x97, 0x14, 0xc7, 0xdb, 0x32, 0x5d, 0x98, 0x07, 0x19, 0x07, 0x62, 0xf5, 0xdf, - 0x43, 0xdb, 0x6d, 0x7b, 0x8f, 0x0b, 0x1c, 0xa1, 0x0c, 0xdb, 0xbf, 0x65, 0xfb, 0x2d, 0x0a, 0xdf, - 0xc4, 0x37, 0x6f, 0xc1, 0x3e, 0xe6, 0xc5, 0x7d, 0x2a, 0x7e, 0x10, 0x81, 0xc2, 0x18, 0xf7, 0x24, - 0x4f, 0x79, 0x98, 0xd9, 0x8d, 0x78, 0x1d, 0x0e, 0x90, 0x30, 0xb4, 0x3b, 0x2e, 0x6d, 0x4b, 0x5e, - 0x95, 0xd2, 0xbc, 0x86, 0xb7, 0xc6, 0xcf, 0x3e, 0xbe, 0x42, 0xdc, 0x9d, 0x24, 0x8d, 0x1f, 0x23, - 0x38, 0x9c, 0xcb, 0x24, 0xb1, 0x75, 0xa4, 0x84, 0x57, 0x1d, 0xaa, 0xa1, 0xb5, 0x45, 0xdb, 0x3d, - 0x87, 0xca, 0xbe, 0x86, 0xa4, 0xd9, 0x6f, 0xed, 0x5e, 0x7c, 0x93, 0x22, 0xbc, 0x27, 0x34, 0x3e, - 0x06, 0xd0, 0x25, 0x6e, 0x8f, 0x38, 0x1c, 0xc2, 0x34, 0x87, 0xa0, 0xcc, 0x18, 0x8b, 0xa0, 0xe7, - 0x99, 0x81, 0xe8, 0x24, 0xfc, 0x03, 0xc1, 0x7e, 0x19, 0x06, 0xc5, 0x1d, 0x2e, 0xc3, 0x01, 0x45, - 0x0d, 0x77, 0xd3, 0xeb, 0x1c, 0x9e, 0x9e, 0x10, 0xe2, 0xa4, 0x2d, 0x4c, 0x65, 0xbb, 0x97, 0xfd, - 0x4c, 0xff, 0xb1, 0x74, 0x1e, 0x42, 0x3b, 0xaa, 0xc4, 0x7e, 0x04, 0xda, 0x1d, 0xe2, 0x92, 0x0e, - 0x6d, 0x27, 0x87, 0x4b, 0x0c, 0xe9, 0x07, 0xea, 0x63, 0x79, 0xd7, 0x4f, 0xd3, 0xa4, 0x9c, 0xb1, - 0x37, 0x37, 0xe5, 0xc3, 0x3b, 0x80, 0xea, 0xba, 0xed, 0x6e, 0xb3, 0xf7, 0x1b, 0x3b, 0x57, 0x64, - 0x47, 0x8e, 0xd4, 0x61, 0x4c, 0xe0, 0x83, 0x30, 0xd5, 0x0b, 0x1c, 0x71, 0xcf, 0x6c, 0x88, 0x97, - 0xa0, 0xde, 0xa6, 0xa1, 0x15, 0xd8, 0xbe, 0xb8, 0x65, 0xde, 0xe8, 0x53, 0xa6, 0x98, 0xb6, 0x6d, - 0xcb, 0x73, 0xaf, 0x39, 0x24, 0x0c, 0x65, 0x62, 0x48, 0x26, 0x8c, 0x57, 0x61, 0x1f, 0x93, 0x99, - 0x1e, 0xf3, 0x5c, 0xf6, 0x98, 0x87, 0x33, 0xf0, 0x25, 0x3c, 0x89, 0xf8, 0x26, 0xbc, 0xc0, 0xf2, - 0xf1, 0x15, 0xdf, 0x17, 0x4c, 0x4a, 0x16, 0x23, 0x53, 0x43, 0x97, 0xde, 0xfa, 0xa9, 0x01, 0x58, - 0xb5, 0x79, 0x1a, 0xf4, 0x6d, 0x8b, 0xe2, 0x77, 0x11, 0x4c, 0x33, 0x01, 0xf8, 0xe8, 0x38, 0x17, - 0xe3, 0xb6, 0xa7, 0xef, 0xdd, 0x83, 0x8e, 0x49, 0x33, 0x16, 0xdf, 0xfa, 0xfb, 0xbf, 0xdf, 0xab, - 0x2c, 0xe0, 0x17, 0xf9, 0x67, 0x84, 0xfe, 0x45, 0xb5, 0xa5, 0x1f, 0xe2, 0xb7, 0x11, 0x60, 0x51, - 0x85, 0x28, 0xdd, 0x5d, 0x7c, 0x6e, 0x1c, 0xc4, 0x9c, 0x2e, 0xb0, 0x7e, 0x54, 0x89, 0xf6, 0x0d, - 0xcb, 0x0b, 0x28, 0x8b, 0xed, 0x7c, 0x01, 0x07, 0xb0, 0xc2, 0x01, 0x9c, 0xc4, 0x46, 0x1e, 0x80, - 0xe6, 0x13, 0xa6, 0xb7, 0xa7, 0x4d, 0x1a, 0xcb, 0xfd, 0x08, 0xc1, 0xcc, 0x43, 0x5e, 0x73, 0x4f, - 0x50, 0xd2, 0xc6, 0x9e, 0x29, 0x89, 0x8b, 0xe3, 0x68, 0x8d, 0x13, 0x1c, 0xe9, 0x51, 0x7c, 0x44, - 0x22, 0x0d, 0xa3, 0x80, 0x92, 0x6e, 0x06, 0xf0, 0x05, 0x84, 0x3f, 0x41, 0x30, 0x1b, 0xb7, 0x1b, - 0xf1, 0xa9, 0x71, 0x28, 0x33, 0xed, 0x48, 0x7d, 0xef, 0x7a, 0x77, 0xc6, 0x59, 0x8e, 0xf1, 0x84, - 0x91, 0x7b, 0x9d, 0x6b, 0x99, 0xce, 0xde, 0xfb, 0x08, 0xa6, 0x6e, 0xd2, 0x89, 0xf6, 0xb6, 0x87, - 0xe0, 0x46, 0x14, 0x98, 0x73, 0xd5, 0xf8, 0x63, 0x04, 0x2f, 0xdd, 0xa4, 0x51, 0x7e, 0xaa, 0xc3, - 0xcb, 0x93, 0xf3, 0x8f, 0x30, 0xbb, 0x73, 0x25, 0x56, 0x26, 0x31, 0xbe, 0xc9, 0x91, 0x9d, 0xc5, - 0x67, 0x8a, 0x8c, 0x30, 0x1c, 0xb8, 0xd6, 0x63, 0x81, 0xe3, 0xcf, 0x08, 0x0e, 0x0e, 0x7f, 0x6b, - 0xc1, 0xd9, 0xe4, 0x98, 0xfb, 0x29, 0x46, 0xbf, 0xbb, 0xdb, 0x58, 0x9a, 0x65, 0x6a, 0x5c, 0xe1, - 0xc8, 0x5f, 0xc1, 0x2f, 0x17, 0x21, 0x97, 0x4d, 0xca, 0xb0, 0xf9, 0x44, 0x0e, 0x9f, 0xf2, 0x8f, - 0x7f, 0x1c, 0xf6, 0x5b, 0x08, 0xe6, 0x6f, 0xd2, 0xe8, 0x4e, 0xd2, 0xa3, 0x3b, 0x55, 0xaa, 0x87, - 0xaf, 0x2f, 0x36, 0x94, 0x6f, 0x74, 0xf2, 0xa7, 0x44, 0xa5, 0xab, 0x1c, 0xd8, 0x19, 0x7c, 0xaa, - 0x08, 0x58, 0xda, 0x17, 0xfc, 0x08, 0xc1, 0x61, 0x15, 0x44, 0xfa, 0x85, 0xe3, 0x2b, 0x3b, 0xfb, - 0xa2, 0x20, 0xbe, 0x4b, 0x4c, 0x40, 0xd7, 0xe2, 0xe8, 0xce, 0x1b, 0xf9, 0x17, 0xde, 0x1d, 0x41, - 0xb1, 0x86, 0x56, 0x96, 0x11, 0xfe, 0x03, 0x82, 0xd9, 0xb8, 0x09, 0x37, 0x5e, 0x47, 0x99, 0x5e, - 0xfd, 0x5e, 0x7a, 0xcf, 0x75, 0x0e, 0xf9, 0xeb, 0xfa, 0x85, 0x7c, 0x85, 0xaa, 0xfb, 0xe5, 0xd5, - 0x36, 0xb8, 0x96, 0xb3, 0x6e, 0xff, 0x1b, 0x04, 0x90, 0x36, 0x12, 0xf1, 0xd9, 0xe2, 0x73, 0x28, - 0xcd, 0x46, 0x7d, 0x6f, 0x5b, 0x89, 0x46, 0x83, 0x9f, 0x67, 0x59, 0x5f, 0x2a, 0xf4, 0x39, 0x9f, - 0x5a, 0x6b, 0x71, 0xd3, 0xf1, 0x97, 0x08, 0x66, 0x78, 0x9f, 0x08, 0x9f, 0x1c, 0x87, 0x59, 0x6d, - 0x23, 0xed, 0xa5, 0xea, 0x4f, 0x73, 0xa8, 0x4b, 0xad, 0xa2, 0xc0, 0xb5, 0x86, 0x56, 0x70, 0x1f, - 0x66, 0xe3, 0x9e, 0xcd, 0x78, 0xf3, 0xc8, 0xf4, 0x74, 0xf4, 0xa5, 0x82, 0x44, 0x1a, 0x1b, 0xaa, - 0x88, 0x99, 0x2b, 0x93, 0x62, 0xe6, 0x34, 0x0b, 0x6b, 0xf8, 0x44, 0x51, 0xd0, 0xfb, 0x0c, 0x14, - 0x73, 0x8e, 0xa3, 0x3b, 0x65, 0x2c, 0x4d, 0x8a, 0x9b, 0x4c, 0x3b, 0x3f, 0x47, 0x70, 0x70, 0xb8, - 0xe4, 0xc4, 0x47, 0x86, 0x62, 0xa6, 0x5a, 0x67, 0xeb, 0x59, 0x2d, 0x8e, 0x2b, 0x57, 0x8d, 0x6f, - 0x70, 0x14, 0x6b, 0xf8, 0xf2, 0x44, 0xcf, 0xb8, 0x2b, 0xa3, 0x0e, 0x63, 0xb4, 0x9a, 0x7e, 0xb3, - 0xf8, 0x2d, 0x82, 0x79, 0xc9, 0xf7, 0x7e, 0x40, 0x69, 0x31, 0xac, 0xbd, 0x73, 0x04, 0x26, 0xcb, - 0x78, 0x95, 0xc3, 0xff, 0x2a, 0xbe, 0x54, 0x12, 0xbe, 0x84, 0xbd, 0x1a, 0x31, 0xa4, 0x7f, 0x44, - 0x70, 0xe8, 0x61, 0x6c, 0xf7, 0x9f, 0x13, 0xfe, 0x6b, 0x1c, 0xff, 0xd7, 0xf0, 0x2b, 0x05, 0x75, - 0xd1, 0xa4, 0x63, 0x5c, 0x40, 0xf8, 0xd7, 0x08, 0xaa, 0xb2, 0x03, 0x8f, 0xcf, 0x8c, 0x75, 0x8c, - 0x6c, 0x8f, 0x7e, 0x2f, 0x8d, 0x59, 0x14, 0x01, 0xc6, 0xc9, 0xc2, 0x54, 0x2a, 0xe4, 0x33, 0x83, - 0x7e, 0x1f, 0x01, 0x4e, 0xde, 0x8b, 0xc9, 0x0b, 0x12, 0x9f, 0xce, 0x88, 0x1a, 0xdb, 0x60, 0xd0, - 0xcf, 0x4c, 0x5c, 0x97, 0x4d, 0xa5, 0x2b, 0x85, 0xa9, 0xd4, 0x4b, 0xe4, 0xbf, 0x83, 0xa0, 0x7e, - 0x93, 0x26, 0x35, 0x7b, 0x81, 0x2e, 0xb3, 0x9f, 0x16, 0xf4, 0xe5, 0xc9, 0x0b, 0x05, 0xa2, 0xf3, - 0x1c, 0xd1, 0x69, 0x5c, 0xac, 0x2a, 0x09, 0xe0, 0x43, 0x04, 0xfb, 0xee, 0xa9, 0x26, 0x8a, 0xcf, - 0x4f, 0x92, 0x94, 0x89, 0xe4, 0xe5, 0x71, 0x7d, 0x99, 0xe3, 0x5a, 0x35, 0x4a, 0xe1, 0x5a, 0x13, - 0xfd, 0xfb, 0x5f, 0xa0, 0xf8, 0x69, 0x37, 0xd4, 0x7d, 0xfd, 0x7f, 0xf5, 0x56, 0xd0, 0xc4, 0x35, - 0x2e, 0x71, 0x7c, 0x0d, 0x7c, 0xbe, 0x0c, 0xbe, 0xa6, 0x68, 0xc9, 0xe2, 0x0f, 0x10, 0x1c, 0xe2, - 0xfd, 0x6f, 0x95, 0xf1, 0x50, 0x8a, 0x19, 0xd7, 0x2d, 0x2f, 0x91, 0x62, 0x44, 0xfc, 0x31, 0x76, - 0x04, 0x6a, 0x4d, 0xf6, 0xb6, 0x7f, 0x86, 0x60, 0xbf, 0x4c, 0x6a, 0xe2, 0x76, 0x57, 0x27, 0x29, - 0x6e, 0xa7, 0x49, 0x50, 0x98, 0xdb, 0x4a, 0x39, 0x73, 0xfb, 0x04, 0xc1, 0x9c, 0xe8, 0x3d, 0x17, - 0x94, 0x0a, 0x4a, 0x73, 0x5a, 0x1f, 0x7a, 0xf9, 0x8b, 0xa6, 0xa6, 0xf1, 0x3d, 0x2e, 0xf6, 0x01, - 0x6e, 0x16, 0x89, 0xf5, 0xbd, 0x76, 0xd8, 0x7c, 0x22, 0x3a, 0x8a, 0x4f, 0x9b, 0x8e, 0xd7, 0x09, - 0xdf, 0x30, 0x70, 0x61, 0x42, 0x64, 0x6b, 0x2e, 0x20, 0x1c, 0x41, 0x8d, 0x19, 0x07, 0x6f, 0x27, - 0xe0, 0xa5, 0xa1, 0xe6, 0xc3, 0x48, 0xa7, 0x41, 0xd7, 0x47, 0xda, 0x13, 0x69, 0x06, 0x14, 0xcf, - 0x3e, 0x7c, 0xbc, 0x50, 0x2c, 0x17, 0xf4, 0x36, 0x82, 0x43, 0xaa, 0xb5, 0xc7, 0xe2, 0x4b, 0xdb, - 0x7a, 0x11, 0x0a, 0x51, 0x54, 0xe3, 0x95, 0x52, 0x86, 0xc4, 0xe1, 0x5c, 0xbd, 0xf1, 0xa7, 0x67, - 0xc7, 0xd0, 0x5f, 0x9f, 0x1d, 0x43, 0xff, 0x7a, 0x76, 0x0c, 0xbd, 0x71, 0xb9, 0xdc, 0x1f, 0x0f, - 0x2d, 0xc7, 0xa6, 0x6e, 0xa4, 0xb2, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x83, 0x0c, 0x3f, - 0x61, 0x5e, 0x29, 0x00, 0x00, + 0x15, 0xa7, 0x66, 0xbf, 0x66, 0xde, 0xac, 0xbf, 0x2a, 0xf1, 0xd2, 0x19, 0xaf, 0xcd, 0xa6, 0xfd, + 0xb5, 0x5e, 0x7b, 0x67, 0xec, 0xc1, 0x20, 0x67, 0x03, 0x02, 0xdb, 0xf1, 0x17, 0xac, 0x1d, 0xd3, + 0x6b, 0xb3, 0x28, 0x1c, 0xa0, 0xd2, 0x5d, 0x3b, 0xdb, 0xec, 0x4c, 0x57, 0xbb, 0xbb, 0x67, 0xac, + 0x91, 0xf1, 0x25, 0x08, 0x4e, 0x28, 0x48, 0x49, 0x0e, 0x28, 0x8a, 0x10, 0x4a, 0x94, 0x0b, 0x17, + 0x6e, 0x08, 0x89, 0x0b, 0x5c, 0x10, 0x48, 0x1c, 0x10, 0x1f, 0x97, 0x9c, 0x90, 0xc5, 0x8d, 0x0b, + 0x7f, 0x02, 0xaa, 0xea, 0xaa, 0xee, 0xea, 0x99, 0x9e, 0x9e, 0x59, 0x76, 0xa3, 0xf8, 0x56, 0xaf, + 0xba, 0xea, 0xbd, 0x5f, 0xbd, 0x7a, 0xef, 0x55, 0xd5, 0x6f, 0x06, 0x4e, 0x85, 0x34, 0xe8, 0xd1, + 0xa0, 0x41, 0x7c, 0xbf, 0xed, 0xda, 0x24, 0x72, 0x99, 0xa7, 0xb7, 0xeb, 0x7e, 0xc0, 0x22, 0x86, + 0xab, 0x5a, 0x57, 0x6d, 0xb1, 0xc5, 0x58, 0xab, 0x4d, 0x1b, 0xc4, 0x77, 0x1b, 0xc4, 0xf3, 0x58, + 0x24, 0xba, 0xc3, 0x78, 0x68, 0xcd, 0xdc, 0xb9, 0x12, 0xd6, 0x5d, 0x26, 0xbe, 0xda, 0x2c, 0xa0, + 0x8d, 0xde, 0xa5, 0x46, 0x8b, 0x7a, 0x34, 0x20, 0x11, 0x75, 0xe4, 0x98, 0xcb, 0xe9, 0x98, 0x0e, + 0xb1, 0xb7, 0x5d, 0x8f, 0x06, 0xfd, 0x86, 0xbf, 0xd3, 0xe2, 0x1d, 0x61, 0xa3, 0x43, 0x23, 0x92, + 0x37, 0x6b, 0xbd, 0xe5, 0x46, 0xdb, 0xdd, 0x37, 0xeb, 0x36, 0xeb, 0x34, 0x48, 0xd0, 0x62, 0x7e, + 0xc0, 0x7e, 0x20, 0x1a, 0xab, 0xb6, 0xd3, 0xe8, 0x35, 0x53, 0x05, 0xfa, 0x5a, 0x7a, 0x97, 0x48, + 0xdb, 0xdf, 0x26, 0xc3, 0xda, 0x6e, 0x8c, 0xd1, 0x16, 0x50, 0x9f, 0x49, 0xdf, 0x88, 0xa6, 0x1b, + 0xb1, 0xa0, 0xaf, 0x35, 0x63, 0x35, 0xe6, 0x27, 0x08, 0x0e, 0x5f, 0x4d, 0xed, 0x7d, 0xab, 0x4b, + 0x83, 0x3e, 0xc6, 0x30, 0xed, 0x91, 0x0e, 0x35, 0xd0, 0x12, 0x5a, 0xae, 0x58, 0xa2, 0x8d, 0x0d, + 0x98, 0x0b, 0xe8, 0x56, 0x40, 0xc3, 0x6d, 0xa3, 0x24, 0xba, 0x95, 0x88, 0x6b, 0x50, 0xe6, 0xc6, + 0xa9, 0x1d, 0x85, 0xc6, 0xd4, 0xd2, 0xd4, 0x72, 0xc5, 0x4a, 0x64, 0xbc, 0x0c, 0x87, 0x02, 0x1a, + 0xb2, 0x6e, 0x60, 0xd3, 0x6f, 0xd3, 0x20, 0x74, 0x99, 0x67, 0x4c, 0x8b, 0xd9, 0x83, 0xdd, 0x5c, + 0x4b, 0x48, 0xdb, 0xd4, 0x8e, 0x58, 0x60, 0xcc, 0x88, 0x21, 0x89, 0xcc, 0xf1, 0x70, 0xe0, 0xc6, + 0x6c, 0x8c, 0x87, 0xb7, 0xb1, 0x09, 0xf3, 0xc4, 0xf7, 0xef, 0x91, 0x0e, 0x0d, 0x7d, 0x62, 0x53, + 0x63, 0x4e, 0x7c, 0xcb, 0xf4, 0x99, 0xd7, 0xa1, 0x72, 0x8f, 0x39, 0x74, 0xf4, 0xa2, 0x06, 0x95, + 0x94, 0x72, 0x94, 0xec, 0xc0, 0x51, 0x8b, 0xf6, 0x5c, 0x0e, 0xf2, 0x2e, 0x8d, 0x88, 0x43, 0x22, + 0x32, 0xa8, 0xb0, 0x94, 0x28, 0xac, 0x41, 0x39, 0x90, 0x83, 0x8d, 0x92, 0xe8, 0x4f, 0xe4, 0x21, + 0x63, 0x53, 0x39, 0xc6, 0xfe, 0x82, 0xe0, 0x84, 0xb6, 0x1d, 0x96, 0x74, 0xd2, 0x8d, 0x1e, 0xf5, + 0xa2, 0x70, 0xb4, 0xd9, 0x0b, 0x70, 0x44, 0xf9, 0x73, 0x70, 0x31, 0xc3, 0x1f, 0x38, 0x10, 0xbd, + 0x53, 0x01, 0xd1, 0xfb, 0xf0, 0x12, 0x54, 0x95, 0xfc, 0xf0, 0xce, 0x6b, 0x72, 0xd3, 0xf4, 0xae, + 0xa1, 0xe5, 0xcc, 0xe4, 0x2c, 0xc7, 0x03, 0x43, 0x5b, 0xcd, 0x5d, 0xe2, 0xb9, 0x5b, 0x34, 0x8c, + 0x26, 0x75, 0x1f, 0xda, 0xb5, 0xfb, 0x5e, 0x86, 0xca, 0x4d, 0xb7, 0x4d, 0xaf, 0x6f, 0x77, 0xbd, + 0x1d, 0xfc, 0x22, 0xcc, 0xd8, 0xbc, 0x21, 0x2c, 0xcc, 0x5b, 0xb1, 0x60, 0x3e, 0x86, 0x97, 0x47, + 0x41, 0xda, 0x74, 0xa3, 0x6d, 0x3e, 0x3d, 0x1c, 0x85, 0xcd, 0xde, 0xa6, 0xf6, 0x4e, 0xd8, 0xed, + 0xa8, 0xad, 0x55, 0xf2, 0x44, 0xd8, 0x7e, 0x85, 0x60, 0x79, 0xac, 0xe5, 0xcd, 0x80, 0xf8, 0x3e, + 0x0d, 0xf0, 0x4d, 0x98, 0x79, 0xc4, 0x3f, 0x88, 0x68, 0xad, 0x36, 0xeb, 0x75, 0xbd, 0xa6, 0x8d, + 0xd5, 0x72, 0xfb, 0x73, 0x56, 0x3c, 0x1d, 0xd7, 0x95, 0x0f, 0x4a, 0x42, 0xcf, 0x42, 0x46, 0x4f, + 0xe2, 0x2a, 0x3e, 0x5e, 0x0c, 0xbb, 0x36, 0x0b, 0xd3, 0x3e, 0x09, 0x22, 0xf3, 0x28, 0xbc, 0x90, + 0x0d, 0x43, 0x9f, 0x79, 0x21, 0x35, 0x7f, 0x87, 0x32, 0x1b, 0x7a, 0x3d, 0xa0, 0x24, 0xa2, 0x16, + 0x7d, 0xd4, 0xa5, 0x61, 0x84, 0x77, 0x40, 0x2f, 0xb3, 0xc2, 0x77, 0xd5, 0xe6, 0x9d, 0x7a, 0x5a, + 0xa7, 0xea, 0xaa, 0x4e, 0x89, 0xc6, 0xf7, 0x6c, 0xa7, 0xde, 0x6b, 0xd6, 0xfd, 0x9d, 0x56, 0x9d, + 0x57, 0xbd, 0x0c, 0x32, 0x55, 0xf5, 0xf4, 0xa5, 0x5a, 0xba, 0x76, 0xbc, 0x00, 0xb3, 0x5d, 0x3f, + 0xa4, 0x41, 0x24, 0x56, 0x56, 0xb6, 0xa4, 0xc4, 0x77, 0xa9, 0x47, 0xda, 0xae, 0x43, 0xa2, 0x78, + 0x17, 0xca, 0x56, 0x22, 0x9b, 0x1f, 0x65, 0xd1, 0x3f, 0xf4, 0x9d, 0xcf, 0x0a, 0xbd, 0x8e, 0xb2, + 0x34, 0x80, 0xf2, 0xfd, 0x2c, 0xca, 0xd7, 0x68, 0x9b, 0xa6, 0x28, 0xf3, 0x02, 0xd3, 0x80, 0x39, + 0x9b, 0x84, 0x36, 0x71, 0x94, 0x2e, 0x25, 0xf2, 0xb2, 0xe0, 0x07, 0xcc, 0x27, 0x2d, 0xa1, 0xe9, + 0x3e, 0x6b, 0xbb, 0x76, 0x5f, 0xc6, 0xe6, 0xf0, 0x87, 0xa1, 0x20, 0x9e, 0xce, 0x09, 0xe2, 0x93, + 0x50, 0xdd, 0xe8, 0x7b, 0xf6, 0xeb, 0xbe, 0x38, 0x32, 0x79, 0x8a, 0xb9, 0x11, 0xed, 0x84, 0x06, + 0x12, 0x75, 0x3f, 0x16, 0xcc, 0x0f, 0x66, 0x60, 0x41, 0x5b, 0x01, 0x9f, 0x50, 0x84, 0xbf, 0x28, + 0xe9, 0x17, 0x60, 0xd6, 0x09, 0xfa, 0x56, 0xd7, 0x93, 0x9b, 0x29, 0x25, 0x6e, 0xd8, 0x0f, 0xba, + 0x5e, 0x0c, 0xb2, 0x6c, 0xc5, 0x02, 0xde, 0x82, 0x72, 0x18, 0xf1, 0x43, 0xb2, 0xd5, 0x17, 0xe5, + 0xa8, 0xda, 0xfc, 0xc6, 0xde, 0x36, 0x90, 0x43, 0xdf, 0x90, 0x1a, 0xad, 0x44, 0x37, 0x7e, 0x04, + 0x15, 0x55, 0x09, 0x43, 0x63, 0x6e, 0x69, 0x6a, 0xb9, 0xda, 0xdc, 0xd8, 0xbb, 0xa1, 0xd7, 0x7d, + 0x7e, 0xc0, 0x6b, 0x55, 0xdf, 0x4a, 0xad, 0xe0, 0x45, 0xa8, 0x74, 0x64, 0xae, 0x87, 0x46, 0x59, + 0x78, 0x3b, 0xed, 0xc0, 0xdf, 0x81, 0x19, 0xd7, 0xdb, 0x62, 0xa1, 0x51, 0x11, 0x60, 0xae, 0xed, + 0x0d, 0xcc, 0x1d, 0x6f, 0x8b, 0x59, 0xb1, 0x42, 0xfc, 0x08, 0x0e, 0x04, 0x34, 0x0a, 0xfa, 0xca, + 0x0b, 0x06, 0x08, 0xbf, 0x7e, 0x73, 0x6f, 0x16, 0x2c, 0x5d, 0xa5, 0x95, 0xb5, 0x80, 0xd7, 0xa0, + 0x1a, 0xa6, 0x31, 0x66, 0x54, 0x85, 0x41, 0x23, 0xa3, 0x48, 0x8b, 0x41, 0x4b, 0x1f, 0x3c, 0x14, + 0xc3, 0xf3, 0x39, 0x31, 0xfc, 0x4f, 0x04, 0x8b, 0x43, 0x65, 0x60, 0xc3, 0xa7, 0x85, 0x41, 0x4a, + 0x60, 0x3a, 0xf4, 0xa9, 0x2d, 0x2a, 0x7f, 0xb5, 0x79, 0x77, 0xdf, 0xea, 0x82, 0xb0, 0x2b, 0x54, + 0x17, 0x95, 0xae, 0x89, 0x72, 0xf3, 0xc7, 0x08, 0x3e, 0xaf, 0x69, 0xbe, 0x4f, 0x22, 0x7b, 0xbb, + 0x68, 0x49, 0x3c, 0x87, 0xf8, 0x18, 0x79, 0x9a, 0xc5, 0x02, 0x0f, 0x34, 0xd1, 0x78, 0xd0, 0xf7, + 0x39, 0x0c, 0xfe, 0x25, 0xed, 0x98, 0xe8, 0xd0, 0x7f, 0x07, 0x41, 0x4d, 0xaf, 0x7c, 0xac, 0xdd, + 0x7e, 0x93, 0xd8, 0x3b, 0x45, 0x50, 0x0e, 0x42, 0xc9, 0x75, 0x04, 0x8e, 0x29, 0xab, 0xe4, 0x3a, + 0xbb, 0x4c, 0xfb, 0x41, 0x50, 0xb3, 0x39, 0xa0, 0x3e, 0x19, 0x00, 0xa5, 0x52, 0xac, 0x00, 0xd4, + 0x22, 0x54, 0xbc, 0x81, 0xcb, 0x54, 0xda, 0x91, 0x73, 0x89, 0x2a, 0x0d, 0x5d, 0xa2, 0x0c, 0x98, + 0xeb, 0x25, 0xb7, 0x5e, 0xfe, 0x59, 0x89, 0x7c, 0x21, 0xad, 0x80, 0x75, 0x7d, 0xe9, 0xc0, 0x58, + 0xe0, 0x28, 0x76, 0x5c, 0xcf, 0x31, 0x66, 0x63, 0x14, 0xbc, 0x3d, 0xd1, 0x3d, 0xf7, 0xdd, 0x12, + 0x7c, 0x21, 0x67, 0x71, 0x63, 0x23, 0xe0, 0xf9, 0x58, 0x61, 0x12, 0x87, 0x73, 0x23, 0xe3, 0xb0, + 0x3c, 0x2e, 0x0e, 0x2b, 0x39, 0x5e, 0x79, 0xbb, 0x04, 0x4b, 0x39, 0x5e, 0x19, 0x7f, 0xa0, 0x3e, + 0x37, 0x6e, 0xd9, 0x62, 0x81, 0xdc, 0xf1, 0xb2, 0x15, 0x0b, 0x3c, 0x33, 0x58, 0xe0, 0x6f, 0x13, + 0xcf, 0x28, 0xc7, 0x99, 0x11, 0x4b, 0x13, 0x39, 0xe4, 0xbf, 0x08, 0x0c, 0xe5, 0x85, 0xab, 0xb6, + 0xf0, 0x49, 0xd7, 0x7b, 0xfe, 0x1d, 0xb1, 0x00, 0xb3, 0x44, 0xa0, 0x95, 0x01, 0x22, 0xa5, 0xa1, + 0x25, 0x97, 0xf3, 0x6b, 0xe2, 0xb1, 0xec, 0x92, 0xc3, 0x75, 0x37, 0x8c, 0xd4, 0x85, 0x16, 0x6f, + 0xc1, 0x5c, 0xac, 0x2d, 0xbe, 0xc2, 0x54, 0x9b, 0xeb, 0x7b, 0x3d, 0xd8, 0x32, 0xee, 0x55, 0xca, + 0xcd, 0x57, 0xe0, 0x58, 0x6e, 0xf5, 0x91, 0x30, 0x6a, 0x50, 0x56, 0x87, 0xb9, 0xdc, 0x80, 0x44, + 0x36, 0xff, 0x33, 0x95, 0x2d, 0xeb, 0xcc, 0x59, 0x67, 0xad, 0x82, 0xb7, 0x60, 0xf1, 0xa6, 0x19, + 0x30, 0xe7, 0x33, 0x47, 0x7b, 0xf6, 0x29, 0x91, 0xcf, 0xb3, 0x99, 0x17, 0x11, 0xd7, 0xa3, 0x81, + 0x3c, 0x5f, 0xd2, 0x0e, 0xee, 0xec, 0xd0, 0xf5, 0x6c, 0xba, 0x41, 0x6d, 0xe6, 0x39, 0xa1, 0xd8, + 0xb5, 0x29, 0x2b, 0xd3, 0x87, 0x6f, 0x43, 0x45, 0xc8, 0x0f, 0xdc, 0x4e, 0x5c, 0x84, 0xab, 0xcd, + 0x95, 0x7a, 0x4c, 0x95, 0xd4, 0x75, 0xaa, 0x24, 0xf5, 0x61, 0x87, 0x46, 0xa4, 0xde, 0xbb, 0x54, + 0xe7, 0x33, 0xac, 0x74, 0x32, 0xc7, 0x12, 0x11, 0xb7, 0xbd, 0xee, 0x7a, 0xe2, 0x82, 0xc5, 0x4d, + 0xa5, 0x1d, 0x3c, 0x20, 0xb6, 0x58, 0xbb, 0xcd, 0x1e, 0xab, 0x1c, 0x88, 0x25, 0x3e, 0xab, 0xeb, + 0x45, 0x6e, 0x5b, 0xd8, 0x8f, 0x13, 0x20, 0xed, 0x10, 0xb3, 0xdc, 0x76, 0x44, 0x03, 0x71, 0x85, + 0xa9, 0x58, 0x52, 0x4a, 0x42, 0xae, 0x1a, 0xf3, 0x02, 0x2a, 0xf7, 0xe2, 0xe0, 0x9c, 0xd7, 0x83, + 0x73, 0x30, 0xe0, 0x0f, 0xe4, 0xbc, 0x9b, 0x05, 0x19, 0x42, 0x7b, 0x2e, 0xeb, 0x86, 0xc6, 0xc1, + 0xf8, 0x10, 0x57, 0xf2, 0x50, 0xc0, 0x1e, 0xca, 0x09, 0xd8, 0xdf, 0x23, 0x28, 0xaf, 0xb3, 0xd6, + 0x0d, 0x2f, 0x0a, 0xfa, 0xe2, 0x66, 0xcf, 0xbc, 0x88, 0x7a, 0x2a, 0x2a, 0x94, 0xc8, 0x5d, 0x1d, + 0xb9, 0x1d, 0xba, 0x11, 0x91, 0x8e, 0x2f, 0xef, 0x24, 0xbb, 0x72, 0x75, 0x32, 0x99, 0x2f, 0xbf, + 0x4d, 0xc2, 0x48, 0x64, 0x6f, 0xd9, 0x12, 0x6d, 0x0e, 0x34, 0x19, 0xb0, 0x11, 0x05, 0x32, 0x75, + 0x33, 0x7d, 0x7a, 0x20, 0xcd, 0xc4, 0xd8, 0xa4, 0x68, 0x6e, 0xc0, 0x4b, 0xc9, 0x55, 0xf6, 0x01, + 0x0d, 0x3a, 0xae, 0x47, 0x8a, 0xeb, 0xed, 0x24, 0x2c, 0xcc, 0xc3, 0x4c, 0x02, 0xf1, 0xfb, 0xdf, + 0xa6, 0xeb, 0x39, 0xec, 0x71, 0x41, 0x22, 0x4c, 0xa2, 0xf6, 0x6f, 0x59, 0xbe, 0x45, 0xd3, 0x9b, + 0xe4, 0xe6, 0x6d, 0x38, 0xc0, 0xb3, 0xb8, 0x47, 0xe5, 0x07, 0x59, 0x28, 0xcc, 0x51, 0x4f, 0xf2, + 0x54, 0x87, 0x95, 0x9d, 0x88, 0xd7, 0xe1, 0x10, 0x09, 0x43, 0xb7, 0xe5, 0x51, 0x47, 0xe9, 0x2a, + 0x4d, 0xac, 0x6b, 0x70, 0x6a, 0xfc, 0xec, 0x13, 0x23, 0xe4, 0xde, 0x29, 0xd1, 0xfc, 0x11, 0x82, + 0xa3, 0xb9, 0x4a, 0x92, 0x58, 0x47, 0x5a, 0x79, 0xad, 0x41, 0x39, 0xb4, 0xb7, 0xa9, 0xd3, 0x6d, + 0x53, 0xc5, 0x6b, 0x28, 0x99, 0x7f, 0x73, 0xba, 0xf1, 0x4e, 0xca, 0xf2, 0x9e, 0xc8, 0xf8, 0x04, + 0x40, 0x87, 0x78, 0x5d, 0xd2, 0x16, 0x10, 0xa6, 0x05, 0x04, 0xad, 0xc7, 0x5c, 0x84, 0x5a, 0x5e, + 0x18, 0x48, 0x26, 0xe1, 0x1f, 0x08, 0x0e, 0xaa, 0x32, 0x28, 0xf7, 0x70, 0x19, 0x0e, 0x69, 0x6e, + 0xb8, 0x97, 0x6e, 0xe7, 0x60, 0xf7, 0x98, 0x12, 0xa7, 0x62, 0x61, 0x2a, 0xcb, 0x5e, 0xf6, 0x32, + 0xfc, 0xe3, 0xc4, 0xe7, 0x10, 0xda, 0xd5, 0x4d, 0xec, 0x87, 0x60, 0xdc, 0x25, 0x1e, 0x69, 0x51, + 0x27, 0x59, 0x5c, 0x12, 0x48, 0xdf, 0xd7, 0x1f, 0xcb, 0x7b, 0x7e, 0x9a, 0x26, 0xd7, 0x19, 0x77, + 0x6b, 0x4b, 0x3e, 0xbc, 0x9b, 0x3f, 0x59, 0x02, 0xac, 0x6f, 0x3c, 0x0d, 0x7a, 0xae, 0x4d, 0xf1, + 0x3b, 0x08, 0xa6, 0xf9, 0xa9, 0x87, 0x8f, 0x8f, 0x8a, 0x33, 0xb1, 0x01, 0xb5, 0xfd, 0x7b, 0xd5, + 0x70, 0x6b, 0xe6, 0xe2, 0x5b, 0x7f, 0xff, 0xf7, 0xbb, 0xa5, 0x05, 0xfc, 0xa2, 0xe0, 0xd2, 0x7b, + 0x97, 0x74, 0x5e, 0x3b, 0xc4, 0x3f, 0x45, 0x80, 0xe5, 0x51, 0xac, 0x51, 0x9c, 0xf8, 0xfc, 0x28, + 0x88, 0x39, 0x54, 0x68, 0xed, 0xb8, 0x56, 0xf2, 0xea, 0x36, 0x0b, 0x28, 0x2f, 0x70, 0x62, 0x80, + 0x00, 0xb0, 0x22, 0x00, 0x9c, 0xc2, 0x66, 0x1e, 0x80, 0xc6, 0x13, 0x1e, 0x18, 0x4f, 0x1b, 0x34, + 0xb6, 0xfb, 0x21, 0x82, 0x99, 0x4d, 0x71, 0xf1, 0x1c, 0xe3, 0xa4, 0x8d, 0x7d, 0x73, 0x92, 0x30, + 0x27, 0xd0, 0x9a, 0x27, 0x05, 0xd2, 0xe3, 0xf8, 0x98, 0x42, 0x1a, 0x46, 0x01, 0x25, 0x9d, 0x0c, + 0xe0, 0x8b, 0x08, 0x7f, 0x8c, 0x60, 0x36, 0xe6, 0xdc, 0xf0, 0xe9, 0x51, 0x28, 0x33, 0x9c, 0x5c, + 0x6d, 0xff, 0x08, 0x2c, 0xf3, 0x9c, 0xc0, 0x78, 0xd2, 0xcc, 0xdd, 0xce, 0xb5, 0x0c, 0xbd, 0xf5, + 0x1e, 0x82, 0xa9, 0x5b, 0x74, 0x6c, 0xbc, 0xed, 0x23, 0xb8, 0x21, 0x07, 0xe6, 0x6c, 0x35, 0xfe, + 0x08, 0xc1, 0x4b, 0xb7, 0x68, 0x94, 0x5f, 0xef, 0xf1, 0xf2, 0xf8, 0x22, 0x2c, 0xc3, 0xee, 0xfc, + 0x04, 0x23, 0x93, 0x42, 0xd7, 0x10, 0xc8, 0xce, 0xe1, 0xb3, 0x45, 0x41, 0x18, 0xf6, 0x3d, 0xfb, + 0xb1, 0xc4, 0xf1, 0x67, 0x04, 0x87, 0x07, 0x7f, 0x70, 0xc0, 0xd9, 0x13, 0x22, 0xf7, 0xf7, 0x88, + 0xda, 0xbd, 0xbd, 0x16, 0x94, 0xac, 0x52, 0xf3, 0xaa, 0x40, 0xfe, 0x2a, 0x7e, 0xa5, 0x08, 0xb9, + 0x62, 0xea, 0xc2, 0xc6, 0x13, 0xd5, 0x7c, 0x2a, 0x7e, 0x01, 0x13, 0xb0, 0xdf, 0x42, 0x30, 0x7f, + 0x8b, 0x46, 0x77, 0x13, 0xa2, 0xea, 0xf4, 0x44, 0x44, 0x76, 0x6d, 0xb1, 0xae, 0xfd, 0x50, 0xa5, + 0x3e, 0x25, 0x2e, 0x5d, 0x15, 0xc0, 0xce, 0xe2, 0xd3, 0x45, 0xc0, 0x52, 0x72, 0xec, 0x43, 0x04, + 0x47, 0x75, 0x10, 0x29, 0xcd, 0xff, 0xa5, 0xdd, 0xd1, 0xea, 0x92, 0x9c, 0x1f, 0x83, 0xae, 0x29, + 0xd0, 0x5d, 0x30, 0xf3, 0x37, 0xbc, 0x33, 0x84, 0x62, 0x0d, 0xad, 0x2c, 0x23, 0xfc, 0x07, 0x04, + 0xb3, 0x31, 0x13, 0x35, 0xda, 0x47, 0x19, 0xc2, 0x7a, 0x3f, 0xb3, 0xe7, 0x86, 0x80, 0xfc, 0xb5, + 0xda, 0xc5, 0x7c, 0x87, 0xea, 0xf3, 0xd5, 0xd6, 0xd6, 0x85, 0x97, 0xb3, 0x69, 0xff, 0x1b, 0x04, + 0x90, 0xb2, 0x69, 0xf8, 0x5c, 0xf1, 0x3a, 0x34, 0xc6, 0xad, 0xb6, 0xbf, 0x7c, 0x9a, 0x59, 0x17, + 0xeb, 0x59, 0xae, 0x2d, 0x15, 0xe6, 0x9c, 0x4f, 0xed, 0xb5, 0x98, 0x79, 0xfb, 0x25, 0x82, 0x19, + 0x41, 0x96, 0xe0, 0x53, 0xa3, 0x30, 0xeb, 0x5c, 0xca, 0x7e, 0xba, 0xfe, 0x8c, 0x80, 0xba, 0xd4, + 0x2c, 0x2a, 0x5c, 0x6b, 0x68, 0x05, 0xf7, 0x60, 0x36, 0x26, 0x2e, 0x46, 0x87, 0x47, 0x86, 0xd8, + 0xa8, 0x2d, 0x15, 0x1c, 0xa4, 0x71, 0xa0, 0xca, 0x9a, 0xb9, 0x32, 0xae, 0x66, 0x4e, 0xf3, 0xb2, + 0x86, 0x4f, 0x16, 0x15, 0xbd, 0x4f, 0xc1, 0x31, 0xe7, 0x05, 0xba, 0xd3, 0xe6, 0xd2, 0xb8, 0xba, + 0xc9, 0xbd, 0xf3, 0x73, 0x04, 0x87, 0x07, 0xef, 0x5d, 0xf8, 0xd8, 0x40, 0xcd, 0xd4, 0x2f, 0x9b, + 0xb5, 0xac, 0x17, 0x47, 0xdd, 0xd9, 0xcc, 0xaf, 0x0b, 0x14, 0x6b, 0xf8, 0xca, 0xd8, 0xcc, 0xb8, + 0xa7, 0xaa, 0x0e, 0x57, 0xb4, 0x9a, 0x12, 0xf7, 0xbf, 0x45, 0x30, 0xaf, 0xf4, 0x3e, 0x08, 0x28, + 0x2d, 0x86, 0xb5, 0x7f, 0x89, 0xc0, 0x6d, 0x99, 0x5f, 0x11, 0xf0, 0xbf, 0x8c, 0x2f, 0x4f, 0x08, + 0x5f, 0xc1, 0x5e, 0x8d, 0x38, 0xd2, 0x3f, 0x22, 0x38, 0xb2, 0x19, 0xc7, 0xfd, 0x67, 0x84, 0xff, + 0xba, 0xc0, 0xff, 0x55, 0xfc, 0x6a, 0xc1, 0xbd, 0x68, 0xdc, 0x32, 0x2e, 0x22, 0xfc, 0x6b, 0x04, + 0x65, 0x45, 0x43, 0xe3, 0xb3, 0x23, 0x13, 0x23, 0x4b, 0x54, 0xef, 0x67, 0x30, 0xcb, 0x4b, 0x80, + 0x79, 0xaa, 0xf0, 0x28, 0x95, 0xf6, 0x79, 0x40, 0xbf, 0x87, 0x00, 0x27, 0x8f, 0xa6, 0xe4, 0x19, + 0x85, 0xcf, 0x64, 0x4c, 0x8d, 0x7c, 0x65, 0xd7, 0xce, 0x8e, 0x1d, 0x97, 0x3d, 0x4a, 0x57, 0x0a, + 0x8f, 0x52, 0x96, 0xd8, 0x7f, 0x1b, 0x41, 0xf5, 0x16, 0x4d, 0xee, 0xec, 0x05, 0xbe, 0xcc, 0xf2, + 0xeb, 0xb5, 0xe5, 0xf1, 0x03, 0x25, 0xa2, 0x0b, 0x02, 0xd1, 0x19, 0x5c, 0xec, 0x2a, 0x05, 0xe0, + 0x03, 0x04, 0x07, 0xee, 0xeb, 0x21, 0x8a, 0x2f, 0x8c, 0xb3, 0x94, 0xa9, 0xe4, 0x93, 0xe3, 0xfa, + 0xa2, 0xc0, 0xb5, 0x6a, 0x4e, 0x84, 0x6b, 0x4d, 0x92, 0xd8, 0xbf, 0x40, 0xf0, 0x82, 0xfe, 0xc8, + 0x91, 0x14, 0xe4, 0xff, 0xeb, 0xb7, 0x02, 0x26, 0xd3, 0xbc, 0x2c, 0xf0, 0xd5, 0xf1, 0x85, 0x49, + 0xf0, 0x35, 0x24, 0x2f, 0x89, 0xdf, 0x47, 0x70, 0x44, 0x90, 0xc0, 0xba, 0xe2, 0x81, 0x23, 0x66, + 0x14, 0x65, 0x3c, 0xc1, 0x11, 0x23, 0xeb, 0x8f, 0xb9, 0x2b, 0x50, 0x6b, 0x8a, 0xe0, 0xfd, 0x19, + 0x82, 0x83, 0xea, 0x50, 0x93, 0xbb, 0xbb, 0x3a, 0xce, 0x71, 0xbb, 0x3d, 0x04, 0x65, 0xb8, 0xad, + 0x4c, 0x16, 0x6e, 0x1f, 0x23, 0x98, 0x93, 0x04, 0x6c, 0xc1, 0x55, 0x41, 0x63, 0x68, 0x6b, 0x47, + 0x33, 0xa3, 0x14, 0xb3, 0x67, 0x7e, 0x57, 0x98, 0x7d, 0x88, 0x1b, 0x45, 0x66, 0x7d, 0xe6, 0x84, + 0x8d, 0x27, 0x92, 0x56, 0x7b, 0xda, 0x68, 0xb3, 0x56, 0xf8, 0x86, 0x89, 0x0b, 0x0f, 0x44, 0x3e, + 0xe6, 0x22, 0xba, 0x76, 0xf3, 0x4f, 0xcf, 0x4e, 0xa0, 0xbf, 0x3e, 0x3b, 0x81, 0xfe, 0xf5, 0xec, + 0x04, 0x7a, 0xe3, 0xca, 0x64, 0x7f, 0x3c, 0xb3, 0xdb, 0x2e, 0xf5, 0x22, 0x5d, 0xed, 0xff, 0x02, + 0x00, 0x00, 0xff, 0xff, 0xa8, 0x3a, 0x7a, 0xdf, 0x5e, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2854,10 +2669,6 @@ type ApplicationServiceClient interface { DeleteResource(ctx context.Context, in *ApplicationResourceDeleteRequest, opts ...grpc.CallOption) (*ApplicationResponse, error) // PodLogs returns stream of log entries for the specified pod. Pod PodLogs(ctx context.Context, in *ApplicationPodLogsQuery, opts ...grpc.CallOption) (ApplicationService_PodLogsClient, error) - // ListLinks returns the list of all application deep links - ListLinks(ctx context.Context, in *ListAppLinksRequest, opts ...grpc.CallOption) (*LinksResponse, error) - // ListResourceLinks returns the list of all resource deep links - ListResourceLinks(ctx context.Context, in *ApplicationResourceRequest, opts ...grpc.CallOption) (*LinksResponse, error) } type applicationServiceClient struct { @@ -3187,24 +2998,6 @@ func (x *applicationServicePodLogsClient) Recv() (*LogEntry, error) { return m, nil } -func (c *applicationServiceClient) ListLinks(ctx context.Context, in *ListAppLinksRequest, opts ...grpc.CallOption) (*LinksResponse, error) { - out := new(LinksResponse) - err := c.cc.Invoke(ctx, "/application.ApplicationService/ListLinks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *applicationServiceClient) ListResourceLinks(ctx context.Context, in *ApplicationResourceRequest, opts ...grpc.CallOption) (*LinksResponse, error) { - out := new(LinksResponse) - err := c.cc.Invoke(ctx, "/application.ApplicationService/ListResourceLinks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // ApplicationServiceServer is the server API for ApplicationService service. type ApplicationServiceServer interface { // List returns list of applications @@ -3257,10 +3050,6 @@ type ApplicationServiceServer interface { DeleteResource(context.Context, *ApplicationResourceDeleteRequest) (*ApplicationResponse, error) // PodLogs returns stream of log entries for the specified pod. Pod PodLogs(*ApplicationPodLogsQuery, ApplicationService_PodLogsServer) error - // ListLinks returns the list of all application deep links - ListLinks(context.Context, *ListAppLinksRequest) (*LinksResponse, error) - // ListResourceLinks returns the list of all resource deep links - ListResourceLinks(context.Context, *ApplicationResourceRequest) (*LinksResponse, error) } // UnimplementedApplicationServiceServer can be embedded to have forward compatible implementations. @@ -3342,12 +3131,6 @@ func (*UnimplementedApplicationServiceServer) DeleteResource(ctx context.Context func (*UnimplementedApplicationServiceServer) PodLogs(req *ApplicationPodLogsQuery, srv ApplicationService_PodLogsServer) error { return status.Errorf(codes.Unimplemented, "method PodLogs not implemented") } -func (*UnimplementedApplicationServiceServer) ListLinks(ctx context.Context, req *ListAppLinksRequest) (*LinksResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListLinks not implemented") -} -func (*UnimplementedApplicationServiceServer) ListResourceLinks(ctx context.Context, req *ApplicationResourceRequest) (*LinksResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListResourceLinks not implemented") -} func RegisterApplicationServiceServer(s *grpc.Server, srv ApplicationServiceServer) { s.RegisterService(&_ApplicationService_serviceDesc, srv) @@ -3820,42 +3603,6 @@ func (x *applicationServicePodLogsServer) Send(m *LogEntry) error { return x.ServerStream.SendMsg(m) } -func _ApplicationService_ListLinks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListAppLinksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApplicationServiceServer).ListLinks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/application.ApplicationService/ListLinks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApplicationServiceServer).ListLinks(ctx, req.(*ListAppLinksRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ApplicationService_ListResourceLinks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ApplicationResourceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApplicationServiceServer).ListResourceLinks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/application.ApplicationService/ListResourceLinks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApplicationServiceServer).ListResourceLinks(ctx, req.(*ApplicationResourceRequest)) - } - return interceptor(ctx, in, info, handler) -} - var _ApplicationService_serviceDesc = grpc.ServiceDesc{ ServiceName: "application.ApplicationService", HandlerType: (*ApplicationServiceServer)(nil), @@ -3944,14 +3691,6 @@ var _ApplicationService_serviceDesc = grpc.ServiceDesc{ MethodName: "DeleteResource", Handler: _ApplicationService_DeleteResource_Handler, }, - { - MethodName: "ListLinks", - Handler: _ApplicationService_ListLinks_Handler, - }, - { - MethodName: "ListResourceLinks", - Handler: _ApplicationService_ListResourceLinks_Handler, - }, }, Streams: []grpc.StreamDesc{ { @@ -6051,218 +5790,75 @@ func (m *ManagedResourcesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *LinkInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func encodeVarintApplication(dAtA []byte, offset int, v uint64) int { + offset -= sovApplication(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ } - return dAtA[:n], nil -} - -func (m *LinkInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + dAtA[offset] = uint8(v) + return base } - -func (m *LinkInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i +func (m *ApplicationQuery) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovApplication(uint64(l)) } - if m.IconClass != nil { - i -= len(*m.IconClass) - copy(dAtA[i:], *m.IconClass) - i = encodeVarintApplication(dAtA, i, uint64(len(*m.IconClass))) - i-- - dAtA[i] = 0x22 + if m.Refresh != nil { + l = len(*m.Refresh) + n += 1 + l + sovApplication(uint64(l)) } - if m.Description != nil { - i -= len(*m.Description) - copy(dAtA[i:], *m.Description) - i = encodeVarintApplication(dAtA, i, uint64(len(*m.Description))) - i-- - dAtA[i] = 0x1a + if len(m.Projects) > 0 { + for _, s := range m.Projects { + l = len(s) + n += 1 + l + sovApplication(uint64(l)) + } } - if m.Url == nil { - return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("url") - } else { - i -= len(*m.Url) - copy(dAtA[i:], *m.Url) - i = encodeVarintApplication(dAtA, i, uint64(len(*m.Url))) - i-- - dAtA[i] = 0x12 + if m.ResourceVersion != nil { + l = len(*m.ResourceVersion) + n += 1 + l + sovApplication(uint64(l)) } - if m.Title == nil { - return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("title") - } else { - i -= len(*m.Title) - copy(dAtA[i:], *m.Title) - i = encodeVarintApplication(dAtA, i, uint64(len(*m.Title))) - i-- - dAtA[i] = 0xa + if m.Selector != nil { + l = len(*m.Selector) + n += 1 + l + sovApplication(uint64(l)) } - return len(dAtA) - i, nil -} - -func (m *LinksResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + if m.Repo != nil { + l = len(*m.Repo) + n += 1 + l + sovApplication(uint64(l)) } - return dAtA[:n], nil -} - -func (m *LinksResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + if m.AppNamespace != nil { + l = len(*m.AppNamespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n } -func (m *LinksResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i +func (m *NodeQuery) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovApplication(uint64(l)) + } + if m.AppNamespace != nil { + l = len(*m.AppNamespace) + n += 1 + l + sovApplication(uint64(l)) + } if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintApplication(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ListAppLinksRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListAppLinksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListAppLinksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Namespace != nil { - i -= len(*m.Namespace) - copy(dAtA[i:], *m.Namespace) - i = encodeVarintApplication(dAtA, i, uint64(len(*m.Namespace))) - i-- - dAtA[i] = 0x1a - } - if m.Name == nil { - return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") - } else { - i -= len(*m.Name) - copy(dAtA[i:], *m.Name) - i = encodeVarintApplication(dAtA, i, uint64(len(*m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintApplication(dAtA []byte, offset int, v uint64) int { - offset -= sovApplication(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *ApplicationQuery) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Name != nil { - l = len(*m.Name) - n += 1 + l + sovApplication(uint64(l)) - } - if m.Refresh != nil { - l = len(*m.Refresh) - n += 1 + l + sovApplication(uint64(l)) - } - if len(m.Projects) > 0 { - for _, s := range m.Projects { - l = len(s) - n += 1 + l + sovApplication(uint64(l)) - } - } - if m.ResourceVersion != nil { - l = len(*m.ResourceVersion) - n += 1 + l + sovApplication(uint64(l)) - } - if m.Selector != nil { - l = len(*m.Selector) - n += 1 + l + sovApplication(uint64(l)) - } - if m.Repo != nil { - l = len(*m.Repo) - n += 1 + l + sovApplication(uint64(l)) - } - if m.AppNamespace != nil { - l = len(*m.AppNamespace) - n += 1 + l + sovApplication(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NodeQuery) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Name != nil { - l = len(*m.Name) - n += 1 + l + sovApplication(uint64(l)) - } - if m.AppNamespace != nil { - l = len(*m.AppNamespace) - n += 1 + l + sovApplication(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + n += len(m.XXX_unrecognized) } return n } @@ -7143,72 +6739,6 @@ func (m *ManagedResourcesResponse) Size() (n int) { return n } -func (m *LinkInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Title != nil { - l = len(*m.Title) - n += 1 + l + sovApplication(uint64(l)) - } - if m.Url != nil { - l = len(*m.Url) - n += 1 + l + sovApplication(uint64(l)) - } - if m.Description != nil { - l = len(*m.Description) - n += 1 + l + sovApplication(uint64(l)) - } - if m.IconClass != nil { - l = len(*m.IconClass) - n += 1 + l + sovApplication(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *LinksResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovApplication(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ListAppLinksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Name != nil { - l = len(*m.Name) - n += 1 + l + sovApplication(uint64(l)) - } - if m.Namespace != nil { - l = len(*m.Namespace) - n += 1 + l + sovApplication(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func sovApplication(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -13302,405 +12832,6 @@ func (m *ManagedResourcesResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *LinkInfo) Unmarshal(dAtA []byte) error { - var hasFields [1]uint64 - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: LinkInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LinkInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Title = &s - iNdEx = postIndex - hasFields[0] |= uint64(0x00000001) - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Url", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Url = &s - iNdEx = postIndex - hasFields[0] |= uint64(0x00000002) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Description = &s - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IconClass", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.IconClass = &s - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipApplication(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthApplication - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - if hasFields[0]&uint64(0x00000001) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("title") - } - if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("url") - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *LinksResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: LinksResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LinksResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, &LinkInfo{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipApplication(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthApplication - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListAppLinksRequest) Unmarshal(dAtA []byte) error { - var hasFields [1]uint64 - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ListAppLinksRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListAppLinksRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Name = &s - iNdEx = postIndex - hasFields[0] |= uint64(0x00000001) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Namespace = &s - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipApplication(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthApplication - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - if hasFields[0]&uint64(0x00000001) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipApplication(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apiclient/application/application.pb.gw.go b/pkg/apiclient/application/application.pb.gw.go index 80c86e4fc9a19..56a1bbc27c1ba 100644 --- a/pkg/apiclient/application/application.pb.gw.go +++ b/pkg/apiclient/application/application.pb.gw.go @@ -1790,150 +1790,6 @@ func request_ApplicationService_PodLogs_1(ctx context.Context, marshaler runtime } -var ( - filter_ApplicationService_ListLinks_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_ApplicationService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListAppLinksRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["name"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") - } - - protoReq.Name, err = runtime.StringP(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_ListLinks_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ListLinks(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ApplicationService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, server ApplicationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListAppLinksRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["name"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") - } - - protoReq.Name, err = runtime.StringP(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_ListLinks_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ListLinks(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_ApplicationService_ListResourceLinks_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_ApplicationService_ListResourceLinks_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ApplicationResourceRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["name"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") - } - - protoReq.Name, err = runtime.StringP(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_ListResourceLinks_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ListResourceLinks(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ApplicationService_ListResourceLinks_0(ctx context.Context, marshaler runtime.Marshaler, server ApplicationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ApplicationResourceRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["name"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") - } - - protoReq.Name, err = runtime.StringP(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_ListResourceLinks_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ListResourceLinks(ctx, &protoReq) - return msg, metadata, err - -} - // RegisterApplicationServiceHandlerServer registers the http handlers for service ApplicationService to "mux". // UnaryRPC :call ApplicationServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -2458,52 +2314,6 @@ func RegisterApplicationServiceHandlerServer(ctx context.Context, mux *runtime.S return }) - mux.Handle("GET", pattern_ApplicationService_ListLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ApplicationService_ListLinks_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ApplicationService_ListLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ApplicationService_ListResourceLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ApplicationService_ListResourceLinks_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ApplicationService_ListResourceLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -3065,46 +2875,6 @@ func RegisterApplicationServiceHandlerClient(ctx context.Context, mux *runtime.S }) - mux.Handle("GET", pattern_ApplicationService_ListLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ApplicationService_ListLinks_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ApplicationService_ListLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ApplicationService_ListResourceLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ApplicationService_ListResourceLinks_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ApplicationService_ListResourceLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -3160,10 +2930,6 @@ var ( pattern_ApplicationService_PodLogs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"api", "v1", "applications", "name", "pods", "podName", "logs"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ApplicationService_PodLogs_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "applications", "name", "logs"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ApplicationService_ListLinks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "applications", "name", "links"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ApplicationService_ListResourceLinks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"api", "v1", "applications", "name", "resource", "links"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -3218,8 +2984,4 @@ var ( forward_ApplicationService_PodLogs_0 = runtime.ForwardResponseStream forward_ApplicationService_PodLogs_1 = runtime.ForwardResponseStream - - forward_ApplicationService_ListLinks_0 = runtime.ForwardResponseMessage - - forward_ApplicationService_ListResourceLinks_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/apiclient/application/forwarder_overwrite.go b/pkg/apiclient/application/forwarder_overwrite.go index 9a4bcae10e5a7..02d2d5b2af6aa 100644 --- a/pkg/apiclient/application/forwarder_overwrite.go +++ b/pkg/apiclient/application/forwarder_overwrite.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" gohttp "net/http" - "strings" "github.com/argoproj/argo-cd/v2/util/kube" @@ -18,99 +17,6 @@ import ( "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" ) -// appFields is a map of fields that can be selected from an application. -// The manually maintained list is required because application list response might include thousands of applications -// and JSON based field handling is too slow. -var appFields = map[string]func(app *v1alpha1.Application) interface{}{ - "metadata.name": func(app *v1alpha1.Application) interface{} { return app.Name }, - "metadata.namespace": func(app *v1alpha1.Application) interface{} { return app.Namespace }, - "metadata.annotations": func(app *v1alpha1.Application) interface{} { return app.Annotations }, - "metadata.labels": func(app *v1alpha1.Application) interface{} { return app.Labels }, - "metadata.creationTimestamp": func(app *v1alpha1.Application) interface{} { return app.CreationTimestamp }, - "metadata.deletionTimestamp": func(app *v1alpha1.Application) interface{} { return app.DeletionTimestamp }, - "spec": func(app *v1alpha1.Application) interface{} { return app.Spec }, - "status.sync.status": func(app *v1alpha1.Application) interface{} { return app.Status.Sync.Status }, - "status.health": func(app *v1alpha1.Application) interface{} { return app.Status.Health }, - "status.summary": func(app *v1alpha1.Application) interface{} { return app.Status.Summary }, - "status.operationState.startedAt": func(app *v1alpha1.Application) interface{} { - if app.Status.OperationState != nil { - return app.Status.OperationState.StartedAt - } - return nil - }, - "status.operationState.finishedAt": func(app *v1alpha1.Application) interface{} { - if app.Status.OperationState != nil { - return app.Status.OperationState.FinishedAt - } - return nil - }, - "status.resources": func(app *v1alpha1.Application) interface{} { - if len(app.Status.Resources) > 0 { - return app.Status.Resources - } - return nil - }, - "operation.sync": func(app *v1alpha1.Application) interface{} { - if app.Operation != nil { - return app.Operation.Sync - } - return nil - }, - "status.operationState.phase": func(app *v1alpha1.Application) interface{} { - if app.Status.OperationState != nil { - return app.Status.OperationState.Phase - } - return nil - }, - "status.operationState.operation.sync": func(app *v1alpha1.Application) interface{} { - if app.Status.OperationState != nil { - return app.Status.OperationState.SyncResult - } - return nil - }, -} - -func processApplicationListField(v interface{}, fields map[string]interface{}, exclude bool) (interface{}, error) { - if appList, ok := v.(*v1alpha1.ApplicationList); ok { - var items []map[string]interface{} - for _, app := range appList.Items { - converted := make(map[string]interface{}) - items = append(items, converted) - for field, fn := range appFields { - if _, ok := fields["items."+field]; ok == exclude { - continue - } - value := fn(&app) - if value == nil { - continue - } - parts := strings.Split(field, ".") - item := converted - for i := 0; i < len(parts); i++ { - subField := parts[i] - if i == len(parts)-1 { - item[subField] = value - } else { - if _, ok := item[subField]; !ok { - item[subField] = make(map[string]interface{}) - } - nestedMap, ok := item[subField].(map[string]interface{}) - if !ok { - return nil, fmt.Errorf("field %s is not a map", field) - } - item = nestedMap - } - } - } - } - return map[string]interface{}{ - "items": items, - "metadata": appList.ListMeta, - }, nil - } - return nil, errors.New("not an application list") -} - func init() { logsForwarder := func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w gohttp.ResponseWriter, req *gohttp.Request, recv func() (proto.Message, error), opts ...func(context.Context, gohttp.ResponseWriter, proto.Message) error) { if req.URL.Query().Get("download") == "true" { @@ -149,6 +55,6 @@ func init() { } return event.Application.Name, nil }) - forward_ApplicationService_List_0 = http.UnaryForwarderWithFieldProcessor(processApplicationListField) + forward_ApplicationService_List_0 = http.UnaryForwarder forward_ApplicationService_ManagedResources_0 = http.UnaryForwarder } diff --git a/pkg/apiclient/application/forwarder_overwrite_test.go b/pkg/apiclient/application/forwarder_overwrite_test.go deleted file mode 100644 index 370a84173997b..0000000000000 --- a/pkg/apiclient/application/forwarder_overwrite_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package application - -import ( - "testing" - - "github.com/stretchr/testify/require" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" - "github.com/argoproj/argo-cd/v2/test" -) - -func TestProcessApplicationListField_SyncOperation(t *testing.T) { - list := v1alpha1.ApplicationList{ - Items: []v1alpha1.Application{{Operation: &v1alpha1.Operation{Sync: &v1alpha1.SyncOperation{ - Revision: "abc", - }}}}, - } - - res, err := processApplicationListField(&list, map[string]interface{}{"items.operation.sync": true}, false) - require.NoError(t, err) - resMap, ok := res.(map[string]interface{}) - require.True(t, ok) - - items, ok := resMap["items"].([]map[string]interface{}) - require.True(t, ok) - item := test.ToMap(items[0]) - - val, ok, err := unstructured.NestedString(item, "operation", "sync", "revision") - require.NoError(t, err) - require.True(t, ok) - - require.Equal(t, "abc", val) -} - -func TestProcessApplicationListField_SyncOperationMissing(t *testing.T) { - list := v1alpha1.ApplicationList{ - Items: []v1alpha1.Application{{Operation: nil}}, - } - - res, err := processApplicationListField(&list, map[string]interface{}{"items.operation.sync": true}, false) - require.NoError(t, err) - resMap, ok := res.(map[string]interface{}) - require.True(t, ok) - - items, ok := resMap["items"].([]map[string]interface{}) - require.True(t, ok) - item := test.ToMap(items[0]) - - _, ok, err = unstructured.NestedString(item, "operation") - require.NoError(t, err) - require.False(t, ok) -} diff --git a/pkg/apiclient/project/project.pb.go b/pkg/apiclient/project/project.pb.go index 2a89c8c2a02d8..97199cdd0a84e 100644 --- a/pkg/apiclient/project/project.pb.go +++ b/pkg/apiclient/project/project.pb.go @@ -10,7 +10,6 @@ package project import ( context "context" fmt "fmt" - application "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" v1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" @@ -637,53 +636,6 @@ func (m *DetailedProjectsResponse) GetClusters() []*v1alpha1.Cluster { return nil } -type ListProjectLinksRequest struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListProjectLinksRequest) Reset() { *m = ListProjectLinksRequest{} } -func (m *ListProjectLinksRequest) String() string { return proto.CompactTextString(m) } -func (*ListProjectLinksRequest) ProtoMessage() {} -func (*ListProjectLinksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5f0a51496972c9e2, []int{11} -} -func (m *ListProjectLinksRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListProjectLinksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListProjectLinksRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ListProjectLinksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListProjectLinksRequest.Merge(m, src) -} -func (m *ListProjectLinksRequest) XXX_Size() int { - return m.Size() -} -func (m *ListProjectLinksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListProjectLinksRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListProjectLinksRequest proto.InternalMessageInfo - -func (m *ListProjectLinksRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - func init() { proto.RegisterType((*ProjectCreateRequest)(nil), "project.ProjectCreateRequest") proto.RegisterType((*ProjectTokenDeleteRequest)(nil), "project.ProjectTokenDeleteRequest") @@ -696,76 +648,72 @@ func init() { proto.RegisterType((*SyncWindowsResponse)(nil), "project.SyncWindowsResponse") proto.RegisterType((*GlobalProjectsResponse)(nil), "project.GlobalProjectsResponse") proto.RegisterType((*DetailedProjectsResponse)(nil), "project.DetailedProjectsResponse") - proto.RegisterType((*ListProjectLinksRequest)(nil), "project.ListProjectLinksRequest") } func init() { proto.RegisterFile("server/project/project.proto", fileDescriptor_5f0a51496972c9e2) } var fileDescriptor_5f0a51496972c9e2 = []byte{ - // 1007 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0x96, 0x93, 0x36, 0xbb, 0x7d, 0x2d, 0xa5, 0xcc, 0xee, 0x76, 0xdd, 0xd0, 0x1f, 0x61, 0xd0, - 0x56, 0x51, 0xa1, 0xb6, 0x9a, 0x82, 0xb4, 0x82, 0x13, 0xdb, 0xad, 0x02, 0x52, 0x0f, 0xe0, 0x82, - 0x40, 0x1c, 0x40, 0x8e, 0xfd, 0x94, 0x9d, 0x8d, 0x63, 0x1b, 0xcf, 0x24, 0xdb, 0x10, 0xf5, 0x82, - 0x04, 0x48, 0x1c, 0x38, 0xc0, 0x89, 0x0b, 0x47, 0xfe, 0x0f, 0x6e, 0x1c, 0x91, 0xf8, 0x07, 0x50, - 0xc5, 0x1f, 0x82, 0x66, 0x3c, 0x76, 0xe2, 0xa4, 0xe6, 0x87, 0x1a, 0x38, 0x65, 0x3c, 0x7e, 0xfe, - 0xbe, 0xef, 0xbd, 0x79, 0xf3, 0xcd, 0x04, 0xb6, 0x39, 0x26, 0x43, 0x4c, 0xec, 0x38, 0x89, 0x9e, - 0xa2, 0x27, 0xb2, 0x5f, 0x2b, 0x4e, 0x22, 0x11, 0x91, 0x5b, 0xfa, 0xb1, 0xbe, 0xdd, 0x8d, 0xa2, - 0x6e, 0x80, 0xb6, 0x1b, 0x33, 0xdb, 0x0d, 0xc3, 0x48, 0xb8, 0x82, 0x45, 0x21, 0x4f, 0xc3, 0xea, - 0xb4, 0xf7, 0x90, 0x5b, 0x2c, 0x52, 0x6f, 0xbd, 0x28, 0x41, 0x7b, 0x78, 0x64, 0x77, 0x31, 0xc4, - 0xc4, 0x15, 0xe8, 0xeb, 0x98, 0xb3, 0x2e, 0x13, 0x4f, 0x06, 0x1d, 0xcb, 0x8b, 0xfa, 0xb6, 0x9b, - 0x74, 0x23, 0x89, 0xac, 0x06, 0x87, 0x9e, 0x6f, 0x0f, 0x5b, 0x76, 0xdc, 0xeb, 0xca, 0xef, 0xb9, - 0xed, 0xc6, 0x71, 0xc0, 0x3c, 0x85, 0x6f, 0x0f, 0x8f, 0xdc, 0x20, 0x7e, 0xe2, 0xce, 0xa3, 0x9d, - 0xfc, 0x0d, 0x9a, 0xce, 0x6a, 0x1a, 0x6b, 0x6a, 0x9c, 0x82, 0xd0, 0xef, 0x0c, 0xb8, 0xfb, 0x6e, - 0x9a, 0xe0, 0x49, 0x82, 0xae, 0x40, 0x07, 0x3f, 0x1b, 0x20, 0x17, 0xa4, 0x03, 0x59, 0xe2, 0xa6, - 0xd1, 0x30, 0x9a, 0xab, 0xad, 0xb7, 0xad, 0x09, 0x9f, 0x95, 0xf1, 0xa9, 0xc1, 0xa7, 0x9e, 0x6f, - 0x0d, 0x5b, 0x56, 0xdc, 0xeb, 0x5a, 0x52, 0xbd, 0x35, 0xcd, 0x92, 0xa9, 0xb7, 0xde, 0x8a, 0x63, - 0xcd, 0xe3, 0x64, 0xc0, 0x64, 0x13, 0x6a, 0x83, 0x98, 0x63, 0x22, 0xcc, 0x4a, 0xc3, 0x68, 0xde, - 0x76, 0xf4, 0x13, 0xed, 0xc1, 0x96, 0x8e, 0x7d, 0x3f, 0xea, 0x61, 0xf8, 0x18, 0x03, 0x9c, 0x08, - 0x33, 0x8b, 0xc2, 0x56, 0x26, 0x70, 0x04, 0x96, 0x92, 0x28, 0x40, 0x05, 0xb6, 0xe2, 0xa8, 0x31, - 0xd9, 0x80, 0x2a, 0x73, 0x85, 0x59, 0x6d, 0x18, 0xcd, 0xaa, 0x23, 0x87, 0x64, 0x1d, 0x2a, 0xcc, - 0x37, 0x97, 0x54, 0x4c, 0x85, 0xf9, 0xf4, 0x07, 0xa3, 0xc8, 0x56, 0x2c, 0x43, 0x39, 0x5b, 0x03, - 0x56, 0x7d, 0xe4, 0x5e, 0xc2, 0x62, 0x99, 0xa8, 0x26, 0x9d, 0x9e, 0xca, 0xf5, 0x54, 0xa7, 0xf4, - 0x6c, 0xc3, 0x0a, 0x5e, 0xc4, 0x2c, 0x41, 0xfe, 0x4e, 0xa8, 0x44, 0x54, 0x9d, 0xc9, 0x84, 0xd6, - 0xb6, 0x9c, 0x6b, 0x7b, 0x35, 0x5f, 0x1c, 0x25, 0xcd, 0x41, 0x1e, 0x47, 0x21, 0x47, 0x72, 0x17, - 0x96, 0x85, 0x9c, 0xd0, 0x9a, 0xd2, 0x07, 0x4a, 0x61, 0x4d, 0x47, 0xbf, 0x37, 0xc0, 0x64, 0x24, - 0xf9, 0x43, 0xb7, 0x8f, 0x3a, 0x48, 0x8d, 0xe9, 0xe7, 0x39, 0xe2, 0x07, 0xb1, 0xff, 0xff, 0x2e, - 0x37, 0x7d, 0x1e, 0x9e, 0x3b, 0xed, 0xc7, 0x62, 0x94, 0xa5, 0x41, 0xf7, 0x61, 0xe3, 0x7c, 0x14, - 0x7a, 0x1f, 0xb2, 0xd0, 0x8f, 0x9e, 0xf1, 0x72, 0xd1, 0x23, 0xb8, 0x33, 0x15, 0x97, 0x57, 0xa1, - 0x03, 0xb7, 0x9e, 0xa5, 0x53, 0xa6, 0xd1, 0xa8, 0xde, 0x5c, 0xf3, 0x84, 0xc3, 0xc9, 0x80, 0xe9, - 0x05, 0x6c, 0xb6, 0x83, 0xa8, 0xe3, 0x06, 0x3a, 0x9b, 0x09, 0xfb, 0x27, 0xb0, 0xcc, 0x04, 0xf6, - 0x17, 0xc4, 0x3d, 0x55, 0xaf, 0x14, 0x96, 0xfe, 0x5c, 0x05, 0xf3, 0x31, 0x0a, 0x97, 0x05, 0xe8, - 0xcf, 0x91, 0xc7, 0xb0, 0xde, 0x2d, 0xc8, 0x5a, 0xb8, 0x8a, 0x19, 0xfc, 0xe9, 0x06, 0xa9, 0xfc, - 0x57, 0x7e, 0x10, 0xc0, 0x5a, 0x82, 0x71, 0xc4, 0x99, 0x88, 0x12, 0x86, 0xdc, 0xac, 0x2e, 0x22, - 0x27, 0x27, 0x43, 0x1c, 0x39, 0x05, 0x74, 0xe2, 0xc2, 0x6d, 0x2f, 0x18, 0x70, 0x81, 0x09, 0x37, - 0x97, 0x14, 0xd3, 0xe9, 0xcd, 0x98, 0x4e, 0x52, 0x34, 0x27, 0x87, 0xa5, 0x87, 0x70, 0xff, 0x8c, - 0x71, 0xa1, 0x13, 0x3d, 0x63, 0x61, 0x8f, 0x67, 0x1b, 0xee, 0x9a, 0x3e, 0x6f, 0xfd, 0xb8, 0x06, - 0xeb, 0x3a, 0xf6, 0x1c, 0x93, 0x21, 0xf3, 0x90, 0x7c, 0x63, 0xc0, 0x6a, 0xea, 0x48, 0xca, 0x01, - 0x08, 0xb5, 0xb2, 0xd3, 0xa9, 0xd4, 0xb3, 0xea, 0x3b, 0xd7, 0xc6, 0xe4, 0xbb, 0xee, 0xe1, 0x17, - 0xbf, 0xfd, 0xf1, 0x7d, 0xa5, 0x45, 0x0f, 0xd5, 0x59, 0x35, 0x3c, 0xca, 0xce, 0x3b, 0x6e, 0x8f, - 0xf5, 0xe8, 0xd2, 0x96, 0x5e, 0xc5, 0xed, 0xb1, 0xfc, 0xb9, 0xb4, 0x95, 0xbb, 0xbc, 0x61, 0x1c, - 0x90, 0xaf, 0x0c, 0x58, 0x4d, 0xcd, 0xf8, 0xaf, 0xc4, 0x14, 0xec, 0xba, 0xbe, 0x99, 0xc7, 0x14, - 0xf7, 0xfe, 0x9b, 0x4a, 0xc5, 0xeb, 0x07, 0xc7, 0xff, 0x4a, 0x85, 0x3d, 0x66, 0xae, 0xb8, 0x24, - 0xdf, 0x1a, 0x50, 0x4b, 0x73, 0x26, 0x73, 0xc9, 0x16, 0x6b, 0xb1, 0xb0, 0x2e, 0xa5, 0x2f, 0x2a, - 0xc1, 0xf7, 0xe8, 0xc6, 0xac, 0x60, 0x59, 0x99, 0x2f, 0x0d, 0x58, 0x92, 0x2b, 0x4d, 0xee, 0xcd, - 0xca, 0x51, 0xae, 0x56, 0x3f, 0x5b, 0x94, 0x0c, 0x49, 0x42, 0x4d, 0x25, 0x85, 0x90, 0x39, 0x29, - 0xe4, 0x02, 0x48, 0x1b, 0xc5, 0x8c, 0x6d, 0x94, 0x89, 0x7a, 0x29, 0x9f, 0x2e, 0xf3, 0x19, 0xda, - 0x54, 0x4c, 0x94, 0x34, 0xe6, 0x57, 0x49, 0x76, 0xec, 0xa5, 0xed, 0xeb, 0x2f, 0xc9, 0xd7, 0x06, - 0x54, 0xdb, 0x58, 0xca, 0xb5, 0xb8, 0x75, 0xd8, 0x53, 0x92, 0xb6, 0xc8, 0xfd, 0x12, 0x49, 0x64, - 0x0c, 0x2f, 0xb4, 0x51, 0x14, 0x5d, 0xbb, 0x4c, 0xd6, 0x5e, 0x3e, 0x7d, 0xbd, 0xcb, 0x53, 0x4b, - 0xb1, 0x35, 0xc9, 0x7e, 0x59, 0x01, 0x52, 0x9b, 0xcc, 0x17, 0xe0, 0x27, 0x03, 0x6a, 0xe9, 0xc9, - 0x3a, 0xdf, 0x99, 0x85, 0x13, 0x77, 0x81, 0x15, 0x39, 0x56, 0x1a, 0x0f, 0xeb, 0xcd, 0xd2, 0xad, - 0x64, 0xf5, 0x51, 0xb8, 0xbe, 0x2b, 0x5c, 0x4b, 0x89, 0x96, 0x1d, 0xfb, 0x11, 0xd4, 0xd2, 0x8d, - 0x5a, 0x56, 0x9a, 0xb2, 0x8d, 0xab, 0xeb, 0x7f, 0x50, 0x5a, 0xff, 0xa7, 0x00, 0xb2, 0x4b, 0x4f, - 0x87, 0x18, 0x96, 0x17, 0x7e, 0xc7, 0x4a, 0xef, 0xcb, 0x32, 0x43, 0x4b, 0xde, 0x97, 0xad, 0xe1, - 0x91, 0xa5, 0x3e, 0x51, 0x1d, 0xbe, 0xaf, 0x48, 0x1a, 0x64, 0xb7, 0xac, 0xec, 0x98, 0xa2, 0x8f, - 0xe1, 0x4e, 0x1b, 0xc5, 0xd4, 0xe5, 0xe0, 0x5c, 0xc8, 0xd2, 0x6f, 0xe5, 0xa4, 0xb3, 0xf7, 0x8b, - 0xfa, 0xf6, 0x75, 0xaf, 0xf2, 0xe4, 0x5e, 0x51, 0xbc, 0x0f, 0xc8, 0xcb, 0x65, 0xbc, 0x7c, 0x14, - 0x7a, 0xfa, 0x6e, 0x40, 0x62, 0x58, 0x91, 0x62, 0x95, 0xad, 0x93, 0x46, 0x8e, 0x5b, 0xe2, 0xf8, - 0xf5, 0x7a, 0x61, 0x21, 0xf5, 0x2b, 0xcd, 0xfb, 0x40, 0xf1, 0xee, 0x91, 0x9d, 0x32, 0xde, 0x40, - 0x86, 0x3f, 0x7a, 0xf4, 0xcb, 0xd5, 0xae, 0xf1, 0xeb, 0xd5, 0xae, 0xf1, 0xfb, 0xd5, 0xae, 0xf1, - 0xf1, 0x6b, 0xff, 0xec, 0xef, 0x84, 0x17, 0x30, 0x0c, 0xf3, 0x7f, 0x35, 0x9d, 0x9a, 0xba, 0xf8, - 0x1f, 0xff, 0x19, 0x00, 0x00, 0xff, 0xff, 0x28, 0x9d, 0xea, 0xa8, 0xf6, 0x0c, 0x00, 0x00, + // 950 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x96, 0xcf, 0x6f, 0xe3, 0x44, + 0x14, 0xc7, 0xe5, 0xa4, 0xcd, 0x6e, 0x27, 0x4b, 0x29, 0xb3, 0xbb, 0xc5, 0x0d, 0xdd, 0x6e, 0x18, + 0x44, 0x15, 0x15, 0x3a, 0x56, 0x53, 0x90, 0x56, 0x70, 0x62, 0x77, 0xab, 0x80, 0xd4, 0x03, 0xb8, + 0x20, 0x10, 0x07, 0xd0, 0xc4, 0x7e, 0xca, 0xce, 0xc6, 0xf1, 0x0c, 0x9e, 0x89, 0xb7, 0x21, 0xea, + 0x05, 0x09, 0x90, 0x38, 0x70, 0x80, 0x13, 0xff, 0x00, 0x27, 0xfe, 0x09, 0x6e, 0x1c, 0x91, 0xf8, + 0x07, 0x50, 0xc5, 0x1f, 0x82, 0x3c, 0xfe, 0x91, 0x38, 0xa9, 0x11, 0x68, 0xc3, 0x9e, 0x3c, 0x1e, + 0x3f, 0xbf, 0xef, 0xe7, 0xbd, 0x99, 0x79, 0x6f, 0xd0, 0xae, 0x82, 0x28, 0x86, 0xc8, 0x91, 0x91, + 0x78, 0x0c, 0x9e, 0xce, 0x9f, 0x54, 0x46, 0x42, 0x0b, 0x7c, 0x2d, 0x7b, 0x6d, 0xed, 0x0e, 0x84, + 0x18, 0x04, 0xe0, 0x30, 0xc9, 0x1d, 0x16, 0x86, 0x42, 0x33, 0xcd, 0x45, 0xa8, 0x52, 0xb3, 0x16, + 0x19, 0xde, 0x53, 0x94, 0x0b, 0xf3, 0xd5, 0x13, 0x11, 0x38, 0xf1, 0x91, 0x33, 0x80, 0x10, 0x22, + 0xa6, 0xc1, 0xcf, 0x6c, 0x4e, 0x07, 0x5c, 0x3f, 0x1a, 0xf7, 0xa9, 0x27, 0x46, 0x0e, 0x8b, 0x06, + 0x22, 0xf1, 0x6c, 0x06, 0x87, 0x9e, 0xef, 0xc4, 0x5d, 0x47, 0x0e, 0x07, 0xc9, 0xff, 0xca, 0x61, + 0x52, 0x06, 0xdc, 0x33, 0xfe, 0x9d, 0xf8, 0x88, 0x05, 0xf2, 0x11, 0x5b, 0xf2, 0x46, 0x7e, 0xb0, + 0xd0, 0xad, 0xf7, 0x53, 0xb6, 0x07, 0x11, 0x30, 0x0d, 0x2e, 0x7c, 0x31, 0x06, 0xa5, 0x71, 0x1f, + 0xe5, 0xcc, 0xb6, 0xd5, 0xb6, 0x3a, 0xcd, 0xee, 0xbb, 0x74, 0x26, 0x4c, 0x73, 0x61, 0x33, 0xf8, + 0xdc, 0xf3, 0x69, 0xdc, 0xa5, 0x72, 0x38, 0xa0, 0x89, 0x30, 0x9d, 0x13, 0xa6, 0xb9, 0x30, 0x7d, + 0x47, 0xca, 0x4c, 0xc7, 0xcd, 0x1d, 0xe3, 0x6d, 0xd4, 0x18, 0x4b, 0x05, 0x91, 0xb6, 0x6b, 0x6d, + 0xab, 0x73, 0xdd, 0xcd, 0xde, 0xc8, 0x10, 0xed, 0x64, 0xb6, 0x1f, 0x8a, 0x21, 0x84, 0x0f, 0x21, + 0x80, 0x19, 0x98, 0x5d, 0x06, 0xdb, 0x98, 0xb9, 0xc3, 0x68, 0x2d, 0x12, 0x01, 0x18, 0x67, 0x1b, + 0xae, 0x19, 0xe3, 0x2d, 0x54, 0xe7, 0x4c, 0xdb, 0xf5, 0xb6, 0xd5, 0xa9, 0xbb, 0xc9, 0x10, 0x6f, + 0xa2, 0x1a, 0xf7, 0xed, 0x35, 0x63, 0x53, 0xe3, 0x3e, 0xf9, 0xc9, 0x2a, 0xab, 0x95, 0xd3, 0x50, + 0xad, 0xd6, 0x46, 0x4d, 0x1f, 0x94, 0x17, 0x71, 0x99, 0x04, 0x9a, 0x89, 0xce, 0x4f, 0x15, 0x3c, + 0xf5, 0x39, 0x9e, 0x5d, 0xb4, 0x01, 0xe7, 0x92, 0x47, 0xa0, 0xde, 0x0b, 0x0d, 0x44, 0xdd, 0x9d, + 0x4d, 0x64, 0x6c, 0xeb, 0x05, 0xdb, 0xeb, 0xc5, 0xe2, 0x18, 0x34, 0x17, 0x94, 0x14, 0xa1, 0x02, + 0x7c, 0x0b, 0xad, 0xeb, 0x64, 0x22, 0x63, 0x4a, 0x5f, 0x08, 0x41, 0x37, 0x32, 0xeb, 0x0f, 0xc6, + 0x10, 0x4d, 0x12, 0xfd, 0x90, 0x8d, 0x20, 0x33, 0x32, 0x63, 0xf2, 0x65, 0xe1, 0xf1, 0x23, 0xe9, + 0x3f, 0xdb, 0xe5, 0x26, 0xcf, 0xa3, 0xe7, 0x4e, 0x46, 0x52, 0x4f, 0xf2, 0x30, 0xc8, 0x3e, 0xda, + 0x3a, 0x9b, 0x84, 0xde, 0xc7, 0x3c, 0xf4, 0xc5, 0x13, 0x55, 0x0d, 0x3d, 0x41, 0x37, 0xe7, 0xec, + 0x8a, 0x2c, 0xf4, 0xd1, 0xb5, 0x27, 0xe9, 0x94, 0x6d, 0xb5, 0xeb, 0x4f, 0xcf, 0x3c, 0xd3, 0x70, + 0x73, 0xc7, 0xe4, 0x1c, 0x6d, 0xf7, 0x02, 0xd1, 0x67, 0x41, 0x16, 0xcd, 0x4c, 0xfd, 0x33, 0xb4, + 0xce, 0x35, 0x8c, 0x56, 0xa4, 0x3d, 0x97, 0xaf, 0xd4, 0x2d, 0xf9, 0xb5, 0x8e, 0xec, 0x87, 0xa0, + 0x19, 0x0f, 0xc0, 0x5f, 0x12, 0x97, 0x68, 0x73, 0x50, 0xc2, 0x5a, 0x39, 0xc5, 0x82, 0xff, 0xf9, + 0x0d, 0x52, 0xfb, 0xbf, 0xea, 0x41, 0x80, 0x6e, 0x44, 0x20, 0x85, 0xe2, 0x5a, 0x44, 0x1c, 0x94, + 0x5d, 0x5f, 0x45, 0x4c, 0x6e, 0xee, 0x71, 0xe2, 0x96, 0xbc, 0x63, 0x86, 0xae, 0x7b, 0xc1, 0x58, + 0x69, 0x88, 0x94, 0xbd, 0x66, 0x94, 0x4e, 0x9e, 0x4e, 0xe9, 0x41, 0xea, 0xcd, 0x2d, 0xdc, 0x76, + 0x7f, 0x69, 0xa2, 0xcd, 0x2c, 0xca, 0x33, 0x88, 0x62, 0xee, 0x01, 0xfe, 0xce, 0x42, 0xcd, 0xb4, + 0xc4, 0x98, 0x23, 0x8d, 0x09, 0xcd, 0x3b, 0x45, 0x65, 0x11, 0x6a, 0xdd, 0xb9, 0xd2, 0xa6, 0x38, + 0x46, 0xf7, 0xbe, 0xfa, 0xe3, 0xaf, 0x1f, 0x6b, 0x5d, 0x72, 0x68, 0xfa, 0x46, 0x7c, 0x94, 0xf7, + 0x1e, 0xe5, 0x4c, 0xb3, 0xd1, 0x85, 0x93, 0x14, 0x1f, 0xe5, 0x4c, 0x93, 0xc7, 0x85, 0x63, 0xca, + 0xc5, 0x5b, 0xd6, 0x01, 0xfe, 0xc6, 0x42, 0xcd, 0xb4, 0xba, 0xfe, 0x13, 0x4c, 0xa9, 0xfe, 0xb6, + 0xb6, 0x0b, 0x9b, 0xf2, 0x61, 0x7e, 0xdb, 0x50, 0xbc, 0x79, 0x70, 0xfc, 0x9f, 0x28, 0x9c, 0x29, + 0x67, 0xfa, 0x02, 0x7f, 0x6f, 0xa1, 0x46, 0x1a, 0x33, 0x5e, 0x0a, 0xb6, 0x9c, 0x8b, 0x95, 0x6d, + 0x3b, 0xf2, 0x92, 0x01, 0xbe, 0x4d, 0xb6, 0x16, 0x81, 0x93, 0xcc, 0x7c, 0x6d, 0xa1, 0xb5, 0x53, + 0xae, 0x34, 0xbe, 0xbd, 0x88, 0x63, 0xca, 0x54, 0xeb, 0x74, 0x55, 0x18, 0x89, 0x08, 0xb1, 0x0d, + 0x0a, 0xc6, 0x4b, 0x28, 0xf8, 0x1c, 0xe1, 0x1e, 0xe8, 0x85, 0x3a, 0x50, 0x05, 0xf5, 0x72, 0x31, + 0x5d, 0x55, 0x38, 0x48, 0xc7, 0x28, 0x11, 0xdc, 0x5e, 0x5e, 0xa5, 0xa4, 0xd4, 0x5e, 0x38, 0x7e, + 0xf6, 0x27, 0xfe, 0xd6, 0x42, 0xf5, 0x1e, 0x54, 0x6a, 0xad, 0x6e, 0x1d, 0xee, 0x1a, 0xa4, 0x1d, + 0xfc, 0x62, 0x05, 0x12, 0x9e, 0xa2, 0x17, 0x7a, 0xa0, 0xcb, 0x65, 0xb8, 0x0a, 0xeb, 0x6e, 0x31, + 0x7d, 0x75, 0xd9, 0x26, 0xd4, 0xa8, 0x75, 0xf0, 0x7e, 0x55, 0x02, 0xd2, 0xba, 0x57, 0x2c, 0xc0, + 0xcf, 0x16, 0x6a, 0xa4, 0xad, 0x72, 0x79, 0x67, 0x96, 0x5a, 0xe8, 0x0a, 0x33, 0x72, 0x6c, 0x18, + 0x0f, 0x5b, 0x9d, 0xca, 0xa3, 0x44, 0x47, 0xa0, 0x99, 0xcf, 0x34, 0xa3, 0x06, 0x3a, 0xd9, 0xb1, + 0x9f, 0xa0, 0x46, 0x7a, 0x50, 0xab, 0x52, 0x53, 0x75, 0x70, 0xb3, 0xfc, 0x1f, 0x54, 0xe6, 0xff, + 0x31, 0x42, 0xc9, 0x2e, 0x3d, 0x89, 0x21, 0xac, 0x4e, 0xfc, 0x1d, 0x9a, 0xde, 0x5d, 0x93, 0x08, + 0x69, 0x72, 0x77, 0xa5, 0xf1, 0x11, 0x35, 0xbf, 0x98, 0x1d, 0xbe, 0x6f, 0x44, 0xda, 0x78, 0xaf, + 0x2a, 0xed, 0x90, 0x7a, 0x9f, 0xa2, 0x9b, 0x3d, 0xd0, 0x73, 0xdd, 0xfe, 0x4c, 0x27, 0xa9, 0xdf, + 0x29, 0x44, 0x17, 0x2f, 0x0c, 0xad, 0xdd, 0xab, 0x3e, 0x15, 0xc1, 0xbd, 0x66, 0x74, 0x5f, 0xc5, + 0xaf, 0x54, 0xe9, 0xaa, 0x49, 0xe8, 0x65, 0xcd, 0xfe, 0xfe, 0xfd, 0xdf, 0x2e, 0xf7, 0xac, 0xdf, + 0x2f, 0xf7, 0xac, 0x3f, 0x2f, 0xf7, 0xac, 0x4f, 0xdf, 0xf8, 0x77, 0x17, 0x6d, 0x2f, 0xe0, 0x10, + 0x16, 0xf7, 0xfd, 0x7e, 0xc3, 0xdc, 0xab, 0x8f, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x1d, + 0x2d, 0x85, 0x10, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -802,8 +750,6 @@ type ProjectServiceClient interface { ListEvents(ctx context.Context, in *ProjectQuery, opts ...grpc.CallOption) (*v1.EventList, error) // GetSchedulesState returns true if there are any active sync syncWindows GetSyncWindowsState(ctx context.Context, in *SyncWindowsQuery, opts ...grpc.CallOption) (*SyncWindowsResponse, error) - // ListLinks returns all deep links for the particular project - ListLinks(ctx context.Context, in *ListProjectLinksRequest, opts ...grpc.CallOption) (*application.LinksResponse, error) } type projectServiceClient struct { @@ -913,15 +859,6 @@ func (c *projectServiceClient) GetSyncWindowsState(ctx context.Context, in *Sync return out, nil } -func (c *projectServiceClient) ListLinks(ctx context.Context, in *ListProjectLinksRequest, opts ...grpc.CallOption) (*application.LinksResponse, error) { - out := new(application.LinksResponse) - err := c.cc.Invoke(ctx, "/project.ProjectService/ListLinks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // ProjectServiceServer is the server API for ProjectService service. type ProjectServiceServer interface { // Create a new project token @@ -946,8 +883,6 @@ type ProjectServiceServer interface { ListEvents(context.Context, *ProjectQuery) (*v1.EventList, error) // GetSchedulesState returns true if there are any active sync syncWindows GetSyncWindowsState(context.Context, *SyncWindowsQuery) (*SyncWindowsResponse, error) - // ListLinks returns all deep links for the particular project - ListLinks(context.Context, *ListProjectLinksRequest) (*application.LinksResponse, error) } // UnimplementedProjectServiceServer can be embedded to have forward compatible implementations. @@ -987,9 +922,6 @@ func (*UnimplementedProjectServiceServer) ListEvents(ctx context.Context, req *P func (*UnimplementedProjectServiceServer) GetSyncWindowsState(ctx context.Context, req *SyncWindowsQuery) (*SyncWindowsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetSyncWindowsState not implemented") } -func (*UnimplementedProjectServiceServer) ListLinks(ctx context.Context, req *ListProjectLinksRequest) (*application.LinksResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListLinks not implemented") -} func RegisterProjectServiceServer(s *grpc.Server, srv ProjectServiceServer) { s.RegisterService(&_ProjectService_serviceDesc, srv) @@ -1193,24 +1125,6 @@ func _ProjectService_GetSyncWindowsState_Handler(srv interface{}, ctx context.Co return interceptor(ctx, in, info, handler) } -func _ProjectService_ListLinks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListProjectLinksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ProjectServiceServer).ListLinks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/project.ProjectService/ListLinks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProjectServiceServer).ListLinks(ctx, req.(*ListProjectLinksRequest)) - } - return interceptor(ctx, in, info, handler) -} - var _ProjectService_serviceDesc = grpc.ServiceDesc{ ServiceName: "project.ProjectService", HandlerType: (*ProjectServiceServer)(nil), @@ -1259,10 +1173,6 @@ var _ProjectService_serviceDesc = grpc.ServiceDesc{ MethodName: "GetSyncWindowsState", Handler: _ProjectService_GetSyncWindowsState_Handler, }, - { - MethodName: "ListLinks", - Handler: _ProjectService_ListLinks_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "server/project/project.proto", @@ -1761,40 +1671,6 @@ func (m *DetailedProjectsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *ListProjectLinksRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListProjectLinksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListProjectLinksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintProject(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func encodeVarintProject(dAtA []byte, offset int, v uint64) int { offset -= sovProject(v) base := offset @@ -2029,22 +1905,6 @@ func (m *DetailedProjectsResponse) Size() (n int) { return n } -func (m *ListProjectLinksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovProject(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func sovProject(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -3268,89 +3128,6 @@ func (m *DetailedProjectsResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *ListProjectLinksRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProject - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ListProjectLinksRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListProjectLinksRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProject - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProject - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProject - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProject(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProject - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipProject(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apiclient/project/project.pb.gw.go b/pkg/apiclient/project/project.pb.gw.go index f672aa23cd83f..8ae2e95a62a69 100644 --- a/pkg/apiclient/project/project.pb.gw.go +++ b/pkg/apiclient/project/project.pb.gw.go @@ -705,60 +705,6 @@ func local_request_ProjectService_GetSyncWindowsState_0(ctx context.Context, mar } -func request_ProjectService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, client ProjectServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListProjectLinksRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["name"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") - } - - protoReq.Name, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) - } - - msg, err := client.ListLinks(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ProjectService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, server ProjectServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListProjectLinksRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["name"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") - } - - protoReq.Name, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) - } - - msg, err := server.ListLinks(ctx, &protoReq) - return msg, metadata, err - -} - // RegisterProjectServiceHandlerServer registers the http handlers for service ProjectService to "mux". // UnaryRPC :call ProjectServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -1018,29 +964,6 @@ func RegisterProjectServiceHandlerServer(ctx context.Context, mux *runtime.Serve }) - mux.Handle("GET", pattern_ProjectService_ListLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ProjectService_ListLinks_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ProjectService_ListLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -1302,26 +1225,6 @@ func RegisterProjectServiceHandlerClient(ctx context.Context, mux *runtime.Serve }) - mux.Handle("GET", pattern_ProjectService_ListLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ProjectService_ListLinks_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ProjectService_ListLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -1347,8 +1250,6 @@ var ( pattern_ProjectService_ListEvents_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "projects", "name", "events"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ProjectService_GetSyncWindowsState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "projects", "name", "syncwindows"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ProjectService_ListLinks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "projects", "name", "links"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -1373,6 +1274,4 @@ var ( forward_ProjectService_ListEvents_0 = runtime.ForwardResponseMessage forward_ProjectService_GetSyncWindowsState_0 = runtime.ForwardResponseMessage - - forward_ProjectService_ListLinks_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/apiclient/repository/repository.pb.go b/pkg/apiclient/repository/repository.pb.go index b70b3ab1b9585..d99884b85d953 100644 --- a/pkg/apiclient/repository/repository.pb.go +++ b/pkg/apiclient/repository/repository.pb.go @@ -364,9 +364,7 @@ type RepoAccessQuery struct { // HTTP/HTTPS proxy to access the repository Proxy string `protobuf:"bytes,16,opt,name=proxy,proto3" json:"proxy,omitempty"` // Reference between project and repository that allow you automatically to be added as item inside SourceRepos project entity - Project string `protobuf:"bytes,17,opt,name=project,proto3" json:"project,omitempty"` - // Google Cloud Platform service account key - GcpServiceAccountKey string `protobuf:"bytes,18,opt,name=gcpServiceAccountKey,proto3" json:"gcpServiceAccountKey,omitempty"` + Project string `protobuf:"bytes,17,opt,name=project,proto3" json:"project,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -517,13 +515,6 @@ func (m *RepoAccessQuery) GetProject() string { return "" } -func (m *RepoAccessQuery) GetGcpServiceAccountKey() string { - if m != nil { - return m.GcpServiceAccountKey - } - return "" -} - type RepoResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -694,78 +685,77 @@ func init() { } var fileDescriptor_8d38260443475705 = []byte{ - // 1127 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0xcd, 0x6e, 0x1c, 0x45, - 0x10, 0xd6, 0xd8, 0xce, 0xda, 0x2e, 0xff, 0x64, 0xdd, 0x36, 0x61, 0xd8, 0x38, 0x8e, 0x35, 0x09, - 0x91, 0xb1, 0xc2, 0x4c, 0xbc, 0x08, 0x81, 0x82, 0x40, 0x72, 0x6c, 0x2b, 0xb1, 0xb0, 0x70, 0x98, - 0xc8, 0x1c, 0x10, 0x08, 0xb5, 0x67, 0xcb, 0xbb, 0x93, 0xcc, 0xce, 0x74, 0xba, 0x7b, 0x17, 0x56, - 0x51, 0x2e, 0x9c, 0x90, 0xe0, 0x82, 0x10, 0x12, 0x37, 0x2e, 0x48, 0x1c, 0x78, 0x01, 0x1e, 0x81, - 0x23, 0x12, 0x2f, 0x80, 0x2c, 0x5e, 0x80, 0x17, 0x40, 0xa8, 0xbb, 0x67, 0x67, 0x66, 0xbd, 0x3f, - 0x76, 0x84, 0xf1, 0xad, 0xeb, 0xab, 0x9a, 0xaa, 0xaf, 0xbf, 0xae, 0xae, 0xde, 0x05, 0x47, 0x20, - 0x6f, 0x23, 0xf7, 0x38, 0xb2, 0x44, 0x84, 0x32, 0xe1, 0x9d, 0xc2, 0xd2, 0x65, 0x3c, 0x91, 0x09, - 0x81, 0x1c, 0xa9, 0x2c, 0xd7, 0x93, 0xa4, 0x1e, 0xa1, 0x47, 0x59, 0xe8, 0xd1, 0x38, 0x4e, 0x24, - 0x95, 0x61, 0x12, 0x0b, 0x13, 0x59, 0xd9, 0xab, 0x87, 0xb2, 0xd1, 0x3a, 0x74, 0x83, 0xa4, 0xe9, - 0x51, 0x5e, 0x4f, 0x18, 0x4f, 0x1e, 0xeb, 0xc5, 0xeb, 0x41, 0xcd, 0x6b, 0x57, 0x3d, 0xf6, 0xa4, - 0xae, 0xbe, 0x14, 0x1e, 0x65, 0x2c, 0x0a, 0x03, 0xfd, 0xad, 0xd7, 0xde, 0xa0, 0x11, 0x6b, 0xd0, - 0x0d, 0xaf, 0x8e, 0x31, 0x72, 0x2a, 0xb1, 0x96, 0x66, 0xdb, 0x39, 0x25, 0x9b, 0xa6, 0x75, 0x2a, - 0x7d, 0xa7, 0x03, 0x73, 0x3e, 0xb2, 0x64, 0x93, 0x31, 0xf1, 0x61, 0x0b, 0x79, 0x87, 0x10, 0x98, - 0x50, 0x41, 0xb6, 0xb5, 0x6a, 0xad, 0x4d, 0xfb, 0x7a, 0x4d, 0x2a, 0x30, 0xc5, 0xb1, 0x1d, 0x8a, - 0x30, 0x89, 0xed, 0x31, 0x8d, 0x67, 0x36, 0xb1, 0x61, 0x92, 0x32, 0xf6, 0x01, 0x6d, 0xa2, 0x3d, - 0xae, 0x5d, 0x5d, 0x93, 0xac, 0x00, 0x50, 0xc6, 0x1e, 0xf2, 0xe4, 0x31, 0x06, 0xd2, 0x9e, 0xd0, - 0xce, 0x02, 0xe2, 0x6c, 0xc0, 0xe4, 0x26, 0x63, 0xbb, 0xf1, 0x51, 0xa2, 0x8a, 0xca, 0x0e, 0xc3, - 0x6e, 0x51, 0xb5, 0x56, 0x18, 0xa3, 0xb2, 0x91, 0x16, 0xd4, 0x6b, 0xe7, 0x57, 0x0b, 0x16, 0x53, - 0xba, 0xdb, 0x28, 0x69, 0x18, 0xa5, 0xa4, 0xeb, 0x50, 0x12, 0x49, 0x8b, 0x07, 0x26, 0xc3, 0x4c, - 0x75, 0xdf, 0xcd, 0xd5, 0x71, 0xbb, 0xea, 0xe8, 0xc5, 0x67, 0x41, 0xcd, 0x6d, 0x57, 0x5d, 0xf6, - 0xa4, 0xee, 0x2a, 0xad, 0xdd, 0x82, 0xd6, 0x6e, 0x57, 0x6b, 0x77, 0x33, 0x07, 0x1f, 0xe9, 0xb4, - 0x7e, 0x9a, 0xbe, 0xb8, 0xdb, 0xb1, 0x51, 0xbb, 0x1d, 0xef, 0xdb, 0xed, 0xbb, 0x50, 0xee, 0x0a, - 0xed, 0xa3, 0x60, 0x49, 0x2c, 0x90, 0xbc, 0x06, 0x97, 0x42, 0x89, 0x4d, 0x61, 0x5b, 0xab, 0xe3, - 0x6b, 0x33, 0xd5, 0x45, 0xb7, 0x70, 0x3c, 0xa9, 0x34, 0xbe, 0x89, 0x70, 0xb6, 0x60, 0x5a, 0x7d, - 0x3e, 0xfc, 0x8c, 0x1c, 0x98, 0x3d, 0x4a, 0x14, 0x55, 0x3c, 0xe2, 0x28, 0x8c, 0x6c, 0x53, 0x7e, - 0x0f, 0xe6, 0xfc, 0x3d, 0x01, 0x97, 0x35, 0x89, 0x20, 0x40, 0x31, 0xfa, 0xbc, 0x5b, 0x02, 0x79, - 0x9c, 0x6f, 0x33, 0xb3, 0x95, 0x8f, 0x51, 0x21, 0x3e, 0x4f, 0x78, 0x2d, 0xdd, 0x65, 0x66, 0x93, - 0x9b, 0x30, 0x27, 0x44, 0xe3, 0x21, 0x0f, 0xdb, 0x54, 0xe2, 0xfb, 0xd8, 0x49, 0x0f, 0xbd, 0x17, - 0x54, 0x19, 0xc2, 0x58, 0x60, 0xd0, 0xe2, 0x68, 0x5f, 0xd2, 0x2c, 0x33, 0x9b, 0xdc, 0x86, 0x05, - 0x19, 0x89, 0xad, 0x28, 0xc4, 0x58, 0x6e, 0x21, 0x97, 0xdb, 0x54, 0x52, 0xbb, 0xa4, 0xb3, 0xf4, - 0x3b, 0xc8, 0x3a, 0x94, 0x7b, 0x40, 0x55, 0x72, 0x52, 0x07, 0xf7, 0xe1, 0x59, 0x8b, 0x4d, 0xf7, - 0xb6, 0x98, 0xde, 0x23, 0x18, 0x4c, 0xef, 0x6f, 0x19, 0xa6, 0x31, 0xa6, 0x87, 0x11, 0xee, 0x07, - 0xa1, 0x3d, 0xa3, 0xe9, 0xe5, 0x00, 0xb9, 0x03, 0x8b, 0xa6, 0xb3, 0x36, 0xd5, 0xc9, 0x66, 0xfb, - 0x9c, 0xd5, 0x09, 0x06, 0xb9, 0xc8, 0x2a, 0xcc, 0x64, 0xf0, 0xee, 0xb6, 0x3d, 0xb7, 0x6a, 0xad, - 0x8d, 0xfb, 0x45, 0x88, 0xbc, 0x0d, 0x2f, 0xe7, 0x66, 0x2c, 0x24, 0x8d, 0x22, 0xdd, 0x7a, 0xbb, - 0xdb, 0xf6, 0xbc, 0x8e, 0x1e, 0xe6, 0x26, 0xef, 0x41, 0x25, 0x73, 0xed, 0xc4, 0x12, 0x39, 0xe3, - 0xa1, 0xc0, 0x7b, 0x54, 0xe0, 0x01, 0x8f, 0xec, 0xcb, 0x9a, 0xd4, 0x88, 0x08, 0xb2, 0x04, 0x97, - 0x18, 0x4f, 0xbe, 0xe8, 0xd8, 0x65, 0x1d, 0x6a, 0x0c, 0xd5, 0xe3, 0x2c, 0x6d, 0xe3, 0x05, 0xd3, - 0xe3, 0xa9, 0x49, 0xaa, 0xb0, 0x54, 0x0f, 0xd8, 0x23, 0xe4, 0xed, 0x30, 0xc0, 0xcd, 0x20, 0x48, - 0x5a, 0xb1, 0xd6, 0x9c, 0xe8, 0xb0, 0x81, 0x3e, 0x67, 0x1e, 0x66, 0x55, 0xcb, 0x75, 0x7b, 0xde, - 0xf9, 0xd9, 0x82, 0x05, 0x05, 0x6c, 0x71, 0xa4, 0x12, 0x7d, 0x7c, 0xda, 0x42, 0x21, 0xc9, 0x27, - 0x85, 0x2e, 0x9c, 0xa9, 0x3e, 0xf8, 0x6f, 0xd7, 0xd7, 0xcf, 0x6e, 0x51, 0xda, 0xcf, 0x57, 0xa0, - 0xd4, 0x62, 0x02, 0xb9, 0x4c, 0x6f, 0x45, 0x6a, 0xa9, 0xb3, 0x0e, 0x38, 0xd6, 0xc4, 0x7e, 0x1c, - 0x75, 0x74, 0x33, 0x4f, 0xf9, 0x39, 0xe0, 0x3c, 0x35, 0x44, 0x0f, 0x58, 0xed, 0xa2, 0x88, 0x56, - 0xff, 0x99, 0x37, 0x35, 0x0d, 0x98, 0x8a, 0x49, 0xbe, 0xb1, 0x60, 0x62, 0x2f, 0x14, 0x92, 0xbc, - 0x54, 0x1c, 0x10, 0xd9, 0x38, 0xa8, 0xec, 0x9d, 0x17, 0x0b, 0x55, 0xc4, 0xb9, 0xfe, 0xe5, 0x1f, - 0x7f, 0x7d, 0x37, 0x76, 0x85, 0x2c, 0xe9, 0x67, 0xac, 0xbd, 0x91, 0xbf, 0x19, 0x21, 0x8a, 0xaf, - 0xc6, 0x2c, 0xf2, 0xb5, 0x05, 0xe3, 0xf7, 0x71, 0x28, 0x9b, 0x73, 0xd3, 0xc4, 0xb9, 0xa1, 0x99, - 0x5c, 0x23, 0x57, 0x07, 0x31, 0xf1, 0x9e, 0x29, 0xeb, 0x39, 0xf9, 0xde, 0x82, 0xb2, 0xe2, 0xed, - 0x17, 0x7c, 0x17, 0x23, 0xd4, 0xf2, 0x28, 0xa1, 0xc8, 0xa7, 0x30, 0x65, 0x68, 0x1d, 0x0d, 0xa5, - 0x53, 0xee, 0x85, 0x8f, 0x84, 0xb3, 0xa6, 0x53, 0x3a, 0x64, 0x75, 0xc4, 0x8e, 0x3d, 0xae, 0x52, - 0x36, 0x4d, 0x7a, 0xf5, 0x9c, 0x90, 0x57, 0x4e, 0xa6, 0xcf, 0x5e, 0xf3, 0xca, 0xf2, 0x20, 0x57, - 0x76, 0x17, 0xcf, 0x54, 0x8e, 0xaa, 0x12, 0xdf, 0x5a, 0x30, 0x77, 0x1f, 0x65, 0xfe, 0xee, 0x92, - 0xeb, 0x03, 0x32, 0x17, 0xdf, 0xe4, 0x8a, 0x33, 0x3c, 0x20, 0x23, 0xf0, 0x8e, 0x26, 0xf0, 0xa6, - 0x73, 0x67, 0x30, 0x01, 0xf3, 0xe8, 0xea, 0x3c, 0x07, 0xfe, 0x9e, 0xa6, 0x52, 0x33, 0x19, 0xee, - 0x5a, 0xeb, 0xa4, 0xad, 0x29, 0x3d, 0xc0, 0xa8, 0xb9, 0xd5, 0xa0, 0x5c, 0x0e, 0x95, 0x79, 0xa5, - 0x08, 0xe7, 0xe1, 0x19, 0x09, 0x57, 0x93, 0x58, 0x23, 0xb7, 0x46, 0xa9, 0xd0, 0xc0, 0xa8, 0x19, - 0x98, 0x32, 0x3f, 0x58, 0x50, 0x32, 0xd3, 0x8b, 0x5c, 0x3b, 0x59, 0xb1, 0x67, 0xaa, 0x9d, 0xe3, - 0x55, 0x78, 0x55, 0x73, 0x5c, 0x76, 0x06, 0xf6, 0xda, 0x5d, 0x3d, 0x3c, 0xd4, 0xd5, 0xfc, 0xd1, - 0x82, 0x72, 0x97, 0x42, 0xf7, 0xdb, 0x8b, 0x23, 0xe9, 0x9c, 0x4e, 0x92, 0xfc, 0x64, 0x41, 0xc9, - 0x4c, 0xd4, 0x7e, 0x5e, 0x3d, 0x93, 0xf6, 0x1c, 0x79, 0x6d, 0x98, 0x03, 0xae, 0x8c, 0x68, 0x73, - 0x4d, 0xe5, 0x79, 0x2e, 0xe4, 0x2f, 0x16, 0x94, 0xbb, 0x74, 0x86, 0x0b, 0xf9, 0x7f, 0x11, 0x76, - 0x5f, 0x8c, 0x30, 0xa1, 0x50, 0xda, 0xc6, 0x08, 0x25, 0x0e, 0xbb, 0x02, 0xf6, 0x49, 0x38, 0x6b, - 0xfe, 0x5b, 0x66, 0xc6, 0xae, 0x8f, 0x9a, 0xb1, 0x4a, 0x90, 0x06, 0x94, 0x4d, 0x89, 0x82, 0x1e, - 0x2f, 0x5c, 0xec, 0xc6, 0x19, 0x8a, 0x91, 0x67, 0x30, 0xff, 0x11, 0x8d, 0x42, 0xa5, 0xac, 0xf9, - 0x9d, 0x4a, 0xae, 0xf6, 0x4d, 0x92, 0xfc, 0xf7, 0xeb, 0x88, 0x6a, 0x55, 0x5d, 0xed, 0xb6, 0x73, - 0x73, 0xd4, 0xbd, 0x6e, 0xa7, 0xa5, 0x8c, 0x92, 0xf7, 0x76, 0x7e, 0x3b, 0x5e, 0xb1, 0x7e, 0x3f, - 0x5e, 0xb1, 0xfe, 0x3c, 0x5e, 0xb1, 0x3e, 0x7e, 0xeb, 0x6c, 0xff, 0xd8, 0x02, 0xfd, 0x43, 0xb3, - 0xf0, 0xdf, 0xea, 0xb0, 0xa4, 0xff, 0x5c, 0xbd, 0xf1, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x89, - 0x56, 0x9b, 0x65, 0x41, 0x0e, 0x00, 0x00, + // 1106 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0x4f, 0x6f, 0xdc, 0x44, + 0x14, 0x97, 0xf3, 0x67, 0x93, 0xbc, 0xfc, 0xe9, 0x66, 0x52, 0x8a, 0xd9, 0xa6, 0x69, 0xe4, 0x96, + 0x2a, 0x44, 0xc5, 0x6e, 0x16, 0x21, 0x50, 0x11, 0x48, 0x69, 0x12, 0xb5, 0x11, 0x11, 0x29, 0xae, + 0xc2, 0x01, 0x81, 0xd0, 0xc4, 0xfb, 0xb2, 0xeb, 0xd6, 0x6b, 0x4f, 0x67, 0x66, 0x17, 0x56, 0x55, + 0x2f, 0x9c, 0x90, 0xe0, 0x82, 0x10, 0x12, 0x37, 0x2e, 0x48, 0x1c, 0xf8, 0x02, 0x5c, 0xb8, 0x73, + 0x44, 0xe2, 0x0b, 0xa0, 0x88, 0xcf, 0x81, 0xd0, 0xcc, 0x78, 0x6d, 0x6f, 0xf6, 0x4f, 0x52, 0x11, + 0x72, 0x9b, 0xf7, 0x9b, 0x99, 0xf7, 0x7e, 0xf3, 0x9b, 0xf7, 0xde, 0xd8, 0xe0, 0x08, 0xe4, 0x6d, + 0xe4, 0x1e, 0x47, 0x96, 0x88, 0x50, 0x26, 0xbc, 0x53, 0x18, 0xba, 0x8c, 0x27, 0x32, 0x21, 0x90, + 0x23, 0x95, 0xe5, 0x7a, 0x92, 0xd4, 0x23, 0xf4, 0x28, 0x0b, 0x3d, 0x1a, 0xc7, 0x89, 0xa4, 0x32, + 0x4c, 0x62, 0x61, 0x56, 0x56, 0xf6, 0xea, 0xa1, 0x6c, 0xb4, 0x0e, 0xdd, 0x20, 0x69, 0x7a, 0x94, + 0xd7, 0x13, 0xc6, 0x93, 0xc7, 0x7a, 0xf0, 0x7a, 0x50, 0xf3, 0xda, 0x55, 0x8f, 0x3d, 0xa9, 0xab, + 0x9d, 0xc2, 0xa3, 0x8c, 0x45, 0x61, 0xa0, 0xf7, 0x7a, 0xed, 0x0d, 0x1a, 0xb1, 0x06, 0xdd, 0xf0, + 0xea, 0x18, 0x23, 0xa7, 0x12, 0x6b, 0xa9, 0xb7, 0x9d, 0x53, 0xbc, 0x69, 0x5a, 0xa7, 0xd2, 0x77, + 0x3a, 0x30, 0xef, 0x23, 0x4b, 0x36, 0x19, 0x13, 0x1f, 0xb6, 0x90, 0x77, 0x08, 0x81, 0x09, 0xb5, + 0xc8, 0xb6, 0x56, 0xad, 0xb5, 0x19, 0x5f, 0x8f, 0x49, 0x05, 0xa6, 0x39, 0xb6, 0x43, 0x11, 0x26, + 0xb1, 0x3d, 0xa6, 0xf1, 0xcc, 0x26, 0x36, 0x4c, 0x51, 0xc6, 0x3e, 0xa0, 0x4d, 0xb4, 0xc7, 0xf5, + 0x54, 0xd7, 0x24, 0x2b, 0x00, 0x94, 0xb1, 0x87, 0x3c, 0x79, 0x8c, 0x81, 0xb4, 0x27, 0xf4, 0x64, + 0x01, 0x71, 0x36, 0x60, 0x6a, 0x93, 0xb1, 0xdd, 0xf8, 0x28, 0x51, 0x41, 0x65, 0x87, 0x61, 0x37, + 0xa8, 0x1a, 0x2b, 0x8c, 0x51, 0xd9, 0x48, 0x03, 0xea, 0xb1, 0xf3, 0xab, 0x05, 0x4b, 0x29, 0xdd, + 0x6d, 0x94, 0x34, 0x8c, 0x52, 0xd2, 0x75, 0x28, 0x89, 0xa4, 0xc5, 0x03, 0xe3, 0x61, 0xb6, 0xba, + 0xef, 0xe6, 0xea, 0xb8, 0x5d, 0x75, 0xf4, 0xe0, 0xb3, 0xa0, 0xe6, 0xb6, 0xab, 0x2e, 0x7b, 0x52, + 0x77, 0x95, 0xd6, 0x6e, 0x41, 0x6b, 0xb7, 0xab, 0xb5, 0xbb, 0x99, 0x83, 0x8f, 0xb4, 0x5b, 0x3f, + 0x75, 0x5f, 0x3c, 0xed, 0xd8, 0xa8, 0xd3, 0x8e, 0xf7, 0x9d, 0xf6, 0x5d, 0x28, 0x77, 0x85, 0xf6, + 0x51, 0xb0, 0x24, 0x16, 0x48, 0x5e, 0x83, 0xc9, 0x50, 0x62, 0x53, 0xd8, 0xd6, 0xea, 0xf8, 0xda, + 0x6c, 0x75, 0xc9, 0x2d, 0x5c, 0x4f, 0x2a, 0x8d, 0x6f, 0x56, 0x38, 0x5b, 0x30, 0xa3, 0xb6, 0x0f, + 0xbf, 0x23, 0x07, 0xe6, 0x8e, 0x12, 0x45, 0x15, 0x8f, 0x38, 0x0a, 0x23, 0xdb, 0xb4, 0xdf, 0x83, + 0x39, 0xbf, 0x4d, 0xc0, 0x25, 0x4d, 0x22, 0x08, 0x50, 0x8c, 0xbe, 0xef, 0x96, 0x40, 0x1e, 0xe7, + 0xc7, 0xcc, 0x6c, 0x35, 0xc7, 0xa8, 0x10, 0x9f, 0x27, 0xbc, 0x96, 0x9e, 0x32, 0xb3, 0xc9, 0x4d, + 0x98, 0x17, 0xa2, 0xf1, 0x90, 0x87, 0x6d, 0x2a, 0xf1, 0x7d, 0xec, 0xa4, 0x97, 0xde, 0x0b, 0x2a, + 0x0f, 0x61, 0x2c, 0x30, 0x68, 0x71, 0xb4, 0x27, 0x35, 0xcb, 0xcc, 0x26, 0xb7, 0x61, 0x51, 0x46, + 0x62, 0x2b, 0x0a, 0x31, 0x96, 0x5b, 0xc8, 0xe5, 0x36, 0x95, 0xd4, 0x2e, 0x69, 0x2f, 0xfd, 0x13, + 0x64, 0x1d, 0xca, 0x3d, 0xa0, 0x0a, 0x39, 0xa5, 0x17, 0xf7, 0xe1, 0x59, 0x8a, 0xcd, 0xf4, 0xa6, + 0x98, 0x3e, 0x23, 0x18, 0x4c, 0x9f, 0x6f, 0x19, 0x66, 0x30, 0xa6, 0x87, 0x11, 0xee, 0x07, 0xa1, + 0x3d, 0xab, 0xe9, 0xe5, 0x00, 0xb9, 0x03, 0x4b, 0x26, 0xb3, 0x36, 0xd5, 0xcd, 0x66, 0xe7, 0x9c, + 0xd3, 0x0e, 0x06, 0x4d, 0x91, 0x55, 0x98, 0xcd, 0xe0, 0xdd, 0x6d, 0x7b, 0x7e, 0xd5, 0x5a, 0x1b, + 0xf7, 0x8b, 0x10, 0x79, 0x1b, 0x5e, 0xce, 0xcd, 0x58, 0x48, 0x1a, 0x45, 0x3a, 0xf5, 0x76, 0xb7, + 0xed, 0x05, 0xbd, 0x7a, 0xd8, 0x34, 0x79, 0x0f, 0x2a, 0xd9, 0xd4, 0x4e, 0x2c, 0x91, 0x33, 0x1e, + 0x0a, 0xbc, 0x47, 0x05, 0x1e, 0xf0, 0xc8, 0xbe, 0xa4, 0x49, 0x8d, 0x58, 0x41, 0x2e, 0xc3, 0x24, + 0xe3, 0xc9, 0x17, 0x1d, 0xbb, 0xac, 0x97, 0x1a, 0x43, 0xe5, 0x38, 0x4b, 0xd3, 0x78, 0xd1, 0xe4, + 0x78, 0x6a, 0x3a, 0x0b, 0x30, 0xa7, 0xd2, 0xa7, 0x9b, 0xbf, 0xce, 0xcf, 0x16, 0x2c, 0x2a, 0x60, + 0x8b, 0x23, 0x95, 0xe8, 0xe3, 0xd3, 0x16, 0x0a, 0x49, 0x3e, 0x29, 0x64, 0xd4, 0x6c, 0xf5, 0xc1, + 0x7f, 0x2b, 0x45, 0x3f, 0xab, 0x88, 0x34, 0x37, 0xaf, 0x40, 0xa9, 0xc5, 0x04, 0x72, 0x99, 0x66, + 0x78, 0x6a, 0xa9, 0x7b, 0x0b, 0x38, 0xd6, 0xc4, 0x7e, 0x1c, 0x75, 0x74, 0x62, 0x4e, 0xfb, 0x39, + 0xe0, 0x3c, 0x35, 0x44, 0x0f, 0x58, 0xed, 0xa2, 0x88, 0x56, 0xff, 0x59, 0x30, 0x31, 0x0d, 0xf8, + 0x08, 0x79, 0x3b, 0x0c, 0x90, 0x7c, 0x63, 0xc1, 0xc4, 0x5e, 0x28, 0x24, 0x79, 0xa9, 0x58, 0xec, + 0x59, 0x69, 0x57, 0xf6, 0xce, 0x8b, 0x85, 0x0a, 0xe2, 0x5c, 0xff, 0xf2, 0xcf, 0xbf, 0xbf, 0x1b, + 0xbb, 0x42, 0x2e, 0xeb, 0x27, 0xa9, 0xbd, 0x91, 0xf7, 0xff, 0x10, 0xc5, 0x57, 0x63, 0x16, 0xf9, + 0xda, 0x82, 0xf1, 0xfb, 0x38, 0x94, 0xcd, 0xb9, 0x69, 0xe2, 0xdc, 0xd0, 0x4c, 0xae, 0x91, 0xab, + 0x83, 0x98, 0x78, 0xcf, 0x94, 0xf5, 0x9c, 0x7c, 0x6f, 0x41, 0x59, 0xf1, 0xf6, 0x0b, 0x73, 0x17, + 0x23, 0xd4, 0xf2, 0x28, 0xa1, 0xc8, 0xa7, 0x30, 0x6d, 0x68, 0x1d, 0x0d, 0xa5, 0x53, 0xee, 0x85, + 0x8f, 0x84, 0xb3, 0xa6, 0x5d, 0x3a, 0x64, 0x75, 0xc4, 0x89, 0x3d, 0xae, 0x5c, 0x36, 0x8d, 0x7b, + 0xf5, 0x34, 0x90, 0x57, 0x4e, 0xba, 0xcf, 0x5e, 0xe6, 0xca, 0xf2, 0xa0, 0xa9, 0xac, 0x16, 0xcf, + 0x14, 0x8e, 0xaa, 0x10, 0xdf, 0x5a, 0x30, 0x7f, 0x1f, 0x65, 0xfe, 0x86, 0x92, 0xeb, 0x03, 0x3c, + 0x17, 0xdf, 0xd7, 0x8a, 0x33, 0x7c, 0x41, 0x46, 0xe0, 0x1d, 0x4d, 0xe0, 0x4d, 0xe7, 0xce, 0x60, + 0x02, 0xe6, 0x01, 0xd5, 0x7e, 0x0e, 0xfc, 0x3d, 0x4d, 0xa5, 0x66, 0x3c, 0xdc, 0xb5, 0xd6, 0x49, + 0x5b, 0x53, 0x7a, 0x80, 0x51, 0x73, 0xab, 0x41, 0xb9, 0x1c, 0x2a, 0xf3, 0x4a, 0x11, 0xce, 0x97, + 0x67, 0x24, 0x5c, 0x4d, 0x62, 0x8d, 0xdc, 0x1a, 0xa5, 0x42, 0x03, 0xa3, 0x66, 0x60, 0xc2, 0xfc, + 0x60, 0x41, 0xc9, 0x74, 0x2f, 0x72, 0xed, 0x64, 0xc4, 0x9e, 0xae, 0x76, 0x8e, 0xa5, 0xf0, 0xaa, + 0xe6, 0xb8, 0xec, 0x0c, 0xcc, 0xb5, 0xbb, 0xba, 0x79, 0xa8, 0xd2, 0xfc, 0xd1, 0x82, 0x72, 0x97, + 0x42, 0x77, 0xef, 0xc5, 0x91, 0x74, 0x4e, 0x27, 0x49, 0x7e, 0xb2, 0xa0, 0x64, 0x3a, 0x6a, 0x3f, + 0xaf, 0x9e, 0x4e, 0x7b, 0x8e, 0xbc, 0x36, 0xcc, 0x05, 0x57, 0x46, 0xa4, 0xb9, 0xa6, 0xf2, 0x3c, + 0x17, 0xf2, 0x17, 0x0b, 0xca, 0x5d, 0x3a, 0xc3, 0x85, 0xfc, 0xbf, 0x08, 0xbb, 0x2f, 0x46, 0x98, + 0x50, 0x28, 0x6d, 0x63, 0x84, 0x12, 0x87, 0x95, 0x80, 0x7d, 0x12, 0xce, 0x92, 0xff, 0x96, 0xe9, + 0xb1, 0xeb, 0xa3, 0x7a, 0xac, 0x12, 0xa4, 0x01, 0x65, 0x13, 0xa2, 0xa0, 0xc7, 0x0b, 0x07, 0xbb, + 0x71, 0x86, 0x60, 0xe4, 0x19, 0x2c, 0x7c, 0x44, 0xa3, 0x50, 0x29, 0x6b, 0xbe, 0x39, 0xc9, 0xd5, + 0xbe, 0x4e, 0x92, 0x7f, 0x8b, 0x8e, 0x88, 0x56, 0xd5, 0xd1, 0x6e, 0x3b, 0x37, 0x47, 0xd5, 0x75, + 0x3b, 0x0d, 0x65, 0x94, 0xbc, 0xb7, 0xf3, 0xfb, 0xf1, 0x8a, 0xf5, 0xc7, 0xf1, 0x8a, 0xf5, 0xd7, + 0xf1, 0x8a, 0xf5, 0xf1, 0x5b, 0x67, 0xfb, 0xfb, 0x0a, 0xf4, 0x47, 0x63, 0xe1, 0x3f, 0xe9, 0xb0, + 0xa4, 0x7f, 0x94, 0xde, 0xf8, 0x37, 0x00, 0x00, 0xff, 0xff, 0xa5, 0xef, 0x04, 0xc6, 0x0d, 0x0e, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1604,15 +1594,6 @@ func (m *RepoAccessQuery) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.GcpServiceAccountKey) > 0 { - i -= len(m.GcpServiceAccountKey) - copy(dAtA[i:], m.GcpServiceAccountKey) - i = encodeVarintRepository(dAtA, i, uint64(len(m.GcpServiceAccountKey))) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x92 - } if len(m.Project) > 0 { i -= len(m.Project) copy(dAtA[i:], m.Project) @@ -2045,10 +2026,6 @@ func (m *RepoAccessQuery) Size() (n int) { if l > 0 { n += 2 + l + sovRepository(uint64(l)) } - l = len(m.GcpServiceAccountKey) - if l > 0 { - n += 2 + l + sovRepository(uint64(l)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -3235,38 +3212,6 @@ func (m *RepoAccessQuery) Unmarshal(dAtA []byte) error { } m.Project = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 18: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GcpServiceAccountKey", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GcpServiceAccountKey = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRepository(dAtA[iNdEx:]) diff --git a/pkg/apis/api-rules/violation_exceptions.list b/pkg/apis/api-rules/violation_exceptions.list index 754988e464117..1f625c07e730b 100644 --- a/pkg/apis/api-rules/violation_exceptions.list +++ b/pkg/apis/api-rules/violation_exceptions.list @@ -7,11 +7,7 @@ API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/ap API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,AppProjectSpec,SignatureKeys API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,AppProjectSpec,SourceNamespaces API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,AppProjectSpec,SourceRepos -API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationMatchExpression,Values -API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSetRolloutStep,MatchExpressions -API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSetRolloutStrategy,Steps API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSetSpec,Generators -API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSetStatus,ApplicationStatus API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSetStatus,Conditions API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSetTemplateMeta,Finalizers API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourceHelm,FileParameters @@ -20,12 +16,10 @@ API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/ap API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourceJsonnet,ExtVars API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourceJsonnet,Libs API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourceJsonnet,TLAs -API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourcePluginParameter,Array API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSpec,IgnoreDifferences API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSpec,Info API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationStatus,Conditions API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationStatus,Resources -API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationStatus,SourceTypes API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSummary,ExternalURLs API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSummary,Images API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationTree,Hosts @@ -70,16 +64,12 @@ API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/ap API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ResourceNode,Info API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ResourceNode,ParentRefs API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ResourceOverride,KnownTypeFields -API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,RevisionHistory,Revisions API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,RevisionMetadata,Tags API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SCMProviderGenerator,Filters API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SCMProviderGeneratorFilter,PathsDoNotExist API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SCMProviderGeneratorFilter,PathsExist API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SyncOperation,Manifests API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SyncOperation,Resources -API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SyncOperation,Revisions -API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SyncOperationResult,Revisions -API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SyncStatus,Revisions API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SyncWindow,Applications API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SyncWindow,Clusters API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,SyncWindow,Namespaces @@ -88,7 +78,6 @@ API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/ap API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,TLSClientConfig,KeyData API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,rawResourceOverride,KnownTypeFields API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourceJsonnet,TLAs -API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourcePluginParameter,String_ API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ClusterCacheInfo,APIsCount API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ConnectionState,ModifiedAt API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,HelmOptions,ValuesFileSchemes @@ -97,9 +86,6 @@ API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/applicat API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,KustomizeOptions,BinaryPath API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,KustomizeOptions,BuildOptions API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,PullRequestGenerator,GitLab -API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,RefTarget,Chart -API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,RefTarget,Repo -API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,RefTarget,TargetRevision API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,RepoCreds,GitHubAppEnterpriseBaseURL API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,RepoCreds,GithubAppId API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,RepoCreds,GithubAppInstallationId diff --git a/pkg/apis/application/v1alpha1/app_project_types.go b/pkg/apis/application/v1alpha1/app_project_types.go index 5243ab7990266..0d55f51a79b71 100644 --- a/pkg/apis/application/v1alpha1/app_project_types.go +++ b/pkg/apis/application/v1alpha1/app_project_types.go @@ -187,10 +187,6 @@ func (p *AppProject) ValidateProject() error { srcRepos := make(map[string]bool) for _, src := range p.Spec.SourceRepos { - if src == "!*" { - return status.Errorf(codes.InvalidArgument, "source repository has an invalid format, '!*'") - } - if _, ok := srcRepos[src]; ok { return status.Errorf(codes.InvalidArgument, "source repository '%s' already added", src) } @@ -369,7 +365,7 @@ func (proj *AppProject) RemoveFinalizer() { } func globMatch(pattern string, val string, allowNegation bool, separators ...rune) bool { - if allowNegation && isDenyPattern(pattern) { + if allowNegation && isDenyDestination(pattern) { return !glob.Match(pattern[1:], val, separators...) } @@ -382,26 +378,13 @@ func globMatch(pattern string, val string, allowNegation bool, separators ...run // IsSourcePermitted validates if the provided application's source is a one of the allowed sources for the project. func (proj AppProject) IsSourcePermitted(src ApplicationSource) bool { srcNormalized := git.NormalizeGitURL(src.RepoURL) - - var normalized string - anySourceMatched := false - for _, repoURL := range proj.Spec.SourceRepos { - if isDenyPattern(repoURL) { - normalized = "!" + git.NormalizeGitURL(strings.TrimPrefix(repoURL, "!")) - } else { - normalized = git.NormalizeGitURL(repoURL) - } - - matched := globMatch(normalized, srcNormalized, true, '/') - if matched { - anySourceMatched = true - } else if !matched && isDenyPattern(normalized) { - return false + normalized := git.NormalizeGitURL(repoURL) + if globMatch(normalized, srcNormalized, false, '/') { + return true } } - - return anySourceMatched + return false } // IsDestinationPermitted validates if the provided application's destination is one of the allowed destinations for the project @@ -437,7 +420,7 @@ func (proj AppProject) isDestinationMatched(dst ApplicationDestination) bool { matched := (dstServerMatched || dstNameMatched) && dstNamespaceMatched if matched { anyDestinationMatched = true - } else if ((!dstNameMatched && isDenyPattern(item.Name)) || (!dstServerMatched && isDenyPattern(item.Server))) || (!dstNamespaceMatched && isDenyPattern(item.Namespace)) { + } else if ((!dstNameMatched && isDenyDestination(item.Name)) || (!dstServerMatched && isDenyDestination(item.Server))) || (!dstNamespaceMatched && isDenyDestination(item.Namespace)) { noDenyDestinationsMatched = false } } @@ -445,7 +428,7 @@ func (proj AppProject) isDestinationMatched(dst ApplicationDestination) bool { return anyDestinationMatched && noDenyDestinationsMatched } -func isDenyPattern(pattern string) bool { +func isDenyDestination(pattern string) bool { return strings.HasPrefix(pattern, "!") } diff --git a/pkg/apis/application/v1alpha1/applicationset_types.go b/pkg/apis/application/v1alpha1/applicationset_types.go index 56b1bcfad98be..1c3d657d99781 100644 --- a/pkg/apis/application/v1alpha1/applicationset_types.go +++ b/pkg/apis/application/v1alpha1/applicationset_types.go @@ -25,7 +25,6 @@ import ( apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" ) // Utility struct for a reference to a secret key. @@ -47,39 +46,12 @@ type ApplicationSet struct { Status ApplicationSetStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` } -// RBACName formats fully qualified application name for RBAC check. -func (a *ApplicationSet) RBACName() string { - return fmt.Sprintf("%s/%s", a.Spec.Template.Spec.GetProject(), a.ObjectMeta.Name) -} - // ApplicationSetSpec represents a class of application set state. type ApplicationSetSpec struct { GoTemplate bool `json:"goTemplate,omitempty" protobuf:"bytes,1,name=goTemplate"` Generators []ApplicationSetGenerator `json:"generators" protobuf:"bytes,2,name=generators"` Template ApplicationSetTemplate `json:"template" protobuf:"bytes,3,name=template"` SyncPolicy *ApplicationSetSyncPolicy `json:"syncPolicy,omitempty" protobuf:"bytes,4,name=syncPolicy"` - Strategy *ApplicationSetStrategy `json:"strategy,omitempty" protobuf:"bytes,5,opt,name=strategy"` -} - -// ApplicationSetStrategy configures how generated Applications are updated in sequence. -type ApplicationSetStrategy struct { - Type string `json:"type,omitempty" protobuf:"bytes,1,opt,name=type"` - RollingSync *ApplicationSetRolloutStrategy `json:"rollingSync,omitempty" protobuf:"bytes,2,opt,name=rollingSync"` - // RollingUpdate *ApplicationSetRolloutStrategy `json:"rollingUpdate,omitempty" protobuf:"bytes,3,opt,name=rollingUpdate"` -} -type ApplicationSetRolloutStrategy struct { - Steps []ApplicationSetRolloutStep `json:"steps,omitempty" protobuf:"bytes,1,opt,name=steps"` -} - -type ApplicationSetRolloutStep struct { - MatchExpressions []ApplicationMatchExpression `json:"matchExpressions,omitempty" protobuf:"bytes,1,opt,name=matchExpressions"` - MaxUpdate *intstr.IntOrString `json:"maxUpdate,omitempty" protobuf:"bytes,2,opt,name=maxUpdate"` -} - -type ApplicationMatchExpression struct { - Key string `json:"key,omitempty" protobuf:"bytes,1,opt,name=key"` - Operator string `json:"operator,omitempty" protobuf:"bytes,2,opt,name=operator"` - Values []string `json:"values,omitempty" protobuf:"bytes,3,opt,name=values"` } // ApplicationSetSyncPolicy configures how generated Applications will relate to their @@ -313,7 +285,6 @@ type GitGenerator struct { Revision string `json:"revision" protobuf:"bytes,4,name=revision"` RequeueAfterSeconds *int64 `json:"requeueAfterSeconds,omitempty" protobuf:"bytes,5,name=requeueAfterSeconds"` Template ApplicationSetTemplate `json:"template,omitempty" protobuf:"bytes,6,name=template"` - PathParamPrefix string `json:"pathParamPrefix,omitempty" protobuf:"bytes,7,name=pathParamPrefix"` } type GitDirectoryGeneratorItem struct { @@ -529,8 +500,7 @@ type PullRequestGeneratorFilter struct { type ApplicationSetStatus struct { // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster // Important: Run "make" to regenerate code after modifying this file - Conditions []ApplicationSetCondition `json:"conditions,omitempty" protobuf:"bytes,1,name=conditions"` - ApplicationStatus []ApplicationSetApplicationStatus `json:"applicationStatus,omitempty" protobuf:"bytes,2,name=applicationStatus"` + Conditions []ApplicationSetCondition `json:"conditions,omitempty" protobuf:"bytes,1,name=conditions"` } // ApplicationSetCondition contains details about an applicationset condition, which is usally an error or warning @@ -566,12 +536,11 @@ const ( // prefix "Info" means informational condition type ApplicationSetConditionType string -// ErrorOccurred / ParametersGenerated / TemplateRendered / ResourcesUpToDate +//ErrorOccurred / ParametersGenerated / TemplateRendered / ResourcesUpToDate const ( ApplicationSetConditionErrorOccurred ApplicationSetConditionType = "ErrorOccurred" ApplicationSetConditionParametersGenerated ApplicationSetConditionType = "ParametersGenerated" ApplicationSetConditionResourcesUpToDate ApplicationSetConditionType = "ResourcesUpToDate" - ApplicationSetConditionRolloutProgressing ApplicationSetConditionType = "RolloutProgressing" ) type ApplicationSetReasonType string @@ -588,23 +557,8 @@ const ( ApplicationSetReasonDeleteApplicationError = "DeleteApplicationError" ApplicationSetReasonRefreshApplicationError = "RefreshApplicationError" ApplicationSetReasonApplicationValidationError = "ApplicationValidationError" - ApplicationSetReasonApplicationSetModified = "ApplicationSetModified" - ApplicationSetReasonApplicationSetRolloutComplete = "ApplicationSetRolloutComplete" - ApplicationSetReasonSyncApplicationError = "SyncApplicationError" ) -// ApplicationSetApplicationStatus contains details about each Application managed by the ApplicationSet -type ApplicationSetApplicationStatus struct { - // Application contains the name of the Application resource - Application string `json:"application" protobuf:"bytes,1,opt,name=application"` - // LastTransitionTime is the time the status was last updated - LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty" protobuf:"bytes,2,opt,name=lastTransitionTime"` - // Message contains human-readable message indicating details about the status - Message string `json:"message" protobuf:"bytes,3,opt,name=message"` - // Status contains the AppSet's perceived status of the managed Application resource: (Waiting, Pending, Progressing, Healthy) - Status string `json:"status" protobuf:"bytes,5,opt,name=status"` -} - // ApplicationSetList contains a list of ApplicationSet // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +kubebuilder:object:root=true @@ -662,14 +616,3 @@ func findConditionIndex(conditions []ApplicationSetCondition, t ApplicationSetCo } return -1 } - -func (status *ApplicationSetStatus) SetApplicationStatus(newStatus ApplicationSetApplicationStatus) { - for i := range status.ApplicationStatus { - appStatus := status.ApplicationStatus[i] - if appStatus.Application == newStatus.Application { - status.ApplicationStatus[i] = newStatus - return - } - } - status.ApplicationStatus = append(status.ApplicationStatus, newStatus) -} diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go index 6eb480af30f11..4ea2d24f9c18f 100644 --- a/pkg/apis/application/v1alpha1/generated.pb.go +++ b/pkg/apis/application/v1alpha1/generated.pb.go @@ -23,7 +23,6 @@ import ( reflect "reflect" strings "strings" - intstr "k8s.io/apimachinery/pkg/util/intstr" k8s_io_apimachinery_pkg_watch "k8s.io/apimachinery/pkg/watch" ) @@ -290,38 +289,10 @@ func (m *ApplicationList) XXX_DiscardUnknown() { var xxx_messageInfo_ApplicationList proto.InternalMessageInfo -func (m *ApplicationMatchExpression) Reset() { *m = ApplicationMatchExpression{} } -func (*ApplicationMatchExpression) ProtoMessage() {} -func (*ApplicationMatchExpression) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{9} -} -func (m *ApplicationMatchExpression) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ApplicationMatchExpression) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ApplicationMatchExpression) XXX_Merge(src proto.Message) { - xxx_messageInfo_ApplicationMatchExpression.Merge(m, src) -} -func (m *ApplicationMatchExpression) XXX_Size() int { - return m.Size() -} -func (m *ApplicationMatchExpression) XXX_DiscardUnknown() { - xxx_messageInfo_ApplicationMatchExpression.DiscardUnknown(m) -} - -var xxx_messageInfo_ApplicationMatchExpression proto.InternalMessageInfo - func (m *ApplicationSet) Reset() { *m = ApplicationSet{} } func (*ApplicationSet) ProtoMessage() {} func (*ApplicationSet) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{10} + return fileDescriptor_030104ce3b95bcac, []int{9} } func (m *ApplicationSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -346,38 +317,10 @@ func (m *ApplicationSet) XXX_DiscardUnknown() { var xxx_messageInfo_ApplicationSet proto.InternalMessageInfo -func (m *ApplicationSetApplicationStatus) Reset() { *m = ApplicationSetApplicationStatus{} } -func (*ApplicationSetApplicationStatus) ProtoMessage() {} -func (*ApplicationSetApplicationStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{11} -} -func (m *ApplicationSetApplicationStatus) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ApplicationSetApplicationStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ApplicationSetApplicationStatus) XXX_Merge(src proto.Message) { - xxx_messageInfo_ApplicationSetApplicationStatus.Merge(m, src) -} -func (m *ApplicationSetApplicationStatus) XXX_Size() int { - return m.Size() -} -func (m *ApplicationSetApplicationStatus) XXX_DiscardUnknown() { - xxx_messageInfo_ApplicationSetApplicationStatus.DiscardUnknown(m) -} - -var xxx_messageInfo_ApplicationSetApplicationStatus proto.InternalMessageInfo - func (m *ApplicationSetCondition) Reset() { *m = ApplicationSetCondition{} } func (*ApplicationSetCondition) ProtoMessage() {} func (*ApplicationSetCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{12} + return fileDescriptor_030104ce3b95bcac, []int{10} } func (m *ApplicationSetCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -405,7 +348,7 @@ var xxx_messageInfo_ApplicationSetCondition proto.InternalMessageInfo func (m *ApplicationSetGenerator) Reset() { *m = ApplicationSetGenerator{} } func (*ApplicationSetGenerator) ProtoMessage() {} func (*ApplicationSetGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{13} + return fileDescriptor_030104ce3b95bcac, []int{11} } func (m *ApplicationSetGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -433,7 +376,7 @@ var xxx_messageInfo_ApplicationSetGenerator proto.InternalMessageInfo func (m *ApplicationSetList) Reset() { *m = ApplicationSetList{} } func (*ApplicationSetList) ProtoMessage() {} func (*ApplicationSetList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{14} + return fileDescriptor_030104ce3b95bcac, []int{12} } func (m *ApplicationSetList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -461,7 +404,7 @@ var xxx_messageInfo_ApplicationSetList proto.InternalMessageInfo func (m *ApplicationSetNestedGenerator) Reset() { *m = ApplicationSetNestedGenerator{} } func (*ApplicationSetNestedGenerator) ProtoMessage() {} func (*ApplicationSetNestedGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{15} + return fileDescriptor_030104ce3b95bcac, []int{13} } func (m *ApplicationSetNestedGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -486,66 +429,10 @@ func (m *ApplicationSetNestedGenerator) XXX_DiscardUnknown() { var xxx_messageInfo_ApplicationSetNestedGenerator proto.InternalMessageInfo -func (m *ApplicationSetRolloutStep) Reset() { *m = ApplicationSetRolloutStep{} } -func (*ApplicationSetRolloutStep) ProtoMessage() {} -func (*ApplicationSetRolloutStep) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{16} -} -func (m *ApplicationSetRolloutStep) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ApplicationSetRolloutStep) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ApplicationSetRolloutStep) XXX_Merge(src proto.Message) { - xxx_messageInfo_ApplicationSetRolloutStep.Merge(m, src) -} -func (m *ApplicationSetRolloutStep) XXX_Size() int { - return m.Size() -} -func (m *ApplicationSetRolloutStep) XXX_DiscardUnknown() { - xxx_messageInfo_ApplicationSetRolloutStep.DiscardUnknown(m) -} - -var xxx_messageInfo_ApplicationSetRolloutStep proto.InternalMessageInfo - -func (m *ApplicationSetRolloutStrategy) Reset() { *m = ApplicationSetRolloutStrategy{} } -func (*ApplicationSetRolloutStrategy) ProtoMessage() {} -func (*ApplicationSetRolloutStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{17} -} -func (m *ApplicationSetRolloutStrategy) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ApplicationSetRolloutStrategy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ApplicationSetRolloutStrategy) XXX_Merge(src proto.Message) { - xxx_messageInfo_ApplicationSetRolloutStrategy.Merge(m, src) -} -func (m *ApplicationSetRolloutStrategy) XXX_Size() int { - return m.Size() -} -func (m *ApplicationSetRolloutStrategy) XXX_DiscardUnknown() { - xxx_messageInfo_ApplicationSetRolloutStrategy.DiscardUnknown(m) -} - -var xxx_messageInfo_ApplicationSetRolloutStrategy proto.InternalMessageInfo - func (m *ApplicationSetSpec) Reset() { *m = ApplicationSetSpec{} } func (*ApplicationSetSpec) ProtoMessage() {} func (*ApplicationSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{18} + return fileDescriptor_030104ce3b95bcac, []int{14} } func (m *ApplicationSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -573,7 +460,7 @@ var xxx_messageInfo_ApplicationSetSpec proto.InternalMessageInfo func (m *ApplicationSetStatus) Reset() { *m = ApplicationSetStatus{} } func (*ApplicationSetStatus) ProtoMessage() {} func (*ApplicationSetStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{19} + return fileDescriptor_030104ce3b95bcac, []int{15} } func (m *ApplicationSetStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -598,38 +485,10 @@ func (m *ApplicationSetStatus) XXX_DiscardUnknown() { var xxx_messageInfo_ApplicationSetStatus proto.InternalMessageInfo -func (m *ApplicationSetStrategy) Reset() { *m = ApplicationSetStrategy{} } -func (*ApplicationSetStrategy) ProtoMessage() {} -func (*ApplicationSetStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{20} -} -func (m *ApplicationSetStrategy) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ApplicationSetStrategy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ApplicationSetStrategy) XXX_Merge(src proto.Message) { - xxx_messageInfo_ApplicationSetStrategy.Merge(m, src) -} -func (m *ApplicationSetStrategy) XXX_Size() int { - return m.Size() -} -func (m *ApplicationSetStrategy) XXX_DiscardUnknown() { - xxx_messageInfo_ApplicationSetStrategy.DiscardUnknown(m) -} - -var xxx_messageInfo_ApplicationSetStrategy proto.InternalMessageInfo - func (m *ApplicationSetSyncPolicy) Reset() { *m = ApplicationSetSyncPolicy{} } func (*ApplicationSetSyncPolicy) ProtoMessage() {} func (*ApplicationSetSyncPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{21} + return fileDescriptor_030104ce3b95bcac, []int{16} } func (m *ApplicationSetSyncPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -657,7 +516,7 @@ var xxx_messageInfo_ApplicationSetSyncPolicy proto.InternalMessageInfo func (m *ApplicationSetTemplate) Reset() { *m = ApplicationSetTemplate{} } func (*ApplicationSetTemplate) ProtoMessage() {} func (*ApplicationSetTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{22} + return fileDescriptor_030104ce3b95bcac, []int{17} } func (m *ApplicationSetTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -685,7 +544,7 @@ var xxx_messageInfo_ApplicationSetTemplate proto.InternalMessageInfo func (m *ApplicationSetTemplateMeta) Reset() { *m = ApplicationSetTemplateMeta{} } func (*ApplicationSetTemplateMeta) ProtoMessage() {} func (*ApplicationSetTemplateMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{23} + return fileDescriptor_030104ce3b95bcac, []int{18} } func (m *ApplicationSetTemplateMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -713,7 +572,7 @@ var xxx_messageInfo_ApplicationSetTemplateMeta proto.InternalMessageInfo func (m *ApplicationSetTerminalGenerator) Reset() { *m = ApplicationSetTerminalGenerator{} } func (*ApplicationSetTerminalGenerator) ProtoMessage() {} func (*ApplicationSetTerminalGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{24} + return fileDescriptor_030104ce3b95bcac, []int{19} } func (m *ApplicationSetTerminalGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -741,7 +600,7 @@ var xxx_messageInfo_ApplicationSetTerminalGenerator proto.InternalMessageInfo func (m *ApplicationSource) Reset() { *m = ApplicationSource{} } func (*ApplicationSource) ProtoMessage() {} func (*ApplicationSource) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{25} + return fileDescriptor_030104ce3b95bcac, []int{20} } func (m *ApplicationSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -769,7 +628,7 @@ var xxx_messageInfo_ApplicationSource proto.InternalMessageInfo func (m *ApplicationSourceDirectory) Reset() { *m = ApplicationSourceDirectory{} } func (*ApplicationSourceDirectory) ProtoMessage() {} func (*ApplicationSourceDirectory) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{26} + return fileDescriptor_030104ce3b95bcac, []int{21} } func (m *ApplicationSourceDirectory) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -797,7 +656,7 @@ var xxx_messageInfo_ApplicationSourceDirectory proto.InternalMessageInfo func (m *ApplicationSourceHelm) Reset() { *m = ApplicationSourceHelm{} } func (*ApplicationSourceHelm) ProtoMessage() {} func (*ApplicationSourceHelm) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{27} + return fileDescriptor_030104ce3b95bcac, []int{22} } func (m *ApplicationSourceHelm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -825,7 +684,7 @@ var xxx_messageInfo_ApplicationSourceHelm proto.InternalMessageInfo func (m *ApplicationSourceJsonnet) Reset() { *m = ApplicationSourceJsonnet{} } func (*ApplicationSourceJsonnet) ProtoMessage() {} func (*ApplicationSourceJsonnet) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{28} + return fileDescriptor_030104ce3b95bcac, []int{23} } func (m *ApplicationSourceJsonnet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -853,7 +712,7 @@ var xxx_messageInfo_ApplicationSourceJsonnet proto.InternalMessageInfo func (m *ApplicationSourceKustomize) Reset() { *m = ApplicationSourceKustomize{} } func (*ApplicationSourceKustomize) ProtoMessage() {} func (*ApplicationSourceKustomize) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{29} + return fileDescriptor_030104ce3b95bcac, []int{24} } func (m *ApplicationSourceKustomize) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -881,7 +740,7 @@ var xxx_messageInfo_ApplicationSourceKustomize proto.InternalMessageInfo func (m *ApplicationSourcePlugin) Reset() { *m = ApplicationSourcePlugin{} } func (*ApplicationSourcePlugin) ProtoMessage() {} func (*ApplicationSourcePlugin) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{30} + return fileDescriptor_030104ce3b95bcac, []int{25} } func (m *ApplicationSourcePlugin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -906,38 +765,10 @@ func (m *ApplicationSourcePlugin) XXX_DiscardUnknown() { var xxx_messageInfo_ApplicationSourcePlugin proto.InternalMessageInfo -func (m *ApplicationSourcePluginParameter) Reset() { *m = ApplicationSourcePluginParameter{} } -func (*ApplicationSourcePluginParameter) ProtoMessage() {} -func (*ApplicationSourcePluginParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{31} -} -func (m *ApplicationSourcePluginParameter) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ApplicationSourcePluginParameter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ApplicationSourcePluginParameter) XXX_Merge(src proto.Message) { - xxx_messageInfo_ApplicationSourcePluginParameter.Merge(m, src) -} -func (m *ApplicationSourcePluginParameter) XXX_Size() int { - return m.Size() -} -func (m *ApplicationSourcePluginParameter) XXX_DiscardUnknown() { - xxx_messageInfo_ApplicationSourcePluginParameter.DiscardUnknown(m) -} - -var xxx_messageInfo_ApplicationSourcePluginParameter proto.InternalMessageInfo - func (m *ApplicationSpec) Reset() { *m = ApplicationSpec{} } func (*ApplicationSpec) ProtoMessage() {} func (*ApplicationSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{32} + return fileDescriptor_030104ce3b95bcac, []int{26} } func (m *ApplicationSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -965,7 +796,7 @@ var xxx_messageInfo_ApplicationSpec proto.InternalMessageInfo func (m *ApplicationStatus) Reset() { *m = ApplicationStatus{} } func (*ApplicationStatus) ProtoMessage() {} func (*ApplicationStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{33} + return fileDescriptor_030104ce3b95bcac, []int{27} } func (m *ApplicationStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -993,7 +824,7 @@ var xxx_messageInfo_ApplicationStatus proto.InternalMessageInfo func (m *ApplicationSummary) Reset() { *m = ApplicationSummary{} } func (*ApplicationSummary) ProtoMessage() {} func (*ApplicationSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{34} + return fileDescriptor_030104ce3b95bcac, []int{28} } func (m *ApplicationSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1021,7 +852,7 @@ var xxx_messageInfo_ApplicationSummary proto.InternalMessageInfo func (m *ApplicationTree) Reset() { *m = ApplicationTree{} } func (*ApplicationTree) ProtoMessage() {} func (*ApplicationTree) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{35} + return fileDescriptor_030104ce3b95bcac, []int{29} } func (m *ApplicationTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1049,7 +880,7 @@ var xxx_messageInfo_ApplicationTree proto.InternalMessageInfo func (m *ApplicationWatchEvent) Reset() { *m = ApplicationWatchEvent{} } func (*ApplicationWatchEvent) ProtoMessage() {} func (*ApplicationWatchEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{36} + return fileDescriptor_030104ce3b95bcac, []int{30} } func (m *ApplicationWatchEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1077,7 +908,7 @@ var xxx_messageInfo_ApplicationWatchEvent proto.InternalMessageInfo func (m *Backoff) Reset() { *m = Backoff{} } func (*Backoff) ProtoMessage() {} func (*Backoff) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{37} + return fileDescriptor_030104ce3b95bcac, []int{31} } func (m *Backoff) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1105,7 +936,7 @@ var xxx_messageInfo_Backoff proto.InternalMessageInfo func (m *BasicAuthBitbucketServer) Reset() { *m = BasicAuthBitbucketServer{} } func (*BasicAuthBitbucketServer) ProtoMessage() {} func (*BasicAuthBitbucketServer) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{38} + return fileDescriptor_030104ce3b95bcac, []int{32} } func (m *BasicAuthBitbucketServer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1133,7 +964,7 @@ var xxx_messageInfo_BasicAuthBitbucketServer proto.InternalMessageInfo func (m *Cluster) Reset() { *m = Cluster{} } func (*Cluster) ProtoMessage() {} func (*Cluster) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{39} + return fileDescriptor_030104ce3b95bcac, []int{33} } func (m *Cluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1161,7 +992,7 @@ var xxx_messageInfo_Cluster proto.InternalMessageInfo func (m *ClusterCacheInfo) Reset() { *m = ClusterCacheInfo{} } func (*ClusterCacheInfo) ProtoMessage() {} func (*ClusterCacheInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{40} + return fileDescriptor_030104ce3b95bcac, []int{34} } func (m *ClusterCacheInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1189,7 +1020,7 @@ var xxx_messageInfo_ClusterCacheInfo proto.InternalMessageInfo func (m *ClusterConfig) Reset() { *m = ClusterConfig{} } func (*ClusterConfig) ProtoMessage() {} func (*ClusterConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{41} + return fileDescriptor_030104ce3b95bcac, []int{35} } func (m *ClusterConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1217,7 +1048,7 @@ var xxx_messageInfo_ClusterConfig proto.InternalMessageInfo func (m *ClusterGenerator) Reset() { *m = ClusterGenerator{} } func (*ClusterGenerator) ProtoMessage() {} func (*ClusterGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{42} + return fileDescriptor_030104ce3b95bcac, []int{36} } func (m *ClusterGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1245,7 +1076,7 @@ var xxx_messageInfo_ClusterGenerator proto.InternalMessageInfo func (m *ClusterInfo) Reset() { *m = ClusterInfo{} } func (*ClusterInfo) ProtoMessage() {} func (*ClusterInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{43} + return fileDescriptor_030104ce3b95bcac, []int{37} } func (m *ClusterInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1273,7 +1104,7 @@ var xxx_messageInfo_ClusterInfo proto.InternalMessageInfo func (m *ClusterList) Reset() { *m = ClusterList{} } func (*ClusterList) ProtoMessage() {} func (*ClusterList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{44} + return fileDescriptor_030104ce3b95bcac, []int{38} } func (m *ClusterList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1301,7 +1132,7 @@ var xxx_messageInfo_ClusterList proto.InternalMessageInfo func (m *Command) Reset() { *m = Command{} } func (*Command) ProtoMessage() {} func (*Command) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{45} + return fileDescriptor_030104ce3b95bcac, []int{39} } func (m *Command) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1329,7 +1160,7 @@ var xxx_messageInfo_Command proto.InternalMessageInfo func (m *ComparedTo) Reset() { *m = ComparedTo{} } func (*ComparedTo) ProtoMessage() {} func (*ComparedTo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{46} + return fileDescriptor_030104ce3b95bcac, []int{40} } func (m *ComparedTo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1357,7 +1188,7 @@ var xxx_messageInfo_ComparedTo proto.InternalMessageInfo func (m *ComponentParameter) Reset() { *m = ComponentParameter{} } func (*ComponentParameter) ProtoMessage() {} func (*ComponentParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{47} + return fileDescriptor_030104ce3b95bcac, []int{41} } func (m *ComponentParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1385,7 +1216,7 @@ var xxx_messageInfo_ComponentParameter proto.InternalMessageInfo func (m *ConfigManagementPlugin) Reset() { *m = ConfigManagementPlugin{} } func (*ConfigManagementPlugin) ProtoMessage() {} func (*ConfigManagementPlugin) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{48} + return fileDescriptor_030104ce3b95bcac, []int{42} } func (m *ConfigManagementPlugin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1413,7 +1244,7 @@ var xxx_messageInfo_ConfigManagementPlugin proto.InternalMessageInfo func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{49} + return fileDescriptor_030104ce3b95bcac, []int{43} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1441,7 +1272,7 @@ var xxx_messageInfo_ConnectionState proto.InternalMessageInfo func (m *DuckTypeGenerator) Reset() { *m = DuckTypeGenerator{} } func (*DuckTypeGenerator) ProtoMessage() {} func (*DuckTypeGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{50} + return fileDescriptor_030104ce3b95bcac, []int{44} } func (m *DuckTypeGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1469,7 +1300,7 @@ var xxx_messageInfo_DuckTypeGenerator proto.InternalMessageInfo func (m *EnvEntry) Reset() { *m = EnvEntry{} } func (*EnvEntry) ProtoMessage() {} func (*EnvEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{51} + return fileDescriptor_030104ce3b95bcac, []int{45} } func (m *EnvEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1497,7 +1328,7 @@ var xxx_messageInfo_EnvEntry proto.InternalMessageInfo func (m *ExecProviderConfig) Reset() { *m = ExecProviderConfig{} } func (*ExecProviderConfig) ProtoMessage() {} func (*ExecProviderConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{52} + return fileDescriptor_030104ce3b95bcac, []int{46} } func (m *ExecProviderConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1525,7 +1356,7 @@ var xxx_messageInfo_ExecProviderConfig proto.InternalMessageInfo func (m *GitDirectoryGeneratorItem) Reset() { *m = GitDirectoryGeneratorItem{} } func (*GitDirectoryGeneratorItem) ProtoMessage() {} func (*GitDirectoryGeneratorItem) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{53} + return fileDescriptor_030104ce3b95bcac, []int{47} } func (m *GitDirectoryGeneratorItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1553,7 +1384,7 @@ var xxx_messageInfo_GitDirectoryGeneratorItem proto.InternalMessageInfo func (m *GitFileGeneratorItem) Reset() { *m = GitFileGeneratorItem{} } func (*GitFileGeneratorItem) ProtoMessage() {} func (*GitFileGeneratorItem) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{54} + return fileDescriptor_030104ce3b95bcac, []int{48} } func (m *GitFileGeneratorItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1581,7 +1412,7 @@ var xxx_messageInfo_GitFileGeneratorItem proto.InternalMessageInfo func (m *GitGenerator) Reset() { *m = GitGenerator{} } func (*GitGenerator) ProtoMessage() {} func (*GitGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{55} + return fileDescriptor_030104ce3b95bcac, []int{49} } func (m *GitGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1609,7 +1440,7 @@ var xxx_messageInfo_GitGenerator proto.InternalMessageInfo func (m *GnuPGPublicKey) Reset() { *m = GnuPGPublicKey{} } func (*GnuPGPublicKey) ProtoMessage() {} func (*GnuPGPublicKey) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{56} + return fileDescriptor_030104ce3b95bcac, []int{50} } func (m *GnuPGPublicKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1637,7 +1468,7 @@ var xxx_messageInfo_GnuPGPublicKey proto.InternalMessageInfo func (m *GnuPGPublicKeyList) Reset() { *m = GnuPGPublicKeyList{} } func (*GnuPGPublicKeyList) ProtoMessage() {} func (*GnuPGPublicKeyList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{57} + return fileDescriptor_030104ce3b95bcac, []int{51} } func (m *GnuPGPublicKeyList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1665,7 +1496,7 @@ var xxx_messageInfo_GnuPGPublicKeyList proto.InternalMessageInfo func (m *HealthStatus) Reset() { *m = HealthStatus{} } func (*HealthStatus) ProtoMessage() {} func (*HealthStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{58} + return fileDescriptor_030104ce3b95bcac, []int{52} } func (m *HealthStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1693,7 +1524,7 @@ var xxx_messageInfo_HealthStatus proto.InternalMessageInfo func (m *HelmFileParameter) Reset() { *m = HelmFileParameter{} } func (*HelmFileParameter) ProtoMessage() {} func (*HelmFileParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{59} + return fileDescriptor_030104ce3b95bcac, []int{53} } func (m *HelmFileParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1721,7 +1552,7 @@ var xxx_messageInfo_HelmFileParameter proto.InternalMessageInfo func (m *HelmOptions) Reset() { *m = HelmOptions{} } func (*HelmOptions) ProtoMessage() {} func (*HelmOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{60} + return fileDescriptor_030104ce3b95bcac, []int{54} } func (m *HelmOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1749,7 +1580,7 @@ var xxx_messageInfo_HelmOptions proto.InternalMessageInfo func (m *HelmParameter) Reset() { *m = HelmParameter{} } func (*HelmParameter) ProtoMessage() {} func (*HelmParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{61} + return fileDescriptor_030104ce3b95bcac, []int{55} } func (m *HelmParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1777,7 +1608,7 @@ var xxx_messageInfo_HelmParameter proto.InternalMessageInfo func (m *HostInfo) Reset() { *m = HostInfo{} } func (*HostInfo) ProtoMessage() {} func (*HostInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{62} + return fileDescriptor_030104ce3b95bcac, []int{56} } func (m *HostInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1805,7 +1636,7 @@ var xxx_messageInfo_HostInfo proto.InternalMessageInfo func (m *HostResourceInfo) Reset() { *m = HostResourceInfo{} } func (*HostResourceInfo) ProtoMessage() {} func (*HostResourceInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{63} + return fileDescriptor_030104ce3b95bcac, []int{57} } func (m *HostResourceInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1833,7 +1664,7 @@ var xxx_messageInfo_HostResourceInfo proto.InternalMessageInfo func (m *Info) Reset() { *m = Info{} } func (*Info) ProtoMessage() {} func (*Info) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{64} + return fileDescriptor_030104ce3b95bcac, []int{58} } func (m *Info) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1861,7 +1692,7 @@ var xxx_messageInfo_Info proto.InternalMessageInfo func (m *InfoItem) Reset() { *m = InfoItem{} } func (*InfoItem) ProtoMessage() {} func (*InfoItem) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{65} + return fileDescriptor_030104ce3b95bcac, []int{59} } func (m *InfoItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1889,7 +1720,7 @@ var xxx_messageInfo_InfoItem proto.InternalMessageInfo func (m *JWTToken) Reset() { *m = JWTToken{} } func (*JWTToken) ProtoMessage() {} func (*JWTToken) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{66} + return fileDescriptor_030104ce3b95bcac, []int{60} } func (m *JWTToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1917,7 +1748,7 @@ var xxx_messageInfo_JWTToken proto.InternalMessageInfo func (m *JWTTokens) Reset() { *m = JWTTokens{} } func (*JWTTokens) ProtoMessage() {} func (*JWTTokens) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{67} + return fileDescriptor_030104ce3b95bcac, []int{61} } func (m *JWTTokens) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1945,7 +1776,7 @@ var xxx_messageInfo_JWTTokens proto.InternalMessageInfo func (m *JsonnetVar) Reset() { *m = JsonnetVar{} } func (*JsonnetVar) ProtoMessage() {} func (*JsonnetVar) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{68} + return fileDescriptor_030104ce3b95bcac, []int{62} } func (m *JsonnetVar) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1973,7 +1804,7 @@ var xxx_messageInfo_JsonnetVar proto.InternalMessageInfo func (m *KnownTypeField) Reset() { *m = KnownTypeField{} } func (*KnownTypeField) ProtoMessage() {} func (*KnownTypeField) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{69} + return fileDescriptor_030104ce3b95bcac, []int{63} } func (m *KnownTypeField) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2001,7 +1832,7 @@ var xxx_messageInfo_KnownTypeField proto.InternalMessageInfo func (m *KustomizeOptions) Reset() { *m = KustomizeOptions{} } func (*KustomizeOptions) ProtoMessage() {} func (*KustomizeOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{70} + return fileDescriptor_030104ce3b95bcac, []int{64} } func (m *KustomizeOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2029,7 +1860,7 @@ var xxx_messageInfo_KustomizeOptions proto.InternalMessageInfo func (m *ListGenerator) Reset() { *m = ListGenerator{} } func (*ListGenerator) ProtoMessage() {} func (*ListGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{71} + return fileDescriptor_030104ce3b95bcac, []int{65} } func (m *ListGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2054,38 +1885,10 @@ func (m *ListGenerator) XXX_DiscardUnknown() { var xxx_messageInfo_ListGenerator proto.InternalMessageInfo -func (m *ManagedNamespaceMetadata) Reset() { *m = ManagedNamespaceMetadata{} } -func (*ManagedNamespaceMetadata) ProtoMessage() {} -func (*ManagedNamespaceMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{72} -} -func (m *ManagedNamespaceMetadata) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ManagedNamespaceMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ManagedNamespaceMetadata) XXX_Merge(src proto.Message) { - xxx_messageInfo_ManagedNamespaceMetadata.Merge(m, src) -} -func (m *ManagedNamespaceMetadata) XXX_Size() int { - return m.Size() -} -func (m *ManagedNamespaceMetadata) XXX_DiscardUnknown() { - xxx_messageInfo_ManagedNamespaceMetadata.DiscardUnknown(m) -} - -var xxx_messageInfo_ManagedNamespaceMetadata proto.InternalMessageInfo - func (m *MatrixGenerator) Reset() { *m = MatrixGenerator{} } func (*MatrixGenerator) ProtoMessage() {} func (*MatrixGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{73} + return fileDescriptor_030104ce3b95bcac, []int{66} } func (m *MatrixGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2113,7 +1916,7 @@ var xxx_messageInfo_MatrixGenerator proto.InternalMessageInfo func (m *MergeGenerator) Reset() { *m = MergeGenerator{} } func (*MergeGenerator) ProtoMessage() {} func (*MergeGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{74} + return fileDescriptor_030104ce3b95bcac, []int{67} } func (m *MergeGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2141,7 +1944,7 @@ var xxx_messageInfo_MergeGenerator proto.InternalMessageInfo func (m *NestedMatrixGenerator) Reset() { *m = NestedMatrixGenerator{} } func (*NestedMatrixGenerator) ProtoMessage() {} func (*NestedMatrixGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{75} + return fileDescriptor_030104ce3b95bcac, []int{68} } func (m *NestedMatrixGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2169,7 +1972,7 @@ var xxx_messageInfo_NestedMatrixGenerator proto.InternalMessageInfo func (m *NestedMergeGenerator) Reset() { *m = NestedMergeGenerator{} } func (*NestedMergeGenerator) ProtoMessage() {} func (*NestedMergeGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{76} + return fileDescriptor_030104ce3b95bcac, []int{69} } func (m *NestedMergeGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2197,7 +2000,7 @@ var xxx_messageInfo_NestedMergeGenerator proto.InternalMessageInfo func (m *Operation) Reset() { *m = Operation{} } func (*Operation) ProtoMessage() {} func (*Operation) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{77} + return fileDescriptor_030104ce3b95bcac, []int{70} } func (m *Operation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2225,7 +2028,7 @@ var xxx_messageInfo_Operation proto.InternalMessageInfo func (m *OperationInitiator) Reset() { *m = OperationInitiator{} } func (*OperationInitiator) ProtoMessage() {} func (*OperationInitiator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{78} + return fileDescriptor_030104ce3b95bcac, []int{71} } func (m *OperationInitiator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2253,7 +2056,7 @@ var xxx_messageInfo_OperationInitiator proto.InternalMessageInfo func (m *OperationState) Reset() { *m = OperationState{} } func (*OperationState) ProtoMessage() {} func (*OperationState) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{79} + return fileDescriptor_030104ce3b95bcac, []int{72} } func (m *OperationState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2281,7 +2084,7 @@ var xxx_messageInfo_OperationState proto.InternalMessageInfo func (m *OrphanedResourceKey) Reset() { *m = OrphanedResourceKey{} } func (*OrphanedResourceKey) ProtoMessage() {} func (*OrphanedResourceKey) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{80} + return fileDescriptor_030104ce3b95bcac, []int{73} } func (m *OrphanedResourceKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2309,7 +2112,7 @@ var xxx_messageInfo_OrphanedResourceKey proto.InternalMessageInfo func (m *OrphanedResourcesMonitorSettings) Reset() { *m = OrphanedResourcesMonitorSettings{} } func (*OrphanedResourcesMonitorSettings) ProtoMessage() {} func (*OrphanedResourcesMonitorSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{81} + return fileDescriptor_030104ce3b95bcac, []int{74} } func (m *OrphanedResourcesMonitorSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2337,7 +2140,7 @@ var xxx_messageInfo_OrphanedResourcesMonitorSettings proto.InternalMessageInfo func (m *OverrideIgnoreDiff) Reset() { *m = OverrideIgnoreDiff{} } func (*OverrideIgnoreDiff) ProtoMessage() {} func (*OverrideIgnoreDiff) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{82} + return fileDescriptor_030104ce3b95bcac, []int{75} } func (m *OverrideIgnoreDiff) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2365,7 +2168,7 @@ var xxx_messageInfo_OverrideIgnoreDiff proto.InternalMessageInfo func (m *ProjectRole) Reset() { *m = ProjectRole{} } func (*ProjectRole) ProtoMessage() {} func (*ProjectRole) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{83} + return fileDescriptor_030104ce3b95bcac, []int{76} } func (m *ProjectRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2393,7 +2196,7 @@ var xxx_messageInfo_ProjectRole proto.InternalMessageInfo func (m *PullRequestGenerator) Reset() { *m = PullRequestGenerator{} } func (*PullRequestGenerator) ProtoMessage() {} func (*PullRequestGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{84} + return fileDescriptor_030104ce3b95bcac, []int{77} } func (m *PullRequestGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2421,7 +2224,7 @@ var xxx_messageInfo_PullRequestGenerator proto.InternalMessageInfo func (m *PullRequestGeneratorBitbucketServer) Reset() { *m = PullRequestGeneratorBitbucketServer{} } func (*PullRequestGeneratorBitbucketServer) ProtoMessage() {} func (*PullRequestGeneratorBitbucketServer) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{85} + return fileDescriptor_030104ce3b95bcac, []int{78} } func (m *PullRequestGeneratorBitbucketServer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2449,7 +2252,7 @@ var xxx_messageInfo_PullRequestGeneratorBitbucketServer proto.InternalMessageInf func (m *PullRequestGeneratorFilter) Reset() { *m = PullRequestGeneratorFilter{} } func (*PullRequestGeneratorFilter) ProtoMessage() {} func (*PullRequestGeneratorFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{86} + return fileDescriptor_030104ce3b95bcac, []int{79} } func (m *PullRequestGeneratorFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2477,7 +2280,7 @@ var xxx_messageInfo_PullRequestGeneratorFilter proto.InternalMessageInfo func (m *PullRequestGeneratorGitLab) Reset() { *m = PullRequestGeneratorGitLab{} } func (*PullRequestGeneratorGitLab) ProtoMessage() {} func (*PullRequestGeneratorGitLab) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{87} + return fileDescriptor_030104ce3b95bcac, []int{80} } func (m *PullRequestGeneratorGitLab) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2505,7 +2308,7 @@ var xxx_messageInfo_PullRequestGeneratorGitLab proto.InternalMessageInfo func (m *PullRequestGeneratorGitea) Reset() { *m = PullRequestGeneratorGitea{} } func (*PullRequestGeneratorGitea) ProtoMessage() {} func (*PullRequestGeneratorGitea) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{88} + return fileDescriptor_030104ce3b95bcac, []int{81} } func (m *PullRequestGeneratorGitea) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2533,7 +2336,7 @@ var xxx_messageInfo_PullRequestGeneratorGitea proto.InternalMessageInfo func (m *PullRequestGeneratorGithub) Reset() { *m = PullRequestGeneratorGithub{} } func (*PullRequestGeneratorGithub) ProtoMessage() {} func (*PullRequestGeneratorGithub) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{89} + return fileDescriptor_030104ce3b95bcac, []int{82} } func (m *PullRequestGeneratorGithub) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2558,38 +2361,10 @@ func (m *PullRequestGeneratorGithub) XXX_DiscardUnknown() { var xxx_messageInfo_PullRequestGeneratorGithub proto.InternalMessageInfo -func (m *RefTarget) Reset() { *m = RefTarget{} } -func (*RefTarget) ProtoMessage() {} -func (*RefTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{90} -} -func (m *RefTarget) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RefTarget) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *RefTarget) XXX_Merge(src proto.Message) { - xxx_messageInfo_RefTarget.Merge(m, src) -} -func (m *RefTarget) XXX_Size() int { - return m.Size() -} -func (m *RefTarget) XXX_DiscardUnknown() { - xxx_messageInfo_RefTarget.DiscardUnknown(m) -} - -var xxx_messageInfo_RefTarget proto.InternalMessageInfo - func (m *RepoCreds) Reset() { *m = RepoCreds{} } func (*RepoCreds) ProtoMessage() {} func (*RepoCreds) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{91} + return fileDescriptor_030104ce3b95bcac, []int{83} } func (m *RepoCreds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2617,7 +2392,7 @@ var xxx_messageInfo_RepoCreds proto.InternalMessageInfo func (m *RepoCredsList) Reset() { *m = RepoCredsList{} } func (*RepoCredsList) ProtoMessage() {} func (*RepoCredsList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{92} + return fileDescriptor_030104ce3b95bcac, []int{84} } func (m *RepoCredsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2645,7 +2420,7 @@ var xxx_messageInfo_RepoCredsList proto.InternalMessageInfo func (m *Repository) Reset() { *m = Repository{} } func (*Repository) ProtoMessage() {} func (*Repository) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{93} + return fileDescriptor_030104ce3b95bcac, []int{85} } func (m *Repository) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2673,7 +2448,7 @@ var xxx_messageInfo_Repository proto.InternalMessageInfo func (m *RepositoryCertificate) Reset() { *m = RepositoryCertificate{} } func (*RepositoryCertificate) ProtoMessage() {} func (*RepositoryCertificate) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{94} + return fileDescriptor_030104ce3b95bcac, []int{86} } func (m *RepositoryCertificate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2701,7 +2476,7 @@ var xxx_messageInfo_RepositoryCertificate proto.InternalMessageInfo func (m *RepositoryCertificateList) Reset() { *m = RepositoryCertificateList{} } func (*RepositoryCertificateList) ProtoMessage() {} func (*RepositoryCertificateList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{95} + return fileDescriptor_030104ce3b95bcac, []int{87} } func (m *RepositoryCertificateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2729,7 +2504,7 @@ var xxx_messageInfo_RepositoryCertificateList proto.InternalMessageInfo func (m *RepositoryList) Reset() { *m = RepositoryList{} } func (*RepositoryList) ProtoMessage() {} func (*RepositoryList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{96} + return fileDescriptor_030104ce3b95bcac, []int{88} } func (m *RepositoryList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2757,7 +2532,7 @@ var xxx_messageInfo_RepositoryList proto.InternalMessageInfo func (m *ResourceAction) Reset() { *m = ResourceAction{} } func (*ResourceAction) ProtoMessage() {} func (*ResourceAction) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{97} + return fileDescriptor_030104ce3b95bcac, []int{89} } func (m *ResourceAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2785,7 +2560,7 @@ var xxx_messageInfo_ResourceAction proto.InternalMessageInfo func (m *ResourceActionDefinition) Reset() { *m = ResourceActionDefinition{} } func (*ResourceActionDefinition) ProtoMessage() {} func (*ResourceActionDefinition) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{98} + return fileDescriptor_030104ce3b95bcac, []int{90} } func (m *ResourceActionDefinition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2813,7 +2588,7 @@ var xxx_messageInfo_ResourceActionDefinition proto.InternalMessageInfo func (m *ResourceActionParam) Reset() { *m = ResourceActionParam{} } func (*ResourceActionParam) ProtoMessage() {} func (*ResourceActionParam) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{99} + return fileDescriptor_030104ce3b95bcac, []int{91} } func (m *ResourceActionParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2841,7 +2616,7 @@ var xxx_messageInfo_ResourceActionParam proto.InternalMessageInfo func (m *ResourceActions) Reset() { *m = ResourceActions{} } func (*ResourceActions) ProtoMessage() {} func (*ResourceActions) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{100} + return fileDescriptor_030104ce3b95bcac, []int{92} } func (m *ResourceActions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2869,7 +2644,7 @@ var xxx_messageInfo_ResourceActions proto.InternalMessageInfo func (m *ResourceDiff) Reset() { *m = ResourceDiff{} } func (*ResourceDiff) ProtoMessage() {} func (*ResourceDiff) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{101} + return fileDescriptor_030104ce3b95bcac, []int{93} } func (m *ResourceDiff) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2897,7 +2672,7 @@ var xxx_messageInfo_ResourceDiff proto.InternalMessageInfo func (m *ResourceIgnoreDifferences) Reset() { *m = ResourceIgnoreDifferences{} } func (*ResourceIgnoreDifferences) ProtoMessage() {} func (*ResourceIgnoreDifferences) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{102} + return fileDescriptor_030104ce3b95bcac, []int{94} } func (m *ResourceIgnoreDifferences) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2925,7 +2700,7 @@ var xxx_messageInfo_ResourceIgnoreDifferences proto.InternalMessageInfo func (m *ResourceNetworkingInfo) Reset() { *m = ResourceNetworkingInfo{} } func (*ResourceNetworkingInfo) ProtoMessage() {} func (*ResourceNetworkingInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{103} + return fileDescriptor_030104ce3b95bcac, []int{95} } func (m *ResourceNetworkingInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2953,7 +2728,7 @@ var xxx_messageInfo_ResourceNetworkingInfo proto.InternalMessageInfo func (m *ResourceNode) Reset() { *m = ResourceNode{} } func (*ResourceNode) ProtoMessage() {} func (*ResourceNode) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{104} + return fileDescriptor_030104ce3b95bcac, []int{96} } func (m *ResourceNode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2981,7 +2756,7 @@ var xxx_messageInfo_ResourceNode proto.InternalMessageInfo func (m *ResourceOverride) Reset() { *m = ResourceOverride{} } func (*ResourceOverride) ProtoMessage() {} func (*ResourceOverride) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{105} + return fileDescriptor_030104ce3b95bcac, []int{97} } func (m *ResourceOverride) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3009,7 +2784,7 @@ var xxx_messageInfo_ResourceOverride proto.InternalMessageInfo func (m *ResourceRef) Reset() { *m = ResourceRef{} } func (*ResourceRef) ProtoMessage() {} func (*ResourceRef) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{106} + return fileDescriptor_030104ce3b95bcac, []int{98} } func (m *ResourceRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3037,7 +2812,7 @@ var xxx_messageInfo_ResourceRef proto.InternalMessageInfo func (m *ResourceResult) Reset() { *m = ResourceResult{} } func (*ResourceResult) ProtoMessage() {} func (*ResourceResult) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{107} + return fileDescriptor_030104ce3b95bcac, []int{99} } func (m *ResourceResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3065,7 +2840,7 @@ var xxx_messageInfo_ResourceResult proto.InternalMessageInfo func (m *ResourceStatus) Reset() { *m = ResourceStatus{} } func (*ResourceStatus) ProtoMessage() {} func (*ResourceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{108} + return fileDescriptor_030104ce3b95bcac, []int{100} } func (m *ResourceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3093,7 +2868,7 @@ var xxx_messageInfo_ResourceStatus proto.InternalMessageInfo func (m *RetryStrategy) Reset() { *m = RetryStrategy{} } func (*RetryStrategy) ProtoMessage() {} func (*RetryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{109} + return fileDescriptor_030104ce3b95bcac, []int{101} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3121,7 +2896,7 @@ var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo func (m *RevisionHistory) Reset() { *m = RevisionHistory{} } func (*RevisionHistory) ProtoMessage() {} func (*RevisionHistory) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{110} + return fileDescriptor_030104ce3b95bcac, []int{102} } func (m *RevisionHistory) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3149,7 +2924,7 @@ var xxx_messageInfo_RevisionHistory proto.InternalMessageInfo func (m *RevisionMetadata) Reset() { *m = RevisionMetadata{} } func (*RevisionMetadata) ProtoMessage() {} func (*RevisionMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{111} + return fileDescriptor_030104ce3b95bcac, []int{103} } func (m *RevisionMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3177,7 +2952,7 @@ var xxx_messageInfo_RevisionMetadata proto.InternalMessageInfo func (m *SCMProviderGenerator) Reset() { *m = SCMProviderGenerator{} } func (*SCMProviderGenerator) ProtoMessage() {} func (*SCMProviderGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{112} + return fileDescriptor_030104ce3b95bcac, []int{104} } func (m *SCMProviderGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3205,7 +2980,7 @@ var xxx_messageInfo_SCMProviderGenerator proto.InternalMessageInfo func (m *SCMProviderGeneratorAzureDevOps) Reset() { *m = SCMProviderGeneratorAzureDevOps{} } func (*SCMProviderGeneratorAzureDevOps) ProtoMessage() {} func (*SCMProviderGeneratorAzureDevOps) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{113} + return fileDescriptor_030104ce3b95bcac, []int{105} } func (m *SCMProviderGeneratorAzureDevOps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3233,7 +3008,7 @@ var xxx_messageInfo_SCMProviderGeneratorAzureDevOps proto.InternalMessageInfo func (m *SCMProviderGeneratorBitbucket) Reset() { *m = SCMProviderGeneratorBitbucket{} } func (*SCMProviderGeneratorBitbucket) ProtoMessage() {} func (*SCMProviderGeneratorBitbucket) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{114} + return fileDescriptor_030104ce3b95bcac, []int{106} } func (m *SCMProviderGeneratorBitbucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3261,7 +3036,7 @@ var xxx_messageInfo_SCMProviderGeneratorBitbucket proto.InternalMessageInfo func (m *SCMProviderGeneratorBitbucketServer) Reset() { *m = SCMProviderGeneratorBitbucketServer{} } func (*SCMProviderGeneratorBitbucketServer) ProtoMessage() {} func (*SCMProviderGeneratorBitbucketServer) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{115} + return fileDescriptor_030104ce3b95bcac, []int{107} } func (m *SCMProviderGeneratorBitbucketServer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3289,7 +3064,7 @@ var xxx_messageInfo_SCMProviderGeneratorBitbucketServer proto.InternalMessageInf func (m *SCMProviderGeneratorFilter) Reset() { *m = SCMProviderGeneratorFilter{} } func (*SCMProviderGeneratorFilter) ProtoMessage() {} func (*SCMProviderGeneratorFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{116} + return fileDescriptor_030104ce3b95bcac, []int{108} } func (m *SCMProviderGeneratorFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3317,7 +3092,7 @@ var xxx_messageInfo_SCMProviderGeneratorFilter proto.InternalMessageInfo func (m *SCMProviderGeneratorGitea) Reset() { *m = SCMProviderGeneratorGitea{} } func (*SCMProviderGeneratorGitea) ProtoMessage() {} func (*SCMProviderGeneratorGitea) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{117} + return fileDescriptor_030104ce3b95bcac, []int{109} } func (m *SCMProviderGeneratorGitea) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3345,7 +3120,7 @@ var xxx_messageInfo_SCMProviderGeneratorGitea proto.InternalMessageInfo func (m *SCMProviderGeneratorGithub) Reset() { *m = SCMProviderGeneratorGithub{} } func (*SCMProviderGeneratorGithub) ProtoMessage() {} func (*SCMProviderGeneratorGithub) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{118} + return fileDescriptor_030104ce3b95bcac, []int{110} } func (m *SCMProviderGeneratorGithub) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3373,7 +3148,7 @@ var xxx_messageInfo_SCMProviderGeneratorGithub proto.InternalMessageInfo func (m *SCMProviderGeneratorGitlab) Reset() { *m = SCMProviderGeneratorGitlab{} } func (*SCMProviderGeneratorGitlab) ProtoMessage() {} func (*SCMProviderGeneratorGitlab) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{119} + return fileDescriptor_030104ce3b95bcac, []int{111} } func (m *SCMProviderGeneratorGitlab) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3401,7 +3176,7 @@ var xxx_messageInfo_SCMProviderGeneratorGitlab proto.InternalMessageInfo func (m *SecretRef) Reset() { *m = SecretRef{} } func (*SecretRef) ProtoMessage() {} func (*SecretRef) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{120} + return fileDescriptor_030104ce3b95bcac, []int{112} } func (m *SecretRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3429,7 +3204,7 @@ var xxx_messageInfo_SecretRef proto.InternalMessageInfo func (m *SignatureKey) Reset() { *m = SignatureKey{} } func (*SignatureKey) ProtoMessage() {} func (*SignatureKey) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{121} + return fileDescriptor_030104ce3b95bcac, []int{113} } func (m *SignatureKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3457,7 +3232,7 @@ var xxx_messageInfo_SignatureKey proto.InternalMessageInfo func (m *SyncOperation) Reset() { *m = SyncOperation{} } func (*SyncOperation) ProtoMessage() {} func (*SyncOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{122} + return fileDescriptor_030104ce3b95bcac, []int{114} } func (m *SyncOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3485,7 +3260,7 @@ var xxx_messageInfo_SyncOperation proto.InternalMessageInfo func (m *SyncOperationResource) Reset() { *m = SyncOperationResource{} } func (*SyncOperationResource) ProtoMessage() {} func (*SyncOperationResource) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{123} + return fileDescriptor_030104ce3b95bcac, []int{115} } func (m *SyncOperationResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3513,7 +3288,7 @@ var xxx_messageInfo_SyncOperationResource proto.InternalMessageInfo func (m *SyncOperationResult) Reset() { *m = SyncOperationResult{} } func (*SyncOperationResult) ProtoMessage() {} func (*SyncOperationResult) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{124} + return fileDescriptor_030104ce3b95bcac, []int{116} } func (m *SyncOperationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3541,7 +3316,7 @@ var xxx_messageInfo_SyncOperationResult proto.InternalMessageInfo func (m *SyncPolicy) Reset() { *m = SyncPolicy{} } func (*SyncPolicy) ProtoMessage() {} func (*SyncPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{125} + return fileDescriptor_030104ce3b95bcac, []int{117} } func (m *SyncPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3569,7 +3344,7 @@ var xxx_messageInfo_SyncPolicy proto.InternalMessageInfo func (m *SyncPolicyAutomated) Reset() { *m = SyncPolicyAutomated{} } func (*SyncPolicyAutomated) ProtoMessage() {} func (*SyncPolicyAutomated) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{126} + return fileDescriptor_030104ce3b95bcac, []int{118} } func (m *SyncPolicyAutomated) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3597,7 +3372,7 @@ var xxx_messageInfo_SyncPolicyAutomated proto.InternalMessageInfo func (m *SyncStatus) Reset() { *m = SyncStatus{} } func (*SyncStatus) ProtoMessage() {} func (*SyncStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{127} + return fileDescriptor_030104ce3b95bcac, []int{119} } func (m *SyncStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3625,7 +3400,7 @@ var xxx_messageInfo_SyncStatus proto.InternalMessageInfo func (m *SyncStrategy) Reset() { *m = SyncStrategy{} } func (*SyncStrategy) ProtoMessage() {} func (*SyncStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{128} + return fileDescriptor_030104ce3b95bcac, []int{120} } func (m *SyncStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3653,7 +3428,7 @@ var xxx_messageInfo_SyncStrategy proto.InternalMessageInfo func (m *SyncStrategyApply) Reset() { *m = SyncStrategyApply{} } func (*SyncStrategyApply) ProtoMessage() {} func (*SyncStrategyApply) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{129} + return fileDescriptor_030104ce3b95bcac, []int{121} } func (m *SyncStrategyApply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3681,7 +3456,7 @@ var xxx_messageInfo_SyncStrategyApply proto.InternalMessageInfo func (m *SyncStrategyHook) Reset() { *m = SyncStrategyHook{} } func (*SyncStrategyHook) ProtoMessage() {} func (*SyncStrategyHook) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{130} + return fileDescriptor_030104ce3b95bcac, []int{122} } func (m *SyncStrategyHook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3709,7 +3484,7 @@ var xxx_messageInfo_SyncStrategyHook proto.InternalMessageInfo func (m *SyncWindow) Reset() { *m = SyncWindow{} } func (*SyncWindow) ProtoMessage() {} func (*SyncWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{131} + return fileDescriptor_030104ce3b95bcac, []int{123} } func (m *SyncWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3737,7 +3512,7 @@ var xxx_messageInfo_SyncWindow proto.InternalMessageInfo func (m *TLSClientConfig) Reset() { *m = TLSClientConfig{} } func (*TLSClientConfig) ProtoMessage() {} func (*TLSClientConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{132} + return fileDescriptor_030104ce3b95bcac, []int{124} } func (m *TLSClientConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3773,18 +3548,13 @@ func init() { proto.RegisterType((*ApplicationCondition)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationCondition") proto.RegisterType((*ApplicationDestination)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationDestination") proto.RegisterType((*ApplicationList)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationList") - proto.RegisterType((*ApplicationMatchExpression)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationMatchExpression") proto.RegisterType((*ApplicationSet)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSet") - proto.RegisterType((*ApplicationSetApplicationStatus)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetApplicationStatus") proto.RegisterType((*ApplicationSetCondition)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetCondition") proto.RegisterType((*ApplicationSetGenerator)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetGenerator") proto.RegisterType((*ApplicationSetList)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetList") proto.RegisterType((*ApplicationSetNestedGenerator)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetNestedGenerator") - proto.RegisterType((*ApplicationSetRolloutStep)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetRolloutStep") - proto.RegisterType((*ApplicationSetRolloutStrategy)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetRolloutStrategy") proto.RegisterType((*ApplicationSetSpec)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetSpec") proto.RegisterType((*ApplicationSetStatus)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetStatus") - proto.RegisterType((*ApplicationSetStrategy)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetStrategy") proto.RegisterType((*ApplicationSetSyncPolicy)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetSyncPolicy") proto.RegisterType((*ApplicationSetTemplate)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetTemplate") proto.RegisterType((*ApplicationSetTemplateMeta)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetTemplateMeta") @@ -3799,8 +3569,6 @@ func init() { proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourceKustomize.CommonAnnotationsEntry") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourceKustomize.CommonLabelsEntry") proto.RegisterType((*ApplicationSourcePlugin)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourcePlugin") - proto.RegisterType((*ApplicationSourcePluginParameter)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourcePluginParameter") - proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourcePluginParameter.MapEntry") proto.RegisterType((*ApplicationSpec)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSpec") proto.RegisterType((*ApplicationStatus)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationStatus") proto.RegisterType((*ApplicationSummary)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSummary") @@ -3846,9 +3614,6 @@ func init() { proto.RegisterType((*KnownTypeField)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.KnownTypeField") proto.RegisterType((*KustomizeOptions)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.KustomizeOptions") proto.RegisterType((*ListGenerator)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ListGenerator") - proto.RegisterType((*ManagedNamespaceMetadata)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ManagedNamespaceMetadata") - proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ManagedNamespaceMetadata.AnnotationsEntry") - proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ManagedNamespaceMetadata.LabelsEntry") proto.RegisterType((*MatrixGenerator)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.MatrixGenerator") proto.RegisterType((*MergeGenerator)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.MergeGenerator") proto.RegisterType((*NestedMatrixGenerator)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.NestedMatrixGenerator") @@ -3866,7 +3631,6 @@ func init() { proto.RegisterType((*PullRequestGeneratorGitLab)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.PullRequestGeneratorGitLab") proto.RegisterType((*PullRequestGeneratorGitea)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.PullRequestGeneratorGitea") proto.RegisterType((*PullRequestGeneratorGithub)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.PullRequestGeneratorGithub") - proto.RegisterType((*RefTarget)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.RefTarget") proto.RegisterType((*RepoCreds)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.RepoCreds") proto.RegisterType((*RepoCredsList)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.RepoCredsList") proto.RegisterType((*Repository)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository") @@ -3918,609 +3682,567 @@ func init() { } var fileDescriptor_030104ce3b95bcac = []byte{ - // 9618 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6f, 0x70, 0x24, 0xc7, - 0x75, 0x18, 0xae, 0xd9, 0xc5, 0x02, 0xbb, 0x0f, 0x7f, 0xee, 0xd0, 0x77, 0x47, 0x82, 0x47, 0xf2, - 0x70, 0x35, 0x2c, 0x53, 0xd4, 0x4f, 0x24, 0xf0, 0xe3, 0x89, 0x52, 0x18, 0xd3, 0xa6, 0x8c, 0x05, - 0xee, 0x70, 0xb8, 0x03, 0x0e, 0x60, 0x03, 0x77, 0x27, 0x91, 0xa6, 0xa4, 0xc1, 0x6c, 0xef, 0x62, - 0x0e, 0xb3, 0x33, 0xcb, 0x99, 0x59, 0x1c, 0x96, 0x96, 0x65, 0x49, 0x96, 0x6d, 0x25, 0xfa, 0x43, - 0x85, 0xfe, 0x10, 0xb9, 0x92, 0xd8, 0x8a, 0xed, 0x72, 0xc5, 0x95, 0xa8, 0xe2, 0x54, 0x3e, 0x24, - 0x4e, 0x2a, 0x55, 0x89, 0x9d, 0x0f, 0x4c, 0x29, 0x55, 0x51, 0x55, 0x5c, 0x96, 0x13, 0x3b, 0x30, - 0x75, 0xa9, 0x54, 0x52, 0xa9, 0x8a, 0x53, 0xf9, 0xf3, 0x25, 0x57, 0xf9, 0x90, 0xea, 0xff, 0x3d, - 0xb3, 0xbb, 0x87, 0xdd, 0xc3, 0xe0, 0xee, 0xa4, 0xe2, 0xb7, 0xdd, 0x7e, 0x6f, 0xde, 0xeb, 0xe9, - 0xe9, 0x7e, 0xfd, 0x5e, 0xbf, 0x3f, 0x0d, 0xab, 0x0d, 0x2f, 0xd9, 0x69, 0x6f, 0xcf, 0xb9, 0x61, - 0x73, 0xde, 0x89, 0x1a, 0x61, 0x2b, 0x0a, 0x6f, 0xb1, 0x1f, 0x2f, 0xb8, 0xb5, 0xf9, 0xbd, 0x0b, - 0xf3, 0xad, 0xdd, 0xc6, 0xbc, 0xd3, 0xf2, 0xe2, 0x79, 0xa7, 0xd5, 0xf2, 0x3d, 0xd7, 0x49, 0xbc, - 0x30, 0x98, 0xdf, 0x7b, 0xd1, 0xf1, 0x5b, 0x3b, 0xce, 0x8b, 0xf3, 0x0d, 0x12, 0x90, 0xc8, 0x49, - 0x48, 0x6d, 0xae, 0x15, 0x85, 0x49, 0x88, 0x7e, 0x4a, 0x53, 0x9b, 0x93, 0xd4, 0xd8, 0x8f, 0xcf, - 0xba, 0xb5, 0xb9, 0xbd, 0x0b, 0x73, 0xad, 0xdd, 0xc6, 0x1c, 0xa5, 0x36, 0x67, 0x50, 0x9b, 0x93, - 0xd4, 0xce, 0xbe, 0x60, 0xf4, 0xa5, 0x11, 0x36, 0xc2, 0x79, 0x46, 0x74, 0xbb, 0x5d, 0x67, 0xff, - 0xd8, 0x1f, 0xf6, 0x8b, 0x33, 0x3b, 0x6b, 0xef, 0xbe, 0x1c, 0xcf, 0x79, 0x21, 0xed, 0xde, 0xbc, - 0x1b, 0x46, 0x64, 0x7e, 0xaf, 0xab, 0x43, 0x67, 0x2f, 0x6b, 0x1c, 0xb2, 0x9f, 0x90, 0x20, 0xf6, - 0xc2, 0x20, 0x7e, 0x81, 0x76, 0x81, 0x44, 0x7b, 0x24, 0x32, 0x5f, 0xcf, 0x40, 0xe8, 0x45, 0xe9, - 0x25, 0x4d, 0xa9, 0xe9, 0xb8, 0x3b, 0x5e, 0x40, 0xa2, 0x8e, 0x7e, 0xbc, 0x49, 0x12, 0xa7, 0xd7, - 0x53, 0xf3, 0xfd, 0x9e, 0x8a, 0xda, 0x41, 0xe2, 0x35, 0x49, 0xd7, 0x03, 0x9f, 0x38, 0xec, 0x81, - 0xd8, 0xdd, 0x21, 0x4d, 0xa7, 0xeb, 0xb9, 0x8f, 0xf5, 0x7b, 0xae, 0x9d, 0x78, 0xfe, 0xbc, 0x17, - 0x24, 0x71, 0x12, 0x65, 0x1f, 0xb2, 0xdf, 0x82, 0xc9, 0x85, 0x9b, 0x9b, 0x0b, 0xed, 0x64, 0x67, - 0x31, 0x0c, 0xea, 0x5e, 0x03, 0x7d, 0x1c, 0xc6, 0x5d, 0xbf, 0x1d, 0x27, 0x24, 0xba, 0xe6, 0x34, - 0xc9, 0x8c, 0x75, 0xde, 0x7a, 0xae, 0x52, 0x3d, 0xf5, 0xde, 0xc1, 0xec, 0x87, 0xee, 0x1c, 0xcc, - 0x8e, 0x2f, 0x6a, 0x10, 0x36, 0xf1, 0xd0, 0x47, 0x60, 0x2c, 0x0a, 0x7d, 0xb2, 0x80, 0xaf, 0xcd, - 0x14, 0xd8, 0x23, 0x27, 0xc4, 0x23, 0x63, 0x98, 0x37, 0x63, 0x09, 0xb7, 0xff, 0xb8, 0x00, 0xb0, - 0xd0, 0x6a, 0x6d, 0x44, 0xe1, 0x2d, 0xe2, 0x26, 0xe8, 0x73, 0x50, 0xa6, 0x43, 0x57, 0x73, 0x12, - 0x87, 0x71, 0x1b, 0xbf, 0xf0, 0xff, 0xcf, 0xf1, 0x37, 0x99, 0x33, 0xdf, 0x44, 0x4f, 0x1c, 0x8a, - 0x3d, 0xb7, 0xf7, 0xe2, 0xdc, 0xfa, 0x36, 0x7d, 0x7e, 0x8d, 0x24, 0x4e, 0x15, 0x09, 0x66, 0xa0, - 0xdb, 0xb0, 0xa2, 0x8a, 0x02, 0x18, 0x89, 0x5b, 0xc4, 0x65, 0x1d, 0x1b, 0xbf, 0xb0, 0x3a, 0x77, - 0x94, 0x19, 0x3a, 0xa7, 0x7b, 0xbe, 0xd9, 0x22, 0x6e, 0x75, 0x42, 0x70, 0x1e, 0xa1, 0xff, 0x30, - 0xe3, 0x83, 0xf6, 0x60, 0x34, 0x4e, 0x9c, 0xa4, 0x1d, 0xcf, 0x14, 0x19, 0xc7, 0x6b, 0xb9, 0x71, - 0x64, 0x54, 0xab, 0x53, 0x82, 0xe7, 0x28, 0xff, 0x8f, 0x05, 0x37, 0xfb, 0x3f, 0x58, 0x30, 0xa5, - 0x91, 0x57, 0xbd, 0x38, 0x41, 0x3f, 0xdb, 0x35, 0xb8, 0x73, 0x83, 0x0d, 0x2e, 0x7d, 0x9a, 0x0d, - 0xed, 0x49, 0xc1, 0xac, 0x2c, 0x5b, 0x8c, 0x81, 0x6d, 0x42, 0xc9, 0x4b, 0x48, 0x33, 0x9e, 0x29, - 0x9c, 0x2f, 0x3e, 0x37, 0x7e, 0xe1, 0x72, 0x5e, 0xef, 0x59, 0x9d, 0x14, 0x4c, 0x4b, 0x2b, 0x94, - 0x3c, 0xe6, 0x5c, 0xec, 0xdf, 0x9d, 0x30, 0xdf, 0x8f, 0x0e, 0x38, 0x7a, 0x11, 0xc6, 0xe3, 0xb0, - 0x1d, 0xb9, 0x04, 0x93, 0x56, 0x18, 0xcf, 0x58, 0xe7, 0x8b, 0x74, 0xea, 0xd1, 0x99, 0xba, 0xa9, - 0x9b, 0xb1, 0x89, 0x83, 0xbe, 0x69, 0xc1, 0x44, 0x8d, 0xc4, 0x89, 0x17, 0x30, 0xfe, 0xb2, 0xf3, - 0x5b, 0x47, 0xee, 0xbc, 0x6c, 0x5c, 0xd2, 0xc4, 0xab, 0xa7, 0xc5, 0x8b, 0x4c, 0x18, 0x8d, 0x31, - 0x4e, 0xf1, 0xa7, 0x2b, 0xae, 0x46, 0x62, 0x37, 0xf2, 0x5a, 0xf4, 0x3f, 0x9b, 0x33, 0xc6, 0x8a, - 0x5b, 0xd2, 0x20, 0x6c, 0xe2, 0xa1, 0x00, 0x4a, 0x74, 0x45, 0xc5, 0x33, 0x23, 0xac, 0xff, 0x2b, - 0x47, 0xeb, 0xbf, 0x18, 0x54, 0xba, 0x58, 0xf5, 0xe8, 0xd3, 0x7f, 0x31, 0xe6, 0x6c, 0xd0, 0x37, - 0x2c, 0x98, 0x11, 0x2b, 0x1e, 0x13, 0x3e, 0xa0, 0x37, 0x77, 0xbc, 0x84, 0xf8, 0x5e, 0x9c, 0xcc, - 0x94, 0x58, 0x1f, 0xe6, 0x07, 0x9b, 0x5b, 0xcb, 0x51, 0xd8, 0x6e, 0x5d, 0xf5, 0x82, 0x5a, 0xf5, - 0xbc, 0xe0, 0x34, 0xb3, 0xd8, 0x87, 0x30, 0xee, 0xcb, 0x12, 0xfd, 0xaa, 0x05, 0x67, 0x03, 0xa7, - 0x49, 0xe2, 0x96, 0x43, 0x3f, 0x2d, 0x07, 0x57, 0x7d, 0xc7, 0xdd, 0x65, 0x3d, 0x1a, 0xbd, 0xbf, - 0x1e, 0xd9, 0xa2, 0x47, 0x67, 0xaf, 0xf5, 0x25, 0x8d, 0xef, 0xc1, 0x16, 0xfd, 0x96, 0x05, 0xd3, - 0x61, 0xd4, 0xda, 0x71, 0x02, 0x52, 0x93, 0xd0, 0x78, 0x66, 0x8c, 0x2d, 0xbd, 0xcf, 0x1c, 0xed, - 0x13, 0xad, 0x67, 0xc9, 0xae, 0x85, 0x81, 0x97, 0x84, 0xd1, 0x26, 0x49, 0x12, 0x2f, 0x68, 0xc4, - 0xd5, 0x33, 0x77, 0x0e, 0x66, 0xa7, 0xbb, 0xb0, 0x70, 0x77, 0x7f, 0xd0, 0xcf, 0xc1, 0x78, 0xdc, - 0x09, 0xdc, 0x9b, 0x5e, 0x50, 0x0b, 0x6f, 0xc7, 0x33, 0xe5, 0x3c, 0x96, 0xef, 0xa6, 0x22, 0x28, - 0x16, 0xa0, 0x66, 0x80, 0x4d, 0x6e, 0xbd, 0x3f, 0x9c, 0x9e, 0x4a, 0x95, 0xbc, 0x3f, 0x9c, 0x9e, - 0x4c, 0xf7, 0x60, 0x8b, 0x7e, 0xc5, 0x82, 0xc9, 0xd8, 0x6b, 0x04, 0x4e, 0xd2, 0x8e, 0xc8, 0x55, - 0xd2, 0x89, 0x67, 0x80, 0x75, 0xe4, 0xca, 0x11, 0x47, 0xc5, 0x20, 0x59, 0x3d, 0x23, 0xfa, 0x38, - 0x69, 0xb6, 0xc6, 0x38, 0xcd, 0xb7, 0xd7, 0x42, 0xd3, 0xd3, 0x7a, 0x3c, 0xdf, 0x85, 0xa6, 0x27, - 0x75, 0x5f, 0x96, 0xe8, 0x67, 0xe0, 0x24, 0x6f, 0x52, 0x23, 0x1b, 0xcf, 0x4c, 0x30, 0x41, 0x7b, - 0xfa, 0xce, 0xc1, 0xec, 0xc9, 0xcd, 0x0c, 0x0c, 0x77, 0x61, 0xa3, 0xb7, 0x60, 0xb6, 0x45, 0xa2, - 0xa6, 0x97, 0xac, 0x07, 0x7e, 0x47, 0x8a, 0x6f, 0x37, 0x6c, 0x91, 0x9a, 0xe8, 0x4e, 0x3c, 0x33, - 0x79, 0xde, 0x7a, 0xae, 0x5c, 0xfd, 0xb0, 0xe8, 0xe6, 0xec, 0xc6, 0xbd, 0xd1, 0xf1, 0x61, 0xf4, - 0xec, 0x7f, 0x55, 0x80, 0x93, 0xd9, 0x8d, 0x13, 0xfd, 0x8e, 0x05, 0x27, 0x6e, 0xdd, 0x4e, 0xb6, - 0xc2, 0x5d, 0x12, 0xc4, 0xd5, 0x0e, 0x15, 0x6f, 0x6c, 0xcb, 0x18, 0xbf, 0xe0, 0xe6, 0xbb, 0x45, - 0xcf, 0x5d, 0x49, 0x73, 0xb9, 0x18, 0x24, 0x51, 0xa7, 0xfa, 0xb8, 0x78, 0xbb, 0x13, 0x57, 0x6e, - 0x6e, 0x99, 0x50, 0x9c, 0xed, 0xd4, 0xd9, 0xaf, 0x59, 0x70, 0xba, 0x17, 0x09, 0x74, 0x12, 0x8a, - 0xbb, 0xa4, 0xc3, 0xb5, 0x32, 0x4c, 0x7f, 0xa2, 0x37, 0xa1, 0xb4, 0xe7, 0xf8, 0x6d, 0x22, 0xb4, - 0x9b, 0xe5, 0xa3, 0xbd, 0x88, 0xea, 0x19, 0xe6, 0x54, 0x7f, 0xb2, 0xf0, 0xb2, 0x65, 0xff, 0x9b, - 0x22, 0x8c, 0x1b, 0xfb, 0xdb, 0x03, 0xd0, 0xd8, 0xc2, 0x94, 0xc6, 0xb6, 0x96, 0xdb, 0xd6, 0xdc, - 0x57, 0x65, 0xbb, 0x9d, 0x51, 0xd9, 0xd6, 0xf3, 0x63, 0x79, 0x4f, 0x9d, 0x0d, 0x25, 0x50, 0x09, - 0x5b, 0x54, 0x23, 0xa7, 0x5b, 0xff, 0x48, 0x1e, 0x9f, 0x70, 0x5d, 0x92, 0xab, 0x4e, 0xde, 0x39, - 0x98, 0xad, 0xa8, 0xbf, 0x58, 0x33, 0xb2, 0x7f, 0x60, 0xc1, 0x69, 0xa3, 0x8f, 0x8b, 0x61, 0x50, - 0xf3, 0xd8, 0xa7, 0x3d, 0x0f, 0x23, 0x49, 0xa7, 0x25, 0xd5, 0x7e, 0x35, 0x52, 0x5b, 0x9d, 0x16, - 0xc1, 0x0c, 0x42, 0x15, 0xfd, 0x26, 0x89, 0x63, 0xa7, 0x41, 0xb2, 0x8a, 0xfe, 0x1a, 0x6f, 0xc6, - 0x12, 0x8e, 0x22, 0x40, 0xbe, 0x13, 0x27, 0x5b, 0x91, 0x13, 0xc4, 0x8c, 0xfc, 0x96, 0xd7, 0x24, - 0x62, 0x80, 0xff, 0xbf, 0xc1, 0x66, 0x0c, 0x7d, 0xa2, 0xfa, 0xd8, 0x9d, 0x83, 0x59, 0xb4, 0xda, - 0x45, 0x09, 0xf7, 0xa0, 0x6e, 0xff, 0xaa, 0x05, 0x8f, 0xf5, 0xd6, 0xc5, 0xd0, 0xb3, 0x30, 0xca, - 0x4d, 0x3e, 0xf1, 0x76, 0xfa, 0x93, 0xb0, 0x56, 0x2c, 0xa0, 0x68, 0x1e, 0x2a, 0x6a, 0x9f, 0x10, - 0xef, 0x38, 0x2d, 0x50, 0x2b, 0x7a, 0x73, 0xd1, 0x38, 0x74, 0xd0, 0xe8, 0x1f, 0xa1, 0xb9, 0xa9, - 0x41, 0x63, 0x46, 0x12, 0x83, 0xd8, 0x7f, 0x6e, 0xc1, 0x09, 0xa3, 0x57, 0x0f, 0x40, 0x35, 0x0f, - 0xd2, 0xaa, 0xf9, 0x4a, 0x6e, 0xf3, 0xb9, 0x8f, 0x6e, 0xfe, 0x0d, 0x0b, 0xce, 0x1a, 0x58, 0x6b, - 0x4e, 0xe2, 0xee, 0x5c, 0xdc, 0x6f, 0x45, 0x24, 0xa6, 0xe6, 0x34, 0x7a, 0xda, 0x90, 0x5b, 0xd5, - 0x71, 0x41, 0xa1, 0x78, 0x95, 0x74, 0xb8, 0x10, 0x7b, 0x1e, 0xca, 0x7c, 0x72, 0x86, 0x91, 0x18, - 0x71, 0xf5, 0x6e, 0xeb, 0xa2, 0x1d, 0x2b, 0x0c, 0x64, 0xc3, 0x28, 0x13, 0x4e, 0x74, 0xb1, 0xd2, - 0x6d, 0x08, 0xe8, 0x47, 0xbc, 0xc1, 0x5a, 0xb0, 0x80, 0xd8, 0x77, 0x0a, 0xcc, 0x56, 0x50, 0xab, - 0x90, 0x3c, 0x08, 0x43, 0x33, 0x4a, 0x89, 0xad, 0x8d, 0xfc, 0x64, 0x08, 0xe9, 0x6f, 0x6c, 0xbe, - 0x9d, 0x91, 0x5c, 0x38, 0x57, 0xae, 0xf7, 0x36, 0x38, 0x7f, 0xa3, 0x00, 0xb3, 0xe9, 0x07, 0xba, - 0x04, 0x1f, 0xb5, 0x6e, 0x0c, 0x46, 0xd9, 0xf3, 0x04, 0x03, 0x1f, 0x9b, 0x78, 0x7d, 0x64, 0x47, - 0xe1, 0x38, 0x65, 0x87, 0x29, 0xda, 0x8a, 0x87, 0x88, 0xb6, 0x67, 0xd5, 0xa8, 0x97, 0x32, 0xb2, - 0x24, 0x3d, 0x42, 0xff, 0xb5, 0x00, 0x8f, 0xa7, 0x47, 0x48, 0xcb, 0xda, 0x4f, 0xa6, 0x64, 0xed, - 0x47, 0x4d, 0x59, 0x7b, 0xf7, 0x60, 0xf6, 0xc9, 0x3e, 0x8f, 0xfd, 0xc8, 0x88, 0x62, 0xb4, 0xac, - 0xc6, 0x68, 0x84, 0xf5, 0x6e, 0x3e, 0x3d, 0x46, 0x77, 0x0f, 0x66, 0x9f, 0xee, 0xf3, 0x8e, 0x99, - 0x3d, 0xf2, 0x59, 0x18, 0x8d, 0x88, 0x13, 0x87, 0x41, 0x76, 0xb0, 0x31, 0x6b, 0xc5, 0x02, 0x6a, - 0xff, 0x79, 0x39, 0x3b, 0xd8, 0xcb, 0xfc, 0xb4, 0x2b, 0x8c, 0x90, 0x07, 0x23, 0x4c, 0x7f, 0xe6, - 0x0b, 0xff, 0xea, 0xd1, 0x16, 0x09, 0x95, 0xb7, 0x8a, 0x74, 0xb5, 0x4c, 0xbf, 0x1a, 0x6d, 0xc2, - 0x8c, 0x05, 0xda, 0x87, 0xb2, 0x2b, 0xd5, 0xda, 0x42, 0x1e, 0x07, 0x40, 0x42, 0xa9, 0xd5, 0x1c, - 0x27, 0xa8, 0x60, 0x54, 0xba, 0xb0, 0xe2, 0x86, 0x08, 0x14, 0x1b, 0x5e, 0x22, 0x3e, 0xeb, 0x11, - 0x0d, 0x97, 0x65, 0xcf, 0x78, 0xc5, 0x31, 0x2a, 0xad, 0x97, 0xbd, 0x04, 0x53, 0xfa, 0xe8, 0x97, - 0x2c, 0x18, 0x8f, 0xdd, 0xe6, 0x46, 0x14, 0xee, 0x79, 0x35, 0x12, 0x09, 0xb5, 0xe5, 0x88, 0x82, - 0x67, 0x73, 0x71, 0x4d, 0x12, 0xd4, 0x7c, 0xb9, 0x21, 0xa9, 0x21, 0xd8, 0xe4, 0x4b, 0xd5, 0xf9, - 0xc7, 0xc5, 0xbb, 0x2f, 0x11, 0xd7, 0xa3, 0x1b, 0x8d, 0xb4, 0x5e, 0xd8, 0x4c, 0x39, 0xb2, 0x1a, - 0xb7, 0xd4, 0x76, 0x77, 0xe9, 0x7a, 0xd3, 0x1d, 0x7a, 0xf2, 0xce, 0xc1, 0xec, 0xe3, 0x8b, 0xbd, - 0x79, 0xe2, 0x7e, 0x9d, 0x61, 0x03, 0xd6, 0x6a, 0xfb, 0x3e, 0x26, 0x6f, 0xb5, 0x09, 0x3b, 0x9b, - 0xc8, 0x61, 0xc0, 0x36, 0x34, 0xc1, 0xcc, 0x80, 0x19, 0x10, 0x6c, 0xf2, 0x45, 0x6f, 0xc1, 0x68, - 0xd3, 0x49, 0x22, 0x6f, 0x5f, 0x1c, 0x48, 0x1c, 0x51, 0xb1, 0x5e, 0x63, 0xb4, 0x34, 0x73, 0xb6, - 0x0f, 0xf3, 0x46, 0x2c, 0x18, 0xa1, 0x26, 0x94, 0x9a, 0x24, 0x6a, 0x90, 0x99, 0x72, 0x1e, 0x87, - 0xaf, 0x6b, 0x94, 0x94, 0x66, 0x58, 0xa1, 0x6a, 0x08, 0x6b, 0xc3, 0x9c, 0x0b, 0x7a, 0x13, 0xca, - 0x31, 0xf1, 0x89, 0x4b, 0x15, 0x89, 0x0a, 0xe3, 0xf8, 0xb1, 0x01, 0x95, 0x2a, 0x67, 0x9b, 0xf8, - 0x9b, 0xe2, 0x51, 0xbe, 0xc0, 0xe4, 0x3f, 0xac, 0x48, 0xda, 0xff, 0xc9, 0x02, 0x94, 0x96, 0x30, - 0x0f, 0x40, 0x95, 0x7b, 0x2b, 0xad, 0xca, 0xad, 0xe6, 0xb9, 0xc1, 0xf7, 0xd1, 0xe6, 0xde, 0x2b, - 0x43, 0x46, 0x36, 0x5f, 0x23, 0x71, 0x42, 0x6a, 0x1f, 0xc8, 0xd3, 0x0f, 0xe4, 0xe9, 0x07, 0xf2, - 0x54, 0xc9, 0xd3, 0xed, 0x8c, 0x3c, 0x7d, 0xd5, 0x58, 0xf5, 0xda, 0x95, 0xf8, 0x59, 0xe5, 0x6b, - 0x34, 0x7b, 0x60, 0x20, 0x50, 0x49, 0x70, 0x65, 0x73, 0xfd, 0x5a, 0x4f, 0x01, 0xfa, 0xd9, 0xb4, - 0x00, 0x3d, 0x2a, 0x8b, 0x07, 0x2e, 0x32, 0xff, 0x46, 0x01, 0x9e, 0x48, 0x8b, 0x12, 0x1c, 0xfa, - 0x7e, 0xd8, 0x4e, 0x36, 0x13, 0xd2, 0x42, 0xbf, 0x6e, 0xc1, 0xc9, 0x66, 0xda, 0x56, 0x8c, 0xc5, - 0x91, 0xdc, 0xa7, 0x72, 0x93, 0x73, 0x19, 0x63, 0xb4, 0x3a, 0x23, 0x64, 0xde, 0xc9, 0x0c, 0x20, - 0xc6, 0x5d, 0x7d, 0x41, 0x6f, 0x42, 0xa5, 0xe9, 0xec, 0x5f, 0x6f, 0xd5, 0x9c, 0x44, 0x9a, 0x1f, - 0xfd, 0xad, 0xc6, 0x76, 0xe2, 0xf9, 0x73, 0xdc, 0xd1, 0x3a, 0xb7, 0x12, 0x24, 0xeb, 0xd1, 0x66, - 0x12, 0x79, 0x41, 0x83, 0x1f, 0xc4, 0xac, 0x49, 0x32, 0x58, 0x53, 0xb4, 0xff, 0x96, 0x95, 0x15, - 0xb4, 0x6a, 0x74, 0x22, 0x27, 0x21, 0x8d, 0x0e, 0xfa, 0x3c, 0x94, 0xe2, 0x84, 0xb4, 0xe4, 0xa8, - 0xdc, 0xcc, 0x53, 0xfa, 0x1b, 0x5f, 0x42, 0x6f, 0x04, 0xf4, 0x5f, 0x8c, 0x39, 0x53, 0xfb, 0xce, - 0x48, 0x76, 0xc3, 0x63, 0x6e, 0xb7, 0x0b, 0x00, 0x8d, 0x70, 0x8b, 0x34, 0x5b, 0x3e, 0x1d, 0x16, - 0x8b, 0x9d, 0xdd, 0x2a, 0xd3, 0x78, 0x59, 0x41, 0xb0, 0x81, 0x85, 0xfe, 0x8a, 0x05, 0xd0, 0x90, - 0x0b, 0x4b, 0x6e, 0x66, 0xd7, 0xf3, 0x7c, 0x1d, 0xbd, 0x6c, 0x75, 0x5f, 0x14, 0x43, 0x6c, 0x30, - 0x47, 0x5f, 0xb6, 0xa0, 0x9c, 0xc8, 0xee, 0x73, 0xf1, 0xbe, 0x95, 0x67, 0x4f, 0xe4, 0x4b, 0xeb, - 0x7d, 0x5d, 0x0d, 0x89, 0xe2, 0x8b, 0x7e, 0xd9, 0x02, 0x88, 0x3b, 0x81, 0xbb, 0x11, 0xfa, 0x9e, - 0xdb, 0x11, 0x52, 0xff, 0x46, 0xae, 0xe6, 0xbb, 0xa2, 0x5e, 0x9d, 0xa2, 0xa3, 0xa1, 0xff, 0x63, - 0x83, 0x33, 0xfa, 0x02, 0x94, 0x63, 0x31, 0xdd, 0x84, 0x9c, 0xdf, 0xca, 0xf7, 0x10, 0x81, 0xd3, - 0x16, 0x22, 0x42, 0xfc, 0xc3, 0x8a, 0xa7, 0xfd, 0xbd, 0x42, 0xea, 0x34, 0x52, 0x9d, 0x3b, 0xb0, - 0x29, 0xe3, 0x4a, 0xa3, 0x50, 0xae, 0x80, 0x5c, 0xa7, 0x8c, 0x32, 0x39, 0xf5, 0x94, 0x51, 0x4d, - 0x31, 0x36, 0x98, 0xd3, 0xcd, 0x71, 0xda, 0xc9, 0x9e, 0x6e, 0x88, 0x59, 0xfc, 0x66, 0x9e, 0x5d, - 0xea, 0x3e, 0x3b, 0x7e, 0x42, 0x74, 0x6d, 0xba, 0x0b, 0x84, 0xbb, 0xbb, 0x64, 0x7f, 0x2f, 0x7d, - 0x02, 0x6a, 0x7c, 0x80, 0x01, 0x4e, 0x77, 0xbf, 0x69, 0xc1, 0x78, 0x14, 0xfa, 0xbe, 0x17, 0x34, - 0xe8, 0x64, 0x11, 0x12, 0xef, 0x8d, 0x63, 0x11, 0x3a, 0x62, 0x56, 0xb0, 0x2d, 0x16, 0x6b, 0x9e, - 0xd8, 0xec, 0x80, 0xfd, 0x25, 0x0b, 0x66, 0xfa, 0x4d, 0x6a, 0x44, 0xe0, 0x49, 0x2a, 0xa9, 0xe9, - 0xc6, 0xa7, 0x7c, 0x9b, 0xeb, 0xc1, 0x12, 0xf1, 0x89, 0x3a, 0x6b, 0x2a, 0x57, 0x9f, 0x11, 0xaf, - 0xf9, 0xe4, 0x46, 0x7f, 0x54, 0x7c, 0x2f, 0x3a, 0xf6, 0x6f, 0x17, 0xb2, 0x23, 0xaa, 0x84, 0xda, - 0xb7, 0xad, 0x2e, 0xd5, 0xff, 0x53, 0xc7, 0x21, 0x48, 0x98, 0x91, 0xa0, 0x5c, 0x9c, 0xfd, 0x71, - 0x1e, 0xa2, 0x0f, 0xc5, 0xfe, 0xd7, 0x23, 0x70, 0x8f, 0x9e, 0xa9, 0x53, 0x72, 0xab, 0xdf, 0x29, - 0xf9, 0xf0, 0x07, 0xef, 0x5f, 0xb7, 0x60, 0xd4, 0xa7, 0x5a, 0x08, 0x3f, 0x09, 0x1e, 0xbf, 0x50, - 0x3b, 0xae, 0xb1, 0xe7, 0xca, 0x4e, 0xcc, 0xfd, 0x78, 0xea, 0xfc, 0x89, 0x37, 0x62, 0xd1, 0x07, - 0xf4, 0x1d, 0x0b, 0xc6, 0x9d, 0x20, 0x08, 0x13, 0x11, 0x58, 0xc2, 0x03, 0x33, 0xbc, 0x63, 0xeb, - 0xd3, 0x82, 0xe6, 0xc5, 0x3b, 0xa6, 0x8f, 0x55, 0x35, 0x04, 0x9b, 0x5d, 0x42, 0x73, 0x00, 0x75, - 0x2f, 0x70, 0x7c, 0xef, 0x6d, 0x6a, 0x4d, 0x95, 0xd8, 0xf1, 0x39, 0xdb, 0x1a, 0x2e, 0xa9, 0x56, - 0x6c, 0x60, 0x9c, 0xfd, 0xcb, 0x30, 0x6e, 0xbc, 0x79, 0x0f, 0xf7, 0xe3, 0x69, 0xd3, 0xfd, 0x58, - 0x31, 0xbc, 0x86, 0x67, 0x5f, 0x85, 0x93, 0xd9, 0x0e, 0x0e, 0xf3, 0xbc, 0xfd, 0x3b, 0xa3, 0xd9, - 0xc3, 0xe5, 0x2d, 0x12, 0x35, 0x69, 0xd7, 0x3e, 0xb0, 0x42, 0x3f, 0xb0, 0x42, 0x3f, 0xb0, 0x42, - 0xe5, 0x1f, 0xfb, 0x4e, 0x09, 0x52, 0x9a, 0x01, 0xef, 0xdd, 0x47, 0x60, 0x2c, 0x22, 0xad, 0xf0, - 0x3a, 0x5e, 0x15, 0x12, 0x57, 0x07, 0x64, 0xf2, 0x66, 0x2c, 0xe1, 0x54, 0x32, 0xb7, 0x9c, 0x64, - 0x47, 0x88, 0x5c, 0x25, 0x99, 0x37, 0x9c, 0x64, 0x07, 0x33, 0x08, 0x7a, 0x15, 0xa6, 0x12, 0x27, - 0x6a, 0x90, 0x04, 0x93, 0x3d, 0x36, 0x08, 0xe2, 0x48, 0xff, 0x31, 0x81, 0x3b, 0xb5, 0x95, 0x82, - 0xe2, 0x0c, 0x36, 0x7a, 0x0b, 0x46, 0x76, 0x88, 0xdf, 0x14, 0x66, 0xf2, 0x66, 0x7e, 0x12, 0x91, - 0xbd, 0xeb, 0x65, 0xe2, 0x37, 0xf9, 0x7a, 0xa5, 0xbf, 0x30, 0x63, 0x45, 0xbf, 0x4e, 0x65, 0xb7, - 0x1d, 0x27, 0x61, 0xd3, 0x7b, 0x5b, 0x1a, 0xcf, 0x9f, 0xca, 0x99, 0xf1, 0x55, 0x49, 0x9f, 0x5b, - 0x78, 0xea, 0x2f, 0xd6, 0x9c, 0x59, 0x3f, 0x6a, 0x5e, 0xc4, 0x8c, 0xe1, 0xce, 0x0c, 0x1c, 0x4b, - 0x3f, 0x96, 0x24, 0x7d, 0xde, 0x0f, 0xf5, 0x17, 0x6b, 0xce, 0xa8, 0x03, 0xa3, 0x2d, 0xbf, 0xdd, - 0xf0, 0x82, 0x99, 0x71, 0xd6, 0x87, 0xeb, 0x39, 0xf7, 0x61, 0x83, 0x11, 0xe7, 0x47, 0x18, 0xfc, - 0x37, 0x16, 0x0c, 0xd1, 0x33, 0x50, 0x72, 0x77, 0x9c, 0x28, 0x99, 0x99, 0x60, 0x93, 0x46, 0x59, - 0x9a, 0x8b, 0xb4, 0x11, 0x73, 0x18, 0x7a, 0x1a, 0x8a, 0x11, 0xa9, 0xb3, 0x38, 0x20, 0xc3, 0x43, - 0x8c, 0x49, 0x1d, 0xd3, 0x76, 0xfb, 0x6f, 0x17, 0xd2, 0xca, 0x45, 0xfa, 0xbd, 0xf9, 0x6c, 0x77, - 0xdb, 0x51, 0x2c, 0xad, 0x51, 0x63, 0xb6, 0xb3, 0x66, 0x2c, 0xe1, 0xe8, 0x4b, 0x16, 0x8c, 0xdd, - 0x8a, 0xc3, 0x20, 0x20, 0x89, 0x10, 0xe4, 0x37, 0x72, 0x1e, 0x8a, 0x2b, 0x9c, 0xba, 0xee, 0x83, - 0x68, 0xc0, 0x92, 0x2f, 0xed, 0x2e, 0xd9, 0x77, 0xfd, 0x76, 0xad, 0xcb, 0xd3, 0x78, 0x91, 0x37, - 0x63, 0x09, 0xa7, 0xa8, 0x5e, 0xc0, 0x51, 0x47, 0xd2, 0xa8, 0x2b, 0x81, 0x40, 0x15, 0x70, 0xfb, - 0xf7, 0x4a, 0x70, 0xa6, 0xe7, 0xe2, 0xa0, 0xdb, 0x3e, 0xdb, 0x58, 0x2f, 0x79, 0x3e, 0x91, 0x51, - 0xb2, 0x6c, 0xdb, 0xbf, 0xa1, 0x5a, 0xb1, 0x81, 0x81, 0x7e, 0x01, 0xa0, 0xe5, 0x44, 0x4e, 0x93, - 0x88, 0xed, 0xae, 0x78, 0xf4, 0xdd, 0x95, 0xf6, 0x63, 0x43, 0xd2, 0xd4, 0xd6, 0x96, 0x6a, 0x8a, - 0xb1, 0xc1, 0x12, 0x7d, 0x1c, 0xc6, 0x23, 0xe2, 0x13, 0x27, 0x66, 0x61, 0x64, 0xd9, 0x98, 0x58, - 0xac, 0x41, 0xd8, 0xc4, 0x43, 0xcf, 0xaa, 0xc8, 0x80, 0x91, 0xb4, 0xa7, 0x30, 0x1d, 0x1d, 0x80, - 0xde, 0xb1, 0x60, 0xaa, 0xee, 0xf9, 0x44, 0x73, 0x17, 0x11, 0xac, 0xeb, 0x47, 0x7f, 0xc9, 0x4b, - 0x26, 0x5d, 0x2d, 0x21, 0x53, 0xcd, 0x31, 0xce, 0xb0, 0xa7, 0x9f, 0x79, 0x8f, 0x44, 0x4c, 0xb4, - 0x8e, 0xa6, 0x3f, 0xf3, 0x0d, 0xde, 0x8c, 0x25, 0x1c, 0x2d, 0xc0, 0x89, 0x96, 0x13, 0xc7, 0x8b, - 0x11, 0xa9, 0x91, 0x20, 0xf1, 0x1c, 0x9f, 0xc7, 0x97, 0x96, 0x75, 0x7c, 0xd9, 0x46, 0x1a, 0x8c, - 0xb3, 0xf8, 0xe8, 0xd3, 0xf0, 0xb8, 0xd7, 0x08, 0xc2, 0x88, 0xac, 0x79, 0x71, 0xec, 0x05, 0x0d, - 0x3d, 0x0d, 0x98, 0xa4, 0x2c, 0x57, 0x67, 0x05, 0xa9, 0xc7, 0x57, 0x7a, 0xa3, 0xe1, 0x7e, 0xcf, - 0xa3, 0xe7, 0xa1, 0x1c, 0xef, 0x7a, 0xad, 0xc5, 0xa8, 0x16, 0xb3, 0xe3, 0xc4, 0xb2, 0x3e, 0x03, - 0xd9, 0x14, 0xed, 0x58, 0x61, 0xd8, 0xbf, 0x56, 0x48, 0x9b, 0x77, 0xe6, 0xfa, 0x41, 0x31, 0x5d, - 0x25, 0xc9, 0x0d, 0x27, 0x92, 0xa6, 0xff, 0x11, 0x23, 0x54, 0x05, 0xdd, 0x1b, 0x4e, 0x64, 0xae, - 0x37, 0xc6, 0x00, 0x4b, 0x4e, 0xe8, 0x16, 0x8c, 0x24, 0xbe, 0x93, 0x53, 0x48, 0xbb, 0xc1, 0x51, - 0x5b, 0xdb, 0xab, 0x0b, 0x31, 0x66, 0x3c, 0xd0, 0x53, 0x54, 0x7d, 0xdd, 0x96, 0x61, 0x2c, 0x42, - 0xe3, 0xdc, 0x8e, 0x31, 0x6b, 0xb5, 0xff, 0xfb, 0x68, 0x0f, 0x91, 0xa7, 0xf6, 0x18, 0x74, 0x01, - 0x80, 0x5a, 0x42, 0x1b, 0x11, 0xa9, 0x7b, 0xfb, 0x62, 0x8f, 0x57, 0xcb, 0xea, 0x9a, 0x82, 0x60, - 0x03, 0x4b, 0x3e, 0xb3, 0xd9, 0xae, 0xd3, 0x67, 0x0a, 0xdd, 0xcf, 0x70, 0x08, 0x36, 0xb0, 0xd0, - 0x4b, 0x30, 0xea, 0x35, 0x9d, 0x86, 0x8a, 0xb6, 0x79, 0x8a, 0xae, 0xa7, 0x15, 0xd6, 0x72, 0xf7, - 0x60, 0x76, 0x4a, 0x75, 0x88, 0x35, 0x61, 0x81, 0x8b, 0x7e, 0xdb, 0x82, 0x09, 0x37, 0x6c, 0x36, - 0xc3, 0x80, 0xdb, 0x0f, 0xc2, 0x18, 0xba, 0x75, 0x5c, 0x3b, 0xf0, 0xdc, 0xa2, 0xc1, 0x8c, 0x5b, - 0x43, 0x2a, 0xf6, 0xde, 0x04, 0xe1, 0x54, 0xaf, 0xcc, 0x65, 0x57, 0x3a, 0x64, 0xd9, 0xfd, 0x63, - 0x0b, 0xa6, 0xf9, 0xb3, 0x86, 0x59, 0x23, 0xc2, 0xcc, 0xc3, 0x63, 0x7e, 0xad, 0x2e, 0x4b, 0x4f, - 0x1d, 0x09, 0x75, 0xc1, 0x71, 0x77, 0x27, 0xd1, 0x32, 0x4c, 0xd7, 0xc3, 0xc8, 0x25, 0xe6, 0x40, - 0x08, 0x99, 0xa1, 0x08, 0x5d, 0xca, 0x22, 0xe0, 0xee, 0x67, 0xd0, 0x0d, 0x78, 0xcc, 0x68, 0x34, - 0xc7, 0x81, 0x8b, 0x8d, 0x73, 0x82, 0xda, 0x63, 0x97, 0x7a, 0x62, 0xe1, 0x3e, 0x4f, 0x9f, 0xfd, - 0x24, 0x4c, 0x77, 0x7d, 0xbf, 0xa1, 0x8c, 0xcd, 0x25, 0x78, 0xac, 0xf7, 0x48, 0x0d, 0x65, 0x72, - 0xfe, 0xc3, 0x4c, 0xb4, 0x8e, 0xa1, 0xd8, 0x0c, 0x70, 0x7c, 0xe1, 0x40, 0x91, 0x04, 0x7b, 0x42, - 0x70, 0x5c, 0x3a, 0xda, 0x8c, 0xb8, 0x18, 0xec, 0xf1, 0x0f, 0xcd, 0x6c, 0xb4, 0x8b, 0xc1, 0x1e, - 0xa6, 0xb4, 0xd1, 0xbb, 0x56, 0x6a, 0x63, 0xe6, 0x87, 0x1e, 0x9f, 0x39, 0x16, 0x4d, 0x6e, 0xe0, - 0xbd, 0xda, 0xfe, 0x5e, 0x01, 0xce, 0x1f, 0x46, 0x64, 0x80, 0xe1, 0x7b, 0x06, 0x46, 0x63, 0xe6, - 0x2e, 0x11, 0x2b, 0x71, 0x9c, 0xae, 0x42, 0xee, 0x40, 0xf9, 0x2c, 0x16, 0x20, 0xf4, 0xcb, 0x16, - 0x14, 0x9b, 0x4e, 0x4b, 0xbc, 0x79, 0xe3, 0x78, 0xdf, 0x7c, 0x6e, 0xcd, 0x69, 0xf1, 0xaf, 0xa0, - 0xf4, 0xd1, 0x35, 0xa7, 0x85, 0x69, 0x07, 0xd0, 0x2c, 0x94, 0x9c, 0x28, 0x72, 0x3a, 0x4c, 0xae, - 0x55, 0xb8, 0x5b, 0x6d, 0x81, 0x36, 0x60, 0xde, 0x7e, 0xf6, 0x13, 0x50, 0x96, 0x8f, 0x0f, 0x35, - 0x07, 0xbf, 0x3e, 0x96, 0x0a, 0x15, 0x65, 0xee, 0x96, 0x18, 0x46, 0x85, 0x01, 0x6c, 0xe5, 0x1d, - 0x9d, 0xcc, 0x63, 0xfd, 0x99, 0xd6, 0x2e, 0x32, 0xa6, 0x04, 0x2b, 0xf4, 0x35, 0x8b, 0xe5, 0x25, - 0xc9, 0xf0, 0x59, 0xa1, 0x2b, 0x1f, 0x4f, 0x9a, 0x94, 0x99, 0xed, 0x24, 0x1b, 0xb1, 0xc9, 0x9d, - 0x0a, 0xea, 0x16, 0x8f, 0xb0, 0xcf, 0x6a, 0xcc, 0x32, 0x73, 0x49, 0xc2, 0xd1, 0x7e, 0x0f, 0xb7, - 0x4a, 0x0e, 0xb9, 0x2d, 0x03, 0x38, 0x52, 0xbe, 0x63, 0xc1, 0x34, 0xd7, 0x8b, 0x96, 0xbc, 0x7a, - 0x9d, 0x44, 0x24, 0x70, 0x89, 0xd4, 0x2c, 0x8f, 0xe8, 0xb8, 0x93, 0xa7, 0x0e, 0x2b, 0x59, 0xf2, - 0x5a, 0x82, 0x77, 0x81, 0x70, 0x77, 0x67, 0x50, 0x0d, 0x46, 0xbc, 0xa0, 0x1e, 0x8a, 0x7d, 0xab, - 0x7a, 0xb4, 0x4e, 0xad, 0x04, 0xf5, 0x50, 0xaf, 0x65, 0xfa, 0x0f, 0x33, 0xea, 0x68, 0x15, 0x4e, - 0x47, 0xc2, 0xf6, 0xbf, 0xec, 0xc5, 0xd4, 0x42, 0x5b, 0xf5, 0x9a, 0x5e, 0xc2, 0xf6, 0x9c, 0x62, - 0x75, 0xe6, 0xce, 0xc1, 0xec, 0x69, 0xdc, 0x03, 0x8e, 0x7b, 0x3e, 0x85, 0xde, 0x86, 0x31, 0x99, - 0x48, 0x55, 0xce, 0x43, 0x4b, 0xef, 0x9e, 0xff, 0x6a, 0x32, 0x6d, 0x8a, 0x9c, 0x29, 0xc9, 0xd0, - 0xfe, 0xe7, 0x00, 0xdd, 0x6e, 0x17, 0xf4, 0xf3, 0x50, 0x89, 0x54, 0x72, 0x97, 0x95, 0x47, 0x58, - 0x8e, 0xfc, 0xbe, 0xc2, 0xe5, 0xa3, 0xce, 0xbd, 0x75, 0x1a, 0x97, 0xe6, 0x48, 0x75, 0xd4, 0x58, - 0x7b, 0x67, 0x72, 0x98, 0xdb, 0x82, 0xab, 0x3e, 0xd5, 0xef, 0x04, 0x2e, 0x66, 0x3c, 0x50, 0x04, - 0xa3, 0x3b, 0xc4, 0xf1, 0x93, 0x9d, 0x7c, 0x0e, 0x20, 0x2f, 0x33, 0x5a, 0xd9, 0xb8, 0x62, 0xde, - 0x8a, 0x05, 0x27, 0xb4, 0x0f, 0x63, 0x3b, 0x7c, 0x02, 0x08, 0xb5, 0x71, 0xed, 0xa8, 0x83, 0x9b, - 0x9a, 0x55, 0xfa, 0x73, 0x8b, 0x06, 0x2c, 0xd9, 0x31, 0x9f, 0xac, 0xe1, 0x71, 0xe4, 0x4b, 0x37, - 0xbf, 0x90, 0xea, 0xc1, 0xdd, 0x8d, 0x9f, 0x83, 0x89, 0x88, 0xb8, 0x61, 0xe0, 0x7a, 0x3e, 0xa9, - 0x2d, 0xc8, 0xc3, 0xc5, 0x61, 0x42, 0x75, 0x4f, 0x52, 0xd5, 0x17, 0x1b, 0x34, 0x70, 0x8a, 0x22, - 0xfa, 0xaa, 0x05, 0x53, 0x2a, 0x23, 0x84, 0x7e, 0x10, 0x22, 0x8e, 0xe7, 0x56, 0x73, 0xca, 0x3f, - 0x61, 0x34, 0xab, 0x88, 0x1a, 0xbf, 0xe9, 0x36, 0x9c, 0xe1, 0x8b, 0x5e, 0x07, 0x08, 0xb7, 0x99, - 0xfb, 0x8d, 0xbe, 0x6a, 0x79, 0xe8, 0x57, 0x9d, 0xe2, 0x11, 0xf9, 0x92, 0x02, 0x36, 0xa8, 0xa1, - 0xab, 0x00, 0x7c, 0xd9, 0x6c, 0x75, 0x5a, 0x84, 0x59, 0xa4, 0x3a, 0xd6, 0x1a, 0x36, 0x15, 0xe4, - 0xee, 0xc1, 0x6c, 0xf7, 0xd9, 0x09, 0x73, 0x8c, 0x1a, 0x8f, 0xa3, 0x9f, 0x83, 0xb1, 0xb8, 0xdd, - 0x6c, 0x3a, 0xea, 0x24, 0x2f, 0xc7, 0x18, 0x7f, 0x4e, 0xd7, 0x10, 0x45, 0xbc, 0x01, 0x4b, 0x8e, - 0xe8, 0x16, 0x15, 0xaa, 0xb1, 0x38, 0xd4, 0x61, 0xab, 0x88, 0xeb, 0x04, 0xe3, 0xec, 0x9d, 0x3e, - 0x21, 0x9e, 0x3b, 0x8d, 0x7b, 0xe0, 0xdc, 0x3d, 0x98, 0x7d, 0x2c, 0xdd, 0xbe, 0x1a, 0x8a, 0xa8, - 0xfb, 0x9e, 0x34, 0xd1, 0x15, 0x99, 0x57, 0x4d, 0x5f, 0x5b, 0xa6, 0xfb, 0x3d, 0xa7, 0xf3, 0xaa, - 0x59, 0x73, 0xff, 0x31, 0x33, 0x1f, 0xb6, 0x83, 0x74, 0x08, 0x89, 0x78, 0x9b, 0x97, 0x60, 0x82, - 0xec, 0x27, 0x24, 0x0a, 0x1c, 0xff, 0x3a, 0x5e, 0x95, 0x87, 0x52, 0x6c, 0xd2, 0x5e, 0x34, 0xda, - 0x71, 0x0a, 0x0b, 0xd9, 0xca, 0x18, 0x2d, 0xe8, 0xd4, 0x0f, 0x6e, 0x8c, 0x4a, 0xd3, 0xd3, 0xfe, - 0x3f, 0x85, 0x94, 0x06, 0xb5, 0x15, 0x11, 0x82, 0x42, 0x28, 0x05, 0x61, 0x4d, 0x09, 0xeb, 0x2b, - 0xf9, 0x08, 0xeb, 0x6b, 0x61, 0xcd, 0xc8, 0x96, 0xa6, 0xff, 0x62, 0xcc, 0xf9, 0xb0, 0x74, 0x52, - 0x99, 0x77, 0xcb, 0x00, 0xc2, 0x2e, 0xc8, 0x93, 0xb3, 0x4a, 0x27, 0x5d, 0x37, 0x19, 0xe1, 0x34, - 0x5f, 0xb4, 0x0b, 0xa5, 0x9d, 0x30, 0x4e, 0xa4, 0xb5, 0x70, 0x44, 0xc3, 0xe4, 0x72, 0x18, 0x27, - 0x6c, 0xdb, 0x57, 0xaf, 0x4d, 0x5b, 0x62, 0xcc, 0x79, 0xd8, 0xff, 0xd9, 0x4a, 0x1d, 0x41, 0xde, - 0x64, 0xe1, 0x54, 0x7b, 0x24, 0xa0, 0xeb, 0xd0, 0x8c, 0x3d, 0xf8, 0x4b, 0x99, 0x6c, 0x87, 0x0f, - 0xf7, 0xab, 0x5d, 0x71, 0x9b, 0x52, 0x98, 0x63, 0x24, 0x8c, 0x30, 0x85, 0x2f, 0x5a, 0xe9, 0xac, - 0x12, 0xbe, 0x11, 0xe6, 0x98, 0xe4, 0x74, 0x68, 0x82, 0x8a, 0xfd, 0xae, 0x05, 0x63, 0x55, 0xc7, - 0xdd, 0x0d, 0xeb, 0x75, 0xf4, 0x3c, 0x94, 0x6b, 0xed, 0xc8, 0x4c, 0x70, 0x51, 0x67, 0x5e, 0x4b, - 0xa2, 0x1d, 0x2b, 0x0c, 0x3a, 0x87, 0xeb, 0x8e, 0x2b, 0x53, 0x9d, 0x8a, 0x7c, 0x0e, 0x5f, 0x62, - 0x2d, 0x58, 0x40, 0xd0, 0xc7, 0x61, 0xbc, 0xe9, 0xec, 0xcb, 0x87, 0xb3, 0xe7, 0x9f, 0x6b, 0x1a, - 0x84, 0x4d, 0x3c, 0xfb, 0x5f, 0x5a, 0x30, 0x53, 0x75, 0x62, 0xcf, 0x5d, 0x68, 0x27, 0x3b, 0x55, - 0x2f, 0xd9, 0x6e, 0xbb, 0xbb, 0x24, 0xe1, 0xf9, 0x6d, 0xb4, 0x97, 0xed, 0x98, 0x2e, 0x25, 0x65, - 0x86, 0xa9, 0x5e, 0x5e, 0x17, 0xed, 0x58, 0x61, 0xa0, 0xb7, 0x61, 0xbc, 0xe5, 0xc4, 0xf1, 0xed, - 0x30, 0xaa, 0x61, 0x52, 0xcf, 0x27, 0xbb, 0x74, 0x93, 0xb8, 0x11, 0x49, 0x30, 0xa9, 0x0b, 0x8f, - 0x96, 0xa6, 0x8f, 0x4d, 0x66, 0xf6, 0xbf, 0xa8, 0xc0, 0x98, 0x70, 0xc7, 0x0d, 0x9c, 0xb5, 0x27, - 0x0d, 0xcc, 0x42, 0x5f, 0x03, 0x33, 0x86, 0x51, 0x97, 0xd5, 0x38, 0x11, 0x9a, 0xcc, 0xd5, 0x5c, - 0xfc, 0xb7, 0xbc, 0x6c, 0x8a, 0xee, 0x16, 0xff, 0x8f, 0x05, 0x2b, 0xf4, 0x2d, 0x0b, 0x4e, 0xb8, - 0x61, 0x10, 0x10, 0x57, 0x6f, 0xb3, 0x23, 0x79, 0x44, 0x64, 0x2c, 0xa6, 0x89, 0xea, 0xc3, 0xdf, - 0x0c, 0x00, 0x67, 0xd9, 0xa3, 0x57, 0x60, 0x92, 0x8f, 0xd9, 0x8d, 0xd4, 0xc9, 0x97, 0x4e, 0x4e, - 0x37, 0x81, 0x38, 0x8d, 0x8b, 0xe6, 0xf8, 0x09, 0xa2, 0x48, 0x03, 0x1f, 0xd5, 0x9e, 0x04, 0x23, - 0x01, 0xdc, 0xc0, 0x40, 0x11, 0xa0, 0x88, 0xd4, 0x23, 0x12, 0xef, 0x08, 0x77, 0x25, 0xdb, 0xe2, - 0xc7, 0xee, 0x2f, 0xf1, 0x08, 0x77, 0x51, 0xc2, 0x3d, 0xa8, 0xa3, 0x5d, 0x61, 0xe3, 0x94, 0xf3, - 0x90, 0x0a, 0xe2, 0x33, 0xf7, 0x35, 0x75, 0x66, 0xa1, 0x14, 0xef, 0x38, 0x51, 0x8d, 0xa9, 0x16, - 0x45, 0x7e, 0x10, 0xb0, 0x49, 0x1b, 0x30, 0x6f, 0x47, 0x4b, 0x70, 0x32, 0x93, 0x5a, 0x1f, 0x33, - 0xe5, 0xa1, 0xac, 0xe3, 0x50, 0x33, 0x49, 0xf9, 0x31, 0xee, 0x7a, 0xc2, 0xb4, 0x7f, 0xc7, 0x0f, - 0xb1, 0x7f, 0x3b, 0x2a, 0x28, 0x66, 0x82, 0x49, 0xfc, 0xd7, 0x72, 0x19, 0x80, 0x81, 0x22, 0x60, - 0xbe, 0x91, 0x89, 0x80, 0x99, 0x64, 0x1d, 0xb8, 0x91, 0x4f, 0x07, 0x86, 0x0f, 0x77, 0x79, 0x98, - 0xe1, 0x2b, 0xff, 0xdb, 0x02, 0xf9, 0x5d, 0x17, 0x1d, 0x77, 0x87, 0xd0, 0x29, 0x83, 0x5e, 0x85, - 0x29, 0x65, 0xc5, 0x2d, 0x86, 0xed, 0x80, 0x47, 0xae, 0x14, 0xb5, 0x97, 0x08, 0xa7, 0xa0, 0x38, - 0x83, 0x8d, 0xe6, 0xa1, 0x42, 0xc7, 0x89, 0x3f, 0xca, 0x77, 0x0f, 0x65, 0x29, 0x2e, 0x6c, 0xac, - 0x88, 0xa7, 0x34, 0x0e, 0x0a, 0x61, 0xda, 0x77, 0xe2, 0x84, 0xf5, 0x80, 0x1a, 0x75, 0xf7, 0x99, - 0xf6, 0xc7, 0x2a, 0x8b, 0xac, 0x66, 0x09, 0xe1, 0x6e, 0xda, 0xf6, 0x0f, 0x46, 0x60, 0x32, 0x25, - 0x19, 0x87, 0xdc, 0x76, 0x9e, 0x87, 0xb2, 0xdc, 0x09, 0xb2, 0x99, 0xc0, 0x6a, 0xbb, 0x50, 0x18, - 0x74, 0x9b, 0xdc, 0x26, 0x4e, 0x44, 0x22, 0x56, 0xb4, 0x20, 0xbb, 0x4d, 0x56, 0x35, 0x08, 0x9b, - 0x78, 0x4c, 0x28, 0x27, 0x7e, 0xbc, 0xe8, 0x7b, 0x24, 0x48, 0x78, 0x37, 0xf3, 0x11, 0xca, 0x5b, - 0xab, 0x9b, 0x26, 0x51, 0x2d, 0x94, 0x33, 0x00, 0x9c, 0x65, 0x8f, 0xbe, 0x62, 0xc1, 0xa4, 0x73, - 0x3b, 0xd6, 0x85, 0xb8, 0x44, 0xac, 0xcb, 0x11, 0x37, 0xa9, 0x54, 0x6d, 0xaf, 0xea, 0x34, 0x15, - 0xef, 0xa9, 0x26, 0x9c, 0x66, 0x8a, 0xbe, 0x6d, 0x01, 0x22, 0xfb, 0xc4, 0x95, 0xd1, 0x38, 0xa2, - 0x2f, 0xa3, 0x79, 0x18, 0x3b, 0x17, 0xbb, 0xe8, 0x72, 0xa9, 0xde, 0xdd, 0x8e, 0x7b, 0xf4, 0xc1, - 0xfe, 0x27, 0x45, 0xb5, 0xa0, 0x74, 0x00, 0x98, 0x63, 0x24, 0x2f, 0x58, 0xf7, 0x9f, 0xbc, 0xa0, - 0x5d, 0x94, 0x5d, 0x09, 0x0c, 0xe9, 0x58, 0xf1, 0xc2, 0x43, 0x8a, 0x15, 0xff, 0xb2, 0x95, 0xca, - 0x79, 0x1f, 0xbf, 0xf0, 0x7a, 0xbe, 0xc1, 0x67, 0x73, 0xdc, 0x41, 0x9e, 0x91, 0xee, 0x69, 0xaf, - 0x39, 0x95, 0xa6, 0x06, 0xda, 0x50, 0xd2, 0xf0, 0xdf, 0x17, 0x61, 0xdc, 0xd8, 0x49, 0x7b, 0xaa, - 0x45, 0xd6, 0x23, 0xa6, 0x16, 0x15, 0x86, 0x50, 0x8b, 0x7e, 0x01, 0x2a, 0xae, 0x94, 0xf2, 0xf9, - 0x54, 0x7d, 0xcb, 0xee, 0x1d, 0x5a, 0xd0, 0xab, 0x26, 0xac, 0x79, 0xa2, 0xe5, 0x54, 0x74, 0xba, - 0xd8, 0x21, 0x46, 0xd8, 0x0e, 0xd1, 0x2b, 0x7c, 0x5c, 0xec, 0x14, 0xdd, 0xcf, 0xa0, 0x17, 0xa9, - 0x65, 0xe5, 0x89, 0xf7, 0x92, 0x21, 0xa2, 0x4c, 0x5d, 0x5f, 0xd8, 0x58, 0x91, 0xcd, 0xd8, 0xc4, - 0xb1, 0x7f, 0x60, 0xa9, 0x8f, 0xfb, 0x00, 0xd2, 0x21, 0x6f, 0xa5, 0xd3, 0x21, 0x2f, 0xe6, 0x32, - 0xcc, 0x7d, 0xf2, 0x20, 0xaf, 0xc1, 0xd8, 0x62, 0xd8, 0x6c, 0x3a, 0x41, 0x0d, 0xfd, 0x04, 0x8c, - 0xb9, 0xfc, 0xa7, 0x38, 0xaa, 0x60, 0xfe, 0x29, 0x01, 0xc5, 0x12, 0x86, 0x9e, 0x82, 0x11, 0x27, - 0x6a, 0xc8, 0xe3, 0x09, 0xe6, 0xd2, 0x5f, 0x88, 0x1a, 0x31, 0x66, 0xad, 0xf6, 0x3b, 0x45, 0x80, - 0xc5, 0xb0, 0xd9, 0x72, 0x22, 0x52, 0xdb, 0x0a, 0x59, 0xd5, 0x99, 0x63, 0xf5, 0xeb, 0x68, 0x63, - 0xe9, 0x51, 0xf6, 0xed, 0x18, 0xe7, 0xfb, 0xc5, 0x07, 0x7d, 0xbe, 0xff, 0x75, 0x0b, 0x10, 0xfd, - 0x22, 0x61, 0x40, 0x82, 0x44, 0xbb, 0x2b, 0xe7, 0xa1, 0xe2, 0xca, 0x56, 0xa1, 0xb5, 0xe8, 0xf5, - 0x27, 0x01, 0x58, 0xe3, 0x0c, 0x60, 0x7e, 0x3e, 0x23, 0x85, 0x63, 0x31, 0x1d, 0x05, 0xc7, 0x44, - 0xaa, 0x90, 0x95, 0xf6, 0x1f, 0x14, 0xe0, 0x31, 0xbe, 0xdf, 0xad, 0x39, 0x81, 0xd3, 0x20, 0x4d, - 0xda, 0xab, 0x41, 0x1d, 0xd0, 0x2e, 0xb5, 0x7b, 0x3c, 0x19, 0xd5, 0x76, 0xd4, 0x85, 0xc1, 0x27, - 0x34, 0x9f, 0xc2, 0x2b, 0x81, 0x97, 0x60, 0x46, 0x1c, 0xc5, 0x50, 0x96, 0x35, 0x44, 0x85, 0xa0, - 0xcb, 0x89, 0x91, 0x5a, 0xf3, 0x62, 0x53, 0x22, 0x58, 0x31, 0xa2, 0x5a, 0xa1, 0x1f, 0xba, 0xbb, - 0x98, 0xb4, 0x42, 0x26, 0xd4, 0x8c, 0xa0, 0xa2, 0x55, 0xd1, 0x8e, 0x15, 0x86, 0xfd, 0x07, 0x16, - 0x64, 0xc5, 0xbd, 0x51, 0xb0, 0xc3, 0xba, 0x57, 0xc1, 0x8e, 0x61, 0x6a, 0x6a, 0xfc, 0x2c, 0x8c, - 0x3b, 0x09, 0xdd, 0xa1, 0xb9, 0x4d, 0x5b, 0xbc, 0xbf, 0x63, 0xeb, 0xb5, 0xb0, 0xe6, 0xd5, 0x3d, - 0x66, 0xcb, 0x9a, 0xe4, 0xec, 0xff, 0x39, 0x02, 0xd3, 0x5d, 0x91, 0xca, 0xe8, 0x65, 0x98, 0x70, - 0xc5, 0xf4, 0x68, 0x61, 0x52, 0x17, 0x2f, 0x63, 0x44, 0xba, 0x68, 0x18, 0x4e, 0x61, 0x0e, 0x30, - 0x41, 0x57, 0xe0, 0x54, 0x44, 0xad, 0xe8, 0x36, 0x59, 0xa8, 0x27, 0x24, 0xda, 0x24, 0x6e, 0x18, - 0xd4, 0x78, 0x59, 0x99, 0x62, 0xf5, 0xf1, 0x3b, 0x07, 0xb3, 0xa7, 0x70, 0x37, 0x18, 0xf7, 0x7a, - 0x06, 0xb5, 0x60, 0xd2, 0x37, 0x15, 0x2c, 0xa1, 0x5d, 0xdf, 0x97, 0x6e, 0xa6, 0x36, 0xe0, 0x54, - 0x33, 0x4e, 0x33, 0x48, 0x6b, 0x69, 0xa5, 0x87, 0xa4, 0xa5, 0xfd, 0xa2, 0xd6, 0xd2, 0xb8, 0x7f, - 0xf5, 0x8d, 0x9c, 0x23, 0xd5, 0x8f, 0x5b, 0x4d, 0x7b, 0x0d, 0xca, 0x32, 0xf2, 0x64, 0xa0, 0x88, - 0x0d, 0x93, 0x4e, 0x1f, 0x89, 0x76, 0xb7, 0x00, 0x3d, 0x34, 0x7c, 0xba, 0xce, 0xf4, 0x76, 0x9a, - 0x5a, 0x67, 0xc3, 0x6d, 0xa9, 0x68, 0x9f, 0x47, 0xdd, 0xf0, 0x8d, 0xe3, 0xd3, 0x79, 0x5b, 0x28, - 0x3a, 0x10, 0x47, 0x85, 0x80, 0xa8, 0x60, 0x9c, 0x0b, 0x00, 0x5a, 0x0b, 0x12, 0x01, 0xa7, 0xca, - 0xad, 0xa7, 0x95, 0x25, 0x6c, 0x60, 0x51, 0x83, 0xd5, 0x0b, 0xe2, 0xc4, 0xf1, 0xfd, 0xcb, 0x5e, - 0x90, 0x88, 0x93, 0x37, 0xb5, 0x43, 0xae, 0x68, 0x10, 0x36, 0xf1, 0xce, 0x7e, 0xc2, 0xf8, 0x2e, - 0xc3, 0x7c, 0xcf, 0x1d, 0x78, 0x62, 0xd9, 0x4b, 0x54, 0x98, 0xb4, 0x9a, 0x47, 0x54, 0xc9, 0x51, - 0x61, 0xff, 0x56, 0xdf, 0xb0, 0x7f, 0x23, 0x4c, 0xb9, 0x90, 0x8e, 0xaa, 0xce, 0x86, 0x29, 0xdb, - 0x2f, 0xc3, 0xe9, 0x65, 0x2f, 0xb9, 0xe4, 0xf9, 0x64, 0x48, 0x26, 0xf6, 0x57, 0x4a, 0x30, 0x61, - 0xa6, 0xa5, 0x0c, 0x93, 0xb9, 0xf0, 0x4d, 0xaa, 0xc7, 0x88, 0xb7, 0xf3, 0x94, 0x8f, 0xe5, 0xe6, - 0x91, 0x73, 0x64, 0x7a, 0x8f, 0x98, 0xa1, 0xca, 0x68, 0x9e, 0xd8, 0xec, 0x00, 0xba, 0x0d, 0xa5, - 0x3a, 0x0b, 0xa3, 0x2d, 0xe6, 0xe1, 0x39, 0xee, 0x35, 0xa2, 0x7a, 0x99, 0xf1, 0x40, 0x5c, 0xce, - 0x8f, 0xee, 0x90, 0x51, 0x3a, 0x37, 0x43, 0x09, 0x2a, 0x95, 0x95, 0xa1, 0x30, 0xfa, 0x89, 0xfa, - 0xd2, 0x7d, 0x88, 0xfa, 0x94, 0xe0, 0x1d, 0x7d, 0x48, 0x82, 0x97, 0x85, 0x44, 0x27, 0x3b, 0x4c, - 0x7f, 0x13, 0x01, 0xb1, 0x63, 0x6c, 0x10, 0x8c, 0x90, 0xe8, 0x14, 0x18, 0x67, 0xf1, 0xed, 0xaf, - 0x17, 0x60, 0x6a, 0x39, 0x68, 0x6f, 0x2c, 0x6f, 0xb4, 0xb7, 0x7d, 0xcf, 0xbd, 0x4a, 0x3a, 0x54, - 0xbe, 0xed, 0x92, 0xce, 0xca, 0x92, 0x98, 0x86, 0x6a, 0xe0, 0xaf, 0xd2, 0x46, 0xcc, 0x61, 0x74, - 0x45, 0xd7, 0xbd, 0xa0, 0x41, 0xa2, 0x56, 0xe4, 0x89, 0x43, 0x39, 0x63, 0x45, 0x5f, 0xd2, 0x20, - 0x6c, 0xe2, 0x51, 0xda, 0xe1, 0xed, 0x80, 0x44, 0x59, 0x6d, 0x70, 0x9d, 0x36, 0x62, 0x0e, 0xa3, - 0x48, 0x49, 0xd4, 0x8e, 0x13, 0xf1, 0x45, 0x15, 0xd2, 0x16, 0x6d, 0xc4, 0x1c, 0x46, 0x97, 0x4b, - 0xdc, 0xde, 0x66, 0xde, 0xed, 0x4c, 0x08, 0xeb, 0x26, 0x6f, 0xc6, 0x12, 0x4e, 0x51, 0x77, 0x49, - 0x67, 0x89, 0xda, 0x65, 0x99, 0x20, 0xf3, 0xab, 0xbc, 0x19, 0x4b, 0x38, 0xab, 0x74, 0x93, 0x1e, - 0x8e, 0x1f, 0xb9, 0x4a, 0x37, 0xe9, 0xee, 0xf7, 0xb1, 0xf0, 0x7e, 0xd3, 0x82, 0x09, 0x33, 0x26, - 0x05, 0x35, 0x32, 0x8a, 0xe2, 0x7a, 0x57, 0xd5, 0xb2, 0x9f, 0xee, 0x75, 0x5f, 0x42, 0xc3, 0x4b, - 0xc2, 0x56, 0xfc, 0x02, 0x09, 0x1a, 0x5e, 0x40, 0x98, 0xe7, 0x92, 0xc7, 0xb2, 0xa4, 0x02, 0x5e, - 0x16, 0xc3, 0x1a, 0xb9, 0x0f, 0x4d, 0xd3, 0xbe, 0x09, 0xd3, 0x5d, 0x99, 0x05, 0x03, 0xec, 0xcf, - 0x87, 0xe6, 0x75, 0xd9, 0x18, 0xc6, 0x29, 0xe1, 0xf5, 0x16, 0x0f, 0x3a, 0x59, 0x84, 0x69, 0xae, - 0x43, 0x50, 0x4e, 0x9b, 0xee, 0x0e, 0x69, 0xaa, 0x6c, 0x11, 0x76, 0x02, 0x7c, 0x23, 0x0b, 0xc4, - 0xdd, 0xf8, 0xf6, 0x37, 0x2c, 0x98, 0x4c, 0x25, 0x7b, 0xe4, 0xa4, 0x49, 0xb0, 0x95, 0x16, 0xb2, - 0x10, 0x29, 0x16, 0x25, 0x5a, 0x64, 0x3b, 0x92, 0x5e, 0x69, 0x1a, 0x84, 0x4d, 0x3c, 0xfb, 0xdd, - 0x02, 0x94, 0xa5, 0xd7, 0x7a, 0x80, 0xae, 0x7c, 0xcd, 0x82, 0x49, 0x75, 0xea, 0xce, 0x8e, 0x73, - 0xf8, 0x64, 0xbc, 0x76, 0x74, 0xbf, 0xb9, 0x8a, 0xe1, 0x0b, 0xea, 0xa1, 0x56, 0x6b, 0xb1, 0xc9, - 0x0c, 0xa7, 0x79, 0xa3, 0x1b, 0x00, 0x71, 0x27, 0x4e, 0x48, 0xd3, 0x38, 0x58, 0xb2, 0x8d, 0x15, - 0x37, 0xe7, 0x86, 0x11, 0xa1, 0xeb, 0xeb, 0x5a, 0x58, 0x23, 0x9b, 0x0a, 0x53, 0xeb, 0x21, 0xba, - 0x0d, 0x1b, 0x94, 0xec, 0xbf, 0x5f, 0x80, 0x93, 0xd9, 0x2e, 0xa1, 0x37, 0x60, 0x42, 0x72, 0x37, - 0xee, 0x7e, 0x90, 0xae, 0xfa, 0x09, 0x6c, 0xc0, 0xee, 0x1e, 0xcc, 0xce, 0x76, 0xdf, 0xbd, 0x31, - 0x67, 0xa2, 0xe0, 0x14, 0x31, 0xee, 0xfa, 0x10, 0x3e, 0xba, 0x6a, 0x67, 0xa1, 0xd5, 0x12, 0xfe, - 0x0b, 0xc3, 0xf5, 0x61, 0x42, 0x71, 0x06, 0x1b, 0x6d, 0xc0, 0x69, 0xa3, 0xe5, 0x1a, 0xf1, 0x1a, - 0x3b, 0xdb, 0x61, 0x24, 0xcd, 0x93, 0xa7, 0x74, 0xf4, 0x4b, 0x37, 0x0e, 0xee, 0xf9, 0x24, 0xdd, - 0x32, 0x5d, 0xa7, 0xe5, 0xb8, 0x5e, 0xd2, 0x11, 0x27, 0x65, 0x4a, 0x36, 0x2d, 0x8a, 0x76, 0xac, - 0x30, 0xec, 0x35, 0x18, 0x19, 0x70, 0x06, 0x0d, 0xa4, 0x16, 0xbf, 0x06, 0x65, 0x4a, 0x4e, 0xea, - 0x48, 0x79, 0x90, 0x0c, 0xa1, 0x2c, 0xcb, 0x37, 0x23, 0x1b, 0x8a, 0x9e, 0x23, 0xbd, 0x4b, 0xea, - 0xb5, 0x56, 0xe2, 0xb8, 0xcd, 0x2c, 0x4d, 0x0a, 0x44, 0xcf, 0x40, 0x91, 0xec, 0xb7, 0xb2, 0x6e, - 0xa4, 0x8b, 0xfb, 0x2d, 0x2f, 0x22, 0x31, 0x45, 0x22, 0xfb, 0x2d, 0x74, 0x16, 0x0a, 0x5e, 0x4d, - 0x6c, 0x52, 0x20, 0x70, 0x0a, 0x2b, 0x4b, 0xb8, 0xe0, 0xd5, 0xec, 0x7d, 0xa8, 0xa8, 0x7a, 0xd1, - 0x68, 0x57, 0xca, 0x6e, 0x2b, 0x8f, 0x30, 0x13, 0x49, 0xb7, 0x8f, 0xd4, 0x6e, 0x03, 0xe8, 0xd4, - 0x9a, 0xbc, 0xe4, 0xcb, 0x79, 0x18, 0x71, 0x43, 0x91, 0x91, 0x57, 0xd6, 0x64, 0x98, 0xd0, 0x66, - 0x10, 0xfb, 0x26, 0x4c, 0x5d, 0x0d, 0xc2, 0xdb, 0xac, 0x06, 0xe7, 0x25, 0x8f, 0xf8, 0x35, 0x4a, - 0xb8, 0x4e, 0x7f, 0x64, 0x55, 0x04, 0x06, 0xc5, 0x1c, 0xa6, 0xca, 0x6e, 0x14, 0xfa, 0x95, 0xdd, - 0xb0, 0xbf, 0x68, 0xc1, 0x49, 0x95, 0xf3, 0x21, 0xa5, 0xf1, 0xcb, 0x30, 0xb1, 0xdd, 0xf6, 0xfc, - 0x9a, 0xf8, 0x9f, 0xb5, 0xf5, 0xab, 0x06, 0x0c, 0xa7, 0x30, 0xa9, 0x65, 0xb2, 0xed, 0x05, 0x4e, - 0xd4, 0xd9, 0xd0, 0xe2, 0x5f, 0x49, 0x84, 0xaa, 0x82, 0x60, 0x03, 0xcb, 0xfe, 0x72, 0x01, 0x26, - 0x53, 0x19, 0xf0, 0xc8, 0x87, 0x32, 0xf1, 0xd9, 0x09, 0x94, 0xfc, 0xa8, 0x47, 0x2d, 0x3e, 0xa5, - 0x26, 0xe2, 0x45, 0x41, 0x17, 0x2b, 0x0e, 0x8f, 0x84, 0x9b, 0xc5, 0xfe, 0xc3, 0x22, 0xcc, 0xf0, - 0x83, 0xb7, 0x9a, 0x8a, 0x67, 0x58, 0x93, 0xda, 0xc9, 0x5f, 0xd5, 0xd5, 0x26, 0xf8, 0x70, 0x6c, - 0x1f, 0xb5, 0x7c, 0x62, 0x6f, 0x46, 0x03, 0x79, 0xda, 0x7f, 0x3d, 0xe3, 0x69, 0x2f, 0xe4, 0x91, - 0x10, 0xd1, 0xb7, 0x47, 0x3f, 0x5a, 0xae, 0xf7, 0xbf, 0x53, 0x80, 0x13, 0x99, 0xda, 0x94, 0xe8, - 0x9d, 0x74, 0xf5, 0x29, 0x2b, 0x8f, 0xe3, 0x99, 0x7b, 0x56, 0x48, 0x1c, 0xae, 0x06, 0xd5, 0xc3, - 0x9a, 0xf0, 0x7f, 0x54, 0x80, 0xa9, 0x74, 0x51, 0xcd, 0x47, 0x70, 0xa4, 0x3e, 0x0a, 0x15, 0x56, - 0xaa, 0x8e, 0xdd, 0xca, 0xc1, 0x4f, 0x81, 0x78, 0x45, 0x35, 0xd9, 0x88, 0x35, 0xfc, 0x91, 0x28, - 0xed, 0x65, 0xff, 0x5d, 0x0b, 0xce, 0xf0, 0xb7, 0xcc, 0xce, 0xc3, 0xbf, 0xd6, 0x6b, 0x74, 0xdf, - 0xcc, 0xb7, 0x83, 0x99, 0x2a, 0x29, 0x87, 0x8d, 0x2f, 0xbb, 0x0d, 0x40, 0xf4, 0x36, 0x3d, 0x15, - 0x1e, 0xc1, 0xce, 0x0e, 0x35, 0x19, 0xec, 0x3f, 0x2a, 0x82, 0xbe, 0x00, 0x01, 0x79, 0x22, 0x6d, - 0x22, 0x97, 0x6a, 0x31, 0x9b, 0x9d, 0xc0, 0xd5, 0x57, 0x2d, 0x94, 0x33, 0x59, 0x13, 0xbf, 0x62, - 0xc1, 0xb8, 0x17, 0x78, 0x89, 0xe7, 0x30, 0xa5, 0x33, 0x9f, 0x8a, 0xf0, 0x8a, 0xdd, 0x0a, 0xa7, - 0x1c, 0x46, 0xe6, 0xd1, 0xa1, 0x62, 0x86, 0x4d, 0xce, 0xe8, 0x73, 0x22, 0x18, 0xae, 0x98, 0x5b, - 0xc2, 0x4f, 0x39, 0x13, 0x01, 0xd7, 0x82, 0x52, 0x44, 0x92, 0x48, 0xa6, 0x5a, 0x5d, 0x3d, 0x6a, - 0x84, 0x73, 0x12, 0x75, 0x54, 0x71, 0x30, 0x7d, 0x15, 0x15, 0x6d, 0xc6, 0x9c, 0x91, 0x1d, 0x03, - 0xea, 0x1e, 0x8b, 0x21, 0x03, 0x8d, 0xe6, 0xa1, 0xe2, 0xb4, 0x93, 0xb0, 0x49, 0x87, 0x49, 0x9c, - 0x6e, 0xea, 0x50, 0x2a, 0x09, 0xc0, 0x1a, 0xc7, 0x7e, 0xa7, 0x04, 0x99, 0x3c, 0x06, 0xb4, 0x6f, - 0x5e, 0xde, 0x61, 0xe5, 0x7b, 0x79, 0x87, 0xea, 0x4c, 0xaf, 0x0b, 0x3c, 0x50, 0x03, 0x4a, 0xad, - 0x1d, 0x27, 0x96, 0x3a, 0xe5, 0x6b, 0x72, 0x98, 0x36, 0x68, 0xe3, 0xdd, 0x83, 0xd9, 0x9f, 0x19, - 0xec, 0x8c, 0x82, 0xce, 0xd5, 0x79, 0x9e, 0x2f, 0xac, 0x59, 0x33, 0x1a, 0x98, 0xd3, 0x1f, 0xa6, - 0x26, 0xfe, 0x97, 0x44, 0x3d, 0x43, 0x4c, 0xe2, 0xb6, 0x9f, 0x88, 0xd9, 0xf0, 0x5a, 0x8e, 0xab, - 0x8c, 0x13, 0xd6, 0x19, 0x78, 0xfc, 0x3f, 0x36, 0x98, 0xa2, 0x37, 0xa0, 0x12, 0x27, 0x4e, 0x94, - 0xdc, 0x67, 0xce, 0x8c, 0x1a, 0xf4, 0x4d, 0x49, 0x04, 0x6b, 0x7a, 0xe8, 0x75, 0x56, 0x3c, 0xcb, - 0x8b, 0x77, 0xee, 0x33, 0x86, 0x55, 0x16, 0xda, 0x12, 0x14, 0xb0, 0x41, 0x8d, 0xaa, 0xec, 0x6c, - 0x6e, 0xf3, 0xc0, 0x8d, 0x32, 0xb3, 0xc9, 0x94, 0x28, 0xc4, 0x0a, 0x82, 0x0d, 0x2c, 0xfb, 0x0b, - 0x70, 0x2a, 0x7b, 0xdb, 0x97, 0x38, 0xb6, 0x6c, 0x44, 0x61, 0xbb, 0x95, 0xb5, 0x49, 0xd8, 0x6d, - 0x50, 0x98, 0xc3, 0xa8, 0x4d, 0xb2, 0xeb, 0x05, 0xb5, 0xac, 0x4d, 0x72, 0xd5, 0x0b, 0x6a, 0x98, - 0x41, 0x06, 0xb8, 0xd5, 0xe4, 0x9f, 0x5a, 0x70, 0xfe, 0xb0, 0x4b, 0xc9, 0xd0, 0x53, 0x30, 0x72, - 0xdb, 0x89, 0x64, 0x31, 0x3e, 0x26, 0x3b, 0x6e, 0x3a, 0x51, 0x80, 0x59, 0x2b, 0xea, 0xc0, 0x28, - 0xcf, 0x51, 0x14, 0x0a, 0xec, 0x6b, 0xf9, 0x5e, 0x91, 0x76, 0x95, 0x18, 0x1a, 0x34, 0xcf, 0x8f, - 0xc4, 0x82, 0xa1, 0xfd, 0xbe, 0x05, 0x68, 0x7d, 0x8f, 0x44, 0x91, 0x57, 0x33, 0xb2, 0x2a, 0xd1, - 0x4b, 0x30, 0x71, 0x6b, 0x73, 0xfd, 0xda, 0x46, 0xe8, 0x05, 0x2c, 0xc7, 0xda, 0xc8, 0x4b, 0xb9, - 0x62, 0xb4, 0xe3, 0x14, 0x16, 0x5a, 0x84, 0xe9, 0x5b, 0x6f, 0x51, 0x3b, 0xca, 0xac, 0x63, 0x5b, - 0xd0, 0x27, 0x67, 0x57, 0x5e, 0xcb, 0x00, 0x71, 0x37, 0x3e, 0x5a, 0x87, 0x33, 0x4d, 0xae, 0x81, - 0x33, 0xf3, 0x31, 0xe6, 0xea, 0x78, 0x24, 0x0b, 0x2f, 0x3c, 0x71, 0xe7, 0x60, 0xf6, 0xcc, 0x5a, - 0x2f, 0x04, 0xdc, 0xfb, 0x39, 0xfb, 0xbb, 0x05, 0x18, 0x37, 0x2e, 0xf6, 0x1b, 0xc0, 0x50, 0xce, - 0xdc, 0x45, 0x58, 0x18, 0xf0, 0x2e, 0xc2, 0xe7, 0xa0, 0xdc, 0x0a, 0x7d, 0xcf, 0xf5, 0x54, 0x95, - 0x08, 0x56, 0xcc, 0x6c, 0x43, 0xb4, 0x61, 0x05, 0x45, 0xb7, 0xa1, 0xa2, 0x2e, 0xbb, 0x12, 0xc9, - 0x7d, 0x79, 0x1d, 0x15, 0xa8, 0xc5, 0xab, 0x2f, 0xb1, 0xd2, 0xbc, 0x90, 0x0d, 0xa3, 0x6c, 0xe6, - 0xcb, 0x90, 0x26, 0x96, 0x75, 0xc1, 0x96, 0x44, 0x8c, 0x05, 0xc4, 0xfe, 0xa5, 0x31, 0x38, 0xdd, - 0xab, 0x00, 0x17, 0xfa, 0x3c, 0x8c, 0xf2, 0x3e, 0xe6, 0x53, 0xe3, 0xb1, 0x17, 0x8f, 0x65, 0x46, - 0x50, 0x74, 0x8b, 0xfd, 0xc6, 0x82, 0xa7, 0xe0, 0xee, 0x3b, 0xdb, 0x42, 0x8d, 0x38, 0x1e, 0xee, - 0xab, 0x8e, 0xe6, 0xbe, 0xea, 0x70, 0xee, 0xbe, 0xb3, 0x8d, 0xf6, 0xa1, 0xd4, 0xf0, 0x12, 0xe2, - 0x08, 0x65, 0xfa, 0xe6, 0xb1, 0x30, 0x27, 0x0e, 0x8f, 0x9c, 0x67, 0x3f, 0x31, 0x67, 0x88, 0xbe, - 0x63, 0xc1, 0x89, 0xed, 0x74, 0x12, 0x8b, 0xd8, 0x55, 0x9c, 0x63, 0x28, 0xb2, 0x96, 0x66, 0x54, - 0x3d, 0x75, 0xe7, 0x60, 0xf6, 0x44, 0xa6, 0x11, 0x67, 0xbb, 0x83, 0x7e, 0xd1, 0x82, 0xb1, 0xba, - 0xe7, 0x1b, 0x15, 0x84, 0x8e, 0xe1, 0xe3, 0x5c, 0x62, 0x0c, 0xf4, 0xce, 0xcb, 0xff, 0xc7, 0x58, - 0x72, 0xee, 0xe7, 0xce, 0x1b, 0x3d, 0xaa, 0x3b, 0x6f, 0xec, 0x21, 0x99, 0x4f, 0x7f, 0xbd, 0x00, - 0xcf, 0x0c, 0xf0, 0x8d, 0xcc, 0xa4, 0x08, 0xeb, 0x90, 0xa4, 0x88, 0xf3, 0x30, 0x12, 0x91, 0x56, - 0x98, 0xdd, 0xef, 0x58, 0xe4, 0x10, 0x83, 0xa0, 0xa7, 0xa1, 0xe8, 0xb4, 0x3c, 0xb1, 0xdd, 0x29, - 0x6f, 0xff, 0xc2, 0xc6, 0x0a, 0xa6, 0xed, 0xf4, 0x4b, 0x57, 0xb6, 0x65, 0x6a, 0x55, 0x3e, 0xc5, - 0x9a, 0xfb, 0x65, 0x6a, 0x71, 0x83, 0x46, 0x41, 0xb1, 0xe6, 0x6b, 0xaf, 0xc3, 0xd9, 0xfe, 0x33, - 0x04, 0xbd, 0x08, 0xe3, 0xdb, 0x91, 0x13, 0xb8, 0x3b, 0xac, 0xb0, 0xb9, 0x1c, 0x13, 0x16, 0x0a, - 0xaf, 0x9b, 0xb1, 0x89, 0x63, 0xff, 0x61, 0xa1, 0x37, 0x45, 0x2e, 0x04, 0x86, 0x19, 0x61, 0x31, - 0x7e, 0x85, 0x3e, 0xe3, 0xf7, 0x16, 0x94, 0x13, 0x16, 0x89, 0x4f, 0xea, 0x42, 0x92, 0xe4, 0x96, - 0x4c, 0xc6, 0xf6, 0x9a, 0x2d, 0x41, 0x1c, 0x2b, 0x36, 0x54, 0xe4, 0xfb, 0xba, 0xf8, 0x90, 0x10, - 0xf9, 0x99, 0x73, 0xb4, 0x25, 0x38, 0x69, 0xd4, 0x52, 0xe4, 0x81, 0xc8, 0xdc, 0x8d, 0xaa, 0xb2, - 0x73, 0x36, 0x32, 0x70, 0xdc, 0xf5, 0x84, 0xfd, 0x9b, 0x05, 0x78, 0xa2, 0xaf, 0x64, 0xd3, 0xbe, - 0x5e, 0xeb, 0x1e, 0xbe, 0xde, 0x23, 0x4f, 0x50, 0x73, 0x80, 0x47, 0x1e, 0xcc, 0x00, 0x3f, 0x0f, - 0x65, 0x2f, 0x88, 0x89, 0xdb, 0x8e, 0xf8, 0xa0, 0x19, 0x61, 0x79, 0x2b, 0xa2, 0x1d, 0x2b, 0x0c, - 0xfb, 0x8f, 0xfb, 0x4f, 0x35, 0xba, 0xcb, 0xfd, 0xd8, 0x8e, 0xd2, 0x2b, 0x30, 0xe9, 0xb4, 0x5a, - 0x1c, 0x8f, 0xf9, 0xd5, 0x32, 0xf9, 0x76, 0x0b, 0x26, 0x10, 0xa7, 0x71, 0x8d, 0x39, 0x3c, 0xda, - 0x6f, 0x0e, 0xdb, 0x7f, 0x66, 0x41, 0x05, 0x93, 0x3a, 0xaf, 0xc1, 0x89, 0x6e, 0x89, 0x21, 0xb2, - 0xf2, 0x28, 0x0e, 0xc1, 0xae, 0xcc, 0xf6, 0x58, 0xd1, 0x84, 0x5e, 0x83, 0xdd, 0x5d, 0x17, 0xb4, - 0x30, 0x54, 0x5d, 0x50, 0x55, 0x19, 0xb2, 0xd8, 0xbf, 0x32, 0xa4, 0xfd, 0xc3, 0x51, 0xfa, 0x7a, - 0xad, 0x70, 0x31, 0x22, 0xb5, 0x98, 0x7e, 0xdf, 0x76, 0xe4, 0x67, 0x6f, 0x12, 0xbc, 0x8e, 0x57, - 0x31, 0x6d, 0x4f, 0x1d, 0x02, 0x14, 0x86, 0xca, 0x36, 0x2a, 0x1e, 0x9a, 0x6d, 0xf4, 0x0a, 0x4c, - 0xc6, 0xf1, 0xce, 0x46, 0xe4, 0xed, 0x39, 0x09, 0x35, 0x2d, 0x44, 0x58, 0x86, 0xce, 0x10, 0xd8, - 0xbc, 0xac, 0x81, 0x38, 0x8d, 0x8b, 0x96, 0x61, 0x5a, 0xe7, 0xfc, 0x90, 0x28, 0x61, 0x51, 0x18, - 0x7c, 0x26, 0xa8, 0x00, 0x7d, 0x9d, 0x25, 0x24, 0x10, 0x70, 0xf7, 0x33, 0x54, 0x62, 0xa5, 0x1a, - 0x69, 0x47, 0x46, 0xd3, 0x12, 0x2b, 0x45, 0x87, 0xf6, 0xa5, 0xeb, 0x09, 0xb4, 0x06, 0xa7, 0xf8, - 0xc4, 0x60, 0x57, 0xd7, 0xaa, 0x37, 0xe2, 0x51, 0x33, 0x4f, 0x0a, 0x42, 0xa7, 0x96, 0xbb, 0x51, - 0x70, 0xaf, 0xe7, 0xa8, 0xdd, 0xa0, 0x9a, 0x57, 0x96, 0x84, 0xfd, 0xaa, 0xec, 0x06, 0x45, 0x66, - 0xa5, 0x86, 0x4d, 0x3c, 0xf4, 0x69, 0x78, 0x5c, 0xff, 0xe5, 0xf1, 0x6e, 0xfc, 0x50, 0x67, 0x49, - 0xa4, 0x53, 0xaa, 0x3a, 0x84, 0xcb, 0x3d, 0xd1, 0x6a, 0xb8, 0xdf, 0xf3, 0x68, 0x1b, 0xce, 0x2a, - 0xd0, 0x45, 0x6a, 0xa4, 0xb5, 0x22, 0x2f, 0x26, 0x55, 0x27, 0x26, 0xd7, 0x23, 0x9f, 0x25, 0x60, - 0x56, 0x74, 0x41, 0xf5, 0x65, 0x2f, 0xb9, 0xdc, 0x0b, 0x13, 0xaf, 0xe2, 0x7b, 0x50, 0x41, 0xf3, - 0x50, 0x21, 0x81, 0xb3, 0xed, 0x93, 0xf5, 0xc5, 0x15, 0x96, 0x96, 0x69, 0x9c, 0x21, 0x5d, 0x94, - 0x00, 0xac, 0x71, 0x94, 0x27, 0x70, 0xa2, 0x6f, 0x01, 0xfe, 0x0d, 0x38, 0xdd, 0x70, 0x5b, 0x54, - 0x0f, 0xf0, 0x5c, 0xb2, 0xe0, 0xba, 0xd4, 0xd0, 0xa7, 0x1f, 0x86, 0xd7, 0x45, 0x55, 0x6e, 0xee, - 0xe5, 0xc5, 0x8d, 0x2e, 0x1c, 0xdc, 0xf3, 0x49, 0xba, 0xc6, 0x5a, 0x51, 0xb8, 0xdf, 0x99, 0x39, - 0x95, 0x5e, 0x63, 0x1b, 0xb4, 0x11, 0x73, 0x98, 0xfd, 0xa7, 0x16, 0x4c, 0xaa, 0x35, 0xf6, 0x00, - 0x22, 0x7d, 0xfc, 0x74, 0xa4, 0xcf, 0xf2, 0xd1, 0xa5, 0x14, 0xeb, 0x79, 0x1f, 0x77, 0xf1, 0xef, - 0x03, 0x80, 0x96, 0x64, 0x6a, 0x13, 0xb1, 0xfa, 0x6e, 0x22, 0x8f, 0xac, 0x14, 0xe9, 0x95, 0x37, - 0x55, 0x7a, 0xb8, 0x79, 0x53, 0x9b, 0x70, 0x46, 0x6e, 0xf1, 0xfc, 0x18, 0xe5, 0x72, 0x18, 0x2b, - 0xa1, 0x54, 0xae, 0x3e, 0x2d, 0x08, 0x9d, 0x59, 0xe9, 0x85, 0x84, 0x7b, 0x3f, 0x9b, 0xd2, 0x2c, - 0xc6, 0x0e, 0xd3, 0x2c, 0xf4, 0x3a, 0x5c, 0xad, 0xcb, 0x4a, 0x84, 0x99, 0x75, 0xb8, 0x7a, 0x69, - 0x13, 0x6b, 0x9c, 0xde, 0xc2, 0xb8, 0x92, 0x93, 0x30, 0x86, 0xa1, 0x85, 0xb1, 0x14, 0x0b, 0xe3, - 0x7d, 0xc5, 0x82, 0x3c, 0xb9, 0x99, 0xe8, 0x7b, 0x72, 0xf3, 0x2a, 0x4c, 0x79, 0xc1, 0x0e, 0x89, - 0xbc, 0x84, 0xd4, 0xd8, 0x5a, 0x10, 0x57, 0xaa, 0xab, 0xad, 0x78, 0x25, 0x05, 0xc5, 0x19, 0xec, - 0xb4, 0x2c, 0x9b, 0x1a, 0x40, 0x96, 0xf5, 0xd9, 0x41, 0x4e, 0xe4, 0xb3, 0x83, 0x9c, 0x3c, 0xfa, - 0x0e, 0x32, 0x7d, 0xac, 0x3b, 0x08, 0xca, 0x65, 0x07, 0x19, 0x44, 0x38, 0x9b, 0x46, 0xd8, 0xe9, - 0x43, 0x8c, 0xb0, 0x7e, 0xdb, 0xc7, 0x99, 0xfb, 0xdd, 0x3e, 0xec, 0xaf, 0x16, 0xe0, 0x8c, 0x96, - 0x9d, 0x74, 0xc6, 0x7a, 0x75, 0x2a, 0x3d, 0x58, 0x01, 0x5a, 0x1e, 0xf6, 0x61, 0x04, 0x8b, 0xe9, - 0xb8, 0x33, 0x05, 0xc1, 0x06, 0x16, 0x8b, 0xb9, 0x22, 0x11, 0x2b, 0xe5, 0x92, 0x15, 0xac, 0x8b, - 0xa2, 0x1d, 0x2b, 0x0c, 0x3a, 0x27, 0xe8, 0x6f, 0x11, 0xc7, 0x9a, 0x4d, 0xef, 0x5e, 0xd4, 0x20, - 0x6c, 0xe2, 0xa1, 0xe7, 0x38, 0x13, 0xb6, 0xa8, 0xa9, 0x70, 0x9d, 0x10, 0x57, 0x2b, 0xc8, 0x75, - 0xac, 0xa0, 0xb2, 0x3b, 0x2c, 0xb8, 0xae, 0xd4, 0xdd, 0x1d, 0xe6, 0xe4, 0x52, 0x18, 0xf6, 0xff, - 0xb2, 0xe0, 0x89, 0x9e, 0x43, 0xf1, 0x00, 0x36, 0xcc, 0xfd, 0xf4, 0x86, 0xb9, 0x99, 0x97, 0x5a, - 0x6f, 0xbc, 0x45, 0x9f, 0xcd, 0xf3, 0xdf, 0x59, 0x30, 0xa5, 0xf1, 0x1f, 0xc0, 0xab, 0x7a, 0xe9, - 0x57, 0xcd, 0xcf, 0x82, 0xa9, 0x74, 0xbd, 0xdb, 0x9f, 0xb2, 0x77, 0xe3, 0xbe, 0x82, 0x05, 0x57, - 0xde, 0x80, 0x7f, 0xc8, 0x19, 0x79, 0x07, 0x46, 0x59, 0xf5, 0xd3, 0x38, 0x1f, 0x9f, 0x45, 0x9a, - 0x3f, 0x8b, 0x9a, 0xd5, 0x3e, 0x0b, 0xf6, 0x37, 0xc6, 0x82, 0x21, 0x2b, 0x34, 0xe4, 0xc5, 0x54, - 0x02, 0xd7, 0x44, 0x98, 0x9a, 0x2e, 0x34, 0x24, 0xda, 0xb1, 0xc2, 0xb0, 0x9b, 0x30, 0x93, 0x26, - 0xbe, 0x44, 0xea, 0xcc, 0x35, 0x3c, 0xd0, 0x6b, 0xce, 0x43, 0xc5, 0x61, 0x4f, 0xad, 0xb6, 0x9d, - 0xec, 0x6d, 0x3c, 0x0b, 0x12, 0x80, 0x35, 0x8e, 0xfd, 0xbb, 0x16, 0x9c, 0xea, 0xf1, 0x32, 0x39, - 0x86, 0xe7, 0x25, 0x5a, 0x0a, 0xf4, 0xda, 0x24, 0x3f, 0x02, 0x63, 0x35, 0x52, 0x77, 0xa4, 0xf3, - 0xd1, 0x90, 0x93, 0x4b, 0xbc, 0x19, 0x4b, 0xb8, 0xfd, 0xdf, 0x2c, 0x38, 0x91, 0xee, 0x6b, 0x8c, - 0xae, 0x00, 0xe2, 0x2f, 0xb3, 0xe4, 0xc5, 0x6e, 0xb8, 0x47, 0xa2, 0x0e, 0x7d, 0x73, 0xde, 0xeb, - 0xb3, 0x82, 0x12, 0x5a, 0xe8, 0xc2, 0xc0, 0x3d, 0x9e, 0x62, 0x85, 0x50, 0x6a, 0x6a, 0xb4, 0xe5, - 0x4c, 0xb9, 0x91, 0xe7, 0x4c, 0xd1, 0x1f, 0xd3, 0x74, 0xd0, 0x28, 0x96, 0xd8, 0xe4, 0x6f, 0xbf, - 0x3f, 0x02, 0x2a, 0x7e, 0x97, 0xb9, 0xb9, 0x72, 0x72, 0x12, 0xa6, 0xae, 0x6c, 0x2a, 0x0e, 0x70, - 0x65, 0x93, 0x9c, 0x0c, 0x23, 0xf7, 0x72, 0x41, 0xf1, 0x53, 0x02, 0xf3, 0x30, 0x4e, 0xbd, 0xe1, - 0x96, 0x06, 0x61, 0x13, 0x8f, 0xf6, 0xc4, 0xf7, 0xf6, 0x08, 0x7f, 0x68, 0x34, 0xdd, 0x93, 0x55, - 0x09, 0xc0, 0x1a, 0x87, 0xf6, 0xa4, 0xe6, 0xd5, 0xeb, 0xc2, 0xe4, 0x55, 0x3d, 0xa1, 0xa3, 0x83, - 0x19, 0x84, 0x62, 0xec, 0x84, 0xe1, 0xae, 0xd0, 0x28, 0x15, 0xc6, 0xe5, 0x30, 0xdc, 0xc5, 0x0c, - 0x42, 0x75, 0xa0, 0x20, 0x8c, 0x9a, 0xec, 0xb6, 0xa4, 0x9a, 0xe2, 0x22, 0x34, 0x49, 0xa5, 0x03, - 0x5d, 0xeb, 0x46, 0xc1, 0xbd, 0x9e, 0xa3, 0x33, 0xb0, 0x15, 0x91, 0x9a, 0xe7, 0x26, 0x26, 0x35, - 0x48, 0xcf, 0xc0, 0x8d, 0x2e, 0x0c, 0xdc, 0xe3, 0x29, 0xb4, 0x00, 0x27, 0x64, 0xfc, 0xb5, 0x4c, - 0x51, 0x1b, 0x4f, 0xa7, 0xc4, 0xe0, 0x34, 0x18, 0x67, 0xf1, 0xa9, 0xb4, 0x69, 0x8a, 0xec, 0x54, - 0xa6, 0x78, 0x1a, 0xd2, 0x46, 0x66, 0xad, 0x62, 0x85, 0x61, 0x7f, 0xa9, 0x48, 0x77, 0xc7, 0x3e, - 0x55, 0x6a, 0x1f, 0x98, 0x53, 0x3a, 0x3d, 0x23, 0x47, 0x06, 0x98, 0x91, 0x2f, 0xc1, 0xc4, 0xad, - 0x38, 0x0c, 0x94, 0xc3, 0xb7, 0xd4, 0xd7, 0xe1, 0x6b, 0x60, 0xf5, 0x76, 0xf8, 0x8e, 0xe6, 0xe5, - 0xf0, 0x1d, 0xbb, 0x4f, 0x87, 0xef, 0xf7, 0x4a, 0xa0, 0xea, 0x3c, 0x5e, 0x23, 0xc9, 0xed, 0x30, - 0xda, 0xf5, 0x82, 0x06, 0x8b, 0x5b, 0xff, 0x8e, 0x05, 0x13, 0x7c, 0xbd, 0xac, 0x9a, 0x31, 0xac, - 0xf5, 0x9c, 0xea, 0x11, 0xa6, 0x98, 0xcd, 0x6d, 0x19, 0x8c, 0x32, 0xc5, 0xf8, 0x4d, 0x10, 0x4e, - 0xf5, 0x08, 0xfd, 0x3c, 0x80, 0x3c, 0x1f, 0xac, 0x4b, 0x91, 0xb9, 0x92, 0x4f, 0xff, 0x30, 0xa9, - 0x6b, 0xdd, 0x74, 0x4b, 0x31, 0xc1, 0x06, 0x43, 0xf4, 0xd5, 0xec, 0x6d, 0x72, 0x9f, 0x3b, 0x96, - 0xb1, 0x19, 0x24, 0xba, 0x17, 0xc3, 0x98, 0x17, 0x34, 0xe8, 0x3c, 0x11, 0x3e, 0xf2, 0x0f, 0xf7, - 0xca, 0xf9, 0x58, 0x0d, 0x9d, 0x5a, 0xd5, 0xf1, 0x9d, 0xc0, 0x25, 0xd1, 0x0a, 0x47, 0x37, 0x6f, - 0x87, 0x61, 0x0d, 0x58, 0x12, 0xea, 0x2a, 0xb8, 0x59, 0x1a, 0xa4, 0xe0, 0xe6, 0xd9, 0x4f, 0xc2, - 0x74, 0xd7, 0xc7, 0x1c, 0x2a, 0x98, 0xf7, 0xfe, 0xe3, 0x80, 0xed, 0x7f, 0x36, 0xaa, 0x37, 0xad, - 0x6b, 0x61, 0x8d, 0x97, 0x7d, 0x8c, 0xf4, 0x17, 0x15, 0xba, 0x67, 0x8e, 0x53, 0xc4, 0xb8, 0x61, - 0x46, 0x35, 0x62, 0x93, 0x25, 0x9d, 0xa3, 0x2d, 0x27, 0x22, 0xc1, 0x71, 0xcf, 0xd1, 0x0d, 0xc5, - 0x04, 0x1b, 0x0c, 0xd1, 0x4e, 0x2a, 0x9a, 0xef, 0xd2, 0xd1, 0xa3, 0xf9, 0x58, 0x4a, 0x69, 0xaf, - 0xba, 0x76, 0xdf, 0xb2, 0x60, 0x2a, 0x48, 0xcd, 0x5c, 0xe1, 0x2f, 0xd9, 0x3a, 0x8e, 0x55, 0xc1, - 0xcb, 0x04, 0xa7, 0xdb, 0x70, 0x86, 0x7f, 0xaf, 0x2d, 0xad, 0x34, 0xe4, 0x96, 0xa6, 0xeb, 0xc7, - 0x8e, 0xf6, 0xab, 0x1f, 0x8b, 0x02, 0x55, 0xf1, 0x7a, 0x2c, 0xf7, 0x8a, 0xd7, 0xd0, 0xa3, 0xda, - 0xf5, 0x4d, 0xa8, 0xb8, 0x11, 0x71, 0x92, 0xfb, 0x2c, 0x7e, 0xcc, 0x9c, 0xc5, 0x8b, 0x92, 0x00, - 0xd6, 0xb4, 0xec, 0x7f, 0x5b, 0x84, 0x93, 0x72, 0x44, 0x64, 0xa4, 0x13, 0xdd, 0x1f, 0x39, 0x5f, - 0xad, 0xdc, 0xaa, 0xfd, 0xf1, 0xb2, 0x04, 0x60, 0x8d, 0x43, 0xf5, 0xb1, 0x76, 0x4c, 0xd6, 0x5b, - 0x24, 0x58, 0xf5, 0xb6, 0x63, 0xe1, 0xe7, 0x53, 0x0b, 0xe5, 0xba, 0x06, 0x61, 0x13, 0x8f, 0x2a, - 0xe3, 0x5c, 0x2f, 0x8e, 0xb3, 0x81, 0x83, 0x42, 0xdf, 0xc6, 0x12, 0x8e, 0x7e, 0xad, 0x67, 0xd9, - 0xfc, 0x7c, 0x42, 0x66, 0xbb, 0x02, 0xbc, 0x86, 0xac, 0x97, 0xff, 0x8e, 0x05, 0x27, 0x76, 0x53, - 0x39, 0x3f, 0x52, 0x24, 0x1f, 0x31, 0x3b, 0x35, 0x9d, 0x48, 0xa4, 0xa7, 0x70, 0xba, 0x3d, 0xc6, - 0x59, 0xee, 0xf6, 0xff, 0xb0, 0xc0, 0x14, 0x4f, 0x83, 0x69, 0x56, 0xc6, 0x3d, 0x37, 0x85, 0x43, - 0xee, 0xb9, 0x91, 0x4a, 0x58, 0x71, 0x30, 0xa5, 0x7f, 0x64, 0x08, 0xa5, 0xbf, 0xd4, 0x57, 0x6b, - 0x7b, 0x1a, 0x8a, 0x6d, 0xaf, 0x26, 0xf4, 0x76, 0xed, 0xd5, 0x5b, 0x59, 0xc2, 0xb4, 0xdd, 0xfe, - 0xfd, 0x92, 0xb6, 0xd3, 0x45, 0xa4, 0xe7, 0x8f, 0xc5, 0x6b, 0xd7, 0x55, 0xb2, 0x31, 0x7f, 0xf3, - 0x6b, 0x5d, 0xc9, 0xc6, 0x3f, 0x35, 0x7c, 0x20, 0x2f, 0x1f, 0xa0, 0x7e, 0xb9, 0xc6, 0x63, 0x87, - 0x44, 0xf1, 0xde, 0x82, 0x32, 0x35, 0x6d, 0xd8, 0x81, 0x5b, 0x39, 0xd5, 0xa9, 0xf2, 0x65, 0xd1, - 0x7e, 0xf7, 0x60, 0xf6, 0x27, 0x87, 0xef, 0x96, 0x7c, 0x1a, 0x2b, 0xfa, 0x28, 0x86, 0x0a, 0xfd, - 0xcd, 0x02, 0x8e, 0x85, 0xd1, 0x74, 0x5d, 0xc9, 0x22, 0x09, 0xc8, 0x25, 0x9a, 0x59, 0xf3, 0x41, - 0x01, 0x54, 0xd8, 0x95, 0x1d, 0x8c, 0x29, 0xb7, 0xad, 0x36, 0x54, 0xd8, 0xaf, 0x04, 0xdc, 0x3d, - 0x98, 0x7d, 0x65, 0x78, 0xa6, 0xea, 0x71, 0xac, 0x59, 0xd8, 0xef, 0x8e, 0xe8, 0xb9, 0x2b, 0x72, - 0xcc, 0x7f, 0x2c, 0xe6, 0xee, 0xcb, 0x99, 0xb9, 0x7b, 0xbe, 0x6b, 0xee, 0x4e, 0xe9, 0xab, 0x25, - 0x52, 0xb3, 0xf1, 0x41, 0x6f, 0xb0, 0x87, 0xdb, 0xf1, 0x4c, 0xb3, 0x78, 0xab, 0xed, 0x45, 0x24, - 0xde, 0x88, 0xda, 0x81, 0x17, 0x34, 0xc4, 0xdd, 0x75, 0x86, 0x66, 0x91, 0x02, 0xe3, 0x2c, 0x3e, - 0xbb, 0xf7, 0xae, 0x13, 0xb8, 0x37, 0x9d, 0x3d, 0x3e, 0xab, 0x8c, 0xb4, 0xdb, 0x4d, 0xd1, 0x8e, - 0x15, 0x86, 0xfd, 0x5d, 0xe6, 0x6f, 0x35, 0x32, 0x1d, 0xe8, 0x9c, 0xf0, 0xd9, 0x1d, 0x29, 0x3c, - 0x67, 0x57, 0xcd, 0x09, 0x7e, 0x31, 0x0a, 0x87, 0xa1, 0xdb, 0x30, 0xb6, 0xcd, 0x6b, 0x8e, 0xe7, - 0x53, 0xe4, 0x4b, 0x14, 0x30, 0x67, 0x75, 0x38, 0x65, 0x35, 0xf3, 0xbb, 0xfa, 0x27, 0x96, 0xdc, - 0xec, 0xf7, 0x46, 0xe0, 0x44, 0xe6, 0x16, 0x8d, 0x54, 0xc9, 0x91, 0xc2, 0xa1, 0x25, 0x47, 0x3e, - 0x03, 0x50, 0x23, 0x2d, 0x3f, 0xec, 0x30, 0x35, 0x67, 0x64, 0x68, 0x35, 0x47, 0x69, 0xc6, 0x4b, - 0x8a, 0x0a, 0x36, 0x28, 0x8a, 0x44, 0x65, 0x5e, 0xc1, 0x24, 0x93, 0xa8, 0x6c, 0xd4, 0xd9, 0x1b, - 0x7d, 0xb0, 0x75, 0xf6, 0x3c, 0x38, 0xc1, 0xbb, 0xa8, 0xf2, 0x09, 0xee, 0x23, 0x6d, 0x80, 0x45, - 0xa2, 0x2e, 0xa5, 0xc9, 0xe0, 0x2c, 0xdd, 0x87, 0x79, 0x49, 0x0e, 0xfa, 0x28, 0x54, 0xe4, 0x77, - 0x8e, 0x67, 0x2a, 0x3a, 0x27, 0x4b, 0x4e, 0x03, 0x76, 0x79, 0x8d, 0xf8, 0x69, 0x7f, 0xb3, 0x40, - 0xb5, 0x52, 0xfe, 0x4f, 0xe5, 0xd6, 0x3e, 0x0b, 0xa3, 0x4e, 0x3b, 0xd9, 0x09, 0xbb, 0xaa, 0xbc, - 0x2f, 0xb0, 0x56, 0x2c, 0xa0, 0x68, 0x15, 0x46, 0x6a, 0x3a, 0x5f, 0x72, 0x98, 0x51, 0xd4, 0x07, - 0x7c, 0x4e, 0x42, 0x30, 0xa3, 0x82, 0x9e, 0x82, 0x91, 0xc4, 0x69, 0xa4, 0xee, 0x5f, 0xdc, 0x72, - 0x1a, 0x31, 0x66, 0xad, 0xe6, 0xa6, 0x39, 0x72, 0xc8, 0xa6, 0xf9, 0x0a, 0x4c, 0xc6, 0x5e, 0x23, - 0x70, 0x92, 0x76, 0x44, 0x0c, 0x67, 0x92, 0xf6, 0xe9, 0x9b, 0x40, 0x9c, 0xc6, 0xb5, 0xdf, 0xaf, - 0xc0, 0xe9, 0x5e, 0xf7, 0x64, 0xe7, 0x1d, 0x75, 0xde, 0x8b, 0xc7, 0x83, 0x8b, 0x3a, 0xef, 0xc3, - 0xdd, 0x37, 0xa2, 0xce, 0x7d, 0x23, 0xea, 0xfc, 0xab, 0x16, 0x54, 0x54, 0xb0, 0xb5, 0x08, 0x18, - 0x7d, 0xe3, 0x18, 0xee, 0x22, 0x97, 0x2c, 0x44, 0xcc, 0xad, 0xfc, 0x8b, 0x35, 0xf3, 0xe3, 0x0b, - 0x43, 0xbf, 0x67, 0x87, 0x86, 0x0a, 0x43, 0x57, 0x31, 0xfa, 0xa5, 0x3c, 0x62, 0xf4, 0xfb, 0x7c, - 0xaa, 0x9e, 0x31, 0xfa, 0xdf, 0xb2, 0x60, 0xdc, 0x79, 0xbb, 0x1d, 0x91, 0x25, 0xb2, 0xb7, 0xde, - 0x8a, 0x85, 0x80, 0x7d, 0x33, 0xff, 0x0e, 0x2c, 0x68, 0x26, 0xa2, 0x1c, 0xad, 0x6e, 0xc0, 0x66, - 0x17, 0x52, 0x31, 0xf9, 0x63, 0x79, 0xc4, 0xe4, 0xf7, 0xea, 0xce, 0xa1, 0x31, 0xf9, 0xaf, 0xc0, - 0xa4, 0xeb, 0x87, 0x01, 0xd9, 0x88, 0xc2, 0x24, 0x74, 0x43, 0x5f, 0x28, 0xd3, 0x4a, 0x24, 0x2c, - 0x9a, 0x40, 0x9c, 0xc6, 0xed, 0x17, 0xd0, 0x5f, 0x39, 0x6a, 0x40, 0x3f, 0x3c, 0xa4, 0x80, 0xfe, - 0xbf, 0x28, 0xc0, 0xec, 0x21, 0x1f, 0x15, 0xbd, 0x0c, 0x13, 0x61, 0xd4, 0x70, 0x02, 0xef, 0x6d, - 0x9e, 0x4f, 0x59, 0x4a, 0x97, 0xbb, 0x58, 0x37, 0x60, 0x38, 0x85, 0x29, 0x43, 0x7e, 0x47, 0xfb, - 0x84, 0xfc, 0x7e, 0x1c, 0xc6, 0x13, 0xe2, 0x34, 0x45, 0xac, 0x84, 0x30, 0x80, 0xb4, 0x43, 0x49, - 0x83, 0xb0, 0x89, 0x47, 0xa7, 0xd1, 0x94, 0xe3, 0xba, 0x24, 0x8e, 0x65, 0x4c, 0xaf, 0x38, 0x9c, - 0xc9, 0x2d, 0x60, 0x98, 0x9d, 0x79, 0x2d, 0xa4, 0x58, 0xe0, 0x0c, 0x4b, 0xda, 0x79, 0xc7, 0xf7, - 0x79, 0xf8, 0x3e, 0x91, 0x37, 0x2a, 0xeb, 0xea, 0x0b, 0x1a, 0x84, 0x4d, 0x3c, 0xfb, 0xb7, 0x0a, - 0xf0, 0xf4, 0x3d, 0xc5, 0xcb, 0xc0, 0xe1, 0xd6, 0xed, 0x98, 0x44, 0x59, 0x87, 0xcc, 0xf5, 0x98, - 0x44, 0x98, 0x41, 0xf8, 0x28, 0xb5, 0x5a, 0xc6, 0x55, 0x2e, 0x79, 0x47, 0xf7, 0xf3, 0x51, 0x4a, - 0xb1, 0xc0, 0x19, 0x96, 0xd9, 0x51, 0x1a, 0x19, 0x70, 0x94, 0xfe, 0x5e, 0x01, 0x9e, 0x19, 0x40, - 0x08, 0xe7, 0x98, 0x05, 0x91, 0xce, 0x22, 0x29, 0x3e, 0x9c, 0x2c, 0x92, 0xfb, 0x1d, 0xae, 0xef, - 0x16, 0xe0, 0x6c, 0x7f, 0x59, 0x88, 0x7e, 0x9a, 0x1a, 0x51, 0x32, 0xd8, 0xc2, 0xcc, 0x40, 0x39, - 0xc5, 0x0d, 0xa8, 0x14, 0x08, 0x67, 0x71, 0xd1, 0x1c, 0x40, 0xcb, 0x49, 0x76, 0xe2, 0x8b, 0xfb, - 0x5e, 0x9c, 0x88, 0xdc, 0xc9, 0x29, 0x7e, 0x14, 0x2e, 0x5b, 0xb1, 0x81, 0x41, 0xd9, 0xb1, 0x7f, - 0x4b, 0xe1, 0xb5, 0x30, 0xe1, 0x0f, 0x71, 0x3d, 0xee, 0x94, 0xac, 0xf7, 0x67, 0x80, 0x70, 0x16, - 0x97, 0xb2, 0x63, 0xce, 0x16, 0xde, 0x51, 0x71, 0x5d, 0x3c, 0x65, 0xb7, 0xaa, 0x5a, 0xb1, 0x81, - 0x91, 0xcd, 0xad, 0x29, 0x0d, 0x90, 0x5b, 0xf3, 0x8f, 0x0a, 0xf0, 0x44, 0xdf, 0xbd, 0x74, 0xb0, - 0x05, 0xf8, 0xe8, 0x25, 0xd5, 0xdc, 0xdf, 0xdc, 0x19, 0x32, 0x55, 0xe4, 0xcf, 0xfa, 0xcc, 0x34, - 0x91, 0x2a, 0x92, 0xdd, 0x2a, 0xac, 0x61, 0xb7, 0x8a, 0x47, 0x68, 0x3c, 0xbb, 0xb2, 0x43, 0x46, - 0x86, 0xc8, 0x0e, 0xc9, 0x7c, 0x8c, 0xd2, 0x80, 0x0b, 0xf9, 0xfb, 0xfd, 0x87, 0x97, 0xea, 0xde, - 0x03, 0x1d, 0x4f, 0x2d, 0xc1, 0x49, 0x2f, 0x60, 0xb5, 0x5f, 0x37, 0xdb, 0xdb, 0x22, 0xb3, 0xb6, - 0x90, 0xbe, 0xd6, 0x68, 0x25, 0x03, 0xc7, 0x5d, 0x4f, 0x3c, 0x82, 0xd9, 0x3a, 0xf7, 0x39, 0xa4, - 0x9f, 0x81, 0x8a, 0xa2, 0xcd, 0x23, 0x23, 0xd5, 0x07, 0xed, 0x8a, 0x8c, 0x54, 0x5f, 0xd3, 0xc0, - 0xa2, 0x23, 0xb1, 0x4b, 0x3a, 0xd9, 0x99, 0x79, 0x95, 0x74, 0x98, 0x97, 0xd4, 0xfe, 0x18, 0x4c, - 0x28, 0x23, 0x72, 0xd0, 0xda, 0xa4, 0xf6, 0xbb, 0xa3, 0x30, 0x99, 0xaa, 0xa0, 0x90, 0x3a, 0xb3, - 0xb1, 0x0e, 0x3d, 0xb3, 0x61, 0xd1, 0xa9, 0xed, 0x40, 0x56, 0xff, 0x35, 0xa2, 0x53, 0xdb, 0x01, - 0xc1, 0x1c, 0x46, 0x4d, 0xf7, 0x5a, 0xd4, 0xc1, 0xed, 0x40, 0x44, 0xa4, 0x29, 0xd3, 0x7d, 0x89, - 0xb5, 0x62, 0x01, 0x45, 0x5f, 0xb4, 0x60, 0x22, 0x66, 0x07, 0x82, 0xfc, 0xc4, 0x4b, 0x7c, 0xd0, - 0x2b, 0x79, 0xdc, 0x5e, 0x2b, 0xaa, 0x85, 0x30, 0x67, 0xb6, 0xd9, 0x82, 0x53, 0x1c, 0xd1, 0x57, - 0x2c, 0xf3, 0xde, 0xde, 0xd1, 0x3c, 0x22, 0x29, 0xb3, 0x05, 0x2a, 0xf8, 0x51, 0xc9, 0xbd, 0xaf, - 0xef, 0xd5, 0xd7, 0x79, 0x8f, 0x3d, 0xb8, 0xeb, 0xbc, 0x3f, 0x0a, 0x95, 0xa6, 0x13, 0x78, 0x75, - 0x12, 0x27, 0xfc, 0x84, 0x48, 0xd6, 0xcd, 0x91, 0x8d, 0x58, 0xc3, 0xe9, 0x66, 0x17, 0xb3, 0x17, - 0x4b, 0x8c, 0x23, 0x1d, 0xb6, 0xd9, 0x6d, 0xea, 0x66, 0x6c, 0xe2, 0x98, 0xe7, 0x4f, 0xf0, 0x50, - 0xcf, 0x9f, 0xc6, 0x0f, 0x39, 0x7f, 0xfa, 0x07, 0x16, 0x9c, 0xe9, 0xf9, 0xd5, 0x1e, 0xdd, 0x18, - 0x25, 0xfb, 0xfd, 0x22, 0x9c, 0xea, 0x51, 0x0a, 0x05, 0x75, 0x8e, 0xed, 0x1e, 0x6a, 0x51, 0x6b, - 0x65, 0xb2, 0xef, 0x24, 0x1e, 0xee, 0xf4, 0x57, 0x9f, 0xc0, 0x16, 0x1f, 0xec, 0x09, 0xac, 0x31, - 0x2d, 0x47, 0x1e, 0xea, 0xb4, 0x2c, 0x1d, 0x32, 0x2d, 0xdf, 0x2f, 0x82, 0x71, 0xad, 0x3c, 0xfa, - 0x82, 0x59, 0x9e, 0xc8, 0xca, 0xab, 0x94, 0x0e, 0x27, 0xae, 0xca, 0x1b, 0xf1, 0xee, 0xf4, 0xaa, - 0x76, 0x94, 0x95, 0x00, 0x85, 0x01, 0x24, 0x80, 0x2f, 0xeb, 0x40, 0x15, 0xf3, 0xaf, 0x03, 0x55, - 0xc9, 0xd6, 0x80, 0x42, 0xbf, 0x67, 0xc1, 0x4c, 0xb3, 0x4f, 0xbd, 0xc2, 0x7c, 0xd2, 0xf3, 0xfb, - 0x55, 0x43, 0xac, 0x3e, 0x75, 0xe7, 0x60, 0xb6, 0x6f, 0x99, 0x48, 0xdc, 0xb7, 0x57, 0xf6, 0xdf, - 0xb4, 0xf8, 0x2a, 0xce, 0x7c, 0x05, 0xbd, 0xcd, 0x5a, 0xf7, 0xd8, 0x66, 0x9f, 0x67, 0x37, 0x9d, - 0xd5, 0x2f, 0x13, 0xc7, 0x17, 0xdb, 0xb1, 0x79, 0x69, 0x19, 0x6b, 0xc7, 0x0a, 0x83, 0xdd, 0x4d, - 0xe0, 0xfb, 0xe1, 0xed, 0x8b, 0xcd, 0x56, 0xd2, 0x11, 0x1b, 0xb3, 0xbe, 0x9b, 0x40, 0x41, 0xb0, - 0x81, 0x65, 0xff, 0x46, 0x81, 0xcf, 0x40, 0xe1, 0xa4, 0x7c, 0x39, 0x53, 0x08, 0x7b, 0x70, 0xff, - 0xde, 0xe7, 0x01, 0x5c, 0x75, 0xc9, 0x51, 0x3e, 0x97, 0xd4, 0xeb, 0x4b, 0x93, 0xcc, 0x9b, 0xd3, - 0x65, 0x1b, 0x36, 0xf8, 0xa5, 0x04, 0x53, 0xf1, 0x50, 0xc1, 0x94, 0x5a, 0xa3, 0x23, 0x87, 0xac, - 0xd1, 0xbf, 0xb0, 0x20, 0xa5, 0x5e, 0xa0, 0x16, 0x94, 0x68, 0x77, 0x3b, 0xf9, 0xdc, 0xdf, 0x64, - 0x92, 0xa6, 0x72, 0x46, 0x4c, 0x7b, 0xf6, 0x13, 0x73, 0x46, 0xc8, 0x17, 0xbe, 0xcc, 0x42, 0x1e, - 0x77, 0x8c, 0x99, 0x0c, 0x2f, 0x87, 0xe1, 0x2e, 0x77, 0x81, 0x68, 0xbf, 0xa8, 0xfd, 0x32, 0x4c, - 0x77, 0x75, 0x8a, 0xd5, 0xbc, 0x0d, 0xe5, 0xa5, 0x55, 0xc6, 0x74, 0x65, 0x15, 0xb8, 0x31, 0x87, - 0xd9, 0xdf, 0xb5, 0xe0, 0x64, 0x96, 0x3c, 0xfa, 0xb6, 0x05, 0xd3, 0x71, 0x96, 0xde, 0x71, 0x8d, - 0x9d, 0x8a, 0xf3, 0xe9, 0x02, 0xe1, 0xee, 0x4e, 0xd8, 0xff, 0x57, 0x4c, 0xfe, 0x9b, 0x5e, 0x50, - 0x0b, 0x6f, 0xab, 0x5d, 0xde, 0xea, 0xbb, 0xcb, 0xd3, 0xf5, 0xe8, 0xee, 0x90, 0x5a, 0xdb, 0xef, - 0xca, 0x64, 0xda, 0x14, 0xed, 0x58, 0x61, 0xa4, 0x6e, 0x88, 0x2e, 0x1e, 0x7a, 0x43, 0xf4, 0x4b, - 0x30, 0x61, 0x5e, 0xcc, 0x26, 0xe6, 0x25, 0xd3, 0x6e, 0xcd, 0x3b, 0xdc, 0x70, 0x0a, 0x2b, 0x73, - 0x35, 0x6f, 0xe9, 0xd0, 0xab, 0x79, 0x9f, 0x83, 0xb2, 0xb8, 0x66, 0x56, 0x46, 0xc3, 0xf1, 0x34, - 0x29, 0xd1, 0x86, 0x15, 0x94, 0x4a, 0x93, 0xa6, 0x13, 0xb4, 0x1d, 0x9f, 0x8e, 0x90, 0xc8, 0xc7, - 0x54, 0xcb, 0x70, 0x4d, 0x41, 0xb0, 0x81, 0x45, 0xdf, 0x38, 0xf1, 0x9a, 0xe4, 0xf5, 0x30, 0x90, - 0x71, 0x24, 0xfa, 0x80, 0x58, 0xb4, 0x63, 0x85, 0x61, 0xff, 0x17, 0x0b, 0xb2, 0x77, 0x64, 0xa6, - 0x8e, 0x0c, 0xac, 0x43, 0x73, 0x40, 0xd3, 0xd9, 0x68, 0x85, 0x81, 0xb2, 0xd1, 0xcc, 0x44, 0xb1, - 0xe2, 0x3d, 0x13, 0xc5, 0x7e, 0x42, 0xdf, 0x9c, 0xc0, 0x33, 0xca, 0xc6, 0x7b, 0xdd, 0x9a, 0x80, - 0x6c, 0x18, 0x75, 0x1d, 0x95, 0xd9, 0x3f, 0xc1, 0x15, 0xf1, 0xc5, 0x05, 0x86, 0x24, 0x20, 0xd5, - 0xed, 0xf7, 0x7e, 0x78, 0xee, 0x43, 0xdf, 0xff, 0xe1, 0xb9, 0x0f, 0xfd, 0xc9, 0x0f, 0xcf, 0x7d, - 0xe8, 0x8b, 0x77, 0xce, 0x59, 0xef, 0xdd, 0x39, 0x67, 0x7d, 0xff, 0xce, 0x39, 0xeb, 0x4f, 0xee, - 0x9c, 0xb3, 0xde, 0xbf, 0x73, 0xce, 0xfa, 0xd6, 0x7f, 0x3c, 0xf7, 0xa1, 0xd7, 0x7b, 0xc6, 0xfd, - 0xd0, 0x1f, 0x2f, 0xb8, 0xb5, 0xf9, 0xbd, 0x0b, 0x2c, 0xf4, 0x84, 0xae, 0x86, 0x79, 0x63, 0x0a, - 0xcc, 0xcb, 0xd5, 0xf0, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x38, 0xc0, 0xfa, 0xc5, 0xd3, 0xc1, - 0x00, 0x00, + // 8955 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, + 0x75, 0xd8, 0xf5, 0x0c, 0x87, 0x9c, 0x79, 0xfc, 0xd8, 0x65, 0xed, 0xee, 0x1d, 0x6f, 0xef, 0x6e, + 0xb9, 0xe8, 0x83, 0xa5, 0x73, 0x74, 0x47, 0xe6, 0xd6, 0x27, 0xe5, 0xe2, 0xb3, 0x4f, 0xe6, 0x90, + 0xbb, 0x5c, 0xee, 0xf2, 0xeb, 0x8a, 0xdc, 0x5d, 0xeb, 0x64, 0x7d, 0x34, 0x7b, 0x6a, 0x86, 0xbd, + 0xec, 0xe9, 0x9e, 0xed, 0xee, 0xe1, 0x72, 0xce, 0x5f, 0x92, 0x6c, 0xc7, 0x0a, 0xf4, 0x19, 0x29, + 0x40, 0x64, 0x20, 0x48, 0x14, 0xd9, 0x30, 0x62, 0x24, 0x42, 0x92, 0x5f, 0xf9, 0x42, 0x7e, 0xd8, + 0xce, 0x0f, 0x05, 0x09, 0x10, 0x01, 0x31, 0x2c, 0x27, 0x4e, 0x68, 0x89, 0x41, 0xe0, 0xc4, 0x40, + 0x1c, 0xc4, 0xf1, 0x9f, 0x2c, 0xf2, 0x23, 0xa8, 0xef, 0xea, 0x9e, 0x99, 0xe5, 0xcc, 0xb2, 0xb9, + 0xbb, 0x16, 0xee, 0xdf, 0xcc, 0x7b, 0xaf, 0xdf, 0x7b, 0x5d, 0x5d, 0xf5, 0xea, 0x55, 0xbd, 0x57, + 0xaf, 0x60, 0xb5, 0xe1, 0x25, 0xbb, 0xed, 0x9d, 0x39, 0x37, 0x6c, 0xce, 0x3b, 0x51, 0x23, 0x6c, + 0x45, 0xe1, 0x5d, 0xf6, 0xe3, 0x35, 0xb7, 0x36, 0xbf, 0x7f, 0x65, 0xbe, 0xb5, 0xd7, 0x98, 0x77, + 0x5a, 0x5e, 0x3c, 0xef, 0xb4, 0x5a, 0xbe, 0xe7, 0x3a, 0x89, 0x17, 0x06, 0xf3, 0xfb, 0xaf, 0x3b, + 0x7e, 0x6b, 0xd7, 0x79, 0x7d, 0xbe, 0x41, 0x02, 0x12, 0x39, 0x09, 0xa9, 0xcd, 0xb5, 0xa2, 0x30, + 0x09, 0xd1, 0x4f, 0x68, 0x6e, 0x73, 0x92, 0x1b, 0xfb, 0xf1, 0x29, 0xb7, 0x36, 0xb7, 0x7f, 0x65, + 0xae, 0xb5, 0xd7, 0x98, 0xa3, 0xdc, 0xe6, 0x0c, 0x6e, 0x73, 0x92, 0xdb, 0xc5, 0xd7, 0x0c, 0x5d, + 0x1a, 0x61, 0x23, 0x9c, 0x67, 0x4c, 0x77, 0xda, 0x75, 0xf6, 0x8f, 0xfd, 0x61, 0xbf, 0xb8, 0xb0, + 0x8b, 0xf6, 0xde, 0x9b, 0xf1, 0x9c, 0x17, 0x52, 0xf5, 0xe6, 0xdd, 0x30, 0x22, 0xf3, 0xfb, 0x5d, + 0x0a, 0x5d, 0xbc, 0xae, 0x69, 0xc8, 0x41, 0x42, 0x82, 0xd8, 0x0b, 0x83, 0xf8, 0x35, 0xaa, 0x02, + 0x89, 0xf6, 0x49, 0x64, 0xbe, 0x9e, 0x41, 0xd0, 0x8b, 0xd3, 0x1b, 0x9a, 0x53, 0xd3, 0x71, 0x77, + 0xbd, 0x80, 0x44, 0x1d, 0xfd, 0x78, 0x93, 0x24, 0x4e, 0xaf, 0xa7, 0xe6, 0xfb, 0x3d, 0x15, 0xb5, + 0x83, 0xc4, 0x6b, 0x92, 0xae, 0x07, 0x3e, 0x72, 0xdc, 0x03, 0xb1, 0xbb, 0x4b, 0x9a, 0x4e, 0xf6, + 0x39, 0xfb, 0x1e, 0x4c, 0x2e, 0xdc, 0xd9, 0x5a, 0x68, 0x27, 0xbb, 0x8b, 0x61, 0x50, 0xf7, 0x1a, + 0xe8, 0xc3, 0x30, 0xee, 0xfa, 0xed, 0x38, 0x21, 0xd1, 0xba, 0xd3, 0x24, 0x33, 0xd6, 0x65, 0xeb, + 0x95, 0x4a, 0xf5, 0xdc, 0x77, 0x0e, 0x67, 0x9f, 0x39, 0x3a, 0x9c, 0x1d, 0x5f, 0xd4, 0x28, 0x6c, + 0xd2, 0xa1, 0x1f, 0x85, 0xb1, 0x28, 0xf4, 0xc9, 0x02, 0x5e, 0x9f, 0x29, 0xb0, 0x47, 0xce, 0x88, + 0x47, 0xc6, 0x30, 0x07, 0x63, 0x89, 0xb7, 0x7f, 0xbf, 0x00, 0xb0, 0xd0, 0x6a, 0x6d, 0x46, 0xe1, + 0x5d, 0xe2, 0x26, 0xe8, 0xd3, 0x50, 0xa6, 0xad, 0x50, 0x73, 0x12, 0x87, 0x49, 0x1b, 0xbf, 0xf2, + 0x97, 0xe7, 0xf8, 0xcb, 0xcc, 0x99, 0x2f, 0xa3, 0xfb, 0x00, 0xa5, 0x9e, 0xdb, 0x7f, 0x7d, 0x6e, + 0x63, 0x87, 0x3e, 0xbf, 0x46, 0x12, 0xa7, 0x8a, 0x84, 0x30, 0xd0, 0x30, 0xac, 0xb8, 0xa2, 0x00, + 0x46, 0xe2, 0x16, 0x71, 0x99, 0x62, 0xe3, 0x57, 0x56, 0xe7, 0x4e, 0xd2, 0xd9, 0xe6, 0xb4, 0xe6, + 0x5b, 0x2d, 0xe2, 0x56, 0x27, 0x84, 0xe4, 0x11, 0xfa, 0x0f, 0x33, 0x39, 0x68, 0x1f, 0x46, 0xe3, + 0xc4, 0x49, 0xda, 0xf1, 0x4c, 0x91, 0x49, 0x5c, 0xcf, 0x4d, 0x22, 0xe3, 0x5a, 0x9d, 0x12, 0x32, + 0x47, 0xf9, 0x7f, 0x2c, 0xa4, 0xd9, 0xff, 0xc5, 0x82, 0x29, 0x4d, 0xbc, 0xea, 0xc5, 0x09, 0xfa, + 0x99, 0xae, 0xc6, 0x9d, 0x1b, 0xac, 0x71, 0xe9, 0xd3, 0xac, 0x69, 0xcf, 0x0a, 0x61, 0x65, 0x09, + 0x31, 0x1a, 0xb6, 0x09, 0x25, 0x2f, 0x21, 0xcd, 0x78, 0xa6, 0x70, 0xb9, 0xf8, 0xca, 0xf8, 0x95, + 0xeb, 0x79, 0xbd, 0x67, 0x75, 0x52, 0x08, 0x2d, 0xad, 0x50, 0xf6, 0x98, 0x4b, 0xb1, 0x7f, 0x6b, + 0xc2, 0x7c, 0x3f, 0xda, 0xe0, 0xe8, 0x75, 0x18, 0x8f, 0xc3, 0x76, 0xe4, 0x12, 0x4c, 0x5a, 0x61, + 0x3c, 0x63, 0x5d, 0x2e, 0xd2, 0xae, 0x47, 0x7b, 0xea, 0x96, 0x06, 0x63, 0x93, 0x06, 0x7d, 0xd9, + 0x82, 0x89, 0x1a, 0x89, 0x13, 0x2f, 0x60, 0xf2, 0xa5, 0xf2, 0xdb, 0x27, 0x56, 0x5e, 0x02, 0x97, + 0x34, 0xf3, 0xea, 0x79, 0xf1, 0x22, 0x13, 0x06, 0x30, 0xc6, 0x29, 0xf9, 0x74, 0xc4, 0xd5, 0x48, + 0xec, 0x46, 0x5e, 0x8b, 0xfe, 0x67, 0x7d, 0xc6, 0x18, 0x71, 0x4b, 0x1a, 0x85, 0x4d, 0x3a, 0x14, + 0x40, 0x89, 0x8e, 0xa8, 0x78, 0x66, 0x84, 0xe9, 0xbf, 0x72, 0x32, 0xfd, 0x45, 0xa3, 0xd2, 0xc1, + 0xaa, 0x5b, 0x9f, 0xfe, 0x8b, 0x31, 0x17, 0x83, 0xbe, 0x64, 0xc1, 0x8c, 0x18, 0xf1, 0x98, 0xf0, + 0x06, 0xbd, 0xb3, 0xeb, 0x25, 0xc4, 0xf7, 0xe2, 0x64, 0xa6, 0xc4, 0x74, 0x98, 0x1f, 0xac, 0x6f, + 0x2d, 0x47, 0x61, 0xbb, 0x75, 0xd3, 0x0b, 0x6a, 0xd5, 0xcb, 0x42, 0xd2, 0xcc, 0x62, 0x1f, 0xc6, + 0xb8, 0xaf, 0x48, 0xf4, 0x75, 0x0b, 0x2e, 0x06, 0x4e, 0x93, 0xc4, 0x2d, 0x87, 0x7e, 0x5a, 0x8e, + 0xae, 0xfa, 0x8e, 0xbb, 0xc7, 0x34, 0x1a, 0x7d, 0x34, 0x8d, 0x6c, 0xa1, 0xd1, 0xc5, 0xf5, 0xbe, + 0xac, 0xf1, 0x43, 0xc4, 0xa2, 0x5f, 0xb7, 0x60, 0x3a, 0x8c, 0x5a, 0xbb, 0x4e, 0x40, 0x6a, 0x12, + 0x1b, 0xcf, 0x8c, 0xb1, 0xa1, 0xf7, 0xc9, 0x93, 0x7d, 0xa2, 0x8d, 0x2c, 0xdb, 0xb5, 0x30, 0xf0, + 0x92, 0x30, 0xda, 0x22, 0x49, 0xe2, 0x05, 0x8d, 0xb8, 0x7a, 0xe1, 0xe8, 0x70, 0x76, 0xba, 0x8b, + 0x0a, 0x77, 0xeb, 0x83, 0x7e, 0x16, 0xc6, 0xe3, 0x4e, 0xe0, 0xde, 0xf1, 0x82, 0x5a, 0x78, 0x3f, + 0x9e, 0x29, 0xe7, 0x31, 0x7c, 0xb7, 0x14, 0x43, 0x31, 0x00, 0xb5, 0x00, 0x6c, 0x4a, 0xeb, 0xfd, + 0xe1, 0x74, 0x57, 0xaa, 0xe4, 0xfd, 0xe1, 0x74, 0x67, 0x7a, 0x88, 0x58, 0xf4, 0xab, 0x16, 0x4c, + 0xc6, 0x5e, 0x23, 0x70, 0x92, 0x76, 0x44, 0x6e, 0x92, 0x4e, 0x3c, 0x03, 0x4c, 0x91, 0x1b, 0x27, + 0x6c, 0x15, 0x83, 0x65, 0xf5, 0x82, 0xd0, 0x71, 0xd2, 0x84, 0xc6, 0x38, 0x2d, 0xb7, 0xd7, 0x40, + 0xd3, 0xdd, 0x7a, 0x3c, 0xdf, 0x81, 0xa6, 0x3b, 0x75, 0x5f, 0x91, 0xe8, 0xa7, 0xe0, 0x2c, 0x07, + 0xa9, 0x96, 0x8d, 0x67, 0x26, 0x98, 0xa1, 0x3d, 0x7f, 0x74, 0x38, 0x7b, 0x76, 0x2b, 0x83, 0xc3, + 0x5d, 0xd4, 0xe8, 0x1e, 0xcc, 0xb6, 0x48, 0xd4, 0xf4, 0x92, 0x8d, 0xc0, 0xef, 0x48, 0xf3, 0xed, + 0x86, 0x2d, 0x52, 0x13, 0xea, 0xc4, 0x33, 0x93, 0x97, 0xad, 0x57, 0xca, 0xd5, 0x0f, 0x0a, 0x35, + 0x67, 0x37, 0x1f, 0x4e, 0x8e, 0x8f, 0xe3, 0x67, 0xff, 0x9b, 0x02, 0x9c, 0xcd, 0x4e, 0x9c, 0xe8, + 0x37, 0x2d, 0x38, 0x73, 0xf7, 0x7e, 0xb2, 0x1d, 0xee, 0x91, 0x20, 0xae, 0x76, 0xa8, 0x79, 0x63, + 0x53, 0xc6, 0xf8, 0x15, 0x37, 0xdf, 0x29, 0x7a, 0xee, 0x46, 0x5a, 0xca, 0xd5, 0x20, 0x89, 0x3a, + 0xd5, 0xe7, 0xc4, 0xdb, 0x9d, 0xb9, 0x71, 0x67, 0xdb, 0xc4, 0xe2, 0xac, 0x52, 0x17, 0xbf, 0x60, + 0xc1, 0xf9, 0x5e, 0x2c, 0xd0, 0x59, 0x28, 0xee, 0x91, 0x0e, 0xf7, 0xca, 0x30, 0xfd, 0x89, 0x3e, + 0x01, 0xa5, 0x7d, 0xc7, 0x6f, 0x13, 0xe1, 0xdd, 0x2c, 0x9f, 0xec, 0x45, 0x94, 0x66, 0x98, 0x73, + 0xfd, 0xf1, 0xc2, 0x9b, 0x96, 0xfd, 0xef, 0x8b, 0x30, 0x6e, 0xcc, 0x6f, 0x8f, 0xc1, 0x63, 0x0b, + 0x53, 0x1e, 0xdb, 0x5a, 0x6e, 0x53, 0x73, 0x5f, 0x97, 0xed, 0x7e, 0xc6, 0x65, 0xdb, 0xc8, 0x4f, + 0xe4, 0x43, 0x7d, 0x36, 0x94, 0x40, 0x25, 0x6c, 0x51, 0x8f, 0x9c, 0x4e, 0xfd, 0x23, 0x79, 0x7c, + 0xc2, 0x0d, 0xc9, 0xae, 0x3a, 0x79, 0x74, 0x38, 0x5b, 0x51, 0x7f, 0xb1, 0x16, 0x64, 0x7f, 0xcf, + 0x82, 0xf3, 0x86, 0x8e, 0x8b, 0x61, 0x50, 0xf3, 0xd8, 0xa7, 0xbd, 0x0c, 0x23, 0x49, 0xa7, 0x25, + 0xdd, 0x7e, 0xd5, 0x52, 0xdb, 0x9d, 0x16, 0xc1, 0x0c, 0x43, 0x1d, 0xfd, 0x26, 0x89, 0x63, 0xa7, + 0x41, 0xb2, 0x8e, 0xfe, 0x1a, 0x07, 0x63, 0x89, 0x47, 0x11, 0x20, 0xdf, 0x89, 0x93, 0xed, 0xc8, + 0x09, 0x62, 0xc6, 0x7e, 0xdb, 0x6b, 0x12, 0xd1, 0xc0, 0x7f, 0x69, 0xb0, 0x1e, 0x43, 0x9f, 0xa8, + 0x3e, 0x7b, 0x74, 0x38, 0x8b, 0x56, 0xbb, 0x38, 0xe1, 0x1e, 0xdc, 0xed, 0xaf, 0x5b, 0xf0, 0x6c, + 0x6f, 0x5f, 0x0c, 0x7d, 0x00, 0x46, 0xf9, 0xea, 0x4d, 0xbc, 0x9d, 0xfe, 0x24, 0x0c, 0x8a, 0x05, + 0x16, 0xcd, 0x43, 0x45, 0xcd, 0x13, 0xe2, 0x1d, 0xa7, 0x05, 0x69, 0x45, 0x4f, 0x2e, 0x9a, 0x86, + 0x36, 0x1a, 0xfd, 0x23, 0x3c, 0x37, 0xd5, 0x68, 0x6c, 0x91, 0xc4, 0x30, 0xf6, 0x1f, 0x59, 0x70, + 0xc6, 0xd0, 0xea, 0x31, 0xb8, 0xe6, 0x41, 0xda, 0x35, 0x5f, 0xc9, 0xad, 0x3f, 0xf7, 0xf1, 0xcd, + 0x8f, 0x0a, 0xcc, 0x37, 0x57, 0xbd, 0x9e, 0x3c, 0x8e, 0x85, 0x5d, 0x94, 0x32, 0x13, 0x9b, 0xf9, + 0x8d, 0x59, 0xd2, 0x7f, 0x71, 0xf7, 0x5e, 0xc6, 0x52, 0xe0, 0x5c, 0xa5, 0x3e, 0x7c, 0x81, 0xf7, + 0x27, 0x05, 0x78, 0x2e, 0xfd, 0x80, 0x1e, 0xb9, 0x1f, 0x4d, 0x8d, 0xdc, 0x0f, 0x99, 0x23, 0xf7, + 0xc1, 0xe1, 0xec, 0x0b, 0x7d, 0x1e, 0xfb, 0x0b, 0x33, 0xb0, 0xd1, 0xb2, 0x6a, 0xf7, 0x11, 0xa6, + 0xdd, 0x7c, 0xba, 0x8d, 0x1e, 0x1c, 0xce, 0xbe, 0xd4, 0xe7, 0x1d, 0x33, 0x16, 0xf7, 0x03, 0x30, + 0x1a, 0x11, 0x27, 0x0e, 0x83, 0x99, 0x52, 0xda, 0x0c, 0x60, 0x06, 0xc5, 0x02, 0x6b, 0xff, 0x51, + 0x39, 0xdb, 0xd8, 0xcb, 0x7c, 0xef, 0x24, 0x8c, 0x90, 0x07, 0x23, 0xcc, 0x1b, 0xe3, 0xdd, 0xfa, + 0xe6, 0xc9, 0xba, 0x00, 0x1d, 0xbd, 0x8a, 0x75, 0xb5, 0x4c, 0xbf, 0x1a, 0x05, 0x61, 0x26, 0x02, + 0x1d, 0x40, 0xd9, 0x95, 0x4e, 0x52, 0x21, 0x8f, 0xed, 0x04, 0xe1, 0x22, 0x69, 0x89, 0x13, 0xd4, + 0x84, 0x28, 0xcf, 0x4a, 0x49, 0x43, 0x04, 0x8a, 0x0d, 0x2f, 0x11, 0x9f, 0xf5, 0x84, 0x6e, 0xf0, + 0xb2, 0x67, 0xbc, 0xe2, 0xd8, 0xd1, 0xe1, 0x6c, 0x71, 0xd9, 0x4b, 0x30, 0xe5, 0x8f, 0x7e, 0xc5, + 0x82, 0xf1, 0xd8, 0x6d, 0x6e, 0x46, 0xe1, 0xbe, 0x57, 0x23, 0x91, 0x98, 0x04, 0x4f, 0x38, 0xac, + 0xb6, 0x16, 0xd7, 0x24, 0x43, 0x2d, 0x97, 0x2f, 0x4b, 0x34, 0x06, 0x9b, 0x72, 0xa9, 0x73, 0xf8, + 0x9c, 0x78, 0xf7, 0x25, 0xe2, 0x7a, 0x31, 0x9d, 0x32, 0x85, 0x2f, 0xcc, 0x7a, 0xca, 0x89, 0x9d, + 0x82, 0xa5, 0xb6, 0xbb, 0x47, 0xc7, 0x9b, 0x56, 0xe8, 0x85, 0xa3, 0xc3, 0xd9, 0xe7, 0x16, 0x7b, + 0xcb, 0xc4, 0xfd, 0x94, 0x61, 0x0d, 0xd6, 0x6a, 0xfb, 0x3e, 0x26, 0xf7, 0xda, 0x84, 0xad, 0x74, + 0x73, 0x68, 0xb0, 0x4d, 0xcd, 0x30, 0xd3, 0x60, 0x06, 0x06, 0x9b, 0x72, 0xd1, 0x3d, 0x18, 0x6d, + 0x3a, 0x49, 0xe4, 0x1d, 0x88, 0xe5, 0xed, 0x09, 0xdd, 0xb4, 0x35, 0xc6, 0x4b, 0x0b, 0x07, 0x3a, + 0x26, 0x39, 0x10, 0x0b, 0x41, 0xa8, 0x09, 0xa5, 0x26, 0x89, 0x1a, 0x64, 0xa6, 0x9c, 0xc7, 0x56, + 0xde, 0x1a, 0x65, 0xa5, 0x05, 0x56, 0xe8, 0xa4, 0xc6, 0x60, 0x98, 0x4b, 0x41, 0x9f, 0x80, 0x72, + 0x4c, 0x7c, 0xe2, 0x26, 0x61, 0x34, 0x53, 0x61, 0x12, 0x7f, 0x6c, 0xc0, 0x29, 0xda, 0xd9, 0x21, + 0xfe, 0x96, 0x78, 0x94, 0x0f, 0x30, 0xf9, 0x0f, 0x2b, 0x96, 0xf6, 0x7f, 0xb3, 0x00, 0xa5, 0x2d, + 0xcc, 0x63, 0x70, 0x0c, 0xee, 0xa5, 0x1d, 0x83, 0xd5, 0x3c, 0xa7, 0xaf, 0x3e, 0xbe, 0xc1, 0x77, + 0xca, 0x90, 0xb1, 0xcd, 0xeb, 0x24, 0x4e, 0x48, 0xed, 0x7d, 0x7b, 0xfa, 0xbe, 0x3d, 0x7d, 0xdf, + 0x9e, 0x2a, 0x7b, 0xba, 0x93, 0xb1, 0xa7, 0x6f, 0x1b, 0xa3, 0x5e, 0xc7, 0x98, 0x3e, 0xa5, 0x82, + 0x50, 0xa6, 0x06, 0x06, 0x01, 0xb5, 0x04, 0x37, 0xb6, 0x36, 0xd6, 0x7b, 0x1a, 0xd0, 0x4f, 0xa5, + 0x0d, 0xe8, 0x49, 0x45, 0x3c, 0x76, 0x93, 0x79, 0x54, 0xcc, 0x9a, 0x4c, 0x16, 0x06, 0xb8, 0x02, + 0xd0, 0x08, 0xb7, 0x49, 0xb3, 0xe5, 0x3b, 0x09, 0x77, 0x81, 0xcb, 0x7a, 0xe9, 0xb0, 0xac, 0x30, + 0xd8, 0xa0, 0x42, 0x7f, 0xdd, 0x02, 0x68, 0xc8, 0x4f, 0x23, 0xcd, 0xe1, 0xad, 0x3c, 0xcd, 0xa1, + 0xfe, 0xf0, 0x5a, 0x17, 0x25, 0x10, 0x1b, 0xc2, 0xd1, 0xe7, 0x2c, 0x28, 0x27, 0x52, 0x7d, 0x6e, + 0x20, 0xb6, 0xf3, 0xd4, 0x44, 0xbe, 0xb4, 0x9e, 0x19, 0x54, 0x93, 0x28, 0xb9, 0xe8, 0xaf, 0x59, + 0x00, 0x71, 0x27, 0x70, 0x37, 0x43, 0xdf, 0x73, 0x3b, 0xc2, 0x6e, 0xdc, 0xce, 0x75, 0x79, 0xa3, + 0xb8, 0x57, 0xa7, 0x68, 0x6b, 0xe8, 0xff, 0xd8, 0x90, 0x6c, 0x7f, 0x2b, 0xbd, 0x3b, 0xa1, 0xd6, + 0x45, 0xec, 0x93, 0xb9, 0xd2, 0xad, 0x8f, 0xc5, 0xd6, 0x5d, 0xae, 0x9f, 0x4c, 0x2d, 0x1a, 0xf4, + 0x27, 0x53, 0xa0, 0x18, 0x1b, 0xc2, 0xed, 0xcf, 0x5a, 0x30, 0xd3, 0xef, 0xed, 0x10, 0x81, 0x17, + 0x5a, 0x11, 0x61, 0x63, 0x48, 0x6d, 0xba, 0x6f, 0x04, 0x4b, 0xc4, 0x27, 0x6c, 0x9f, 0x87, 0x77, + 0xd0, 0x97, 0x85, 0x84, 0x17, 0x36, 0xfb, 0x93, 0xe2, 0x87, 0xf1, 0xb1, 0x7f, 0xa3, 0x90, 0xda, + 0xec, 0x30, 0x3e, 0x34, 0xfa, 0x86, 0xd5, 0xe5, 0x45, 0xfc, 0xf4, 0x69, 0xf4, 0x28, 0xe6, 0x6f, + 0xa8, 0xbd, 0xf7, 0xfe, 0x34, 0x4f, 0x70, 0x73, 0xcf, 0xfe, 0x77, 0x23, 0xf0, 0x10, 0xcd, 0xd4, + 0xf6, 0x8d, 0xd5, 0x6f, 0xfb, 0x66, 0xf8, 0x1d, 0xa1, 0x2f, 0x5a, 0x30, 0xea, 0x53, 0x83, 0x16, + 0xcf, 0x14, 0x59, 0x27, 0xad, 0x9d, 0x56, 0xdb, 0x73, 0xbb, 0x19, 0xf3, 0x0d, 0x66, 0xb5, 0x94, + 0xe5, 0x40, 0x2c, 0x74, 0x40, 0xdf, 0xb4, 0x60, 0xdc, 0x09, 0x82, 0x30, 0x11, 0x11, 0x4f, 0x1e, + 0x31, 0xf4, 0x4e, 0x4d, 0xa7, 0x05, 0x2d, 0x8b, 0x2b, 0xa6, 0xa2, 0x99, 0x06, 0x06, 0x9b, 0x2a, + 0xa1, 0x39, 0x80, 0xba, 0x17, 0x38, 0xbe, 0xf7, 0x1e, 0x75, 0xcc, 0x4a, 0x2c, 0xbc, 0xc0, 0x6c, + 0xc4, 0x35, 0x05, 0xc5, 0x06, 0xc5, 0xc5, 0xbf, 0x0a, 0xe3, 0xc6, 0x9b, 0xf7, 0xd8, 0x17, 0x3f, + 0x6f, 0xee, 0x8b, 0x57, 0x8c, 0xed, 0xec, 0x8b, 0x6f, 0xc3, 0xd9, 0xac, 0x82, 0xc3, 0x3c, 0x6f, + 0xff, 0xe6, 0x28, 0xcc, 0x66, 0x5f, 0x3e, 0x6a, 0x52, 0xd5, 0xde, 0x77, 0x68, 0xdf, 0x77, 0x68, + 0xdf, 0x77, 0x68, 0xe5, 0x1f, 0xfb, 0x77, 0x4b, 0x30, 0x6d, 0x0e, 0x14, 0xae, 0xdd, 0x8f, 0xc2, + 0x58, 0x44, 0x5a, 0xe1, 0x2d, 0xbc, 0x2a, 0x2c, 0xae, 0xce, 0x14, 0xe2, 0x60, 0x2c, 0xf1, 0xd4, + 0x32, 0xb7, 0x9c, 0x64, 0x57, 0x98, 0x5c, 0x65, 0x99, 0x37, 0x9d, 0x64, 0x17, 0x33, 0x0c, 0x7a, + 0x1b, 0xa6, 0x12, 0x27, 0x6a, 0x90, 0x04, 0x93, 0x7d, 0xd6, 0x08, 0x62, 0x77, 0xf0, 0x59, 0x41, + 0x3b, 0xb5, 0x9d, 0xc2, 0xe2, 0x0c, 0x35, 0xba, 0x07, 0x23, 0xbb, 0xc4, 0x6f, 0x0a, 0x8f, 0x7b, + 0x2b, 0x3f, 0x8b, 0xc8, 0xde, 0xf5, 0x3a, 0xf1, 0x9b, 0x7c, 0xbc, 0xd2, 0x5f, 0x98, 0x89, 0xa2, + 0x5f, 0xa7, 0xb2, 0xd7, 0x8e, 0x93, 0xb0, 0xe9, 0xbd, 0x27, 0xfd, 0xf0, 0x9f, 0xce, 0x59, 0xf0, + 0x4d, 0xc9, 0x9f, 0xc7, 0x80, 0xd4, 0x5f, 0xac, 0x25, 0x33, 0x3d, 0x6a, 0x5e, 0xc4, 0xfc, 0xea, + 0xce, 0x0c, 0x9c, 0x8a, 0x1e, 0x4b, 0x92, 0x3f, 0xd7, 0x43, 0xfd, 0xc5, 0x5a, 0x32, 0xea, 0xc0, + 0x68, 0xcb, 0x6f, 0x37, 0xbc, 0x60, 0x66, 0x9c, 0xe9, 0x70, 0x2b, 0x67, 0x1d, 0x36, 0x19, 0x73, + 0xbe, 0x1a, 0xe2, 0xbf, 0xb1, 0x10, 0x88, 0x5e, 0x86, 0x92, 0xbb, 0xeb, 0x44, 0xc9, 0xcc, 0x04, + 0xeb, 0x34, 0x6a, 0xf7, 0x62, 0x91, 0x02, 0x31, 0xc7, 0xd9, 0x7f, 0xaf, 0x90, 0xf6, 0x1e, 0xd2, + 0x2f, 0xc6, 0xbb, 0xb3, 0xdb, 0x8e, 0x62, 0xb9, 0xee, 0x30, 0xba, 0x33, 0x03, 0x63, 0x89, 0x47, + 0x9f, 0xb5, 0x60, 0xec, 0x6e, 0x1c, 0x06, 0x01, 0x49, 0x84, 0xa5, 0xbe, 0x9d, 0xf3, 0xbb, 0xde, + 0xe0, 0xdc, 0xb5, 0x0e, 0x02, 0x80, 0xa5, 0x5c, 0xaa, 0x2e, 0x39, 0x70, 0xfd, 0x76, 0x4d, 0x86, + 0xab, 0x14, 0xe9, 0x55, 0x0e, 0xc6, 0x12, 0x4f, 0x49, 0xbd, 0x80, 0x93, 0x8e, 0xa4, 0x49, 0x57, + 0x02, 0x41, 0x2a, 0xf0, 0xf6, 0x3f, 0x2e, 0xc1, 0x85, 0x9e, 0xbd, 0x9f, 0xce, 0xeb, 0x6c, 0xe6, + 0xbc, 0xe6, 0xf9, 0x44, 0xe6, 0x67, 0xb1, 0x79, 0xfd, 0xb6, 0x82, 0x62, 0x83, 0x02, 0xfd, 0x22, + 0x40, 0xcb, 0x89, 0x9c, 0x26, 0x11, 0xf3, 0x59, 0xf1, 0xe4, 0xd3, 0x27, 0xd5, 0x63, 0x53, 0xf2, + 0xd4, 0x7e, 0xbd, 0x02, 0xc5, 0xd8, 0x10, 0x89, 0x3e, 0x0c, 0xe3, 0x11, 0xf1, 0x89, 0x13, 0xb3, + 0x04, 0x86, 0x6c, 0x36, 0x16, 0xd6, 0x28, 0x6c, 0xd2, 0xa1, 0x0f, 0xc0, 0x28, 0x7b, 0x0b, 0x19, + 0x9e, 0x50, 0xae, 0x18, 0x7b, 0xcf, 0x18, 0x0b, 0x2c, 0xfa, 0x8a, 0x05, 0x53, 0x75, 0xcf, 0x27, + 0x5a, 0xba, 0xc8, 0x9d, 0xda, 0x38, 0xf9, 0x4b, 0x5e, 0x33, 0xf9, 0x6a, 0x13, 0x98, 0x02, 0xc7, + 0x38, 0x23, 0x9e, 0x7e, 0xe6, 0x7d, 0x12, 0x31, 0xdb, 0x39, 0x9a, 0xfe, 0xcc, 0xb7, 0x39, 0x18, + 0x4b, 0x3c, 0x5a, 0x80, 0x33, 0x2d, 0x27, 0x8e, 0x17, 0x23, 0x52, 0x23, 0x41, 0xe2, 0x39, 0x3e, + 0xcf, 0x6c, 0x2a, 0xeb, 0xcc, 0x86, 0xcd, 0x34, 0x1a, 0x67, 0xe9, 0xd1, 0xc7, 0xe0, 0x39, 0xaf, + 0x11, 0x84, 0x11, 0x59, 0xf3, 0xe2, 0xd8, 0x0b, 0x1a, 0xba, 0x1b, 0x30, 0x53, 0x58, 0xae, 0xce, + 0x0a, 0x56, 0xcf, 0xad, 0xf4, 0x26, 0xc3, 0xfd, 0x9e, 0x47, 0xaf, 0x42, 0x39, 0xde, 0xf3, 0x5a, + 0x8b, 0x51, 0x2d, 0x66, 0x5b, 0x0f, 0x65, 0xbd, 0xda, 0xdd, 0x12, 0x70, 0xac, 0x28, 0xec, 0x5f, + 0x2b, 0xa4, 0xd7, 0x6f, 0xe6, 0xf8, 0x41, 0x31, 0x1d, 0x25, 0xc9, 0x6d, 0x27, 0x92, 0x8b, 0xcc, + 0x13, 0xe6, 0x46, 0x09, 0xbe, 0xb7, 0x9d, 0xc8, 0x1c, 0x6f, 0x4c, 0x00, 0x96, 0x92, 0xd0, 0x5d, + 0x18, 0x49, 0x7c, 0x27, 0xa7, 0x64, 0x4a, 0x43, 0xa2, 0x8e, 0xe2, 0xaf, 0x2e, 0xc4, 0x98, 0xc9, + 0x40, 0x2f, 0x52, 0xff, 0x74, 0x87, 0xaf, 0x4e, 0x2a, 0xd2, 0xa5, 0xdc, 0x89, 0x31, 0x83, 0xda, + 0xff, 0x6b, 0xb4, 0x87, 0xc9, 0x53, 0x93, 0x08, 0xba, 0x02, 0x40, 0x97, 0x3a, 0x9b, 0x11, 0xa9, + 0x7b, 0x07, 0x62, 0x12, 0x57, 0xc3, 0x6a, 0x5d, 0x61, 0xb0, 0x41, 0x25, 0x9f, 0xd9, 0x6a, 0xd7, + 0xe9, 0x33, 0x85, 0xee, 0x67, 0x38, 0x06, 0x1b, 0x54, 0xe8, 0x0d, 0x18, 0xf5, 0x9a, 0x4e, 0x83, + 0x48, 0x35, 0x5f, 0xa4, 0xe3, 0x69, 0x85, 0x41, 0x1e, 0x1c, 0xce, 0x4e, 0x29, 0x85, 0x18, 0x08, + 0x0b, 0x5a, 0xf4, 0x1b, 0x16, 0x4c, 0xb8, 0x61, 0xb3, 0x19, 0x06, 0x7c, 0x81, 0x20, 0x56, 0x3b, + 0x77, 0x4f, 0x6b, 0x8a, 0x9d, 0x5b, 0x34, 0x84, 0xf1, 0xe5, 0x8e, 0xca, 0xfa, 0x34, 0x51, 0x38, + 0xa5, 0x95, 0x39, 0xec, 0x4a, 0xc7, 0x0c, 0xbb, 0x7f, 0x66, 0xc1, 0x34, 0x7f, 0xd6, 0x58, 0xb7, + 0x88, 0x04, 0xc7, 0xf0, 0x94, 0x5f, 0xab, 0x6b, 0x29, 0xf7, 0xbc, 0x50, 0x73, 0xba, 0x0b, 0x8f, + 0xbb, 0x95, 0x44, 0xcb, 0x30, 0x5d, 0x0f, 0x23, 0x97, 0x98, 0x0d, 0x21, 0x6c, 0x86, 0x62, 0x74, + 0x2d, 0x4b, 0x80, 0xbb, 0x9f, 0x41, 0xb7, 0xe1, 0x59, 0x03, 0x68, 0xb6, 0x03, 0x37, 0x1b, 0x97, + 0x04, 0xb7, 0x67, 0xaf, 0xf5, 0xa4, 0xc2, 0x7d, 0x9e, 0xbe, 0xf8, 0x51, 0x98, 0xee, 0xfa, 0x7e, + 0x43, 0xad, 0x26, 0x97, 0xe0, 0xd9, 0xde, 0x2d, 0x35, 0xd4, 0x9a, 0xf2, 0xef, 0x58, 0xe9, 0x60, + 0xb3, 0xe1, 0xb9, 0x0c, 0xb0, 0x3f, 0xe1, 0x40, 0x91, 0x04, 0xfb, 0xc2, 0x70, 0x5c, 0x3b, 0x59, + 0x8f, 0xb8, 0x1a, 0xec, 0xf3, 0x0f, 0xcd, 0x16, 0x61, 0x57, 0x83, 0x7d, 0x4c, 0x79, 0xdb, 0x7f, + 0x73, 0x34, 0x95, 0xc1, 0xb2, 0x25, 0x93, 0xa6, 0xf8, 0xf2, 0xc7, 0xca, 0x3b, 0x69, 0x8a, 0xa7, + 0x20, 0xea, 0x3c, 0x08, 0xbe, 0xe2, 0x11, 0xe2, 0xd0, 0x17, 0x2c, 0x96, 0x32, 0x2d, 0x33, 0x7b, + 0x84, 0x33, 0x75, 0x3a, 0x19, 0xdc, 0x66, 0x22, 0xb6, 0x04, 0x62, 0x53, 0x3a, 0x1d, 0xc9, 0x2d, + 0x9e, 0xfc, 0x97, 0x75, 0xa9, 0x64, 0x52, 0xb5, 0xc4, 0xa3, 0x83, 0x1e, 0x3b, 0xac, 0x39, 0xa4, + 0xdd, 0x1e, 0xbf, 0xa7, 0x8a, 0xbe, 0x69, 0xc1, 0x34, 0x9f, 0x38, 0x97, 0xbc, 0x7a, 0x9d, 0x44, + 0x24, 0x70, 0x89, 0x74, 0x3d, 0xee, 0x9c, 0x4c, 0x03, 0xb9, 0xee, 0x5c, 0xc9, 0xb2, 0xd7, 0x43, + 0xbc, 0x0b, 0x85, 0xbb, 0x95, 0x41, 0x35, 0x18, 0xf1, 0x82, 0x7a, 0x28, 0x0c, 0x5b, 0xf5, 0x64, + 0x4a, 0xad, 0x04, 0xf5, 0x50, 0x8f, 0x15, 0xfa, 0x0f, 0x33, 0xee, 0x68, 0x15, 0xce, 0x47, 0x62, + 0xf5, 0x77, 0xdd, 0x8b, 0xa9, 0x0b, 0xbf, 0xea, 0x35, 0xbd, 0x84, 0x19, 0xa5, 0x62, 0x75, 0xe6, + 0xe8, 0x70, 0xf6, 0x3c, 0xee, 0x81, 0xc7, 0x3d, 0x9f, 0xb2, 0xff, 0xbc, 0x92, 0x5e, 0xe2, 0xf2, + 0x7d, 0xea, 0x9f, 0x87, 0x4a, 0xa4, 0x72, 0xbf, 0xad, 0x3c, 0xe2, 0xac, 0xb2, 0x8d, 0x45, 0x82, + 0x90, 0xda, 0x7d, 0xd4, 0x59, 0xde, 0x5a, 0x22, 0x75, 0x24, 0xe8, 0x97, 0x17, 0xc3, 0x22, 0x87, + 0xfe, 0x25, 0xa4, 0xea, 0xbd, 0xd5, 0x4e, 0xe0, 0x62, 0x26, 0x03, 0x45, 0x30, 0xba, 0x4b, 0x1c, + 0x3f, 0xd9, 0xcd, 0x67, 0x1b, 0xe8, 0x3a, 0xe3, 0x95, 0x4d, 0x83, 0xe2, 0x50, 0x2c, 0x24, 0xa1, + 0x03, 0x18, 0xdb, 0xe5, 0x1f, 0x41, 0xcc, 0xed, 0x6b, 0x27, 0x6d, 0xdc, 0xd4, 0x97, 0xd5, 0xe3, + 0x57, 0x00, 0xb0, 0x14, 0xc7, 0x42, 0x24, 0x46, 0x00, 0x82, 0x0f, 0x9f, 0xfc, 0x32, 0xc0, 0x06, + 0x8e, 0x3e, 0xa0, 0x4f, 0xc3, 0x44, 0x44, 0xdc, 0x30, 0x70, 0x3d, 0x9f, 0xd4, 0x16, 0xe4, 0x16, + 0xcf, 0x30, 0xb9, 0x57, 0x67, 0xa9, 0x7f, 0x82, 0x0d, 0x1e, 0x38, 0xc5, 0x11, 0x7d, 0xde, 0x82, + 0x29, 0x95, 0x30, 0x4a, 0x3f, 0x08, 0x11, 0x9b, 0x24, 0xab, 0x39, 0xa5, 0xa7, 0x32, 0x9e, 0x55, + 0x44, 0x57, 0x28, 0x69, 0x18, 0xce, 0xc8, 0x45, 0xef, 0x02, 0x84, 0x3b, 0x2c, 0x08, 0x42, 0x5f, + 0xb5, 0x3c, 0xf4, 0xab, 0x4e, 0xf1, 0x04, 0x42, 0xc9, 0x01, 0x1b, 0xdc, 0xd0, 0x4d, 0x00, 0x3e, + 0x6c, 0xb6, 0x3b, 0x2d, 0xc2, 0x96, 0x0d, 0x3a, 0x79, 0x0e, 0xb6, 0x14, 0xe6, 0xc1, 0xe1, 0x6c, + 0xf7, 0x02, 0x97, 0x25, 0xcf, 0x19, 0x8f, 0xa3, 0x9f, 0x85, 0xb1, 0xb8, 0xdd, 0x6c, 0x3a, 0x6a, + 0x3f, 0x25, 0xc7, 0x94, 0x44, 0xce, 0x57, 0xf7, 0x4d, 0x01, 0xc0, 0x52, 0x22, 0xba, 0x4b, 0x0d, + 0x5b, 0x2c, 0x56, 0xde, 0x6c, 0x14, 0xf1, 0xb9, 0x79, 0x9c, 0xbd, 0xd3, 0x47, 0xc4, 0x73, 0xe7, + 0x71, 0x0f, 0x9a, 0x07, 0x87, 0xb3, 0xcf, 0xa6, 0xe1, 0xab, 0x21, 0x17, 0x8b, 0x7b, 0xf2, 0xb4, + 0x83, 0x74, 0x14, 0x56, 0x68, 0xf0, 0x06, 0x4c, 0x90, 0x83, 0x84, 0x44, 0x81, 0xe3, 0xdf, 0xc2, + 0xab, 0x72, 0xb5, 0xcf, 0x3a, 0xda, 0x55, 0x03, 0x8e, 0x53, 0x54, 0xc8, 0x56, 0x5e, 0x7e, 0x81, + 0xd1, 0x83, 0xf6, 0xf2, 0xa5, 0x4f, 0x6f, 0xff, 0xdf, 0x42, 0xca, 0xfb, 0xd8, 0x8e, 0x08, 0x41, + 0x21, 0x94, 0x82, 0xb0, 0xa6, 0x0c, 0xec, 0x8d, 0x7c, 0x0c, 0xec, 0x7a, 0x58, 0x33, 0x0e, 0x40, + 0xd1, 0x7f, 0x31, 0xe6, 0x72, 0xd8, 0x09, 0x11, 0x79, 0x94, 0x86, 0x21, 0x84, 0xc3, 0x95, 0xa7, + 0x64, 0x75, 0x42, 0x64, 0xc3, 0x14, 0x84, 0xd3, 0x72, 0xd1, 0x1e, 0x94, 0x76, 0xc3, 0x38, 0x91, + 0xc1, 0xa5, 0x13, 0x7a, 0x7c, 0xd7, 0xc3, 0x38, 0x61, 0xd3, 0xa5, 0x7a, 0x6d, 0x0a, 0x89, 0x31, + 0x97, 0x61, 0xff, 0xb1, 0x95, 0xda, 0xdb, 0xb9, 0xe3, 0x24, 0xee, 0xee, 0xd5, 0x7d, 0x12, 0xd0, + 0xb1, 0x63, 0xa6, 0x9c, 0xfe, 0x95, 0x4c, 0xca, 0xe9, 0x07, 0xfb, 0x9d, 0x48, 0xbd, 0x4f, 0x39, + 0xcc, 0x31, 0x16, 0x46, 0xfa, 0xe9, 0x67, 0x2c, 0x18, 0x37, 0xd4, 0x13, 0x93, 0x57, 0x8e, 0x79, + 0xcb, 0x3a, 0x06, 0xa5, 0x81, 0xd8, 0x14, 0x69, 0x7f, 0xcd, 0x82, 0xb1, 0xaa, 0xe3, 0xee, 0x85, + 0xf5, 0x3a, 0x7a, 0x15, 0xca, 0xb5, 0xb6, 0x48, 0xcb, 0xe7, 0xef, 0xa7, 0x36, 0x13, 0x96, 0x04, + 0x1c, 0x2b, 0x0a, 0xda, 0x87, 0xeb, 0x0e, 0xcb, 0x79, 0x28, 0x30, 0x37, 0x82, 0xf5, 0xe1, 0x6b, + 0x0c, 0x82, 0x05, 0x06, 0x7d, 0x18, 0xc6, 0x9b, 0xce, 0x81, 0x7c, 0x38, 0xbb, 0xb1, 0xb4, 0xa6, + 0x51, 0xd8, 0xa4, 0xb3, 0xff, 0xb5, 0x05, 0x33, 0x55, 0x27, 0xf6, 0xdc, 0x85, 0x76, 0xb2, 0x5b, + 0xf5, 0x92, 0x9d, 0xb6, 0xbb, 0x47, 0x12, 0x9e, 0xb2, 0x4e, 0xb5, 0x6c, 0xc7, 0x74, 0x28, 0xa9, + 0xe5, 0x81, 0xd2, 0xf2, 0x96, 0x80, 0x63, 0x45, 0x81, 0xde, 0x83, 0xf1, 0x96, 0x13, 0xc7, 0xf7, + 0xc3, 0xa8, 0x86, 0x49, 0x3d, 0x9f, 0x03, 0x23, 0x5b, 0xc4, 0x8d, 0x48, 0x82, 0x49, 0x5d, 0xc4, + 0x02, 0x34, 0x7f, 0x6c, 0x0a, 0xb3, 0x7f, 0xbb, 0x02, 0x63, 0x22, 0x90, 0x31, 0x70, 0x22, 0xbe, + 0x5c, 0xf8, 0x14, 0xfa, 0x2e, 0x7c, 0x62, 0x18, 0x75, 0xd9, 0xb1, 0x65, 0xe1, 0x7d, 0xdc, 0xcc, + 0x25, 0xf2, 0xc5, 0x4f, 0x42, 0x6b, 0xb5, 0xf8, 0x7f, 0x2c, 0x44, 0xa1, 0xaf, 0x5a, 0x70, 0xc6, + 0x0d, 0x83, 0x80, 0xb8, 0x7a, 0x6a, 0x1c, 0xc9, 0x23, 0x96, 0xbd, 0x98, 0x66, 0xaa, 0x77, 0xd5, + 0x32, 0x08, 0x9c, 0x15, 0x8f, 0xde, 0x82, 0x49, 0xde, 0x66, 0xb7, 0x53, 0x5b, 0x0a, 0xfa, 0xbc, + 0x99, 0x89, 0xc4, 0x69, 0x5a, 0x34, 0xc7, 0xb7, 0x66, 0xc4, 0xc9, 0xae, 0x51, 0xbd, 0x45, 0x6b, + 0x9c, 0xe9, 0x32, 0x28, 0x50, 0x04, 0x28, 0x22, 0xf5, 0x88, 0xc4, 0xbb, 0x22, 0xd0, 0xc3, 0xa6, + 0xe5, 0xb1, 0x47, 0xcb, 0xfe, 0xc6, 0x5d, 0x9c, 0x70, 0x0f, 0xee, 0x68, 0x4f, 0xac, 0x0d, 0xca, + 0x79, 0x58, 0x05, 0xf1, 0x99, 0xfb, 0x2e, 0x11, 0x66, 0xa1, 0x14, 0xef, 0x3a, 0x51, 0x8d, 0xb9, + 0x03, 0x45, 0x9e, 0xe4, 0xb4, 0x45, 0x01, 0x98, 0xc3, 0xd1, 0x12, 0x9c, 0xcd, 0x9c, 0x96, 0x8b, + 0xd9, 0x84, 0x5f, 0xae, 0xce, 0x08, 0x76, 0x67, 0x33, 0xe7, 0xec, 0x62, 0xdc, 0xf5, 0x84, 0xb9, + 0x6e, 0x1c, 0x3f, 0x66, 0xdd, 0xd8, 0x51, 0xe9, 0x04, 0x13, 0xcc, 0xe2, 0xbf, 0x93, 0x4b, 0x03, + 0x0c, 0x94, 0x3b, 0xf0, 0xa5, 0x4c, 0xee, 0xc0, 0x24, 0x53, 0xe0, 0x76, 0x3e, 0x0a, 0x0c, 0x9f, + 0x28, 0xf0, 0x24, 0x03, 0xff, 0x7f, 0x6e, 0x81, 0xfc, 0xae, 0x8b, 0x8e, 0xbb, 0x4b, 0x68, 0x97, + 0x41, 0x6f, 0xc3, 0x94, 0x5a, 0x79, 0x2d, 0x86, 0xed, 0x80, 0xc7, 0xfc, 0x8b, 0x7a, 0xfb, 0x1d, + 0xa7, 0xb0, 0x38, 0x43, 0x8d, 0xe6, 0xa1, 0x42, 0xdb, 0x89, 0x3f, 0xca, 0x67, 0x0f, 0xb5, 0xba, + 0x5b, 0xd8, 0x5c, 0x11, 0x4f, 0x69, 0x1a, 0x14, 0xc2, 0xb4, 0xef, 0xc4, 0x09, 0xd3, 0x80, 0x2e, + 0xc4, 0x1e, 0xf1, 0xec, 0x05, 0x3b, 0x2c, 0xbc, 0x9a, 0x65, 0x84, 0xbb, 0x79, 0xdb, 0xdf, 0x1b, + 0x81, 0xc9, 0x94, 0x65, 0x1c, 0x72, 0xda, 0x79, 0x15, 0xca, 0x72, 0x26, 0x10, 0xa6, 0x5c, 0x51, + 0xab, 0xe9, 0x42, 0x51, 0xd0, 0x69, 0x72, 0x87, 0x38, 0x11, 0x89, 0xd8, 0x39, 0xc4, 0xec, 0x34, + 0x59, 0xd5, 0x28, 0x6c, 0xd2, 0x31, 0xa3, 0x9c, 0xf8, 0xf1, 0xa2, 0xef, 0x91, 0x20, 0xe1, 0x6a, + 0xe6, 0x63, 0x94, 0xb7, 0x57, 0xb7, 0x4c, 0xa6, 0xda, 0x28, 0x67, 0x10, 0x38, 0x2b, 0x1e, 0xfd, + 0xb2, 0x05, 0x93, 0xce, 0xfd, 0x58, 0xd7, 0xd6, 0x10, 0x59, 0x02, 0x27, 0x9c, 0xa4, 0x52, 0xe5, + 0x3a, 0xaa, 0xd3, 0xd4, 0xbc, 0xa7, 0x40, 0x38, 0x2d, 0x14, 0x7d, 0xc3, 0x02, 0x44, 0x0e, 0x88, + 0x2b, 0xf3, 0x18, 0x84, 0x2e, 0xa3, 0x79, 0x2c, 0x50, 0xae, 0x76, 0xf1, 0xe5, 0x56, 0xbd, 0x1b, + 0x8e, 0x7b, 0xe8, 0x60, 0xff, 0x8b, 0xa2, 0x1a, 0x50, 0x3a, 0x75, 0xc6, 0x31, 0x32, 0x48, 0xad, + 0x47, 0xcf, 0x20, 0xd5, 0xb1, 0x9f, 0xae, 0x2c, 0xd2, 0x74, 0xba, 0x65, 0xe1, 0x09, 0xa5, 0x5b, + 0x7e, 0xce, 0x52, 0x21, 0x43, 0xee, 0xc6, 0xbf, 0x9b, 0x6f, 0xda, 0xce, 0x1c, 0x8f, 0x3c, 0x66, + 0xac, 0x7b, 0x3a, 0x1c, 0x49, 0xad, 0xa9, 0x41, 0x36, 0x94, 0x35, 0xfc, 0x4f, 0x45, 0x18, 0x37, + 0x66, 0xd2, 0x9e, 0x6e, 0x91, 0xf5, 0x94, 0xb9, 0x45, 0x85, 0x21, 0xdc, 0xa2, 0x5f, 0x84, 0x8a, + 0x2b, 0xad, 0x7c, 0x3e, 0x85, 0x5c, 0xb2, 0x73, 0x87, 0x36, 0xf4, 0x0a, 0x84, 0xb5, 0x4c, 0xb4, + 0x0c, 0xd3, 0x06, 0x1b, 0x31, 0x43, 0x8c, 0xb0, 0x19, 0x42, 0x6d, 0xac, 0x2e, 0x64, 0x09, 0x70, + 0xf7, 0x33, 0xe8, 0x75, 0xba, 0xb2, 0xf2, 0xc4, 0x7b, 0xc9, 0xe4, 0x3a, 0xe6, 0xae, 0x2f, 0x6c, + 0xae, 0x48, 0x30, 0x36, 0x69, 0xec, 0xef, 0x59, 0xea, 0xe3, 0x3e, 0x86, 0x33, 0x29, 0x77, 0xd3, + 0x67, 0x52, 0xae, 0xe6, 0xd2, 0xcc, 0x7d, 0x0e, 0xa3, 0xac, 0xc3, 0xd8, 0x62, 0xd8, 0x6c, 0x3a, + 0x41, 0x0d, 0xfd, 0x08, 0x8c, 0xb9, 0xfc, 0xa7, 0xd8, 0xaa, 0x18, 0xa7, 0xce, 0x97, 0xc0, 0x62, + 0x89, 0x43, 0x2f, 0xc2, 0x88, 0x13, 0x35, 0xe4, 0xf6, 0x04, 0x8b, 0x95, 0x2e, 0x44, 0x8d, 0x18, + 0x33, 0xa8, 0xfd, 0xf5, 0x02, 0xc0, 0x62, 0xd8, 0x6c, 0x39, 0x11, 0xa9, 0x6d, 0x87, 0xef, 0xc7, + 0x44, 0xf8, 0xaa, 0xf5, 0x8b, 0x16, 0x20, 0xda, 0x2a, 0x61, 0x40, 0x82, 0x44, 0x25, 0x1b, 0x50, + 0x67, 0xc7, 0x95, 0x50, 0xe1, 0x39, 0xe8, 0x31, 0x20, 0x11, 0x58, 0xd3, 0x0c, 0xb0, 0x04, 0x7c, + 0x59, 0x1a, 0xa8, 0x62, 0x3a, 0x87, 0x87, 0x99, 0x35, 0x61, 0xaf, 0xec, 0xdf, 0x29, 0xc0, 0xb3, + 0x7c, 0xce, 0x59, 0x73, 0x02, 0xa7, 0x41, 0x9a, 0x54, 0xab, 0x41, 0xa3, 0x6b, 0x2e, 0x5d, 0x7b, + 0x78, 0x32, 0x65, 0xe7, 0xa4, 0x9d, 0x93, 0x77, 0x2a, 0xde, 0x8d, 0x56, 0x02, 0x2f, 0xc1, 0x8c, + 0x39, 0x8a, 0xa1, 0x2c, 0x4b, 0x73, 0x09, 0x63, 0x93, 0x93, 0x20, 0x35, 0xee, 0xc4, 0xc4, 0x40, + 0xb0, 0x12, 0x44, 0x3d, 0x33, 0x3f, 0x74, 0xf7, 0x30, 0x69, 0x85, 0xcc, 0xb0, 0x18, 0x19, 0x13, + 0xab, 0x02, 0x8e, 0x15, 0x85, 0xfd, 0x3b, 0x16, 0x64, 0x4d, 0x2e, 0x5b, 0xca, 0xf3, 0x53, 0xb9, + 0xd9, 0xa5, 0x7c, 0xfa, 0xd0, 0xed, 0x10, 0x87, 0x8b, 0x7f, 0x06, 0xc6, 0x9d, 0x84, 0xce, 0x92, + 0x7c, 0x5d, 0x59, 0x7c, 0xb4, 0xed, 0xde, 0xb5, 0xb0, 0xe6, 0xd5, 0x3d, 0xb6, 0x9e, 0x34, 0xd9, + 0xd9, 0x7f, 0x36, 0x02, 0xd3, 0x5d, 0x79, 0x96, 0xe8, 0x4d, 0x98, 0x70, 0x45, 0xf7, 0x68, 0x61, + 0x52, 0x17, 0x2f, 0x63, 0x84, 0xf1, 0x35, 0x0e, 0xa7, 0x28, 0x07, 0xe8, 0xa0, 0x2b, 0x70, 0x2e, + 0xa2, 0x2b, 0xd9, 0x36, 0x59, 0xa8, 0x27, 0x24, 0xda, 0x22, 0x6e, 0x18, 0xd4, 0xf8, 0xe9, 0xf1, + 0x62, 0xf5, 0xb9, 0xa3, 0xc3, 0xd9, 0x73, 0xb8, 0x1b, 0x8d, 0x7b, 0x3d, 0x83, 0x5a, 0x30, 0xe9, + 0x9b, 0x4e, 0x8e, 0xf0, 0x70, 0x1f, 0xc9, 0x3f, 0x52, 0x93, 0x60, 0x0a, 0x8c, 0xd3, 0x02, 0xd2, + 0x9e, 0x52, 0xe9, 0x09, 0x79, 0x4a, 0xbf, 0xa4, 0x3d, 0x25, 0x1e, 0x1b, 0xfc, 0x78, 0xce, 0x79, + 0xb6, 0xa7, 0xed, 0x2a, 0xbd, 0x03, 0x65, 0x19, 0x56, 0x1f, 0xc0, 0xde, 0xbc, 0x9c, 0xe2, 0xd3, + 0xc7, 0xa2, 0x3d, 0x28, 0x40, 0x0f, 0x2f, 0x9b, 0x8e, 0x33, 0x3d, 0xa5, 0xa5, 0xc6, 0xd9, 0x70, + 0xd3, 0x1a, 0x3a, 0xe0, 0x29, 0x05, 0xdc, 0x33, 0xfd, 0x58, 0xde, 0xab, 0x04, 0x9d, 0x65, 0x30, + 0x2e, 0xf4, 0x53, 0x99, 0x06, 0xe8, 0x0a, 0x80, 0xf6, 0x44, 0x44, 0x36, 0x9d, 0x0a, 0x87, 0x69, + 0x87, 0x05, 0x1b, 0x54, 0x74, 0xd1, 0xe8, 0x05, 0x71, 0xe2, 0xf8, 0xfe, 0x75, 0x2f, 0x48, 0xc4, + 0xee, 0x97, 0x9a, 0xa5, 0x56, 0x34, 0x0a, 0x9b, 0x74, 0x17, 0x3f, 0x62, 0x7c, 0x97, 0x61, 0xbe, + 0xe7, 0x2e, 0x3c, 0xbf, 0xec, 0x25, 0x2a, 0x07, 0x54, 0xf5, 0x23, 0xea, 0x68, 0xa8, 0xa4, 0x65, + 0xab, 0x6f, 0xd2, 0xb2, 0x91, 0x83, 0x59, 0x48, 0xa7, 0x8c, 0x66, 0x73, 0x30, 0xed, 0x37, 0xe1, + 0xfc, 0xb2, 0x97, 0x5c, 0xf3, 0x7c, 0x32, 0xa4, 0x10, 0xfb, 0xb7, 0x47, 0x60, 0xc2, 0x4c, 0xaa, + 0x1f, 0x26, 0xef, 0xfa, 0xcb, 0xd4, 0x97, 0x10, 0x6f, 0xe7, 0xa9, 0x38, 0xc7, 0x9d, 0x13, 0x67, + 0xf8, 0xf7, 0x6e, 0x31, 0xc3, 0x9d, 0xd0, 0x32, 0xb1, 0xa9, 0x00, 0xba, 0x0f, 0xa5, 0x3a, 0xcb, + 0x11, 0x2c, 0xe6, 0x11, 0x71, 0xed, 0xd5, 0xa2, 0x7a, 0x98, 0xf1, 0x2c, 0x43, 0x2e, 0x8f, 0xce, + 0x90, 0x51, 0x3a, 0xb3, 0x5c, 0x19, 0x2a, 0x95, 0x53, 0xae, 0x28, 0xfa, 0x99, 0xfa, 0xd2, 0x23, + 0x98, 0xfa, 0x94, 0xe1, 0x1d, 0x7d, 0x32, 0x86, 0xd7, 0xfe, 0x62, 0x01, 0xa6, 0x96, 0x83, 0xf6, + 0xe6, 0xf2, 0x66, 0x7b, 0xc7, 0xf7, 0xdc, 0x9b, 0xa4, 0x43, 0x8d, 0xd3, 0x1e, 0xe9, 0xac, 0x2c, + 0x89, 0x3e, 0xa4, 0x5a, 0xed, 0x26, 0x05, 0x62, 0x8e, 0xa3, 0xc3, 0xb1, 0xee, 0x05, 0x0d, 0x12, + 0xb5, 0x22, 0x4f, 0xec, 0x6a, 0x19, 0xc3, 0xf1, 0x9a, 0x46, 0x61, 0x93, 0x8e, 0xf2, 0x0e, 0xef, + 0x07, 0x24, 0xca, 0xba, 0x72, 0x1b, 0x14, 0x88, 0x39, 0x8e, 0x12, 0x25, 0x51, 0x3b, 0x4e, 0xc4, + 0xe7, 0x50, 0x44, 0xdb, 0x14, 0x88, 0x39, 0x8e, 0xf6, 0xf5, 0xb8, 0xbd, 0xc3, 0x42, 0xba, 0x99, + 0xe4, 0xba, 0x2d, 0x0e, 0xc6, 0x12, 0x4f, 0x49, 0xf7, 0x48, 0x67, 0x89, 0x2e, 0x6c, 0x32, 0xe9, + 0xaf, 0x37, 0x39, 0x18, 0x4b, 0x3c, 0x3b, 0xaf, 0x9f, 0x6e, 0x8e, 0xbf, 0x70, 0xe7, 0xf5, 0xd3, + 0xea, 0xf7, 0x59, 0x22, 0x7d, 0xcb, 0x82, 0x09, 0x33, 0x11, 0x03, 0x35, 0x32, 0x5e, 0xde, 0x46, + 0x57, 0xed, 0x95, 0x9f, 0xec, 0x55, 0x0e, 0xb8, 0xe1, 0x25, 0x61, 0x2b, 0x7e, 0x8d, 0x04, 0x0d, + 0x2f, 0x20, 0x2c, 0xf4, 0xc7, 0x13, 0x38, 0x52, 0x59, 0x1e, 0x8b, 0x61, 0x8d, 0x3c, 0x82, 0x9b, + 0x68, 0xdf, 0x81, 0xe9, 0xae, 0x9c, 0xe7, 0x01, 0x26, 0xd7, 0x63, 0x8f, 0x94, 0xd8, 0x18, 0xc6, + 0x29, 0xe3, 0x8d, 0x16, 0xcf, 0xb4, 0x58, 0x84, 0x69, 0xee, 0x00, 0x50, 0x49, 0x5b, 0xee, 0x2e, + 0x69, 0xaa, 0x3c, 0x76, 0xb6, 0x85, 0x7a, 0x3b, 0x8b, 0xc4, 0xdd, 0xf4, 0xf6, 0x97, 0x2c, 0x98, + 0x4c, 0xa5, 0xa1, 0xe7, 0xe4, 0x06, 0xb0, 0x91, 0x16, 0xb2, 0xbc, 0xa0, 0xc8, 0x0b, 0x78, 0x14, + 0xac, 0x6c, 0x8c, 0x34, 0x8d, 0xc2, 0x26, 0x9d, 0xfd, 0xb5, 0x02, 0x94, 0x65, 0xd8, 0x77, 0x00, + 0x55, 0xbe, 0x60, 0xc1, 0xa4, 0xda, 0xb6, 0x66, 0xfb, 0x21, 0xbc, 0x33, 0xae, 0x9f, 0x3c, 0xf0, + 0xac, 0x92, 0xc7, 0x82, 0x7a, 0xa8, 0x7d, 0x52, 0x6c, 0x0a, 0xc3, 0x69, 0xd9, 0xe8, 0x36, 0x40, + 0xdc, 0x89, 0x13, 0xd2, 0x34, 0x76, 0x66, 0x6c, 0x63, 0xc4, 0xcd, 0xb9, 0x61, 0x44, 0xe8, 0xf8, + 0x5a, 0x0f, 0x6b, 0x64, 0x4b, 0x51, 0x6a, 0x27, 0x42, 0xc3, 0xb0, 0xc1, 0xc9, 0xfe, 0x47, 0x05, + 0x38, 0x9b, 0x55, 0x09, 0x7d, 0x1c, 0x26, 0xa4, 0x74, 0xa3, 0x1e, 0xb2, 0x8c, 0x75, 0x4f, 0x60, + 0x03, 0xf7, 0xe0, 0x70, 0x76, 0xb6, 0xbb, 0xb4, 0xf4, 0x9c, 0x49, 0x82, 0x53, 0xcc, 0x78, 0xec, + 0x40, 0x04, 0xb9, 0xaa, 0x9d, 0x85, 0x56, 0x4b, 0x04, 0x00, 0x8c, 0xd8, 0x81, 0x89, 0xc5, 0x19, + 0x6a, 0xb4, 0x09, 0xe7, 0x0d, 0xc8, 0x3a, 0xf1, 0x1a, 0xbb, 0x3b, 0x61, 0x24, 0xd7, 0x16, 0x2f, + 0xea, 0x94, 0x8f, 0x6e, 0x1a, 0xdc, 0xf3, 0x49, 0x3a, 0xdf, 0xb9, 0x4e, 0xcb, 0x71, 0xbd, 0xa4, + 0x23, 0xb6, 0x9a, 0x94, 0x6d, 0x5a, 0x14, 0x70, 0xac, 0x28, 0xec, 0x35, 0x18, 0x19, 0xb0, 0x07, + 0x0d, 0xe4, 0xd3, 0xbe, 0x03, 0x65, 0xca, 0x4e, 0x3a, 0x38, 0x79, 0xb0, 0x0c, 0xa1, 0x2c, 0x4b, + 0x1a, 0x22, 0x1b, 0x8a, 0x9e, 0x23, 0xc3, 0x33, 0xea, 0xb5, 0x56, 0xe2, 0xb8, 0xcd, 0x96, 0x89, + 0x14, 0x89, 0x5e, 0x86, 0x22, 0x39, 0x68, 0x65, 0xe3, 0x30, 0x57, 0x0f, 0x5a, 0x5e, 0x44, 0x62, + 0x4a, 0x44, 0x0e, 0x5a, 0xe8, 0x22, 0x14, 0xbc, 0x9a, 0x98, 0xa4, 0x40, 0xd0, 0x14, 0x56, 0x96, + 0x70, 0xc1, 0xab, 0xd9, 0x07, 0x50, 0x51, 0x35, 0x14, 0xd1, 0x9e, 0xb4, 0xdd, 0x56, 0x1e, 0x79, + 0x1a, 0x92, 0x6f, 0x1f, 0xab, 0xdd, 0x06, 0xd0, 0x49, 0xff, 0x79, 0xd9, 0x97, 0xcb, 0x30, 0xe2, + 0x86, 0xe2, 0xac, 0x50, 0x59, 0xb3, 0x61, 0x46, 0x9b, 0x61, 0xec, 0x3b, 0x30, 0x75, 0x33, 0x08, + 0xef, 0xb3, 0x4a, 0x62, 0xd7, 0x3c, 0xe2, 0xd7, 0x28, 0xe3, 0x3a, 0xfd, 0x91, 0x75, 0x11, 0x18, + 0x16, 0x73, 0x9c, 0x2a, 0x34, 0x58, 0xe8, 0x57, 0x68, 0xd0, 0xfe, 0x8c, 0x05, 0x67, 0x55, 0x36, + 0xba, 0xb4, 0xc6, 0x6f, 0xc2, 0xc4, 0x4e, 0xdb, 0xf3, 0x6b, 0xe2, 0x7f, 0x76, 0xa1, 0x5e, 0x35, + 0x70, 0x38, 0x45, 0x49, 0x97, 0x15, 0x3b, 0x5e, 0xe0, 0x44, 0x9d, 0x4d, 0x6d, 0xfe, 0x95, 0x45, + 0xa8, 0x2a, 0x0c, 0x36, 0xa8, 0xec, 0xcf, 0x15, 0x60, 0x32, 0x75, 0xf8, 0x16, 0xf9, 0x50, 0x26, + 0x3e, 0xdb, 0x3e, 0x92, 0x1f, 0xf5, 0xa4, 0x25, 0x34, 0x54, 0x47, 0xbc, 0x2a, 0xf8, 0x62, 0x25, + 0xe1, 0xa9, 0x88, 0x53, 0xd8, 0x7f, 0xbf, 0x00, 0x67, 0x32, 0xb5, 0x99, 0xd0, 0x57, 0xd2, 0xb5, + 0x33, 0xac, 0x3c, 0x56, 0xe5, 0x0f, 0xad, 0x10, 0x34, 0x5c, 0x05, 0x8d, 0x27, 0xd5, 0x54, 0xbf, + 0x57, 0x80, 0xa9, 0x74, 0x51, 0xa9, 0xa7, 0xb0, 0xa5, 0x3e, 0x04, 0x15, 0x56, 0xaa, 0x85, 0xd5, + 0x38, 0xe6, 0x8b, 0x7f, 0x76, 0x38, 0x73, 0x4d, 0x02, 0xb1, 0xc6, 0x3f, 0x15, 0x85, 0x49, 0xec, + 0x7f, 0x60, 0xc1, 0x05, 0xfe, 0x96, 0xd9, 0x7e, 0xf8, 0x37, 0x7a, 0xb5, 0xee, 0x27, 0xf2, 0x55, + 0x30, 0x73, 0xb4, 0xff, 0xb8, 0xf6, 0x65, 0xb5, 0x55, 0x85, 0xb6, 0xe9, 0xae, 0xf0, 0x14, 0x2a, + 0x3b, 0x54, 0x67, 0xb0, 0x7f, 0xaf, 0x08, 0xba, 0x9c, 0x2c, 0xf2, 0x44, 0x96, 0x79, 0x2e, 0x25, + 0x0e, 0xb6, 0x3a, 0x81, 0xab, 0x0b, 0xd7, 0x96, 0x33, 0x49, 0xe6, 0xbf, 0x6a, 0xc1, 0xb8, 0x17, + 0x78, 0x89, 0xe7, 0x30, 0x77, 0x25, 0x9f, 0x7a, 0x9f, 0x4a, 0xdc, 0x0a, 0xe7, 0x1c, 0x46, 0xe6, + 0x8e, 0x91, 0x12, 0x86, 0x4d, 0xc9, 0xe8, 0xd3, 0x22, 0x0f, 0xa9, 0x98, 0xdb, 0x19, 0x85, 0x72, + 0x26, 0xf9, 0xa8, 0x05, 0xa5, 0x88, 0x24, 0x91, 0x3c, 0x1d, 0x72, 0xf3, 0xa4, 0xc9, 0xa5, 0x49, + 0xd4, 0xd9, 0x4a, 0x22, 0x27, 0x21, 0x0d, 0x63, 0xb9, 0xc7, 0xc0, 0x98, 0x0b, 0xb2, 0x63, 0x40, + 0xdd, 0x6d, 0x31, 0x64, 0x8e, 0xc7, 0x3c, 0x54, 0x9c, 0x76, 0x12, 0x36, 0x69, 0x33, 0x89, 0x4d, + 0x2d, 0x9d, 0xc5, 0x22, 0x11, 0x58, 0xd3, 0xd8, 0x5f, 0x29, 0x41, 0x26, 0xed, 0x1b, 0x1d, 0x98, + 0xa5, 0x90, 0xad, 0x7c, 0x4b, 0x21, 0x2b, 0x65, 0x7a, 0x95, 0x43, 0x46, 0x0d, 0x28, 0xb5, 0x76, + 0x9d, 0x58, 0x7a, 0x23, 0xef, 0xc8, 0x66, 0xda, 0xa4, 0xc0, 0x07, 0x87, 0xb3, 0x3f, 0x35, 0xd8, + 0xea, 0x96, 0xf6, 0xd5, 0x79, 0x7e, 0x06, 0x4e, 0x8b, 0x66, 0x3c, 0x30, 0xe7, 0x6f, 0xae, 0x6f, + 0x8b, 0xc7, 0x84, 0x41, 0x3e, 0x2b, 0xaa, 0x31, 0x61, 0x12, 0xb7, 0xfd, 0x44, 0xf4, 0x86, 0x77, + 0x72, 0x1c, 0x65, 0x9c, 0xb1, 0x3e, 0x34, 0xc4, 0xff, 0x63, 0x43, 0x28, 0xfa, 0x38, 0x54, 0xe2, + 0xc4, 0x89, 0x92, 0x47, 0x3c, 0x62, 0xa0, 0x1a, 0x7d, 0x4b, 0x32, 0xc1, 0x9a, 0x1f, 0x7a, 0x97, + 0x55, 0x7c, 0xf1, 0xe2, 0xdd, 0x47, 0x4c, 0x1f, 0x94, 0xd5, 0x61, 0x04, 0x07, 0x6c, 0x70, 0xa3, + 0xce, 0x1e, 0xeb, 0xdb, 0x3c, 0x66, 0x5e, 0x66, 0xde, 0xbc, 0x32, 0x85, 0x58, 0x61, 0xb0, 0x41, + 0x65, 0xff, 0x02, 0x9c, 0xcb, 0xde, 0x9d, 0x20, 0x36, 0xbc, 0x1a, 0x51, 0xd8, 0x6e, 0x65, 0xbd, + 0x59, 0x56, 0x5b, 0x1f, 0x73, 0x1c, 0xf5, 0x66, 0xf7, 0xbc, 0xa0, 0x96, 0xf5, 0x66, 0x6f, 0x7a, + 0x41, 0x0d, 0x33, 0xcc, 0x00, 0x35, 0xa2, 0xff, 0xa5, 0x05, 0x97, 0x8f, 0xbb, 0xe2, 0x01, 0xbd, + 0x08, 0x23, 0xf7, 0x9d, 0x48, 0x56, 0x90, 0x62, 0xb6, 0xe3, 0x8e, 0x13, 0x05, 0x98, 0x41, 0x51, + 0x07, 0x46, 0xf9, 0xb1, 0x2a, 0xb1, 0x3e, 0x7f, 0x27, 0xdf, 0x0b, 0x27, 0x6e, 0x12, 0x23, 0x3a, + 0xc2, 0x8f, 0x74, 0x61, 0x21, 0xd0, 0xfe, 0xbe, 0x05, 0x68, 0x63, 0x9f, 0x44, 0x91, 0x57, 0x33, + 0x0e, 0x82, 0xa1, 0x37, 0x60, 0xe2, 0xee, 0xd6, 0xc6, 0xfa, 0x66, 0xe8, 0x05, 0xec, 0xac, 0xbb, + 0x71, 0x24, 0xe0, 0x86, 0x01, 0xc7, 0x29, 0x2a, 0xb4, 0x08, 0xd3, 0x77, 0xef, 0x51, 0x0f, 0xfc, + 0xea, 0x41, 0x2b, 0x22, 0x71, 0xac, 0xae, 0x69, 0x11, 0x7b, 0x2e, 0x37, 0xde, 0xc9, 0x20, 0x71, + 0x37, 0x3d, 0xda, 0x80, 0x0b, 0x4d, 0x16, 0xec, 0xad, 0xb1, 0x85, 0x47, 0xcc, 0x23, 0xbf, 0x91, + 0x3c, 0x4c, 0xfc, 0xfc, 0xd1, 0xe1, 0xec, 0x85, 0xb5, 0x5e, 0x04, 0xb8, 0xf7, 0x73, 0xf6, 0xb7, + 0x0b, 0x30, 0x6e, 0x5c, 0x93, 0x32, 0xc0, 0x12, 0x2b, 0x73, 0xb3, 0x4b, 0x61, 0xc0, 0x9b, 0x5d, + 0x5e, 0x81, 0x72, 0x2b, 0xf4, 0x3d, 0xd7, 0x53, 0x27, 0x9f, 0x59, 0x05, 0x9e, 0x4d, 0x01, 0xc3, + 0x0a, 0x8b, 0xee, 0x43, 0x45, 0x5d, 0x1d, 0x20, 0xce, 0x42, 0xe5, 0xb5, 0xc8, 0x54, 0x83, 0x57, + 0x5f, 0x09, 0xa0, 0x65, 0x21, 0x1b, 0x46, 0x59, 0xcf, 0x97, 0xd9, 0x24, 0x2c, 0xe1, 0x9d, 0x0d, + 0x89, 0x18, 0x0b, 0x8c, 0xfd, 0x2b, 0x63, 0x70, 0xbe, 0x57, 0xd5, 0x18, 0xf4, 0x73, 0x30, 0xca, + 0x75, 0xcc, 0xa7, 0x30, 0x59, 0x2f, 0x19, 0xcb, 0x8c, 0xa1, 0x50, 0x8b, 0xfd, 0xc6, 0x42, 0xa6, + 0x90, 0xee, 0x3b, 0x3b, 0xc2, 0x8d, 0x38, 0x1d, 0xe9, 0xab, 0x8e, 0x96, 0xbe, 0xea, 0x70, 0xe9, + 0xbe, 0xb3, 0x83, 0x0e, 0xa0, 0xd4, 0xf0, 0x12, 0xe2, 0x08, 0x67, 0xfa, 0xce, 0xa9, 0x08, 0x27, + 0x0e, 0x4f, 0x5a, 0x66, 0x3f, 0x31, 0x17, 0x88, 0xbe, 0x69, 0xc1, 0x99, 0x9d, 0xf4, 0xf9, 0x01, + 0x31, 0xab, 0x38, 0xa7, 0x50, 0x19, 0x28, 0x2d, 0xa8, 0x7a, 0xee, 0xe8, 0x70, 0xf6, 0x4c, 0x06, + 0x88, 0xb3, 0xea, 0xa0, 0x5f, 0xb2, 0x60, 0xac, 0xee, 0xf9, 0x46, 0x55, 0x8c, 0x53, 0xf8, 0x38, + 0xd7, 0x98, 0x00, 0x3d, 0xf3, 0xf2, 0xff, 0x31, 0x96, 0x92, 0xfb, 0x45, 0x71, 0x46, 0x4f, 0x1a, + 0xc5, 0x19, 0x7b, 0x42, 0xcb, 0xa7, 0xbf, 0x55, 0x80, 0x97, 0x07, 0xf8, 0x46, 0x66, 0x3e, 0xba, + 0x75, 0x4c, 0x3e, 0xfa, 0x65, 0x18, 0x89, 0x48, 0x2b, 0xcc, 0xce, 0x77, 0x2c, 0x61, 0x84, 0x61, + 0xd0, 0x4b, 0x50, 0x74, 0x5a, 0x9e, 0x98, 0xee, 0x54, 0x90, 0x77, 0x61, 0x73, 0x05, 0x53, 0x38, + 0xfd, 0xd2, 0x95, 0x1d, 0x79, 0xaa, 0x25, 0x9f, 0x52, 0x93, 0xfd, 0x0e, 0xc9, 0xf0, 0x05, 0x8d, + 0xc2, 0x62, 0x2d, 0xd7, 0xde, 0x80, 0x8b, 0xfd, 0x7b, 0x08, 0x7a, 0x1d, 0xc6, 0x77, 0x22, 0x27, + 0x70, 0x77, 0xd7, 0x9c, 0xc4, 0x95, 0xa1, 0x56, 0x96, 0x36, 0x57, 0xd5, 0x60, 0x6c, 0xd2, 0xd8, + 0xbf, 0x5b, 0xe8, 0xcd, 0x91, 0x1b, 0x81, 0x61, 0x5a, 0x58, 0xb4, 0x5f, 0xa1, 0x4f, 0xfb, 0xdd, + 0x83, 0x72, 0xc2, 0x92, 0xa0, 0x49, 0x5d, 0x58, 0x92, 0xdc, 0xce, 0xf1, 0xb0, 0xb9, 0x66, 0x5b, + 0x30, 0xc7, 0x4a, 0x0c, 0x35, 0xf9, 0xbe, 0x2e, 0xa8, 0x21, 0x4c, 0x7e, 0xe6, 0xb0, 0xc0, 0x12, + 0x9c, 0x35, 0x0a, 0x80, 0xf1, 0x1c, 0x50, 0x1e, 0x80, 0x53, 0x07, 0x23, 0x36, 0x33, 0x78, 0xdc, + 0xf5, 0x84, 0xfd, 0xad, 0x02, 0x3c, 0xdf, 0xd7, 0xb2, 0xe9, 0x28, 0xa1, 0xf5, 0x90, 0x28, 0xe1, + 0x89, 0x3b, 0xa8, 0xd9, 0xc0, 0x23, 0x8f, 0xa7, 0x81, 0x5f, 0x85, 0xb2, 0x17, 0xc4, 0xc4, 0x6d, + 0x47, 0xbc, 0xd1, 0x8c, 0x6c, 0xac, 0x15, 0x01, 0xc7, 0x8a, 0xc2, 0xfe, 0xfd, 0xfe, 0x5d, 0x8d, + 0xce, 0x72, 0x3f, 0xb4, 0xad, 0xf4, 0x16, 0x4c, 0x3a, 0xad, 0x16, 0xa7, 0x63, 0x11, 0x99, 0xcc, + 0x51, 0xa7, 0x05, 0x13, 0x89, 0xd3, 0xb4, 0x46, 0x1f, 0x1e, 0xed, 0xd7, 0x87, 0xed, 0x3f, 0x29, + 0x41, 0x85, 0xb6, 0xc0, 0x62, 0x44, 0x6a, 0x31, 0x6d, 0x80, 0x76, 0xe4, 0x8b, 0x56, 0x54, 0x0d, + 0x70, 0x0b, 0xaf, 0x62, 0x0a, 0x4f, 0xad, 0x92, 0x0b, 0x43, 0x9d, 0x84, 0x28, 0x1e, 0x7b, 0x12, + 0xe2, 0x2d, 0x98, 0x8c, 0xe3, 0xdd, 0xcd, 0xc8, 0xdb, 0x77, 0x12, 0xea, 0x7b, 0x8b, 0x88, 0xb7, + 0xce, 0x5e, 0xde, 0xba, 0xae, 0x91, 0x38, 0x4d, 0x8b, 0x96, 0x61, 0x5a, 0x9f, 0x47, 0x20, 0x51, + 0xc2, 0x02, 0xdc, 0xbc, 0xa9, 0x54, 0xf2, 0xb0, 0x3e, 0xc1, 0x20, 0x08, 0x70, 0xf7, 0x33, 0x74, + 0x48, 0xa7, 0x80, 0x54, 0x91, 0xd1, 0xf4, 0x90, 0x4e, 0xf1, 0xa1, 0xba, 0x74, 0x3d, 0x81, 0xd6, + 0xe0, 0x1c, 0xef, 0x17, 0xec, 0xa6, 0x2c, 0xf5, 0x46, 0x63, 0x8c, 0xd1, 0x0b, 0x82, 0xd1, 0xb9, + 0xe5, 0x6e, 0x12, 0xdc, 0xeb, 0x39, 0xea, 0x58, 0x2b, 0xf0, 0xca, 0x92, 0x58, 0xe0, 0x29, 0xc7, + 0x5a, 0xb1, 0x59, 0xa9, 0x61, 0x93, 0x0e, 0x7d, 0x0c, 0x9e, 0xd3, 0x7f, 0x79, 0x1e, 0x10, 0xdf, + 0xf5, 0x58, 0x12, 0x47, 0xbd, 0x54, 0xf1, 0xa9, 0xe5, 0x9e, 0x64, 0x35, 0xdc, 0xef, 0x79, 0xb4, + 0x03, 0x17, 0x15, 0xea, 0x2a, 0x5d, 0xc5, 0xb4, 0x22, 0x2f, 0x26, 0x55, 0x27, 0x26, 0xb7, 0x22, + 0x9f, 0x1d, 0x0e, 0xab, 0xe8, 0x32, 0xb9, 0xcb, 0x5e, 0x72, 0xbd, 0x17, 0x25, 0x5e, 0xc5, 0x0f, + 0xe1, 0x82, 0xe6, 0xa1, 0x42, 0x02, 0x67, 0xc7, 0x27, 0x1b, 0x8b, 0x2b, 0xec, 0xc8, 0x98, 0xb1, + 0xc9, 0x72, 0x55, 0x22, 0xb0, 0xa6, 0x51, 0x41, 0x96, 0x89, 0xbe, 0x41, 0x96, 0x3f, 0xb4, 0x60, + 0x52, 0x75, 0xf6, 0xc7, 0x90, 0xcd, 0xe0, 0xa7, 0xb3, 0x19, 0x96, 0x4f, 0xba, 0xbb, 0x25, 0x34, + 0xef, 0x13, 0x12, 0xfb, 0xe3, 0x0a, 0x00, 0xbb, 0xf4, 0xd3, 0x63, 0xd5, 0x1b, 0xa4, 0xb9, 0xb3, + 0xfa, 0x9a, 0xbb, 0xa7, 0x76, 0x38, 0xf7, 0x3a, 0x5c, 0x51, 0x7a, 0xb2, 0x87, 0x2b, 0xb6, 0xe0, + 0x82, 0x9c, 0x8c, 0xf8, 0x82, 0xff, 0x7a, 0x18, 0x2b, 0xeb, 0x50, 0xae, 0xbe, 0x24, 0x18, 0x5d, + 0x58, 0xe9, 0x45, 0x84, 0x7b, 0x3f, 0x9b, 0x9a, 0x03, 0xc7, 0x8e, 0x9b, 0x03, 0xf5, 0x80, 0x58, + 0xad, 0xcb, 0x3a, 0x50, 0x99, 0x01, 0xb1, 0x7a, 0x6d, 0x0b, 0x6b, 0x9a, 0xde, 0x56, 0xb1, 0x92, + 0x93, 0x55, 0x84, 0xa1, 0xad, 0xa2, 0x1c, 0x9f, 0xe3, 0x7d, 0x6f, 0x5b, 0x93, 0x7b, 0x0c, 0x13, + 0x7d, 0xf7, 0x18, 0xde, 0x86, 0x29, 0x2f, 0xd8, 0x25, 0x91, 0x97, 0x90, 0x1a, 0x1b, 0x0b, 0xe2, + 0x2a, 0x45, 0x95, 0x43, 0xb0, 0x92, 0xc2, 0xe2, 0x0c, 0x75, 0xda, 0xa8, 0x4c, 0x0d, 0x60, 0x54, + 0xfa, 0x98, 0xf2, 0x33, 0xf9, 0x98, 0xf2, 0xb3, 0x27, 0x37, 0xe5, 0xd3, 0xa7, 0x6a, 0xca, 0x51, + 0x2e, 0xa6, 0xfc, 0x65, 0x28, 0xb5, 0xa2, 0xf0, 0xa0, 0x33, 0x73, 0x2e, 0xed, 0x9e, 0x6d, 0x52, + 0x20, 0xe6, 0x38, 0x73, 0xb9, 0x70, 0xfe, 0xe1, 0xcb, 0x05, 0xfb, 0xf3, 0x05, 0xb8, 0xa0, 0x2d, + 0x1d, 0xed, 0x5f, 0x5e, 0x9d, 0x8e, 0x75, 0x56, 0xac, 0x8f, 0x07, 0xa2, 0x8d, 0xf4, 0x15, 0x9d, + 0x09, 0xa3, 0x30, 0xd8, 0xa0, 0x62, 0x59, 0x20, 0x24, 0x62, 0xd5, 0x19, 0xb2, 0x66, 0x70, 0x51, + 0xc0, 0xb1, 0xa2, 0x60, 0x37, 0x86, 0x93, 0x28, 0x11, 0x99, 0x75, 0xd9, 0x13, 0x9b, 0x8b, 0x1a, + 0x85, 0x4d, 0x3a, 0xf4, 0x0a, 0x17, 0xc2, 0x86, 0x20, 0x35, 0x85, 0x13, 0xa2, 0xce, 0xb4, 0x1c, + 0x75, 0x0a, 0x2b, 0xd5, 0x61, 0xe9, 0x3e, 0xa5, 0x6e, 0x75, 0x58, 0xf0, 0x44, 0x51, 0xd8, 0xff, + 0xc7, 0x82, 0xe7, 0x7b, 0x36, 0xc5, 0x63, 0x98, 0xde, 0x0e, 0xd2, 0xd3, 0xdb, 0xd6, 0xc9, 0xa7, + 0xb7, 0xae, 0xb7, 0xe8, 0x33, 0xd5, 0xfd, 0x47, 0x0b, 0xa6, 0x34, 0xfd, 0x63, 0x78, 0x55, 0x2f, + 0xd7, 0xbb, 0xbf, 0xb5, 0xea, 0x7c, 0xe7, 0x2a, 0xf5, 0x6e, 0x7f, 0xc8, 0xde, 0x8d, 0xef, 0x41, + 0x2f, 0xb8, 0xf2, 0x9e, 0xca, 0x63, 0xf6, 0x5e, 0x3b, 0x30, 0xca, 0xaa, 0xba, 0xc6, 0xf9, 0xec, + 0x85, 0xa7, 0xe5, 0xb3, 0x3c, 0x3e, 0xbd, 0x17, 0xce, 0xfe, 0xc6, 0x58, 0x08, 0x64, 0xb5, 0x43, + 0xbc, 0x98, 0xda, 0xcb, 0x9a, 0x48, 0x9c, 0xd1, 0xb5, 0x43, 0x04, 0x1c, 0x2b, 0x0a, 0xbb, 0x09, + 0x33, 0x69, 0xe6, 0x4b, 0xa4, 0xce, 0x42, 0x8e, 0x03, 0xbd, 0xe6, 0x3c, 0x54, 0x1c, 0xf6, 0xd4, + 0x6a, 0xdb, 0xc9, 0x5e, 0x4d, 0xb0, 0x20, 0x11, 0x58, 0xd3, 0xd8, 0xbf, 0x65, 0xc1, 0xb9, 0x1e, + 0x2f, 0x93, 0x63, 0xc2, 0x50, 0xa2, 0xad, 0x40, 0x9f, 0x0b, 0x44, 0x6b, 0xa4, 0xee, 0xc8, 0xa0, + 0x96, 0x61, 0xd5, 0x96, 0x38, 0x18, 0x4b, 0xbc, 0xfd, 0x3f, 0x2d, 0x38, 0x93, 0xd6, 0x35, 0x46, + 0x37, 0x00, 0xf1, 0x97, 0x59, 0xf2, 0x62, 0x37, 0xdc, 0x27, 0x51, 0x87, 0xbe, 0x39, 0xd7, 0xfa, + 0xa2, 0xe0, 0x84, 0x16, 0xba, 0x28, 0x70, 0x8f, 0xa7, 0x58, 0x6d, 0x83, 0x9a, 0x6a, 0x6d, 0xd9, + 0x53, 0x6e, 0xe7, 0xd9, 0x53, 0xf4, 0xc7, 0x34, 0x37, 0xfe, 0x95, 0x48, 0x6c, 0xca, 0xb7, 0xbf, + 0x3f, 0x02, 0x2a, 0xa3, 0x90, 0x85, 0x4f, 0x72, 0x0a, 0x3e, 0xa5, 0xee, 0xaf, 0x28, 0x0e, 0x71, + 0xa3, 0xe9, 0xc8, 0xc3, 0x42, 0x1b, 0xbc, 0x94, 0xba, 0xb9, 0xc9, 0xa3, 0xde, 0x70, 0x5b, 0xa3, + 0xb0, 0x49, 0x47, 0x35, 0xf1, 0xbd, 0x7d, 0xc2, 0x1f, 0x1a, 0x4d, 0x6b, 0xb2, 0x2a, 0x11, 0x58, + 0xd3, 0x50, 0x4d, 0x6a, 0x5e, 0xbd, 0x2e, 0x56, 0x8a, 0x4a, 0x13, 0xda, 0x3a, 0x98, 0x61, 0x28, + 0xc5, 0x6e, 0x18, 0xee, 0x09, 0xff, 0x4f, 0x51, 0x5c, 0x0f, 0xc3, 0x3d, 0xcc, 0x30, 0xd4, 0x63, + 0x09, 0xc2, 0xa8, 0xc9, 0xae, 0x8e, 0xa8, 0x29, 0x29, 0xc2, 0xef, 0x53, 0x1e, 0xcb, 0x7a, 0x37, + 0x09, 0xee, 0xf5, 0x1c, 0xed, 0x81, 0xad, 0x88, 0xd4, 0x3c, 0x37, 0x31, 0xb9, 0x41, 0xba, 0x07, + 0x6e, 0x76, 0x51, 0xe0, 0x1e, 0x4f, 0xa1, 0x05, 0x38, 0x23, 0x33, 0x42, 0xe5, 0x89, 0x17, 0xee, + 0x0c, 0x2a, 0x3f, 0x1c, 0xa7, 0xd1, 0x38, 0x4b, 0x4f, 0xad, 0x4d, 0x53, 0x1c, 0x76, 0x63, 0x6e, + 0xa2, 0x61, 0x6d, 0xe4, 0x21, 0x38, 0xac, 0x28, 0xec, 0xcf, 0x16, 0xe9, 0xec, 0xd8, 0xa7, 0x60, + 0xe3, 0x63, 0x0b, 0x76, 0xa6, 0x7b, 0xe4, 0xc8, 0x00, 0x3d, 0xf2, 0x0d, 0x98, 0xb8, 0x1b, 0x87, + 0x81, 0x0a, 0x24, 0x96, 0xfa, 0x06, 0x12, 0x0d, 0xaa, 0xde, 0x81, 0xc4, 0xd1, 0xbc, 0x02, 0x89, + 0x63, 0x8f, 0x18, 0x48, 0xfc, 0xb7, 0x25, 0x50, 0xe5, 0xd6, 0xd6, 0x49, 0x72, 0x3f, 0x8c, 0xf6, + 0xbc, 0xa0, 0xc1, 0x32, 0x69, 0xbf, 0x69, 0xc1, 0x04, 0x1f, 0x2f, 0xa2, 0x56, 0x2e, 0xcf, 0x12, + 0xaa, 0xe7, 0x54, 0x62, 0x2c, 0x25, 0x6c, 0x6e, 0xdb, 0x10, 0x94, 0x29, 0x5c, 0x6c, 0xa2, 0x70, + 0x4a, 0x23, 0xf4, 0xf3, 0x00, 0xf2, 0x12, 0x85, 0x7a, 0x4e, 0xd7, 0x0b, 0xab, 0x2b, 0x2d, 0x48, + 0x5d, 0xfb, 0xa6, 0xdb, 0x4a, 0x08, 0x36, 0x04, 0xa2, 0xcf, 0x67, 0xaf, 0xd6, 0xf9, 0xf4, 0xa9, + 0xb4, 0xcd, 0x20, 0xa5, 0x71, 0x30, 0x8c, 0x79, 0x41, 0x83, 0xf6, 0x13, 0x11, 0x7b, 0xfd, 0x60, + 0xaf, 0x2c, 0xf4, 0xd5, 0xd0, 0xa9, 0x55, 0x1d, 0xdf, 0x09, 0x5c, 0x12, 0xad, 0x70, 0x72, 0xb3, + 0x92, 0x3e, 0x03, 0x60, 0xc9, 0xa8, 0xab, 0x86, 0x5e, 0x69, 0x90, 0x1a, 0x7a, 0x17, 0x3f, 0x0a, + 0xd3, 0x5d, 0x1f, 0x73, 0xa8, 0xd2, 0x38, 0x8f, 0x5e, 0x55, 0xc7, 0xfe, 0x57, 0xa3, 0x7a, 0xd2, + 0x5a, 0x0f, 0x6b, 0xbc, 0x92, 0x5b, 0xa4, 0xbf, 0xa8, 0xf0, 0x3d, 0x73, 0xec, 0x22, 0x46, 0x35, + 0x7e, 0x05, 0xc4, 0xa6, 0x48, 0xda, 0x47, 0x5b, 0x4e, 0x44, 0x82, 0xd3, 0xee, 0xa3, 0x9b, 0x4a, + 0x08, 0x36, 0x04, 0xa2, 0xdd, 0x54, 0x96, 0xd8, 0xb5, 0x93, 0x67, 0x89, 0xb1, 0x13, 0x6a, 0xbd, + 0x4a, 0x55, 0x7d, 0xd5, 0x82, 0xa9, 0x20, 0xd5, 0x73, 0xc5, 0x3e, 0xfc, 0xf6, 0x69, 0x8c, 0x0a, + 0x5e, 0xad, 0x33, 0x0d, 0xc3, 0x19, 0xf9, 0xbd, 0xa6, 0xb4, 0xd2, 0x90, 0x53, 0x9a, 0x2e, 0x09, + 0x39, 0xda, 0xaf, 0x24, 0x24, 0x0a, 0x54, 0xe1, 0xd9, 0xb1, 0xdc, 0x0b, 0xcf, 0x42, 0x8f, 0xa2, + 0xb3, 0x77, 0xa0, 0xe2, 0x46, 0xc4, 0x49, 0x1e, 0xb1, 0x06, 0x29, 0x0b, 0x42, 0x2e, 0x4a, 0x06, + 0x58, 0xf3, 0xb2, 0xff, 0x43, 0x11, 0xce, 0xca, 0x16, 0x91, 0x19, 0x34, 0x74, 0x7e, 0xe4, 0x72, + 0xb5, 0x73, 0xab, 0xe6, 0xc7, 0xeb, 0x12, 0x81, 0x35, 0x0d, 0xf5, 0xc7, 0xda, 0x31, 0xd9, 0x68, + 0x91, 0x60, 0xd5, 0xdb, 0x89, 0x45, 0xfc, 0x48, 0x0d, 0x94, 0x5b, 0x1a, 0x85, 0x4d, 0x3a, 0xea, + 0x8c, 0x73, 0xbf, 0x38, 0xce, 0x26, 0xa4, 0x09, 0x7f, 0x1b, 0x4b, 0x3c, 0xfa, 0xb5, 0x9e, 0x15, + 0xa4, 0xf3, 0x49, 0xc5, 0xec, 0x4a, 0x1c, 0x1a, 0xb2, 0x74, 0xf4, 0x57, 0x2c, 0x38, 0xb3, 0x97, + 0x3a, 0x85, 0x20, 0x4d, 0xf2, 0x09, 0xcf, 0xcb, 0xa5, 0x8f, 0x36, 0xe8, 0x2e, 0x9c, 0x86, 0xc7, + 0x38, 0x2b, 0xdd, 0xfe, 0xdf, 0x16, 0x98, 0xe6, 0x69, 0x30, 0xcf, 0xca, 0xb8, 0x13, 0xa0, 0x70, + 0xcc, 0x9d, 0x00, 0xd2, 0x09, 0x2b, 0x0e, 0xe6, 0xf4, 0x8f, 0x0c, 0xe1, 0xf4, 0x97, 0xfa, 0x7a, + 0x6d, 0x2f, 0x41, 0xb1, 0xed, 0xd5, 0x84, 0xdf, 0xae, 0x83, 0x61, 0x2b, 0x4b, 0x98, 0xc2, 0xed, + 0x7f, 0x5e, 0xd2, 0xeb, 0x74, 0x91, 0x41, 0xf8, 0x43, 0xf1, 0xda, 0x75, 0x75, 0xfc, 0x91, 0xbf, + 0xf9, 0x7a, 0xd7, 0xf1, 0xc7, 0x9f, 0x18, 0x3e, 0x41, 0x94, 0x37, 0x50, 0xbf, 0xd3, 0x8f, 0x63, + 0xc7, 0x64, 0x87, 0xde, 0x85, 0x32, 0x5d, 0xda, 0xb0, 0x0d, 0xb7, 0x72, 0x4a, 0xa9, 0xf2, 0x75, + 0x01, 0x7f, 0x70, 0x38, 0xfb, 0xe3, 0xc3, 0xab, 0x25, 0x9f, 0xc6, 0x8a, 0x3f, 0x8a, 0xa1, 0x42, + 0x7f, 0xb3, 0x44, 0x56, 0xb1, 0x68, 0xba, 0xa5, 0x6c, 0x91, 0x44, 0xe4, 0x92, 0x25, 0xab, 0xe5, + 0xa0, 0x00, 0x2a, 0xac, 0x7a, 0x3d, 0x13, 0xca, 0xd7, 0x56, 0x9b, 0x2a, 0x9d, 0x54, 0x22, 0x1e, + 0x1c, 0xce, 0xbe, 0x35, 0xbc, 0x50, 0xf5, 0x38, 0xd6, 0x22, 0xec, 0xaf, 0x8d, 0xe8, 0xbe, 0x2b, + 0x4e, 0xbd, 0xfe, 0x50, 0xf4, 0xdd, 0x37, 0x33, 0x7d, 0xf7, 0x72, 0x57, 0xdf, 0x9d, 0xd2, 0x15, + 0xde, 0x53, 0xbd, 0xf1, 0x71, 0x4f, 0xb0, 0xc7, 0xaf, 0xe3, 0x99, 0x67, 0x71, 0xaf, 0xed, 0x45, + 0x24, 0xde, 0x8c, 0xda, 0x81, 0x17, 0x34, 0xc4, 0x3d, 0x3f, 0x86, 0x67, 0x91, 0x42, 0xe3, 0x2c, + 0x3d, 0xbb, 0x23, 0xa8, 0x13, 0xb8, 0x77, 0x9c, 0x7d, 0xde, 0xab, 0x8c, 0x83, 0x80, 0x5b, 0x02, + 0x8e, 0x15, 0x85, 0xfd, 0x6d, 0x16, 0x1d, 0x35, 0x32, 0xe8, 0x69, 0x9f, 0xf0, 0xd9, 0x75, 0x01, + 0xfc, 0x14, 0xa1, 0xea, 0x13, 0xfc, 0x8e, 0x00, 0x8e, 0x43, 0xf7, 0x61, 0x6c, 0x87, 0x97, 0x11, + 0xce, 0xa7, 0x66, 0x90, 0xa8, 0x49, 0xcc, 0x4a, 0xeb, 0xc9, 0x02, 0xc5, 0x0f, 0xf4, 0x4f, 0x2c, + 0xa5, 0xd9, 0x7f, 0xb7, 0x08, 0x67, 0x32, 0xc5, 0xec, 0x53, 0x15, 0x0c, 0x0a, 0xc7, 0x56, 0x30, + 0xf8, 0x24, 0x40, 0x8d, 0xb4, 0xfc, 0xb0, 0xc3, 0xdc, 0x9c, 0x91, 0xa1, 0xdd, 0x1c, 0xe5, 0x19, + 0x2f, 0x29, 0x2e, 0xd8, 0xe0, 0x28, 0x8e, 0x4e, 0xf2, 0x82, 0x08, 0x99, 0xa3, 0x93, 0x46, 0xe9, + 0xac, 0xd1, 0xc7, 0x5b, 0x3a, 0xcb, 0x83, 0x33, 0x5c, 0x45, 0x95, 0xa7, 0xfe, 0x08, 0xe9, 0xe8, + 0x2c, 0xc3, 0x71, 0x29, 0xcd, 0x06, 0x67, 0xf9, 0xda, 0x5f, 0x2e, 0x50, 0x67, 0x8f, 0x37, 0xf6, + 0x9a, 0xdc, 0x4a, 0xff, 0x00, 0x8c, 0x3a, 0xed, 0x64, 0x37, 0xec, 0xaa, 0x87, 0xbc, 0xc0, 0xa0, + 0x58, 0x60, 0xd1, 0x2a, 0x8c, 0xd4, 0xf4, 0xf1, 0xb6, 0x61, 0x94, 0xd3, 0xfb, 0x66, 0x4e, 0x42, + 0x30, 0xe3, 0x82, 0x5e, 0x84, 0x91, 0xc4, 0x69, 0xa4, 0xae, 0x80, 0xda, 0x76, 0x1a, 0x31, 0x66, + 0x50, 0x73, 0x2e, 0x1a, 0x39, 0x66, 0x2e, 0x7a, 0x0b, 0x26, 0x63, 0xaf, 0x11, 0x38, 0x49, 0x3b, + 0x22, 0x46, 0x8c, 0x46, 0x07, 0xb6, 0x4d, 0x24, 0x4e, 0xd3, 0xda, 0xdf, 0xaf, 0xc0, 0xf9, 0x5e, + 0x77, 0x71, 0xe6, 0x9d, 0x24, 0xdc, 0x4b, 0xc6, 0xe3, 0x4b, 0x12, 0xee, 0x23, 0xdd, 0x37, 0x92, + 0x84, 0x7d, 0x23, 0x49, 0xf8, 0xf3, 0x16, 0x54, 0x54, 0x6e, 0xac, 0xc8, 0xef, 0xfb, 0xf8, 0x29, + 0xdc, 0x77, 0x2a, 0x45, 0x88, 0x14, 0x49, 0xf9, 0x17, 0x6b, 0xe1, 0xa7, 0x97, 0x35, 0xfc, 0x50, + 0x85, 0x86, 0xca, 0x1a, 0x56, 0x29, 0xd5, 0xa5, 0x3c, 0x52, 0xaa, 0xfb, 0x7c, 0xaa, 0x9e, 0x29, + 0xd5, 0x5f, 0xb5, 0x60, 0xdc, 0x79, 0xaf, 0x1d, 0x91, 0x25, 0xb2, 0xbf, 0xd1, 0x8a, 0x85, 0xdd, + 0xfa, 0x44, 0xfe, 0x0a, 0x2c, 0x68, 0x21, 0xa2, 0x70, 0xa3, 0x06, 0x60, 0x53, 0x85, 0x54, 0x0a, + 0xf5, 0x58, 0x1e, 0x29, 0xd4, 0xbd, 0xd4, 0x39, 0x36, 0x85, 0xfa, 0x2d, 0x98, 0x74, 0xfd, 0x30, + 0x20, 0x9b, 0x51, 0x98, 0x84, 0x6e, 0xe8, 0x0b, 0x1f, 0x55, 0x99, 0x84, 0x45, 0x13, 0x89, 0xd3, + 0xb4, 0xfd, 0xf2, 0xaf, 0x2b, 0x27, 0xcd, 0xbf, 0x86, 0x27, 0x94, 0x7f, 0xfd, 0xa7, 0x05, 0x98, + 0x3d, 0xe6, 0xa3, 0xa2, 0x37, 0x61, 0x22, 0x8c, 0x1a, 0x4e, 0xe0, 0xbd, 0xc7, 0x8f, 0xbf, 0x95, + 0xd2, 0xe7, 0xda, 0x37, 0x0c, 0x1c, 0x4e, 0x51, 0xca, 0x0c, 0xcd, 0xd1, 0x3e, 0x19, 0x9a, 0x1f, + 0x86, 0xf1, 0x84, 0x38, 0x4d, 0x91, 0x30, 0x20, 0xd6, 0x15, 0x3a, 0x4e, 0xa3, 0x51, 0xd8, 0xa4, + 0xa3, 0xdd, 0x68, 0xca, 0x71, 0x5d, 0x12, 0xc7, 0x32, 0x05, 0x53, 0xec, 0x79, 0xe4, 0x96, 0xdf, + 0xc9, 0xb6, 0x92, 0x16, 0x52, 0x22, 0x70, 0x46, 0x24, 0x55, 0xde, 0xf1, 0x7d, 0x9e, 0x6d, 0x4d, + 0xe4, 0xa5, 0x8e, 0xba, 0x44, 0xb8, 0x46, 0x61, 0x93, 0xce, 0xfe, 0xf5, 0x02, 0xbc, 0xf4, 0x50, + 0xf3, 0x32, 0x70, 0x76, 0x6c, 0x3b, 0x26, 0x51, 0x36, 0xce, 0x71, 0x2b, 0x26, 0x11, 0x66, 0x18, + 0xde, 0x4a, 0xad, 0x96, 0x71, 0xe9, 0x41, 0xde, 0xc9, 0xd8, 0xbc, 0x95, 0x52, 0x22, 0x70, 0x46, + 0x64, 0xb6, 0x95, 0x46, 0x06, 0x6c, 0xa5, 0x7f, 0x58, 0x80, 0x97, 0x07, 0x30, 0xc2, 0x39, 0x26, + 0xad, 0xa7, 0x93, 0xfe, 0x8b, 0x4f, 0x26, 0xe9, 0xff, 0x51, 0x9b, 0xeb, 0xdb, 0x05, 0xb8, 0xd8, + 0xdf, 0x16, 0xa2, 0x9f, 0xa4, 0x6b, 0x13, 0x99, 0xc3, 0x60, 0x1e, 0x18, 0x38, 0xc7, 0xd7, 0x25, + 0x29, 0x14, 0xce, 0xd2, 0xa2, 0x39, 0x80, 0x96, 0x93, 0xec, 0xc6, 0x57, 0x0f, 0xbc, 0x38, 0x11, + 0x47, 0xdd, 0xa6, 0xf8, 0x0e, 0xb3, 0x84, 0x62, 0x83, 0x82, 0x8a, 0x63, 0xff, 0x96, 0xc2, 0xf5, + 0x30, 0xe1, 0x0f, 0x71, 0x3f, 0xee, 0x1c, 0xbf, 0x85, 0x35, 0x85, 0xc2, 0x59, 0x5a, 0x2a, 0x8e, + 0xc5, 0x30, 0xb8, 0xa2, 0xe2, 0xc6, 0x5a, 0x2a, 0x6e, 0x55, 0x41, 0xb1, 0x41, 0x91, 0x3d, 0x0a, + 0x51, 0x1a, 0xe0, 0x28, 0xc4, 0x3f, 0x2d, 0xc0, 0xf3, 0x7d, 0xe7, 0xd2, 0xc1, 0x06, 0xe0, 0xd3, + 0x77, 0x06, 0xe2, 0xd1, 0xfa, 0xce, 0x90, 0x99, 0xfd, 0xff, 0xb9, 0x4f, 0x4f, 0x13, 0x99, 0xfd, + 0xd9, 0xa9, 0xc2, 0x1a, 0x76, 0xaa, 0x78, 0x8a, 0xda, 0xb3, 0x2b, 0x99, 0x7f, 0x64, 0x88, 0x64, + 0xfe, 0xcc, 0xc7, 0x28, 0x0d, 0x38, 0x90, 0xbf, 0xdb, 0xbf, 0x79, 0xa9, 0xef, 0x3d, 0xd0, 0xae, + 0xcf, 0x12, 0x9c, 0x15, 0x57, 0x5f, 0x6f, 0xb5, 0x77, 0xc4, 0x41, 0xc8, 0x42, 0xfa, 0x02, 0x90, + 0x95, 0x0c, 0x1e, 0x77, 0x3d, 0xf1, 0x14, 0x1e, 0xae, 0x78, 0xc4, 0x26, 0xfd, 0x24, 0x54, 0x14, + 0x6f, 0x9e, 0x70, 0xa8, 0x3e, 0x68, 0x57, 0xc2, 0xa1, 0xfa, 0x9a, 0x06, 0x15, 0x6d, 0x89, 0x3d, + 0xd2, 0xc9, 0xf6, 0xcc, 0x9b, 0xa4, 0xc3, 0x82, 0x8f, 0xf6, 0x8f, 0xc1, 0x84, 0x5a, 0x44, 0x0e, + 0x5a, 0x84, 0xd0, 0xfe, 0x1f, 0x23, 0x30, 0x99, 0x3a, 0xf0, 0x9e, 0xda, 0x0a, 0xb1, 0x8e, 0xdd, + 0x0a, 0x61, 0x29, 0x9a, 0xed, 0x40, 0xd6, 0xe8, 0x34, 0x52, 0x34, 0xdb, 0x01, 0xc1, 0x1c, 0x47, + 0x97, 0xee, 0xb5, 0xa8, 0x83, 0xdb, 0x81, 0x48, 0xf4, 0x52, 0x4b, 0xf7, 0x25, 0x06, 0xc5, 0x02, + 0x8b, 0x3e, 0x63, 0xc1, 0x44, 0xcc, 0xf6, 0xd9, 0xf8, 0x46, 0x92, 0xf8, 0xa0, 0x37, 0xf2, 0xb8, + 0x9b, 0x51, 0x14, 0x77, 0x60, 0x31, 0x62, 0x13, 0x82, 0x53, 0x12, 0xd1, 0x2f, 0x5b, 0xe6, 0xad, + 0x94, 0xa3, 0x79, 0x24, 0x28, 0x66, 0xeb, 0x09, 0xf0, 0x6d, 0x96, 0x87, 0x5f, 0x4e, 0x19, 0xab, + 0x5d, 0x9e, 0xb1, 0xd3, 0xd9, 0xe5, 0x81, 0x1e, 0x3b, 0x3c, 0x1f, 0x82, 0x4a, 0xd3, 0x09, 0xbc, + 0x3a, 0x89, 0x93, 0x78, 0xa6, 0x6c, 0x94, 0x39, 0x91, 0x40, 0xac, 0xf1, 0x74, 0xb2, 0x8b, 0xd9, + 0x8b, 0xf1, 0xb8, 0x58, 0x45, 0x97, 0xcb, 0xdf, 0xd2, 0x60, 0x6c, 0xd2, 0xd8, 0xff, 0xc4, 0x82, + 0x0b, 0x3d, 0x1b, 0xe3, 0xe9, 0xcd, 0xa8, 0xa1, 0x13, 0xf4, 0xb9, 0x1e, 0x05, 0x21, 0x50, 0xe7, + 0xd4, 0x2e, 0x2f, 0x15, 0x15, 0x27, 0x26, 0xfb, 0xf6, 0x8d, 0xe1, 0xf6, 0x2a, 0xf5, 0x7e, 0x61, + 0xf1, 0xb1, 0xee, 0x17, 0x52, 0x57, 0xd0, 0xb8, 0x66, 0x17, 0xfd, 0x82, 0x59, 0xfb, 0xc4, 0xca, + 0xab, 0x4e, 0x07, 0x67, 0xae, 0x6a, 0xa7, 0xf0, 0x56, 0xeb, 0x55, 0x4a, 0x25, 0xdb, 0x5f, 0x0b, + 0xc7, 0xf7, 0x57, 0xe4, 0xcb, 0x22, 0x33, 0xc5, 0xfc, 0x8b, 0xcc, 0x54, 0xba, 0x0a, 0xcc, 0xfc, + 0x6d, 0x8b, 0xf7, 0xb4, 0xcc, 0x2b, 0x69, 0x0b, 0x6b, 0x3d, 0xc4, 0xc2, 0xbe, 0xca, 0xae, 0x83, + 0xa9, 0x5f, 0x27, 0x8e, 0x2f, 0x2c, 0xb1, 0x79, 0xb3, 0x0b, 0x83, 0x63, 0x45, 0xc1, 0x8a, 0x47, + 0xfb, 0x7e, 0x78, 0xff, 0x6a, 0xb3, 0x95, 0x74, 0x84, 0x4d, 0xd6, 0xc5, 0xa3, 0x15, 0x06, 0x1b, + 0x54, 0xf6, 0x9f, 0x59, 0xfc, 0x73, 0x8a, 0xb0, 0xcf, 0x9b, 0x99, 0x62, 0xa7, 0x83, 0x47, 0x4c, + 0x7e, 0x0e, 0xc0, 0x55, 0x37, 0x41, 0xe4, 0x73, 0xfb, 0xae, 0xbe, 0x59, 0xc2, 0xbc, 0x12, 0x56, + 0xc2, 0xb0, 0x21, 0x2f, 0x35, 0x78, 0x8a, 0xc7, 0x0d, 0x1e, 0xfb, 0x4f, 0x2d, 0x48, 0x4d, 0x16, + 0xa8, 0x05, 0x25, 0xaa, 0x41, 0x27, 0x9f, 0x7b, 0x2b, 0x4c, 0xd6, 0x74, 0x60, 0x89, 0x6e, 0xc1, + 0x7e, 0x62, 0x2e, 0x08, 0xf9, 0x22, 0xe0, 0x53, 0xc8, 0xe3, 0x6e, 0x15, 0x53, 0xe0, 0xf5, 0x30, + 0xdc, 0xe3, 0x1b, 0xda, 0x3a, 0x78, 0x64, 0xbf, 0x09, 0xd3, 0x5d, 0x4a, 0xb1, 0x52, 0x85, 0xa1, + 0xbc, 0xac, 0xc3, 0xe8, 0x81, 0xac, 0x70, 0x2a, 0xe6, 0x38, 0xfb, 0xdb, 0x16, 0x9c, 0xcd, 0xb2, + 0x47, 0xdf, 0xb0, 0x60, 0x3a, 0xce, 0xf2, 0x3b, 0xad, 0xb6, 0x53, 0xc9, 0x10, 0x5d, 0x28, 0xdc, + 0xad, 0x84, 0xfd, 0xff, 0x84, 0x79, 0xba, 0xe3, 0x05, 0xb5, 0xf0, 0xbe, 0x9a, 0x5c, 0xac, 0xbe, + 0x93, 0x0b, 0x1d, 0x62, 0xee, 0x2e, 0xa9, 0xb5, 0xfd, 0xae, 0xe3, 0x1e, 0x5b, 0x02, 0x8e, 0x15, + 0x45, 0xea, 0x66, 0xcc, 0xe2, 0xb1, 0x37, 0x63, 0xbe, 0x01, 0x13, 0xe6, 0x85, 0x34, 0xe2, 0xec, + 0x38, 0xf3, 0x55, 0xcc, 0xbb, 0x6b, 0x70, 0x8a, 0x2a, 0x73, 0x25, 0x61, 0xe9, 0xd8, 0x2b, 0x09, + 0x5f, 0x81, 0xb2, 0xb8, 0x5e, 0x4f, 0xa6, 0x0c, 0xf1, 0xb3, 0x24, 0x02, 0x86, 0x15, 0x96, 0x1a, + 0x88, 0xa6, 0x13, 0xb4, 0x1d, 0x9f, 0xb6, 0x90, 0x38, 0x62, 0xa6, 0x46, 0xd6, 0x9a, 0xc2, 0x60, + 0x83, 0x8a, 0xbe, 0x71, 0xe2, 0x35, 0xc9, 0xbb, 0x61, 0x20, 0x83, 0xed, 0x7a, 0xbb, 0x4f, 0xc0, + 0xb1, 0xa2, 0xb0, 0xff, 0xbb, 0x05, 0xd9, 0xbb, 0xc1, 0x52, 0x0b, 0x40, 0xeb, 0xd8, 0x63, 0x6d, + 0xe9, 0x23, 0x3b, 0x85, 0x81, 0x8e, 0xec, 0x98, 0xa7, 0x69, 0x8a, 0x0f, 0x3d, 0x4d, 0xf3, 0x23, + 0xba, 0xe0, 0x35, 0x3f, 0x76, 0x33, 0xde, 0xab, 0xd8, 0x35, 0xb2, 0x61, 0xd4, 0x75, 0xd4, 0xa9, + 0xe1, 0x09, 0xee, 0x56, 0x2d, 0x2e, 0x30, 0x22, 0x81, 0xa9, 0xee, 0x7c, 0xe7, 0x07, 0x97, 0x9e, + 0xf9, 0xee, 0x0f, 0x2e, 0x3d, 0xf3, 0x07, 0x3f, 0xb8, 0xf4, 0xcc, 0x67, 0x8e, 0x2e, 0x59, 0xdf, + 0x39, 0xba, 0x64, 0x7d, 0xf7, 0xe8, 0x92, 0xf5, 0x07, 0x47, 0x97, 0xac, 0xef, 0x1f, 0x5d, 0xb2, + 0xbe, 0xfa, 0x5f, 0x2f, 0x3d, 0xf3, 0x6e, 0xcf, 0xe4, 0x08, 0xfa, 0xe3, 0x35, 0xb7, 0x36, 0xbf, + 0x7f, 0x85, 0xc5, 0xe7, 0xe9, 0x68, 0x98, 0x37, 0xba, 0xc0, 0xbc, 0x1c, 0x0d, 0xff, 0x3f, 0x00, + 0x00, 0xff, 0xff, 0xf8, 0x50, 0x29, 0x0f, 0x69, 0xb2, 0x00, 0x00, } func (m *AWSAuthConfig) Marshal() (dAtA []byte, err error) { @@ -5081,48 +4803,6 @@ func (m *ApplicationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ApplicationMatchExpression) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ApplicationMatchExpression) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ApplicationMatchExpression) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Values) > 0 { - for iNdEx := len(m.Values) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Values[iNdEx]) - copy(dAtA[i:], m.Values[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Values[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - i -= len(m.Operator) - copy(dAtA[i:], m.Operator) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Operator))) - i-- - dAtA[i] = 0x12 - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *ApplicationSet) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5176,56 +4856,6 @@ func (m *ApplicationSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ApplicationSetApplicationStatus) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ApplicationSetApplicationStatus) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ApplicationSetApplicationStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x2a - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x1a - if m.LastTransitionTime != nil { - { - size, err := m.LastTransitionTime.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - i -= len(m.Application) - copy(dAtA[i:], m.Application) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Application))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *ApplicationSetCondition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5590,92 +5220,6 @@ func (m *ApplicationSetNestedGenerator) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *ApplicationSetRolloutStep) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ApplicationSetRolloutStep) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ApplicationSetRolloutStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.MaxUpdate != nil { - { - size, err := m.MaxUpdate.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.MatchExpressions) > 0 { - for iNdEx := len(m.MatchExpressions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.MatchExpressions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ApplicationSetRolloutStrategy) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ApplicationSetRolloutStrategy) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ApplicationSetRolloutStrategy) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Steps) > 0 { - for iNdEx := len(m.Steps) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Steps[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *ApplicationSetSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5696,18 +5240,6 @@ func (m *ApplicationSetSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.Strategy != nil { - { - size, err := m.Strategy.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } if m.SyncPolicy != nil { { size, err := m.SyncPolicy.MarshalToSizedBuffer(dAtA[:i]) @@ -5775,20 +5307,6 @@ func (m *ApplicationSetStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.ApplicationStatus) > 0 { - for iNdEx := len(m.ApplicationStatus) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ApplicationStatus[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } if len(m.Conditions) > 0 { for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { { @@ -5806,46 +5324,6 @@ func (m *ApplicationSetStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ApplicationSetStrategy) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ApplicationSetStrategy) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ApplicationSetStrategy) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.RollingSync != nil { - { - size, err := m.RollingSync.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *ApplicationSetSyncPolicy) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6125,11 +5603,6 @@ func (m *ApplicationSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - i -= len(m.Ref) - copy(dAtA[i:], m.Ref) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Ref))) - i-- - dAtA[i] = 0x6a i -= len(m.Chart) copy(dAtA[i:], m.Chart) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Chart))) @@ -6542,20 +6015,6 @@ func (m *ApplicationSourcePlugin) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l - if len(m.Parameters) > 0 { - for iNdEx := len(m.Parameters) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Parameters[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } if len(m.Env) > 0 { for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { { @@ -6578,74 +6037,6 @@ func (m *ApplicationSourcePlugin) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *ApplicationSourcePluginParameter) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ApplicationSourcePluginParameter) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ApplicationSourcePluginParameter) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.String_ != nil { - i -= len(*m.String_) - copy(dAtA[i:], *m.String_) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.String_))) - i-- - dAtA[i] = 0x2a - } - if len(m.Array) > 0 { - for iNdEx := len(m.Array) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Array[iNdEx]) - copy(dAtA[i:], m.Array[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Array[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.Map) > 0 { - keysForMap := make([]string, 0, len(m.Map)) - for k := range m.Map { - keysForMap = append(keysForMap, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForMap) - for iNdEx := len(keysForMap) - 1; iNdEx >= 0; iNdEx-- { - v := m.Map[string(keysForMap[iNdEx])] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintGenerated(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(keysForMap[iNdEx]) - copy(dAtA[i:], keysForMap[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(keysForMap[iNdEx]))) - i-- - dAtA[i] = 0xa - i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x1a - } - } - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *ApplicationSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6666,20 +6057,6 @@ func (m *ApplicationSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Sources) > 0 { - for iNdEx := len(m.Sources) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Sources[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - } if m.RevisionHistoryLimit != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.RevisionHistoryLimit)) i-- @@ -6740,18 +6117,16 @@ func (m *ApplicationSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x12 - if m.Source != nil { - { - size, err := m.Source.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + { + size, err := m.Source.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -6775,15 +6150,6 @@ func (m *ApplicationStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.SourceTypes) > 0 { - for iNdEx := len(m.SourceTypes) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SourceTypes[iNdEx]) - copy(dAtA[i:], m.SourceTypes[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.SourceTypes[iNdEx]))) - i-- - dAtA[i] = 0x62 - } - } i -= len(m.ResourceHealthSource) copy(dAtA[i:], m.ResourceHealthSource) i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceHealthSource))) @@ -7630,20 +6996,6 @@ func (m *ComparedTo) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Sources) > 0 { - for iNdEx := len(m.Sources) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Sources[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } { size, err := m.Destination.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -8078,11 +7430,6 @@ func (m *GitGenerator) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - i -= len(m.PathParamPrefix) - copy(dAtA[i:], m.PathParamPrefix) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.PathParamPrefix))) - i-- - dAtA[i] = 0x3a { size, err := m.Template.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -8758,77 +8105,6 @@ func (m *ListGenerator) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ManagedNamespaceMetadata) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ManagedNamespaceMetadata) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ManagedNamespaceMetadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Annotations) > 0 { - keysForAnnotations := make([]string, 0, len(m.Annotations)) - for k := range m.Annotations { - keysForAnnotations = append(keysForAnnotations, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations) - for iNdEx := len(keysForAnnotations) - 1; iNdEx >= 0; iNdEx-- { - v := m.Annotations[string(keysForAnnotations[iNdEx])] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintGenerated(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(keysForAnnotations[iNdEx]) - copy(dAtA[i:], keysForAnnotations[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(keysForAnnotations[iNdEx]))) - i-- - dAtA[i] = 0xa - i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Labels) > 0 { - keysForLabels := make([]string, 0, len(m.Labels)) - for k := range m.Labels { - keysForLabels = append(keysForLabels, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForLabels) - for iNdEx := len(keysForLabels) - 1; iNdEx >= 0; iNdEx-- { - v := m.Labels[string(keysForLabels[iNdEx])] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintGenerated(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(keysForLabels[iNdEx]) - copy(dAtA[i:], keysForLabels[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(keysForLabels[iNdEx]))) - i-- - dAtA[i] = 0xa - i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *MatrixGenerator) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9761,49 +9037,6 @@ func (m *PullRequestGeneratorGithub) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } -func (m *RefTarget) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RefTarget) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefTarget) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Chart) - copy(dAtA[i:], m.Chart) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Chart))) - i-- - dAtA[i] = 0x1a - i -= len(m.TargetRevision) - copy(dAtA[i:], m.TargetRevision) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.TargetRevision))) - i-- - dAtA[i] = 0x12 - { - size, err := m.Repo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *RepoCreds) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9824,18 +9057,6 @@ func (m *RepoCreds) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - i -= len(m.Proxy) - copy(dAtA[i:], m.Proxy) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Proxy))) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x9a - i -= len(m.GCPServiceAccountKey) - copy(dAtA[i:], m.GCPServiceAccountKey) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.GCPServiceAccountKey))) - i-- - dAtA[i] = 0x6a i -= len(m.Type) copy(dAtA[i:], m.Type) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) @@ -9965,13 +9186,6 @@ func (m *Repository) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - i -= len(m.GCPServiceAccountKey) - copy(dAtA[i:], m.GCPServiceAccountKey) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.GCPServiceAccountKey))) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xaa i -= len(m.Project) copy(dAtA[i:], m.Project) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Project))) @@ -11124,29 +10338,6 @@ func (m *RevisionHistory) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Revisions) > 0 { - for iNdEx := len(m.Revisions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Revisions[iNdEx]) - copy(dAtA[i:], m.Revisions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Revisions[iNdEx]))) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Sources) > 0 { - for iNdEx := len(m.Sources) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Sources[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - } if m.DeployStartedAt != nil { { size, err := m.DeployStartedAt.MarshalToSizedBuffer(dAtA[:i]) @@ -11863,29 +11054,6 @@ func (m *SyncOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Revisions) > 0 { - for iNdEx := len(m.Revisions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Revisions[iNdEx]) - copy(dAtA[i:], m.Revisions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Revisions[iNdEx]))) - i-- - dAtA[i] = 0x5a - } - } - if len(m.Sources) > 0 { - for iNdEx := len(m.Sources) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Sources[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - } - } if len(m.SyncOptions) > 0 { for iNdEx := len(m.SyncOptions) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SyncOptions[iNdEx]) @@ -12029,29 +11197,6 @@ func (m *SyncOperationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Revisions) > 0 { - for iNdEx := len(m.Revisions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Revisions[iNdEx]) - copy(dAtA[i:], m.Revisions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Revisions[iNdEx]))) - i-- - dAtA[i] = 0x2a - } - } - if len(m.Sources) > 0 { - for iNdEx := len(m.Sources) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Sources[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } { size, err := m.Source.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -12104,18 +11249,6 @@ func (m *SyncPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.ManagedNamespaceMetadata != nil { - { - size, err := m.ManagedNamespaceMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } if m.Retry != nil { { size, err := m.Retry.MarshalToSizedBuffer(dAtA[:i]) @@ -12219,15 +11352,6 @@ func (m *SyncStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Revisions) > 0 { - for iNdEx := len(m.Revisions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Revisions[iNdEx]) - copy(dAtA[i:], m.Revisions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Revisions[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } i -= len(m.Revision) copy(dAtA[i:], m.Revision) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Revision))) @@ -12715,25 +11839,6 @@ func (m *ApplicationList) Size() (n int) { return n } -func (m *ApplicationMatchExpression) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Operator) - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Values) > 0 { - for _, s := range m.Values { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - func (m *ApplicationSet) Size() (n int) { if m == nil { return 0 @@ -12749,25 +11854,6 @@ func (m *ApplicationSet) Size() (n int) { return n } -func (m *ApplicationSetApplicationStatus) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Application) - n += 1 + l + sovGenerated(uint64(l)) - if m.LastTransitionTime != nil { - l = m.LastTransitionTime.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - l = len(m.Message) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Status) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func (m *ApplicationSetCondition) Size() (n int) { if m == nil { return 0 @@ -12896,40 +11982,6 @@ func (m *ApplicationSetNestedGenerator) Size() (n int) { return n } -func (m *ApplicationSetRolloutStep) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.MatchExpressions) > 0 { - for _, e := range m.MatchExpressions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - if m.MaxUpdate != nil { - l = m.MaxUpdate.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *ApplicationSetRolloutStrategy) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Steps) > 0 { - for _, e := range m.Steps { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - func (m *ApplicationSetSpec) Size() (n int) { if m == nil { return 0 @@ -12949,10 +12001,6 @@ func (m *ApplicationSetSpec) Size() (n int) { l = m.SyncPolicy.Size() n += 1 + l + sovGenerated(uint64(l)) } - if m.Strategy != nil { - l = m.Strategy.Size() - n += 1 + l + sovGenerated(uint64(l)) - } return n } @@ -12968,27 +12016,6 @@ func (m *ApplicationSetStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } - if len(m.ApplicationStatus) > 0 { - for _, e := range m.ApplicationStatus { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ApplicationSetStrategy) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Type) - n += 1 + l + sovGenerated(uint64(l)) - if m.RollingSync != nil { - l = m.RollingSync.Size() - n += 1 + l + sovGenerated(uint64(l)) - } return n } @@ -13113,8 +12140,6 @@ func (m *ApplicationSource) Size() (n int) { } l = len(m.Chart) n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Ref) - n += 1 + l + sovGenerated(uint64(l)) return n } @@ -13250,41 +12275,6 @@ func (m *ApplicationSourcePlugin) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } - if len(m.Parameters) > 0 { - for _, e := range m.Parameters { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ApplicationSourcePluginParameter) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Map) > 0 { - for k, v := range m.Map { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - if len(m.Array) > 0 { - for _, s := range m.Array { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } - if m.String_ != nil { - l = len(*m.String_) - n += 1 + l + sovGenerated(uint64(l)) - } return n } @@ -13294,10 +12284,8 @@ func (m *ApplicationSpec) Size() (n int) { } var l int _ = l - if m.Source != nil { - l = m.Source.Size() - n += 1 + l + sovGenerated(uint64(l)) - } + l = m.Source.Size() + n += 1 + l + sovGenerated(uint64(l)) l = m.Destination.Size() n += 1 + l + sovGenerated(uint64(l)) l = len(m.Project) @@ -13321,12 +12309,6 @@ func (m *ApplicationSpec) Size() (n int) { if m.RevisionHistoryLimit != nil { n += 1 + sovGenerated(uint64(*m.RevisionHistoryLimit)) } - if len(m.Sources) > 0 { - for _, e := range m.Sources { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } return n } @@ -13376,12 +12358,6 @@ func (m *ApplicationStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.ResourceHealthSource) n += 1 + l + sovGenerated(uint64(l)) - if len(m.SourceTypes) > 0 { - for _, s := range m.SourceTypes { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } return n } @@ -13661,12 +12637,6 @@ func (m *ComparedTo) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.Destination.Size() n += 1 + l + sovGenerated(uint64(l)) - if len(m.Sources) > 0 { - for _, e := range m.Sources { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } return n } @@ -13840,8 +12810,6 @@ func (m *GitGenerator) Size() (n int) { } l = m.Template.Size() n += 1 + l + sovGenerated(uint64(l)) - l = len(m.PathParamPrefix) - n += 1 + l + sovGenerated(uint64(l)) return n } @@ -14082,31 +13050,6 @@ func (m *ListGenerator) Size() (n int) { return n } -func (m *ManagedNamespaceMetadata) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Labels) > 0 { - for k, v := range m.Labels { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - if len(m.Annotations) > 0 { - for k, v := range m.Annotations { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - return n -} - func (m *MatrixGenerator) Size() (n int) { if m == nil { return 0 @@ -14475,21 +13418,6 @@ func (m *PullRequestGeneratorGithub) Size() (n int) { return n } -func (m *RefTarget) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Repo.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.TargetRevision) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Chart) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func (m *RepoCreds) Size() (n int) { if m == nil { return 0 @@ -14517,10 +13445,6 @@ func (m *RepoCreds) Size() (n int) { n += 2 l = len(m.Type) n += 1 + l + sovGenerated(uint64(l)) - l = len(m.GCPServiceAccountKey) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Proxy) - n += 2 + l + sovGenerated(uint64(l)) return n } @@ -14580,8 +13504,6 @@ func (m *Repository) Size() (n int) { n += 2 + l + sovGenerated(uint64(l)) l = len(m.Project) n += 2 + l + sovGenerated(uint64(l)) - l = len(m.GCPServiceAccountKey) - n += 2 + l + sovGenerated(uint64(l)) return n } @@ -14988,18 +13910,6 @@ func (m *RevisionHistory) Size() (n int) { l = m.DeployStartedAt.Size() n += 1 + l + sovGenerated(uint64(l)) } - if len(m.Sources) > 0 { - for _, e := range m.Sources { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - if len(m.Revisions) > 0 { - for _, s := range m.Revisions { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } return n } @@ -15279,18 +14189,6 @@ func (m *SyncOperation) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } - if len(m.Sources) > 0 { - for _, e := range m.Sources { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - if len(m.Revisions) > 0 { - for _, s := range m.Revisions { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } return n } @@ -15327,18 +14225,6 @@ func (m *SyncOperationResult) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.Source.Size() n += 1 + l + sovGenerated(uint64(l)) - if len(m.Sources) > 0 { - for _, e := range m.Sources { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - if len(m.Revisions) > 0 { - for _, s := range m.Revisions { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } return n } @@ -15362,10 +14248,6 @@ func (m *SyncPolicy) Size() (n int) { l = m.Retry.Size() n += 1 + l + sovGenerated(uint64(l)) } - if m.ManagedNamespaceMetadata != nil { - l = m.ManagedNamespaceMetadata.Size() - n += 1 + l + sovGenerated(uint64(l)) - } return n } @@ -15393,12 +14275,6 @@ func (m *SyncStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.Revision) n += 1 + l + sovGenerated(uint64(l)) - if len(m.Revisions) > 0 { - for _, s := range m.Revisions { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } return n } @@ -15680,18 +14556,6 @@ func (this *ApplicationList) String() string { }, "") return s } -func (this *ApplicationMatchExpression) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ApplicationMatchExpression{`, - `Key:` + fmt.Sprintf("%v", this.Key) + `,`, - `Operator:` + fmt.Sprintf("%v", this.Operator) + `,`, - `Values:` + fmt.Sprintf("%v", this.Values) + `,`, - `}`, - }, "") - return s -} func (this *ApplicationSet) String() string { if this == nil { return "nil" @@ -15704,19 +14568,6 @@ func (this *ApplicationSet) String() string { }, "") return s } -func (this *ApplicationSetApplicationStatus) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ApplicationSetApplicationStatus{`, - `Application:` + fmt.Sprintf("%v", this.Application) + `,`, - `LastTransitionTime:` + strings.Replace(fmt.Sprintf("%v", this.LastTransitionTime), "Time", "v1.Time", 1) + `,`, - `Message:` + fmt.Sprintf("%v", this.Message) + `,`, - `Status:` + fmt.Sprintf("%v", this.Status) + `,`, - `}`, - }, "") - return s -} func (this *ApplicationSetCondition) String() string { if this == nil { return "nil" @@ -15783,37 +14634,6 @@ func (this *ApplicationSetNestedGenerator) String() string { }, "") return s } -func (this *ApplicationSetRolloutStep) String() string { - if this == nil { - return "nil" - } - repeatedStringForMatchExpressions := "[]ApplicationMatchExpression{" - for _, f := range this.MatchExpressions { - repeatedStringForMatchExpressions += strings.Replace(strings.Replace(f.String(), "ApplicationMatchExpression", "ApplicationMatchExpression", 1), `&`, ``, 1) + "," - } - repeatedStringForMatchExpressions += "}" - s := strings.Join([]string{`&ApplicationSetRolloutStep{`, - `MatchExpressions:` + repeatedStringForMatchExpressions + `,`, - `MaxUpdate:` + strings.Replace(fmt.Sprintf("%v", this.MaxUpdate), "IntOrString", "intstr.IntOrString", 1) + `,`, - `}`, - }, "") - return s -} -func (this *ApplicationSetRolloutStrategy) String() string { - if this == nil { - return "nil" - } - repeatedStringForSteps := "[]ApplicationSetRolloutStep{" - for _, f := range this.Steps { - repeatedStringForSteps += strings.Replace(strings.Replace(f.String(), "ApplicationSetRolloutStep", "ApplicationSetRolloutStep", 1), `&`, ``, 1) + "," - } - repeatedStringForSteps += "}" - s := strings.Join([]string{`&ApplicationSetRolloutStrategy{`, - `Steps:` + repeatedStringForSteps + `,`, - `}`, - }, "") - return s -} func (this *ApplicationSetSpec) String() string { if this == nil { return "nil" @@ -15828,7 +14648,6 @@ func (this *ApplicationSetSpec) String() string { `Generators:` + repeatedStringForGenerators + `,`, `Template:` + strings.Replace(strings.Replace(this.Template.String(), "ApplicationSetTemplate", "ApplicationSetTemplate", 1), `&`, ``, 1) + `,`, `SyncPolicy:` + strings.Replace(this.SyncPolicy.String(), "ApplicationSetSyncPolicy", "ApplicationSetSyncPolicy", 1) + `,`, - `Strategy:` + strings.Replace(this.Strategy.String(), "ApplicationSetStrategy", "ApplicationSetStrategy", 1) + `,`, `}`, }, "") return s @@ -15842,25 +14661,8 @@ func (this *ApplicationSetStatus) String() string { repeatedStringForConditions += strings.Replace(strings.Replace(f.String(), "ApplicationSetCondition", "ApplicationSetCondition", 1), `&`, ``, 1) + "," } repeatedStringForConditions += "}" - repeatedStringForApplicationStatus := "[]ApplicationSetApplicationStatus{" - for _, f := range this.ApplicationStatus { - repeatedStringForApplicationStatus += strings.Replace(strings.Replace(f.String(), "ApplicationSetApplicationStatus", "ApplicationSetApplicationStatus", 1), `&`, ``, 1) + "," - } - repeatedStringForApplicationStatus += "}" s := strings.Join([]string{`&ApplicationSetStatus{`, `Conditions:` + repeatedStringForConditions + `,`, - `ApplicationStatus:` + repeatedStringForApplicationStatus + `,`, - `}`, - }, "") - return s -} -func (this *ApplicationSetStrategy) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ApplicationSetStrategy{`, - `Type:` + fmt.Sprintf("%v", this.Type) + `,`, - `RollingSync:` + strings.Replace(this.RollingSync.String(), "ApplicationSetRolloutStrategy", "ApplicationSetRolloutStrategy", 1) + `,`, `}`, }, "") return s @@ -15948,7 +14750,6 @@ func (this *ApplicationSource) String() string { `Directory:` + strings.Replace(this.Directory.String(), "ApplicationSourceDirectory", "ApplicationSourceDirectory", 1) + `,`, `Plugin:` + strings.Replace(this.Plugin.String(), "ApplicationSourcePlugin", "ApplicationSourcePlugin", 1) + `,`, `Chart:` + fmt.Sprintf("%v", this.Chart) + `,`, - `Ref:` + fmt.Sprintf("%v", this.Ref) + `,`, `}`, }, "") return s @@ -16062,38 +14863,9 @@ func (this *ApplicationSourcePlugin) String() string { repeatedStringForEnv += strings.Replace(f.String(), "EnvEntry", "EnvEntry", 1) + "," } repeatedStringForEnv += "}" - repeatedStringForParameters := "[]ApplicationSourcePluginParameter{" - for _, f := range this.Parameters { - repeatedStringForParameters += strings.Replace(strings.Replace(f.String(), "ApplicationSourcePluginParameter", "ApplicationSourcePluginParameter", 1), `&`, ``, 1) + "," - } - repeatedStringForParameters += "}" s := strings.Join([]string{`&ApplicationSourcePlugin{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `Env:` + repeatedStringForEnv + `,`, - `Parameters:` + repeatedStringForParameters + `,`, - `}`, - }, "") - return s -} -func (this *ApplicationSourcePluginParameter) String() string { - if this == nil { - return "nil" - } - keysForMap := make([]string, 0, len(this.Map)) - for k := range this.Map { - keysForMap = append(keysForMap, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForMap) - mapStringForMap := "map[string]string{" - for _, k := range keysForMap { - mapStringForMap += fmt.Sprintf("%v: %v,", k, this.Map[k]) - } - mapStringForMap += "}" - s := strings.Join([]string{`&ApplicationSourcePluginParameter{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Map:` + mapStringForMap + `,`, - `Array:` + fmt.Sprintf("%v", this.Array) + `,`, - `String_:` + valueToStringGenerated(this.String_) + `,`, `}`, }, "") return s @@ -16112,20 +14884,14 @@ func (this *ApplicationSpec) String() string { repeatedStringForInfo += strings.Replace(strings.Replace(f.String(), "Info", "Info", 1), `&`, ``, 1) + "," } repeatedStringForInfo += "}" - repeatedStringForSources := "[]ApplicationSource{" - for _, f := range this.Sources { - repeatedStringForSources += strings.Replace(strings.Replace(f.String(), "ApplicationSource", "ApplicationSource", 1), `&`, ``, 1) + "," - } - repeatedStringForSources += "}" s := strings.Join([]string{`&ApplicationSpec{`, - `Source:` + strings.Replace(this.Source.String(), "ApplicationSource", "ApplicationSource", 1) + `,`, + `Source:` + strings.Replace(strings.Replace(this.Source.String(), "ApplicationSource", "ApplicationSource", 1), `&`, ``, 1) + `,`, `Destination:` + strings.Replace(strings.Replace(this.Destination.String(), "ApplicationDestination", "ApplicationDestination", 1), `&`, ``, 1) + `,`, `Project:` + fmt.Sprintf("%v", this.Project) + `,`, `SyncPolicy:` + strings.Replace(this.SyncPolicy.String(), "SyncPolicy", "SyncPolicy", 1) + `,`, `IgnoreDifferences:` + repeatedStringForIgnoreDifferences + `,`, `Info:` + repeatedStringForInfo + `,`, `RevisionHistoryLimit:` + valueToStringGenerated(this.RevisionHistoryLimit) + `,`, - `Sources:` + repeatedStringForSources + `,`, `}`, }, "") return s @@ -16161,7 +14927,6 @@ func (this *ApplicationStatus) String() string { `SourceType:` + fmt.Sprintf("%v", this.SourceType) + `,`, `Summary:` + strings.Replace(strings.Replace(this.Summary.String(), "ApplicationSummary", "ApplicationSummary", 1), `&`, ``, 1) + `,`, `ResourceHealthSource:` + fmt.Sprintf("%v", this.ResourceHealthSource) + `,`, - `SourceTypes:` + fmt.Sprintf("%v", this.SourceTypes) + `,`, `}`, }, "") return s @@ -16374,15 +15139,9 @@ func (this *ComparedTo) String() string { if this == nil { return "nil" } - repeatedStringForSources := "[]ApplicationSource{" - for _, f := range this.Sources { - repeatedStringForSources += strings.Replace(strings.Replace(f.String(), "ApplicationSource", "ApplicationSource", 1), `&`, ``, 1) + "," - } - repeatedStringForSources += "}" s := strings.Join([]string{`&ComparedTo{`, `Source:` + strings.Replace(strings.Replace(this.Source.String(), "ApplicationSource", "ApplicationSource", 1), `&`, ``, 1) + `,`, `Destination:` + strings.Replace(strings.Replace(this.Destination.String(), "ApplicationDestination", "ApplicationDestination", 1), `&`, ``, 1) + `,`, - `Sources:` + repeatedStringForSources + `,`, `}`, }, "") return s @@ -16526,7 +15285,6 @@ func (this *GitGenerator) String() string { `Revision:` + fmt.Sprintf("%v", this.Revision) + `,`, `RequeueAfterSeconds:` + valueToStringGenerated(this.RequeueAfterSeconds) + `,`, `Template:` + strings.Replace(strings.Replace(this.Template.String(), "ApplicationSetTemplate", "ApplicationSetTemplate", 1), `&`, ``, 1) + `,`, - `PathParamPrefix:` + fmt.Sprintf("%v", this.PathParamPrefix) + `,`, `}`, }, "") return s @@ -16735,37 +15493,6 @@ func (this *ListGenerator) String() string { }, "") return s } -func (this *ManagedNamespaceMetadata) String() string { - if this == nil { - return "nil" - } - keysForLabels := make([]string, 0, len(this.Labels)) - for k := range this.Labels { - keysForLabels = append(keysForLabels, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForLabels) - mapStringForLabels := "map[string]string{" - for _, k := range keysForLabels { - mapStringForLabels += fmt.Sprintf("%v: %v,", k, this.Labels[k]) - } - mapStringForLabels += "}" - keysForAnnotations := make([]string, 0, len(this.Annotations)) - for k := range this.Annotations { - keysForAnnotations = append(keysForAnnotations, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations) - mapStringForAnnotations := "map[string]string{" - for _, k := range keysForAnnotations { - mapStringForAnnotations += fmt.Sprintf("%v: %v,", k, this.Annotations[k]) - } - mapStringForAnnotations += "}" - s := strings.Join([]string{`&ManagedNamespaceMetadata{`, - `Labels:` + mapStringForLabels + `,`, - `Annotations:` + mapStringForAnnotations + `,`, - `}`, - }, "") - return s -} func (this *MatrixGenerator) String() string { if this == nil { return "nil" @@ -17021,18 +15748,6 @@ func (this *PullRequestGeneratorGithub) String() string { }, "") return s } -func (this *RefTarget) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&RefTarget{`, - `Repo:` + strings.Replace(strings.Replace(this.Repo.String(), "Repository", "Repository", 1), `&`, ``, 1) + `,`, - `TargetRevision:` + fmt.Sprintf("%v", this.TargetRevision) + `,`, - `Chart:` + fmt.Sprintf("%v", this.Chart) + `,`, - `}`, - }, "") - return s -} func (this *RepoCreds) String() string { if this == nil { return "nil" @@ -17050,8 +15765,6 @@ func (this *RepoCreds) String() string { `GitHubAppEnterpriseBaseURL:` + fmt.Sprintf("%v", this.GitHubAppEnterpriseBaseURL) + `,`, `EnableOCI:` + fmt.Sprintf("%v", this.EnableOCI) + `,`, `Type:` + fmt.Sprintf("%v", this.Type) + `,`, - `GCPServiceAccountKey:` + fmt.Sprintf("%v", this.GCPServiceAccountKey) + `,`, - `Proxy:` + fmt.Sprintf("%v", this.Proxy) + `,`, `}`, }, "") return s @@ -17097,7 +15810,6 @@ func (this *Repository) String() string { `GitHubAppEnterpriseBaseURL:` + fmt.Sprintf("%v", this.GitHubAppEnterpriseBaseURL) + `,`, `Proxy:` + fmt.Sprintf("%v", this.Proxy) + `,`, `Project:` + fmt.Sprintf("%v", this.Project) + `,`, - `GCPServiceAccountKey:` + fmt.Sprintf("%v", this.GCPServiceAccountKey) + `,`, `}`, }, "") return s @@ -17400,19 +16112,12 @@ func (this *RevisionHistory) String() string { if this == nil { return "nil" } - repeatedStringForSources := "[]ApplicationSource{" - for _, f := range this.Sources { - repeatedStringForSources += strings.Replace(strings.Replace(f.String(), "ApplicationSource", "ApplicationSource", 1), `&`, ``, 1) + "," - } - repeatedStringForSources += "}" s := strings.Join([]string{`&RevisionHistory{`, `Revision:` + fmt.Sprintf("%v", this.Revision) + `,`, `DeployedAt:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.DeployedAt), "Time", "v1.Time", 1), `&`, ``, 1) + `,`, `ID:` + fmt.Sprintf("%v", this.ID) + `,`, `Source:` + strings.Replace(strings.Replace(this.Source.String(), "ApplicationSource", "ApplicationSource", 1), `&`, ``, 1) + `,`, `DeployStartedAt:` + strings.Replace(fmt.Sprintf("%v", this.DeployStartedAt), "Time", "v1.Time", 1) + `,`, - `Sources:` + repeatedStringForSources + `,`, - `Revisions:` + fmt.Sprintf("%v", this.Revisions) + `,`, `}`, }, "") return s @@ -17581,11 +16286,6 @@ func (this *SyncOperation) String() string { repeatedStringForResources += strings.Replace(strings.Replace(f.String(), "SyncOperationResource", "SyncOperationResource", 1), `&`, ``, 1) + "," } repeatedStringForResources += "}" - repeatedStringForSources := "[]ApplicationSource{" - for _, f := range this.Sources { - repeatedStringForSources += strings.Replace(strings.Replace(f.String(), "ApplicationSource", "ApplicationSource", 1), `&`, ``, 1) + "," - } - repeatedStringForSources += "}" s := strings.Join([]string{`&SyncOperation{`, `Revision:` + fmt.Sprintf("%v", this.Revision) + `,`, `Prune:` + fmt.Sprintf("%v", this.Prune) + `,`, @@ -17595,8 +16295,6 @@ func (this *SyncOperation) String() string { `Source:` + strings.Replace(this.Source.String(), "ApplicationSource", "ApplicationSource", 1) + `,`, `Manifests:` + fmt.Sprintf("%v", this.Manifests) + `,`, `SyncOptions:` + fmt.Sprintf("%v", this.SyncOptions) + `,`, - `Sources:` + repeatedStringForSources + `,`, - `Revisions:` + fmt.Sprintf("%v", this.Revisions) + `,`, `}`, }, "") return s @@ -17623,17 +16321,10 @@ func (this *SyncOperationResult) String() string { repeatedStringForResources += strings.Replace(f.String(), "ResourceResult", "ResourceResult", 1) + "," } repeatedStringForResources += "}" - repeatedStringForSources := "[]ApplicationSource{" - for _, f := range this.Sources { - repeatedStringForSources += strings.Replace(strings.Replace(f.String(), "ApplicationSource", "ApplicationSource", 1), `&`, ``, 1) + "," - } - repeatedStringForSources += "}" s := strings.Join([]string{`&SyncOperationResult{`, `Resources:` + repeatedStringForResources + `,`, `Revision:` + fmt.Sprintf("%v", this.Revision) + `,`, `Source:` + strings.Replace(strings.Replace(this.Source.String(), "ApplicationSource", "ApplicationSource", 1), `&`, ``, 1) + `,`, - `Sources:` + repeatedStringForSources + `,`, - `Revisions:` + fmt.Sprintf("%v", this.Revisions) + `,`, `}`, }, "") return s @@ -17646,7 +16337,6 @@ func (this *SyncPolicy) String() string { `Automated:` + strings.Replace(this.Automated.String(), "SyncPolicyAutomated", "SyncPolicyAutomated", 1) + `,`, `SyncOptions:` + fmt.Sprintf("%v", this.SyncOptions) + `,`, `Retry:` + strings.Replace(this.Retry.String(), "RetryStrategy", "RetryStrategy", 1) + `,`, - `ManagedNamespaceMetadata:` + strings.Replace(this.ManagedNamespaceMetadata.String(), "ManagedNamespaceMetadata", "ManagedNamespaceMetadata", 1) + `,`, `}`, }, "") return s @@ -17671,7 +16361,6 @@ func (this *SyncStatus) String() string { `Status:` + fmt.Sprintf("%v", this.Status) + `,`, `ComparedTo:` + strings.Replace(strings.Replace(this.ComparedTo.String(), "ComparedTo", "ComparedTo", 1), `&`, ``, 1) + `,`, `Revision:` + fmt.Sprintf("%v", this.Revision) + `,`, - `Revisions:` + fmt.Sprintf("%v", this.Revisions) + `,`, `}`, }, "") return s @@ -19377,7 +18066,7 @@ func (m *ApplicationList) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationMatchExpression) Unmarshal(dAtA []byte) error { +func (m *ApplicationSet) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -19400,492 +18089,164 @@ func (m *ApplicationMatchExpression) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationMatchExpression: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationSet: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationMatchExpression: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationSet: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Operator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Operator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Values = append(m.Values, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ApplicationSet) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ApplicationSet: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSet: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ApplicationSetApplicationStatus) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ApplicationSetApplicationStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSetApplicationStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Application", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Application = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastTransitionTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.LastTransitionTime == nil { - m.LastTransitionTime = &v1.Time{} - } - if err := m.LastTransitionTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Message = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ApplicationSetCondition) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ApplicationSetCondition: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSetCondition: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplicationSetCondition) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplicationSetCondition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationSetCondition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -19976,506 +18337,18 @@ func (m *ApplicationSetCondition) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.LastTransitionTime == nil { - m.LastTransitionTime = &v1.Time{} - } - if err := m.LastTransitionTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = ApplicationSetConditionStatus(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Reason = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ApplicationSetGenerator) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ApplicationSetGenerator: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSetGenerator: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field List", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.List == nil { - m.List = &ListGenerator{} - } - if err := m.List.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Clusters", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Clusters == nil { - m.Clusters = &ClusterGenerator{} - } - if err := m.Clusters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Git", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Git == nil { - m.Git = &GitGenerator{} - } - if err := m.Git.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SCMProvider", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.SCMProvider == nil { - m.SCMProvider = &SCMProviderGenerator{} - } - if err := m.SCMProvider.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterDecisionResource", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ClusterDecisionResource == nil { - m.ClusterDecisionResource = &DuckTypeGenerator{} - } - if err := m.ClusterDecisionResource.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PullRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.PullRequest == nil { - m.PullRequest = &PullRequestGenerator{} - } - if err := m.PullRequest.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Matrix", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Matrix == nil { - m.Matrix = &MatrixGenerator{} - } - if err := m.Matrix.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Merge", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Merge == nil { - m.Merge = &MergeGenerator{} - } - if err := m.Merge.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Selector == nil { - m.Selector = &v1.LabelSelector{} + if m.LastTransitionTime == nil { + m.LastTransitionTime = &v1.Time{} } - if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.LastTransitionTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ApplicationSetList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ApplicationSetList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSetList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -20485,30 +18358,29 @@ func (m *ApplicationSetList) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Status = ApplicationSetConditionStatus(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -20518,25 +18390,23 @@ func (m *ApplicationSetList) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, ApplicationSet{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Reason = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -20559,7 +18429,7 @@ func (m *ApplicationSetList) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationSetNestedGenerator) Unmarshal(dAtA []byte) error { +func (m *ApplicationSetGenerator) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -20582,10 +18452,10 @@ func (m *ApplicationSetNestedGenerator) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationSetNestedGenerator: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationSetGenerator: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSetNestedGenerator: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationSetGenerator: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -20834,7 +18704,7 @@ func (m *ApplicationSetNestedGenerator) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Matrix == nil { - m.Matrix = &v11.JSON{} + m.Matrix = &MatrixGenerator{} } if err := m.Matrix.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -20870,7 +18740,7 @@ func (m *ApplicationSetNestedGenerator) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Merge == nil { - m.Merge = &v11.JSON{} + m.Merge = &MergeGenerator{} } if err := m.Merge.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -20933,7 +18803,7 @@ func (m *ApplicationSetNestedGenerator) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationSetRolloutStep) Unmarshal(dAtA []byte) error { +func (m *ApplicationSetList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -20956,15 +18826,15 @@ func (m *ApplicationSetRolloutStep) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationSetRolloutStep: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationSetList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSetRolloutStep: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationSetList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MatchExpressions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -20991,14 +18861,13 @@ func (m *ApplicationSetRolloutStep) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.MatchExpressions = append(m.MatchExpressions, ApplicationMatchExpression{}) - if err := m.MatchExpressions[len(m.MatchExpressions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxUpdate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -21025,10 +18894,8 @@ func (m *ApplicationSetRolloutStep) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.MaxUpdate == nil { - m.MaxUpdate = &intstr.IntOrString{} - } - if err := m.MaxUpdate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Items = append(m.Items, ApplicationSet{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -21053,7 +18920,7 @@ func (m *ApplicationSetRolloutStep) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationSetRolloutStrategy) Unmarshal(dAtA []byte) error { +func (m *ApplicationSetNestedGenerator) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -21076,15 +18943,123 @@ func (m *ApplicationSetRolloutStrategy) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationSetRolloutStrategy: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationSetNestedGenerator: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSetRolloutStrategy: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationSetNestedGenerator: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Steps", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field List", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.List == nil { + m.List = &ListGenerator{} + } + if err := m.List.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Clusters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Clusters == nil { + m.Clusters = &ClusterGenerator{} + } + if err := m.Clusters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Git", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Git == nil { + m.Git = &GitGenerator{} + } + if err := m.Git.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SCMProvider", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -21111,66 +19086,18 @@ func (m *ApplicationSetRolloutStrategy) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Steps = append(m.Steps, ApplicationSetRolloutStep{}) - if err := m.Steps[len(m.Steps)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + if m.SCMProvider == nil { + m.SCMProvider = &SCMProviderGenerator{} } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { + if err := m.SCMProvider.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ApplicationSetSpec) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ApplicationSetSpec: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSetSpec: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field GoTemplate", wireType) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterDecisionResource", wireType) } - var v int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -21180,15 +19107,31 @@ func (m *ApplicationSetSpec) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - m.GoTemplate = bool(v != 0) - case 2: + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ClusterDecisionResource == nil { + m.ClusterDecisionResource = &DuckTypeGenerator{} + } + if err := m.ClusterDecisionResource.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Generators", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PullRequest", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -21215,14 +19158,16 @@ func (m *ApplicationSetSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Generators = append(m.Generators, ApplicationSetGenerator{}) - if err := m.Generators[len(m.Generators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.PullRequest == nil { + m.PullRequest = &PullRequestGenerator{} + } + if err := m.PullRequest.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Template", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Matrix", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -21249,13 +19194,16 @@ func (m *ApplicationSetSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Template.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Matrix == nil { + m.Matrix = &v11.JSON{} + } + if err := m.Matrix.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SyncPolicy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Merge", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -21282,16 +19230,16 @@ func (m *ApplicationSetSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.SyncPolicy == nil { - m.SyncPolicy = &ApplicationSetSyncPolicy{} + if m.Merge == nil { + m.Merge = &v11.JSON{} } - if err := m.SyncPolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Merge.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Strategy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -21318,10 +19266,10 @@ func (m *ApplicationSetSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Strategy == nil { - m.Strategy = &ApplicationSetStrategy{} + if m.Selector == nil { + m.Selector = &v1.LabelSelector{} } - if err := m.Strategy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -21346,7 +19294,7 @@ func (m *ApplicationSetSpec) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationSetStatus) Unmarshal(dAtA []byte) error { +func (m *ApplicationSetSpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -21369,15 +19317,35 @@ func (m *ApplicationSetStatus) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationSetStatus: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationSetSpec: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSetStatus: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationSetSpec: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GoTemplate", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.GoTemplate = bool(v != 0) + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Generators", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -21404,14 +19372,14 @@ func (m *ApplicationSetStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Conditions = append(m.Conditions, ApplicationSetCondition{}) - if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Generators = append(m.Generators, ApplicationSetGenerator{}) + if err := m.Generators[len(m.Generators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ApplicationStatus", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Template", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -21438,8 +19406,43 @@ func (m *ApplicationSetStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ApplicationStatus = append(m.ApplicationStatus, ApplicationSetApplicationStatus{}) - if err := m.ApplicationStatus[len(m.ApplicationStatus)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Template.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SyncPolicy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SyncPolicy == nil { + m.SyncPolicy = &ApplicationSetSyncPolicy{} + } + if err := m.SyncPolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -21464,7 +19467,7 @@ func (m *ApplicationSetStatus) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationSetStrategy) Unmarshal(dAtA []byte) error { +func (m *ApplicationSetStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -21487,47 +19490,15 @@ func (m *ApplicationSetStrategy) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationSetStrategy: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationSetStatus: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSetStrategy: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationSetStatus: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Type = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RollingSync", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -21554,10 +19525,8 @@ func (m *ApplicationSetStrategy) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.RollingSync == nil { - m.RollingSync = &ApplicationSetRolloutStrategy{} - } - if err := m.RollingSync.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Conditions = append(m.Conditions, ApplicationSetCondition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -22735,38 +20704,6 @@ func (m *ApplicationSource) Unmarshal(dAtA []byte) error { } m.Chart = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ref", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Ref = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -23978,314 +21915,6 @@ func (m *ApplicationSourcePlugin) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Parameters = append(m.Parameters, ApplicationSourcePluginParameter{}) - if err := m.Parameters[len(m.Parameters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ApplicationSourcePluginParameter) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ApplicationSourcePluginParameter: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSourcePluginParameter: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Map", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Map == nil { - m.Map = make(map[string]string) - } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthGenerated - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthGenerated - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Map[mapkey] = mapvalue - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Array", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Array = append(m.Array, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field String_", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.String_ = &s - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -24365,9 +21994,6 @@ func (m *ApplicationSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Source == nil { - m.Source = &ApplicationSource{} - } if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -24561,40 +22187,6 @@ func (m *ApplicationSpec) Unmarshal(dAtA []byte) error { } } m.RevisionHistoryLimit = &v - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sources", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sources = append(m.Sources, ApplicationSource{}) - if err := m.Sources[len(m.Sources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -25018,38 +22610,6 @@ func (m *ApplicationStatus) Unmarshal(dAtA []byte) error { } m.ResourceHealthSource = ResourceHealthLocation(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 12: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SourceTypes", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SourceTypes = append(m.SourceTypes, ApplicationSourceType(dAtA[iNdEx:postIndex])) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -27251,211 +24811,178 @@ func (m *ClusterList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, Cluster{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Command) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Command: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Command: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Command = append(m.Command, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Args = append(m.Args, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ComparedTo) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ComparedTo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ComparedTo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Items = append(m.Items, Cluster{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Command) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Command: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Command: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Command = append(m.Command, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Destination", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Args = append(m.Args, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ComparedTo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ComparedTo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ComparedTo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -27482,13 +25009,13 @@ func (m *ComparedTo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Destination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Destination", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -27515,8 +25042,7 @@ func (m *ComparedTo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Sources = append(m.Sources, ApplicationSource{}) - if err := m.Sources[len(m.Sources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Destination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -29097,92 +26623,60 @@ func (m *GitGenerator) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RequeueAfterSeconds", wireType) - } - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.RequeueAfterSeconds = &v - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Template", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Template.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PathParamPrefix", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PathParamPrefix = string(dAtA[iNdEx:postIndex]) + m.Revision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RequeueAfterSeconds", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.RequeueAfterSeconds = &v + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Template", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Template.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -31182,313 +28676,9 @@ func (m *ListGenerator) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Template.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ManagedNamespaceMetadata) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ManagedNamespaceMetadata: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ManagedNamespaceMetadata: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Labels == nil { - m.Labels = make(map[string]string) - } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthGenerated - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthGenerated - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Labels[mapkey] = mapvalue - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Annotations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Annotations == nil { - m.Annotations = make(map[string]string) - } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthGenerated - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthGenerated - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } + if err := m.Template.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.Annotations[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -33850,191 +31040,13 @@ func (m *PullRequestGeneratorGitLab) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Labels = append(m.Labels, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PullRequestState", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PullRequestState = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PullRequestGeneratorGitea) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PullRequestGeneratorGitea: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PullRequestGeneratorGitea: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Owner", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Owner = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Repo = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field API", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.API = string(dAtA[iNdEx:postIndex]) + m.Labels = append(m.Labels, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 4: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PullRequestState", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -34044,48 +31056,24 @@ func (m *PullRequestGeneratorGitea) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if m.TokenRef == nil { - m.TokenRef = &SecretRef{} - } - if err := m.TokenRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.PullRequestState = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Insecure", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Insecure = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -34107,7 +31095,7 @@ func (m *PullRequestGeneratorGitea) Unmarshal(dAtA []byte) error { } return nil } -func (m *PullRequestGeneratorGithub) Unmarshal(dAtA []byte) error { +func (m *PullRequestGeneratorGitea) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -34130,10 +31118,10 @@ func (m *PullRequestGeneratorGithub) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PullRequestGeneratorGithub: wiretype end group for non-group") + return fmt.Errorf("proto: PullRequestGeneratorGitea: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PullRequestGeneratorGithub: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PullRequestGeneratorGitea: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -34269,8 +31257,78 @@ func (m *PullRequestGeneratorGithub) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Insecure", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Insecure = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PullRequestGeneratorGithub) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PullRequestGeneratorGithub: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PullRequestGeneratorGithub: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppSecretName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Owner", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -34298,11 +31356,11 @@ func (m *PullRequestGeneratorGithub) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AppSecretName = string(dAtA[iNdEx:postIndex]) + m.Owner = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -34330,61 +31388,43 @@ func (m *PullRequestGeneratorGithub) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Labels = append(m.Labels, string(dAtA[iNdEx:postIndex])) + m.Repo = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field API", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RefTarget) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RefTarget: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RefTarget: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.API = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TokenRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -34411,13 +31451,16 @@ func (m *RefTarget) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Repo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.TokenRef == nil { + m.TokenRef = &SecretRef{} + } + if err := m.TokenRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TargetRevision", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppSecretName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -34445,11 +31488,11 @@ func (m *RefTarget) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.TargetRevision = string(dAtA[iNdEx:postIndex]) + m.AppSecretName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Chart", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -34477,7 +31520,7 @@ func (m *RefTarget) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Chart = string(dAtA[iNdEx:postIndex]) + m.Labels = append(m.Labels, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -34875,70 +31918,6 @@ func (m *RepoCreds) Unmarshal(dAtA []byte) error { } m.Type = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GCPServiceAccountKey", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GCPServiceAccountKey = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 19: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proxy", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Proxy = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -35661,38 +32640,6 @@ func (m *Repository) Unmarshal(dAtA []byte) error { } m.Project = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 21: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GCPServiceAccountKey", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GCPServiceAccountKey = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -39552,72 +36499,6 @@ func (m *RevisionHistory) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sources", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sources = append(m.Sources, ApplicationSource{}) - if err := m.Sources[len(m.Sources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revisions", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revisions = append(m.Revisions, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -41827,191 +38708,53 @@ func (m *SyncOperation) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Prune", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Prune = 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 ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.DryRun = bool(v != 0) - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SyncStrategy", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.SyncStrategy == nil { - m.SyncStrategy = &SyncStrategy{} - } - if err := m.SyncStrategy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Resources = append(m.Resources, SyncOperationResource{}) - if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Source == nil { - m.Source = &ApplicationSource{} - } - if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Manifests", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Manifests = append(m.Manifests, string(dAtA[iNdEx:postIndex])) + m.Revision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 9: + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Prune", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Prune = 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 ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DryRun = bool(v != 0) + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SyncOptions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SyncStrategy", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -42021,27 +38764,31 @@ func (m *SyncOperation) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.SyncOptions = append(m.SyncOptions, string(dAtA[iNdEx:postIndex])) + if m.SyncStrategy == nil { + m.SyncStrategy = &SyncStrategy{} + } + if err := m.SyncStrategy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 10: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -42068,14 +38815,82 @@ func (m *SyncOperation) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Sources = append(m.Sources, ApplicationSource{}) - if err := m.Sources[len(m.Sources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Resources = append(m.Resources, SyncOperationResource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 11: + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Source == nil { + m.Source = &ApplicationSource{} + } + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Manifests", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Manifests = append(m.Manifests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revisions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SyncOptions", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -42103,7 +38918,7 @@ func (m *SyncOperation) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Revisions = append(m.Revisions, string(dAtA[iNdEx:postIndex])) + m.SyncOptions = append(m.SyncOptions, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -42432,72 +39247,6 @@ func (m *SyncOperationResult) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sources", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sources = append(m.Sources, ApplicationSource{}) - if err := m.Sources[len(m.Sources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revisions", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revisions = append(m.Revisions, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -42652,42 +39401,6 @@ func (m *SyncPolicy) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ManagedNamespaceMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ManagedNamespaceMetadata == nil { - m.ManagedNamespaceMetadata = &ManagedNamespaceMetadata{} - } - if err := m.ManagedNamespaceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -42945,38 +39658,6 @@ func (m *SyncStatus) Unmarshal(dAtA []byte) error { } m.Revision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revisions", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revisions = append(m.Revisions, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index c7f3a766548e3..d14b6cf1ae07a 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -10,7 +10,6 @@ import "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"; @@ -149,14 +148,6 @@ message ApplicationList { repeated Application items = 2; } -message ApplicationMatchExpression { - optional string key = 1; - - optional string operator = 2; - - repeated string values = 3; -} - // ApplicationSet is a set of Application resources // +genclient // +genclient:noStatus @@ -171,21 +162,6 @@ message ApplicationSet { optional ApplicationSetStatus status = 3; } -// ApplicationSetApplicationStatus contains details about each Application managed by the ApplicationSet -message ApplicationSetApplicationStatus { - // Application contains the name of the Application resource - optional string application = 1; - - // LastTransitionTime is the time the status was last updated - optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastTransitionTime = 2; - - // Message contains human-readable message indicating details about the status - optional string message = 3; - - // Status contains the AppSet's perceived status of the managed Application resource: (Waiting, Pending, Progressing, Healthy) - optional string status = 5; -} - // ApplicationSetCondition contains details about an applicationset condition, which is usally an error or warning message ApplicationSetCondition { // Type is an applicationset condition type @@ -260,16 +236,6 @@ message ApplicationSetNestedGenerator { optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 9; } -message ApplicationSetRolloutStep { - repeated ApplicationMatchExpression matchExpressions = 1; - - optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxUpdate = 2; -} - -message ApplicationSetRolloutStrategy { - repeated ApplicationSetRolloutStep steps = 1; -} - // ApplicationSetSpec represents a class of application set state. message ApplicationSetSpec { optional bool goTemplate = 1; @@ -279,8 +245,6 @@ message ApplicationSetSpec { optional ApplicationSetTemplate template = 3; optional ApplicationSetSyncPolicy syncPolicy = 4; - - optional ApplicationSetStrategy strategy = 5; } // ApplicationSetStatus defines the observed state of ApplicationSet @@ -288,15 +252,6 @@ message ApplicationSetStatus { // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster // Important: Run "make" to regenerate code after modifying this file repeated ApplicationSetCondition conditions = 1; - - repeated ApplicationSetApplicationStatus applicationStatus = 2; -} - -// ApplicationSetStrategy configures how generated Applications are updated in sequence. -message ApplicationSetStrategy { - optional string type = 1; - - optional ApplicationSetRolloutStrategy rollingSync = 2; } // ApplicationSetSyncPolicy configures how generated Applications will relate to their @@ -372,9 +327,6 @@ message ApplicationSource { // Chart is a Helm chart name, and must be specified for applications sourced from a Helm repo. optional string chart = 12; - - // Ref is reference to another source within sources field. This field will not be used if used with a `source` tag. - optional string ref = 13; } // ApplicationSourceDirectory holds options for applications of type plain YAML or Jsonnet @@ -466,22 +418,6 @@ message ApplicationSourcePlugin { optional string name = 1; repeated EnvEntry env = 2; - - repeated ApplicationSourcePluginParameter parameters = 3; -} - -message ApplicationSourcePluginParameter { - // Name is the name identifying a parameter. - optional string name = 1; - - // String_ is the value of a string type parameter. - optional string string = 5; - - // Map is the value of a map type parameter. - map map = 3; - - // Array is the value of an array type parameter. - repeated string array = 4; } // ApplicationSpec represents desired application state. Contains link to repository with application definition and additional parameters link definition revision. @@ -511,9 +447,6 @@ message ApplicationSpec { // Increasing will increase the space used to store the history, so we do not recommend increasing it. // Default is 10. optional int64 revisionHistoryLimit = 7; - - // Sources is a reference to the location of the application's manifests or chart - repeated ApplicationSource sources = 8; } // ApplicationStatus contains status information for the application @@ -551,9 +484,6 @@ message ApplicationStatus { // ResourceHealthSource indicates where the resource health status is stored: inline if not set or appTree optional string resourceHealthSource = 11; - - // SourceTypes specifies the type of the sources included in the application - repeated string sourceTypes = 12; } // ApplicationSummary contains information about URLs and container images used by an application @@ -742,9 +672,6 @@ message ComparedTo { // Destination is a reference to the application's destination used for comparison optional ApplicationDestination destination = 2; - - // Sources is a reference to the application's multiple sources used for comparison - repeated ApplicationSource sources = 3; } // ComponentParameter contains information about component parameter value @@ -849,8 +776,6 @@ message GitGenerator { optional int64 requeueAfterSeconds = 5; optional ApplicationSetTemplate template = 6; - - optional string pathParamPrefix = 7; } // GnuPGPublicKey is a representation of a GnuPG public key @@ -1001,12 +926,6 @@ message ListGenerator { optional ApplicationSetTemplate template = 2; } -message ManagedNamespaceMetadata { - map labels = 1; - - map annotations = 2; -} - // MatrixGenerator generates the cartesian product of two sets of parameters. The parameters are defined by two nested // generators. message MatrixGenerator { @@ -1254,14 +1173,6 @@ message PullRequestGeneratorGithub { repeated string labels = 6; } -message RefTarget { - optional Repository repo = 1; - - optional string targetRevision = 2; - - optional string chart = 3; -} - // RepoCreds holds the definition for repository credentials message RepoCreds { // URL is the URL that this credentials matches to @@ -1299,12 +1210,6 @@ message RepoCreds { // Type specifies the type of the repoCreds. Can be either "git" or "helm. "git" is assumed if empty or absent. optional string type = 12; - - // GCPServiceAccountKey specifies the service account key in JSON format to be used for getting credentials to Google Cloud Source repos - optional string gcpServiceAccountKey = 13; - - // Proxy specifies the HTTP/HTTPS proxy used to access repos at the repo server - optional string proxy = 19; } // RepositoryList is a collection of Repositories. @@ -1376,9 +1281,6 @@ message Repository { // Reference between project and repository that allow you automatically to be added as item inside SourceRepos project entity optional string project = 20; - - // GCPServiceAccountKey specifies the service account key in JSON format to be used for getting credentials to Google Cloud Source repos - optional string gcpServiceAccountKey = 21; } // A RepositoryCertificate is either SSH known hosts entry or TLS certificate @@ -1652,12 +1554,6 @@ message RevisionHistory { // DeployStartedAt holds the time the sync operation started optional k8s.io.apimachinery.pkg.apis.meta.v1.Time deployStartedAt = 7; - - // Sources is a reference to the application sources used for the sync operation - repeated ApplicationSource sources = 8; - - // Revisions holds the revision of each source in sources field the sync was performed against - repeated string revisions = 9; } // RevisionMetadata contains metadata for a specific revision in a Git repository @@ -1675,6 +1571,7 @@ message RevisionMetadata { repeated string tags = 3; // Message contains the message associated with the revision, most likely the commit message. + // The message is truncated to the first newline or 64 characters (which ever comes first) optional string message = 4; // SignatureInfo contains a hint on the signer if the revision was signed with GPG, and signature verification is enabled. @@ -1871,14 +1768,6 @@ message SyncOperation { // SyncOptions provide per-sync sync-options, e.g. Validate=false repeated string syncOptions = 9; - - // Sources overrides the source definition set in the application. - // This is typically set in a Rollback operation and is nil during a Sync operation - repeated ApplicationSource sources = 10; - - // Revisions is the list of revision (Git) or chart version (Helm) which to sync each source in sources field for the application to - // If omitted, will use the revision specified in app spec. - repeated string revisions = 11; } // SyncOperationResource contains resources to sync. @@ -1902,12 +1791,6 @@ message SyncOperationResult { // Source records the application source information of the sync, used for comparing auto-sync optional ApplicationSource source = 3; - - // Source records the application source information of the sync, used for comparing auto-sync - repeated ApplicationSource sources = 4; - - // Revisions holds the revision this sync operation was performed for respective indexed source in sources field - repeated string revisions = 5; } // SyncPolicy controls when a sync will be performed in response to updates in git @@ -1920,9 +1803,6 @@ message SyncPolicy { // Retry controls failed sync retry behavior optional RetryStrategy retry = 3; - - // ManagedNamespaceMetadata controls metadata in the given namespace (if CreateNamespace=true) - optional ManagedNamespaceMetadata managedNamespaceMetadata = 4; } // SyncPolicyAutomated controls the behavior of an automated sync @@ -1947,9 +1827,6 @@ message SyncStatus { // Revision contains information about the revision the comparison has been performed to optional string revision = 3; - - // Revisions contains information about the revisions of multiple sources the comparison has been performed to - repeated string revisions = 4; } // SyncStrategy controls the manner in which a sync is performed diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index 17fbea6cf9e11..c6a3a589b7c8d 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -23,18 +23,13 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationCondition": schema_pkg_apis_application_v1alpha1_ApplicationCondition(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationDestination": schema_pkg_apis_application_v1alpha1_ApplicationDestination(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationList": schema_pkg_apis_application_v1alpha1_ApplicationList(ref), - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationMatchExpression": schema_pkg_apis_application_v1alpha1_ApplicationMatchExpression(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSet": schema_pkg_apis_application_v1alpha1_ApplicationSet(ref), - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetApplicationStatus": schema_pkg_apis_application_v1alpha1_ApplicationSetApplicationStatus(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetCondition": schema_pkg_apis_application_v1alpha1_ApplicationSetCondition(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetGenerator": schema_pkg_apis_application_v1alpha1_ApplicationSetGenerator(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetList": schema_pkg_apis_application_v1alpha1_ApplicationSetList(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetNestedGenerator": schema_pkg_apis_application_v1alpha1_ApplicationSetNestedGenerator(ref), - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetRolloutStep": schema_pkg_apis_application_v1alpha1_ApplicationSetRolloutStep(ref), - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetRolloutStrategy": schema_pkg_apis_application_v1alpha1_ApplicationSetRolloutStrategy(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetSpec": schema_pkg_apis_application_v1alpha1_ApplicationSetSpec(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetStatus": schema_pkg_apis_application_v1alpha1_ApplicationSetStatus(ref), - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetStrategy": schema_pkg_apis_application_v1alpha1_ApplicationSetStrategy(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetSyncPolicy": schema_pkg_apis_application_v1alpha1_ApplicationSetSyncPolicy(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetTemplate": schema_pkg_apis_application_v1alpha1_ApplicationSetTemplate(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetTemplateMeta": schema_pkg_apis_application_v1alpha1_ApplicationSetTemplateMeta(ref), @@ -45,7 +40,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourceJsonnet": schema_pkg_apis_application_v1alpha1_ApplicationSourceJsonnet(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourceKustomize": schema_pkg_apis_application_v1alpha1_ApplicationSourceKustomize(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourcePlugin": schema_pkg_apis_application_v1alpha1_ApplicationSourcePlugin(ref), - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourcePluginParameter": schema_pkg_apis_application_v1alpha1_ApplicationSourcePluginParameter(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSpec": schema_pkg_apis_application_v1alpha1_ApplicationSpec(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationStatus": schema_pkg_apis_application_v1alpha1_ApplicationStatus(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSummary": schema_pkg_apis_application_v1alpha1_ApplicationSummary(ref), @@ -86,7 +80,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.KnownTypeField": schema_pkg_apis_application_v1alpha1_KnownTypeField(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.KustomizeOptions": schema_pkg_apis_application_v1alpha1_KustomizeOptions(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ListGenerator": schema_pkg_apis_application_v1alpha1_ListGenerator(ref), - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ManagedNamespaceMetadata": schema_pkg_apis_application_v1alpha1_ManagedNamespaceMetadata(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.MatrixGenerator": schema_pkg_apis_application_v1alpha1_MatrixGenerator(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.MergeGenerator": schema_pkg_apis_application_v1alpha1_MergeGenerator(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.NestedMatrixGenerator": schema_pkg_apis_application_v1alpha1_NestedMatrixGenerator(ref), @@ -104,7 +97,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.PullRequestGeneratorGitLab": schema_pkg_apis_application_v1alpha1_PullRequestGeneratorGitLab(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.PullRequestGeneratorGitea": schema_pkg_apis_application_v1alpha1_PullRequestGeneratorGitea(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.PullRequestGeneratorGithub": schema_pkg_apis_application_v1alpha1_PullRequestGeneratorGithub(ref), - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.RefTarget": schema_pkg_apis_application_v1alpha1_RefTarget(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.RepoCreds": schema_pkg_apis_application_v1alpha1_RepoCreds(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.RepoCredsList": schema_pkg_apis_application_v1alpha1_RepoCredsList(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.Repository": schema_pkg_apis_application_v1alpha1_Repository(ref), @@ -656,44 +648,6 @@ func schema_pkg_apis_application_v1alpha1_ApplicationList(ref common.ReferenceCa } } -func schema_pkg_apis_application_v1alpha1_ApplicationMatchExpression(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "key": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "operator": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "values": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - }, - }, - }, - } -} - func schema_pkg_apis_application_v1alpha1_ApplicationSet(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -742,52 +696,6 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSet(ref common.ReferenceCal } } -func schema_pkg_apis_application_v1alpha1_ApplicationSetApplicationStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ApplicationSetApplicationStatus contains details about each Application managed by the ApplicationSet", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "application": { - SchemaProps: spec.SchemaProps{ - Description: "Application contains the name of the Application resource", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "lastTransitionTime": { - SchemaProps: spec.SchemaProps{ - Description: "LastTransitionTime is the time the status was last updated", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - "message": { - SchemaProps: spec.SchemaProps{ - Description: "Message contains human-readable message indicating details about the status", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Description: "Status contains the AppSet's perceived status of the managed Application resource: (Waiting, Pending, Progressing, Healthy)", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"application", "message", "status"}, - }, - }, - Dependencies: []string{ - "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, - } -} - func schema_pkg_apis_application_v1alpha1_ApplicationSetCondition(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -1015,65 +923,6 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSetNestedGenerator(ref comm } } -func schema_pkg_apis_application_v1alpha1_ApplicationSetRolloutStep(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "matchExpressions": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationMatchExpression"), - }, - }, - }, - }, - }, - "maxUpdate": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationMatchExpression", "k8s.io/apimachinery/pkg/util/intstr.IntOrString"}, - } -} - -func schema_pkg_apis_application_v1alpha1_ApplicationSetRolloutStrategy(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "steps": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetRolloutStep"), - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetRolloutStep"}, - } -} - func schema_pkg_apis_application_v1alpha1_ApplicationSetSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -1111,17 +960,12 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSetSpec(ref common.Referenc Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetSyncPolicy"), }, }, - "strategy": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetStrategy"), - }, - }, }, Required: []string{"generators", "template"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetGenerator", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetStrategy", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetSyncPolicy", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetTemplate"}, + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetGenerator", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetSyncPolicy", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetTemplate"}, } } @@ -1146,50 +990,11 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSetStatus(ref common.Refere }, }, }, - "applicationStatus": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetApplicationStatus"), - }, - }, - }, - }, - }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetApplicationStatus", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetCondition"}, - } -} - -func schema_pkg_apis_application_v1alpha1_ApplicationSetStrategy(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ApplicationSetStrategy configures how generated Applications are updated in sequence.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "type": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "rollingSync": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetRolloutStrategy"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetRolloutStrategy"}, + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetCondition"}, } } @@ -1415,13 +1220,6 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSource(ref common.Reference Format: "", }, }, - "ref": { - SchemaProps: spec.SchemaProps{ - Description: "Ref is reference to another source within sources field. This field will not be used if used with a `source` tag.", - Type: []string{"string"}, - Format: "", - }, - }, }, Required: []string{"repoURL"}, }, @@ -1752,81 +1550,11 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSourcePlugin(ref common.Ref }, }, }, - "parameters": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourcePluginParameter"), - }, - }, - }, - }, - }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourcePluginParameter", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.EnvEntry"}, - } -} - -func schema_pkg_apis_application_v1alpha1_ApplicationSourcePluginParameter(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Description: "Name is the name identifying a parameter.", - Type: []string{"string"}, - Format: "", - }, - }, - "string": { - SchemaProps: spec.SchemaProps{ - Description: "String_ is the value of a string type parameter.", - Type: []string{"string"}, - Format: "", - }, - }, - "map": { - SchemaProps: spec.SchemaProps{ - Description: "Map is the value of a map type parameter.", - Type: []string{"object"}, - AdditionalProperties: &spec.SchemaOrBool{ - Allows: true, - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "array": { - SchemaProps: spec.SchemaProps{ - Description: "Array is the value of an array type parameter.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - }, - }, - }, + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.EnvEntry"}, } } @@ -1840,6 +1568,7 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSpec(ref common.ReferenceCa "source": { SchemaProps: spec.SchemaProps{ Description: "Source is a reference to the location of the application's manifests or chart", + Default: map[string]interface{}{}, Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSource"), }, }, @@ -1899,22 +1628,8 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSpec(ref common.ReferenceCa Format: "int64", }, }, - "sources": { - SchemaProps: spec.SchemaProps{ - Description: "Sources is a reference to the location of the application's manifests or chart", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSource"), - }, - }, - }, - }, - }, }, - Required: []string{"destination", "project"}, + Required: []string{"source", "destination", "project"}, }, }, Dependencies: []string{ @@ -2024,21 +1739,6 @@ func schema_pkg_apis_application_v1alpha1_ApplicationStatus(ref common.Reference Format: "", }, }, - "sourceTypes": { - SchemaProps: spec.SchemaProps{ - Description: "SourceTypes specifies the type of the sources included in the application", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, }, }, }, @@ -2666,22 +2366,8 @@ func schema_pkg_apis_application_v1alpha1_ComparedTo(ref common.ReferenceCallbac Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationDestination"), }, }, - "sources": { - SchemaProps: spec.SchemaProps{ - Description: "Sources is a reference to the application's multiple sources used for comparison", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSource"), - }, - }, - }, - }, - }, }, - Required: []string{"destination"}, + Required: []string{"source", "destination"}, }, }, Dependencies: []string{ @@ -3064,12 +2750,6 @@ func schema_pkg_apis_application_v1alpha1_GitGenerator(ref common.ReferenceCallb Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetTemplate"), }, }, - "pathParamPrefix": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, }, Required: []string{"repoURL", "revision"}, }, @@ -3602,48 +3282,6 @@ func schema_pkg_apis_application_v1alpha1_ListGenerator(ref common.ReferenceCall } } -func schema_pkg_apis_application_v1alpha1_ManagedNamespaceMetadata(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "labels": { - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - AdditionalProperties: &spec.SchemaOrBool{ - Allows: true, - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "annotations": { - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - AdditionalProperties: &spec.SchemaOrBool{ - Allows: true, - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - }, - }, - }, - } -} - func schema_pkg_apis_application_v1alpha1_MatrixGenerator(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -4447,41 +4085,6 @@ func schema_pkg_apis_application_v1alpha1_PullRequestGeneratorGithub(ref common. } } -func schema_pkg_apis_application_v1alpha1_RefTarget(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "Repo": { - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.Repository"), - }, - }, - "TargetRevision": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "Chart": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"Repo", "TargetRevision", "Chart"}, - }, - }, - Dependencies: []string{ - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.Repository"}, - } -} - func schema_pkg_apis_application_v1alpha1_RepoCreds(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -4574,20 +4177,6 @@ func schema_pkg_apis_application_v1alpha1_RepoCreds(ref common.ReferenceCallback Format: "", }, }, - "gcpServiceAccountKey": { - SchemaProps: spec.SchemaProps{ - Description: "GCPServiceAccountKey specifies the service account key in JSON format to be used for getting credentials to Google Cloud Source repos", - Type: []string{"string"}, - Format: "", - }, - }, - "proxy": { - SchemaProps: spec.SchemaProps{ - Description: "Proxy specifies the HTTP/HTTPS proxy used to access repos at the repo server", - Type: []string{"string"}, - Format: "", - }, - }, }, Required: []string{"url"}, }, @@ -4778,13 +4367,6 @@ func schema_pkg_apis_application_v1alpha1_Repository(ref common.ReferenceCallbac Format: "", }, }, - "gcpServiceAccountKey": { - SchemaProps: spec.SchemaProps{ - Description: "GCPServiceAccountKey specifies the service account key in JSON format to be used for getting credentials to Google Cloud Source repos", - Type: []string{"string"}, - Format: "", - }, - }, }, Required: []string{"repo"}, }, @@ -5728,6 +5310,7 @@ func schema_pkg_apis_application_v1alpha1_RevisionHistory(ref common.ReferenceCa "revision": { SchemaProps: spec.SchemaProps{ Description: "Revision holds the revision the sync was performed against", + Default: "", Type: []string{"string"}, Format: "", }, @@ -5760,37 +5343,8 @@ func schema_pkg_apis_application_v1alpha1_RevisionHistory(ref common.ReferenceCa Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, - "sources": { - SchemaProps: spec.SchemaProps{ - Description: "Sources is a reference to the application sources used for the sync operation", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSource"), - }, - }, - }, - }, - }, - "revisions": { - SchemaProps: spec.SchemaProps{ - Description: "Revisions holds the revision of each source in sources field the sync was performed against", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, }, - Required: []string{"deployedAt", "id"}, + Required: []string{"revision", "deployedAt", "id"}, }, }, Dependencies: []string{ @@ -5836,7 +5390,7 @@ func schema_pkg_apis_application_v1alpha1_RevisionMetadata(ref common.ReferenceC }, "message": { SchemaProps: spec.SchemaProps{ - Description: "Message contains the message associated with the revision, most likely the commit message.", + Description: "Message contains the message associated with the revision, most likely the commit message. The message is truncated to the first newline or 64 characters (which ever comes first)", Type: []string{"string"}, Format: "", }, @@ -6431,35 +5985,6 @@ func schema_pkg_apis_application_v1alpha1_SyncOperation(ref common.ReferenceCall }, }, }, - "sources": { - SchemaProps: spec.SchemaProps{ - Description: "Sources overrides the source definition set in the application. This is typically set in a Rollback operation and is nil during a Sync operation", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSource"), - }, - }, - }, - }, - }, - "revisions": { - SchemaProps: spec.SchemaProps{ - Description: "Revisions is the list of revision (Git) or chart version (Helm) which to sync each source in sources field for the application to If omitted, will use the revision specified in app spec.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, }, }, }, @@ -6543,35 +6068,6 @@ func schema_pkg_apis_application_v1alpha1_SyncOperationResult(ref common.Referen Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSource"), }, }, - "sources": { - SchemaProps: spec.SchemaProps{ - Description: "Source records the application source information of the sync, used for comparing auto-sync", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSource"), - }, - }, - }, - }, - }, - "revisions": { - SchemaProps: spec.SchemaProps{ - Description: "Revisions holds the revision this sync operation was performed for respective indexed source in sources field", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, }, Required: []string{"revision"}, }, @@ -6615,17 +6111,11 @@ func schema_pkg_apis_application_v1alpha1_SyncPolicy(ref common.ReferenceCallbac Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.RetryStrategy"), }, }, - "managedNamespaceMetadata": { - SchemaProps: spec.SchemaProps{ - Description: "ManagedNamespaceMetadata controls metadata in the given namespace (if CreateNamespace=true)", - Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ManagedNamespaceMetadata"), - }, - }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ManagedNamespaceMetadata", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.RetryStrategy", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.SyncPolicyAutomated"}, + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.RetryStrategy", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.SyncPolicyAutomated"}, } } @@ -6692,21 +6182,6 @@ func schema_pkg_apis_application_v1alpha1_SyncStatus(ref common.ReferenceCallbac Format: "", }, }, - "revisions": { - SchemaProps: spec.SchemaProps{ - Description: "Revisions contains information about the revisions of multiple sources the comparison has been performed to", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, }, Required: []string{"status"}, }, diff --git a/pkg/apis/application/v1alpha1/repository_types.go b/pkg/apis/application/v1alpha1/repository_types.go index 2104f2b141434..09d5f55cedb92 100644 --- a/pkg/apis/application/v1alpha1/repository_types.go +++ b/pkg/apis/application/v1alpha1/repository_types.go @@ -37,10 +37,6 @@ type RepoCreds struct { EnableOCI bool `json:"enableOCI,omitempty" protobuf:"bytes,11,opt,name=enableOCI"` // Type specifies the type of the repoCreds. Can be either "git" or "helm. "git" is assumed if empty or absent. Type string `json:"type,omitempty" protobuf:"bytes,12,opt,name=type"` - // GCPServiceAccountKey specifies the service account key in JSON format to be used for getting credentials to Google Cloud Source repos - GCPServiceAccountKey string `json:"gcpServiceAccountKey,omitempty" protobuf:"bytes,13,opt,name=gcpServiceAccountKey"` - // Proxy specifies the HTTP/HTTPS proxy used to access repos at the repo server - Proxy string `json:"proxy,omitempty" protobuf:"bytes,19,opt,name=proxy"` } // Repository is a repository holding application configurations @@ -86,8 +82,6 @@ type Repository struct { Proxy string `json:"proxy,omitempty" protobuf:"bytes,19,opt,name=proxy"` // Reference between project and repository that allow you automatically to be added as item inside SourceRepos project entity Project string `json:"project,omitempty" protobuf:"bytes,20,opt,name=project"` - // GCPServiceAccountKey specifies the service account key in JSON format to be used for getting credentials to Google Cloud Source repos - GCPServiceAccountKey string `json:"gcpServiceAccountKey,omitempty" protobuf:"bytes,21,opt,name=gcpServiceAccountKey"` } // IsInsecure returns true if the repository has been configured to skip server verification @@ -135,9 +129,6 @@ func (repo *Repository) CopyCredentialsFromRepo(source *Repository) { if repo.GitHubAppEnterpriseBaseURL == "" { repo.GitHubAppEnterpriseBaseURL = source.GitHubAppEnterpriseBaseURL } - if repo.GCPServiceAccountKey == "" { - repo.GCPServiceAccountKey = source.GCPServiceAccountKey - } } } @@ -171,12 +162,6 @@ func (repo *Repository) CopyCredentialsFrom(source *RepoCreds) { if repo.GitHubAppEnterpriseBaseURL == "" { repo.GitHubAppEnterpriseBaseURL = source.GitHubAppEnterpriseBaseURL } - if repo.GCPServiceAccountKey == "" { - repo.GCPServiceAccountKey = source.GCPServiceAccountKey - } - if repo.Proxy == "" { - repo.Proxy = source.Proxy - } } } @@ -194,9 +179,6 @@ func (repo *Repository) GetGitCreds(store git.CredsStore) git.Creds { if repo.GithubAppPrivateKey != "" && repo.GithubAppId != 0 && repo.GithubAppInstallationId != 0 { return git.NewGitHubAppCreds(repo.GithubAppId, repo.GithubAppInstallationId, repo.GithubAppPrivateKey, repo.GitHubAppEnterpriseBaseURL, repo.Repo, repo.TLSClientCertData, repo.TLSClientCertKey, repo.IsInsecure(), repo.Proxy, store) } - if repo.GCPServiceAccountKey != "" { - return git.NewGoogleCloudCreds(repo.GCPServiceAccountKey) - } return git.NopCreds{} } diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index 409489b14bb67..948e0e8e77c11 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -14,12 +14,11 @@ import ( "strconv" "strings" "time" - "unicode" "github.com/argoproj/gitops-engine/pkg/health" synccommon "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/ghodss/yaml" - "github.com/robfig/cron/v3" + "github.com/robfig/cron" log "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -33,10 +32,8 @@ import ( "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd/api" - "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/util/collections" "github.com/argoproj/argo-cd/v2/util/helm" - "github.com/argoproj/argo-cd/v2/util/security" ) // Application is a definition of Application resource. @@ -58,7 +55,7 @@ type Application struct { // ApplicationSpec represents desired application state. Contains link to repository with application definition and additional parameters link definition revision. type ApplicationSpec struct { // Source is a reference to the location of the application's manifests or chart - Source *ApplicationSource `json:"source,omitempty" protobuf:"bytes,1,opt,name=source"` + Source ApplicationSource `json:"source" protobuf:"bytes,1,opt,name=source"` // Destination is a reference to the target Kubernetes server and namespace Destination ApplicationDestination `json:"destination" protobuf:"bytes,2,name=destination"` // Project is a reference to the project this application belongs to. @@ -76,9 +73,6 @@ type ApplicationSpec struct { // Increasing will increase the space used to store the history, so we do not recommend increasing it. // Default is 10. RevisionHistoryLimit *int64 `json:"revisionHistoryLimit,omitempty" protobuf:"bytes,7,name=revisionHistoryLimit"` - - // Sources is a reference to the location of the application's manifests or chart - Sources ApplicationSources `json:"sources,omitempty" protobuf:"bytes,8,opt,name=sources"` } type TrackingMethod string @@ -176,44 +170,6 @@ type ApplicationSource struct { Plugin *ApplicationSourcePlugin `json:"plugin,omitempty" protobuf:"bytes,11,opt,name=plugin"` // Chart is a Helm chart name, and must be specified for applications sourced from a Helm repo. Chart string `json:"chart,omitempty" protobuf:"bytes,12,opt,name=chart"` - // Ref is reference to another source within sources field. This field will not be used if used with a `source` tag. - Ref string `json:"ref,omitempty" protobuf:"bytes,13,opt,name=ref"` -} - -// ApplicationSources contains list of required information about the sources of an application -type ApplicationSources []ApplicationSource - -func (a *ApplicationSpec) GetSource() ApplicationSource { - // if Application has multiple sources, return the first source in sources - if a.HasMultipleSources() { - return a.Sources[0] - } - if a.Source != nil { - return *a.Source - } - return ApplicationSource{} -} - -func (a *ApplicationSpec) GetSources() ApplicationSources { - if a.HasMultipleSources() { - return a.Sources - } - if a.Source != nil { - return ApplicationSources{*a.Source} - } - return ApplicationSources{} -} - -func (a *ApplicationSpec) HasMultipleSources() bool { - return a.Sources != nil && len(a.Sources) > 0 -} - -func (a *ApplicationSpec) GetSourcePtr() *ApplicationSource { - // if Application has multiple sources, return the first source in sources - if a.HasMultipleSources() { - return &a.Sources[0] - } - return a.Source } // AllowsConcurrentProcessing returns true if given application source can be processed concurrently @@ -269,14 +225,6 @@ const ( RefreshTypeHard RefreshType = "hard" ) -type RefTarget struct { - Repo Repository `protobuf:"bytes,1,opt,name=repo"` - TargetRevision string `protobuf:"bytes,2,opt,name=targetRevision"` - Chart string `protobuf:"bytes,3,opt,name=chart"` -} - -type RefTargetRevisionMapping map[string]*RefTarget - // ApplicationSourceHelm holds helm specific options type ApplicationSourceHelm struct { // ValuesFiles is a list of Helm value files to use when generating a template @@ -513,63 +461,10 @@ func (d *ApplicationSourceDirectory) IsZero() bool { return d == nil || !d.Recurse && d.Jsonnet.IsZero() } -type ApplicationSourcePluginParameter struct { - // Name is the name identifying a parameter. - Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` - // String_ is the value of a string type parameter. - String_ *string `json:"string,omitempty" protobuf:"bytes,5,opt,name=string"` - // Map is the value of a map type parameter. - Map map[string]string `json:"map,omitempty" protobuf:"bytes,3,rep,name=map"` - // Array is the value of an array type parameter. - Array []string `json:"array,omitempty" protobuf:"bytes,4,rep,name=array"` -} - -type ApplicationSourcePluginParameters []ApplicationSourcePluginParameter - -// Environ builds a list of environment variables to represent parameters sent to a plugin from the Application -// manifest. Parameters are represented as one large stringified JSON array (under `ARGOCD_APP_PARAMETERS`). They're -// also represented as individual environment variables, each variable's key being an escaped version of the parameter's -// name. -func (p ApplicationSourcePluginParameters) Environ() ([]string, error) { - out, err := json.Marshal(p) - if err != nil { - return nil, fmt.Errorf("failed to marshal plugin parameters: %w", err) - } - jsonParam := fmt.Sprintf("ARGOCD_APP_PARAMETERS=%s", string(out)) - - env := []string{jsonParam} - - for _, param := range p { - envBaseName := fmt.Sprintf("PARAM_%s", escaped(param.Name)) - if param.String_ != nil { - env = append(env, fmt.Sprintf("%s=%s", envBaseName, *param.String_)) - } - if param.Map != nil { - for key, value := range param.Map { - env = append(env, fmt.Sprintf("%s_%s=%s", envBaseName, escaped(key), value)) - } - } - if param.Array != nil { - for i, value := range param.Array { - env = append(env, fmt.Sprintf("%s_%d=%s", envBaseName, i, value)) - } - } - } - - return env, nil -} - -func escaped(paramName string) string { - newParamName := strings.ToUpper(paramName) - invalidParamCharRegex := regexp.MustCompile("[^A-Z0-9_]") - return invalidParamCharRegex.ReplaceAllString(newParamName, "_") -} - // ApplicationSourcePlugin holds options specific to config management plugins type ApplicationSourcePlugin struct { - Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` - Env `json:"env,omitempty" protobuf:"bytes,2,opt,name=env"` - Parameters ApplicationSourcePluginParameters `json:"parameters,omitempty" protobuf:"bytes,3,opt,name=parameters"` + Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` + Env `json:"env,omitempty" protobuf:"bytes,2,opt,name=env"` } // IsZero returns true if the ApplicationSourcePlugin is considered empty @@ -651,8 +546,6 @@ type ApplicationStatus struct { Summary ApplicationSummary `json:"summary,omitempty" protobuf:"bytes,10,opt,name=summary"` // ResourceHealthSource indicates where the resource health status is stored: inline if not set or appTree ResourceHealthSource ResourceHealthLocation `json:"resourceHealthSource,omitempty" protobuf:"bytes,11,opt,name=resourceHealthSource"` - // SourceTypes specifies the type of the sources included in the application - SourceTypes []ApplicationSourceType `json:"sourceTypes,omitempty" protobuf:"bytes,12,opt,name=sourceTypes"` } // JWTTokens represents a list of JWT tokens @@ -694,8 +587,6 @@ type SyncOperationResource struct { Kind string `json:"kind" protobuf:"bytes,2,opt,name=kind"` Name string `json:"name" protobuf:"bytes,3,opt,name=name"` Namespace string `json:"namespace,omitempty" protobuf:"bytes,4,opt,name=namespace"` - // nolint:govet - Exclude bool `json:"-"` } // RevisionHistories is a array of history, oldest first and newest last @@ -723,17 +614,6 @@ func (r SyncOperationResource) HasIdentity(name string, namespace string, gvk sc return false } -// Compare determines whether an app resource matches the resource filter during sync or wait. -func (r SyncOperationResource) Compare(name string, namespace string, gvk schema.GroupVersionKind) bool { - if (r.Group == "*" || gvk.Group == r.Group) && - (r.Kind == "*" || gvk.Kind == r.Kind) && - (r.Name == "*" || name == r.Name) && - (r.Namespace == "*" || r.Namespace == "" || namespace == r.Namespace) { - return true - } - return false -} - // SyncOperation contains details about a sync operation. type SyncOperation struct { // Revision is the revision (Git) or chart version (Helm) which to sync the application to @@ -754,12 +634,6 @@ type SyncOperation struct { Manifests []string `json:"manifests,omitempty" protobuf:"bytes,8,opt,name=manifests"` // SyncOptions provide per-sync sync-options, e.g. Validate=false SyncOptions SyncOptions `json:"syncOptions,omitempty" protobuf:"bytes,9,opt,name=syncOptions"` - // Sources overrides the source definition set in the application. - // This is typically set in a Rollback operation and is nil during a Sync operation - Sources ApplicationSources `json:"sources,omitempty" protobuf:"bytes,10,opt,name=sources"` - // Revisions is the list of revision (Git) or chart version (Helm) which to sync each source in sources field for the application to - // If omitted, will use the revision specified in app spec. - Revisions []string `json:"revisions,omitempty" protobuf:"bytes,11,opt,name=revisions"` } // IsApplyStrategy returns true if the sync strategy is "apply" @@ -824,11 +698,6 @@ func (o SyncOptions) HasOption(option string) bool { return false } -type ManagedNamespaceMetadata struct { - Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,1,opt,name=labels"` - Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,2,opt,name=annotations"` -} - // SyncPolicy controls when a sync will be performed in response to updates in git type SyncPolicy struct { // Automated will keep an application synced to the target revision @@ -837,8 +706,6 @@ type SyncPolicy struct { SyncOptions SyncOptions `json:"syncOptions,omitempty" protobuf:"bytes,2,opt,name=syncOptions"` // Retry controls failed sync retry behavior Retry *RetryStrategy `json:"retry,omitempty" protobuf:"bytes,3,opt,name=retry"` - // ManagedNamespaceMetadata controls metadata in the given namespace (if CreateNamespace=true) - ManagedNamespaceMetadata *ManagedNamespaceMetadata `json:"managedNamespaceMetadata,omitempty" protobuf:"bytes,4,opt,name=managedNamespaceMetadata"` } // IsZero returns true if the sync policy is empty @@ -968,6 +835,7 @@ type RevisionMetadata struct { // Floating tags can move from one revision to another Tags []string `json:"tags,omitempty" protobuf:"bytes,3,opt,name=tags"` // Message contains the message associated with the revision, most likely the commit message. + // The message is truncated to the first newline or 64 characters (which ever comes first) Message string `json:"message,omitempty" protobuf:"bytes,4,opt,name=message"` // SignatureInfo contains a hint on the signer if the revision was signed with GPG, and signature verification is enabled. SignatureInfo string `json:"signatureInfo,omitempty" protobuf:"bytes,5,opt,name=signatureInfo"` @@ -981,10 +849,6 @@ type SyncOperationResult struct { Revision string `json:"revision" protobuf:"bytes,2,opt,name=revision"` // Source records the application source information of the sync, used for comparing auto-sync Source ApplicationSource `json:"source,omitempty" protobuf:"bytes,3,opt,name=source"` - // Source records the application source information of the sync, used for comparing auto-sync - Sources ApplicationSources `json:"sources,omitempty" protobuf:"bytes,4,opt,name=sources"` - // Revisions holds the revision this sync operation was performed for respective indexed source in sources field - Revisions []string `json:"revisions,omitempty" protobuf:"bytes,5,opt,name=revisions"` } // ResourceResult holds the operation result details of a specific resource @@ -1047,7 +911,7 @@ func (r ResourceResults) PruningRequired() (num int) { // RevisionHistory contains history information about a previous sync type RevisionHistory struct { // Revision holds the revision the sync was performed against - Revision string `json:"revision,omitempty" protobuf:"bytes,2,opt,name=revision"` + Revision string `json:"revision" protobuf:"bytes,2,opt,name=revision"` // DeployedAt holds the time the sync operation completed DeployedAt metav1.Time `json:"deployedAt" protobuf:"bytes,4,opt,name=deployedAt"` // ID is an auto incrementing identifier of the RevisionHistory @@ -1056,10 +920,6 @@ type RevisionHistory struct { Source ApplicationSource `json:"source,omitempty" protobuf:"bytes,6,opt,name=source"` // DeployStartedAt holds the time the sync operation started DeployStartedAt *metav1.Time `json:"deployStartedAt,omitempty" protobuf:"bytes,7,opt,name=deployStartedAt"` - // Sources is a reference to the application sources used for the sync operation - Sources ApplicationSources `json:"sources,omitempty" protobuf:"bytes,8,opt,name=sources"` - // Revisions holds the revision of each source in sources field the sync was performed against - Revisions []string `json:"revisions,omitempty" protobuf:"bytes,9,opt,name=revisions"` } // ApplicationWatchEvent contains information about application change. @@ -1142,11 +1002,9 @@ type ApplicationCondition struct { // ComparedTo contains application source and target which was used for resources comparison type ComparedTo struct { // Source is a reference to the application's source used for comparison - Source ApplicationSource `json:"source,omitempty" protobuf:"bytes,1,opt,name=source"` + Source ApplicationSource `json:"source" protobuf:"bytes,1,opt,name=source"` // Destination is a reference to the application's destination used for comparison Destination ApplicationDestination `json:"destination" protobuf:"bytes,2,opt,name=destination"` - // Sources is a reference to the application's multiple sources used for comparison - Sources ApplicationSources `json:"sources,omitempty" protobuf:"bytes,3,opt,name=sources"` } // SyncStatus contains information about the currently observed live and desired states of an application @@ -1157,8 +1015,6 @@ type SyncStatus struct { ComparedTo ComparedTo `json:"comparedTo,omitempty" protobuf:"bytes,2,opt,name=comparedTo"` // Revision contains information about the revision the comparison has been performed to Revision string `json:"revision,omitempty" protobuf:"bytes,3,opt,name=revision"` - // Revisions contains information about the revisions of multiple sources the comparison has been performed to - Revisions []string `json:"revisions,omitempty" protobuf:"bytes,4,opt,name=revisions"` } // HealthStatus contains information about the currently observed health state of an application or resource @@ -1249,7 +1105,7 @@ func (t *ApplicationTree) FindNode(group string, kind string, namespace string, } // TODO: Document purpose of this method -func (t *ApplicationTree) GetSummary(app *Application) ApplicationSummary { +func (t *ApplicationTree) GetSummary() ApplicationSummary { urlsSet := make(map[string]bool) imagesSet := make(map[string]bool) for _, node := range t.Nodes { @@ -1262,12 +1118,6 @@ func (t *ApplicationTree) GetSummary(app *Application) ApplicationSummary { imagesSet[image] = true } } - // also add Application's own links - for k, v := range app.GetAnnotations() { - if strings.HasPrefix(k, common.AnnotationKeyLinkPrefix) { - urlsSet[v] = true - } - } urls := make([]string, 0) for url := range urlsSet { urls = append(urls, url) @@ -1762,7 +1612,6 @@ func validateRoleName(name string) error { var invalidChars = regexp.MustCompile("[\"\n\r\t]") func validateGroupName(name string) error { - n := []rune(name) name = strings.TrimSpace(name) if len(name) > 1 && strings.HasPrefix(name, "\"") && strings.HasSuffix(name, "\"") { // Remove surrounding quotes for further inspection of the group name @@ -1770,18 +1619,13 @@ func validateGroupName(name string) error { } else if strings.Contains(name, ",") { return status.Errorf(codes.InvalidArgument, "group '%s' must be quoted", name) } + if name == "" { return status.Errorf(codes.InvalidArgument, "group '%s' is empty", name) } if invalidChars.MatchString(name) { return status.Errorf(codes.InvalidArgument, "group '%s' contains invalid characters", name) } - if len(n) > 1 && unicode.IsSpace(n[0]) { - return status.Errorf(codes.InvalidArgument, "group '%s' contains a leading space", name) - } - if len(n) > 1 && unicode.IsSpace(n[len(n)-1]) { - return status.Errorf(codes.InvalidArgument, "group '%s' contains a trailing space", name) - } return nil } @@ -2277,6 +2121,7 @@ func (app *Application) IsRefreshRequested() (RefreshType, bool) { if annotations == nil { return refreshType, false } + typeStr, ok := annotations[AnnotationKeyRefresh] if !ok { return refreshType, false @@ -2285,6 +2130,7 @@ func (app *Application) IsRefreshRequested() (RefreshType, bool) { if typeStr == string(RefreshTypeHard) { refreshType = RefreshTypeHard } + return refreshType, true } @@ -2716,5 +2562,9 @@ func (a *Application) QualifiedName() string { // RBACName returns the full qualified RBAC resource name for the application // in a backwards-compatible way. func (a *Application) RBACName(defaultNS string) string { - return security.AppRBACName(defaultNS, a.Spec.GetProject(), a.Namespace, a.Name) + if defaultNS != "" && a.Namespace != defaultNS && a.Namespace != "" { + return fmt.Sprintf("%s/%s/%s", a.Spec.GetProject(), a.Namespace, a.Name) + } else { + return fmt.Sprintf("%s/%s", a.Spec.GetProject(), a.Name) + } } diff --git a/pkg/apis/application/v1alpha1/types_test.go b/pkg/apis/application/v1alpha1/types_test.go index 17f6982581db3..bf7cd8e85d4ce 100644 --- a/pkg/apis/application/v1alpha1/types_test.go +++ b/pkg/apis/application/v1alpha1/types_test.go @@ -1,7 +1,6 @@ package v1alpha1 import ( - "encoding/json" "errors" fmt "fmt" "os" @@ -12,7 +11,6 @@ import ( "time" argocdcommon "github.com/argoproj/argo-cd/v2/common" - "github.com/stretchr/testify/require" "k8s.io/utils/pointer" "github.com/argoproj/gitops-engine/pkg/sync/common" @@ -64,47 +62,6 @@ func TestAppProject_IsSourcePermitted(t *testing.T) { } } -func TestAppProject_IsNegatedSourcePermitted(t *testing.T) { - testData := []struct { - projSources []string - appSource string - isPermitted bool - }{{ - projSources: []string{"!https://github.com/argoproj/test.git"}, appSource: "https://github.com/argoproj/test.git", isPermitted: false, - }, { - projSources: []string{"!ssh://git@GITHUB.com:argoproj/test"}, appSource: "ssh://git@github.com:argoproj/test", isPermitted: false, - }, { - projSources: []string{"!https://github.com/argoproj/*"}, appSource: "https://github.com/argoproj/argoproj.git", isPermitted: false, - }, { - projSources: []string{"https://github.com/test1/test.git", "!https://github.com/test2/test.git"}, appSource: "https://github.com/test2/test.git", isPermitted: false, - }, { - projSources: []string{"!https://github.com/argoproj/foo*"}, appSource: "https://github.com/argoproj/foo1", isPermitted: false, - }, { - projSources: []string{"!https://gitlab.com/group/*/*"}, appSource: "https://gitlab.com/group/repo/owner", isPermitted: false, - }, { - projSources: []string{"!https://gitlab.com/group/*/*/*"}, appSource: "https://gitlab.com/group/sub-group/repo/owner", isPermitted: false, - }, { - projSources: []string{"!https://gitlab.com/group/**"}, appSource: "https://gitlab.com/group/sub-group/repo/owner", isPermitted: false, - }, { - projSources: []string{"*"}, appSource: "https://github.com/argoproj/test.git", isPermitted: true, - }, { - projSources: []string{"https://github.com/argoproj/test1.git", "*"}, appSource: "https://github.com/argoproj/test2.git", isPermitted: true, - }, { - projSources: []string{"!https://github.com/argoproj/*.git", "*"}, appSource: "https://github.com/argoproj1/test2.git", isPermitted: true, - }} - - for _, data := range testData { - proj := AppProject{ - Spec: AppProjectSpec{ - SourceRepos: data.projSources, - }, - } - assert.Equal(t, proj.IsSourcePermitted(ApplicationSource{ - RepoURL: data.appSource, - }), data.isPermitted) - } -} - func TestAppProject_IsDestinationPermitted(t *testing.T) { testData := []struct { projDest []ApplicationDestination @@ -550,29 +507,6 @@ func newTestProject() *AppProject { return &p } -// TestAppProject_ValidateSources tests for an invalid source -func TestAppProject_ValidateSources(t *testing.T) { - p := newTestProject() - err := p.ValidateProject() - assert.NoError(t, err) - badSources := []string{ - "!*", - } - for _, badName := range badSources { - p.Spec.SourceRepos = []string{badName} - err = p.ValidateProject() - assert.Error(t, err) - } - - duplicateSources := []string{ - "foo", - "foo", - } - p.Spec.SourceRepos = duplicateSources - err = p.ValidateProject() - assert.Error(t, err) -} - // TestAppProject_ValidateDestinations tests for an invalid destination func TestAppProject_ValidateDestinations(t *testing.T) { p := newTestProject() @@ -717,8 +651,6 @@ func TestAppProject_ValidateGroupName(t *testing.T) { "my,group", "my\ngroup", "my\rgroup", - " my:group", - "my:group ", } for _, badName := range badGroupNames { p.Spec.Roles[0].Groups = []string{badName} @@ -3003,7 +2935,7 @@ func Test_validateGroupName(t *testing.T) { {"Normal group name", "foo", true}, {"Quoted with commas", "\"foo,bar,baz\"", true}, {"Quoted without commas", "\"foo\"", true}, - {"Quoted with leading and trailing whitespace", " \"foo\" ", false}, + {"Quoted with leading and trailing whitespace", " \"foo\" ", true}, {"Empty group name", "", false}, {"Empty group name with quotes", "\"\"", false}, {"Unquoted with comma", "foo,bar,baz", false}, @@ -3224,180 +3156,3 @@ func Test_RBACName(t *testing.T) { assert.Equal(t, "default/test-app", a.RBACName("argocd")) }) } - -func TestGetSummary(t *testing.T) { - tree := ApplicationTree{} - app := newTestApp() - - summary := tree.GetSummary(app) - assert.Equal(t, len(summary.ExternalURLs), 0) - - const annotationName = argocdcommon.AnnotationKeyLinkPrefix + "/my-link" - const url = "https://example.com" - app.Annotations = make(map[string]string) - app.Annotations[annotationName] = url - - summary = tree.GetSummary(app) - assert.Equal(t, len(summary.ExternalURLs), 1) - assert.Equal(t, summary.ExternalURLs[0], url) -} - -func TestApplicationSourcePluginParameters_Environ_string(t *testing.T) { - params := ApplicationSourcePluginParameters{ - { - Name: "version", - String_: pointer.String("1.2.3"), - }, - } - environ, err := params.Environ() - require.NoError(t, err) - assert.Len(t, environ, 2) - assert.Contains(t, environ, "PARAM_VERSION=1.2.3") - paramsJson, err := json.Marshal(params) - require.NoError(t, err) - assert.Contains(t, environ, fmt.Sprintf("ARGOCD_APP_PARAMETERS=%s", paramsJson)) -} - -func TestApplicationSourcePluginParameters_Environ_array(t *testing.T) { - params := ApplicationSourcePluginParameters{ - { - Name: "dependencies", - Array: []string{"redis", "minio"}, - }, - } - environ, err := params.Environ() - require.NoError(t, err) - assert.Len(t, environ, 3) - assert.Contains(t, environ, "PARAM_DEPENDENCIES_0=redis") - assert.Contains(t, environ, "PARAM_DEPENDENCIES_1=minio") - paramsJson, err := json.Marshal(params) - require.NoError(t, err) - assert.Contains(t, environ, fmt.Sprintf("ARGOCD_APP_PARAMETERS=%s", paramsJson)) -} - -func TestApplicationSourcePluginParameters_Environ_map(t *testing.T) { - params := ApplicationSourcePluginParameters{ - { - Name: "helm-parameters", - Map: map[string]string{ - "image.repo": "quay.io/argoproj/argo-cd", - "image.tag": "v2.4.0", - }, - }, - } - environ, err := params.Environ() - require.NoError(t, err) - assert.Len(t, environ, 3) - assert.Contains(t, environ, "PARAM_HELM_PARAMETERS_IMAGE_REPO=quay.io/argoproj/argo-cd") - assert.Contains(t, environ, "PARAM_HELM_PARAMETERS_IMAGE_TAG=v2.4.0") - paramsJson, err := json.Marshal(params) - require.NoError(t, err) - assert.Contains(t, environ, fmt.Sprintf("ARGOCD_APP_PARAMETERS=%s", paramsJson)) -} - -func TestApplicationSourcePluginParameters_Environ_all(t *testing.T) { - // Technically there's no rule against specifying multiple types as values. It's up to the CMP how to handle them. - // Name collisions can happen for the convenience env vars. When in doubt, CMP authors should use the JSON env var. - params := ApplicationSourcePluginParameters{ - { - Name: "some-name", - String_: pointer.String("1.2.3"), - Array: []string{"redis", "minio"}, - Map: map[string]string{ - "image.repo": "quay.io/argoproj/argo-cd", - "image.tag": "v2.4.0", - }, - }, - } - environ, err := params.Environ() - require.NoError(t, err) - assert.Len(t, environ, 6) - assert.Contains(t, environ, "PARAM_SOME_NAME=1.2.3") - assert.Contains(t, environ, "PARAM_SOME_NAME_0=redis") - assert.Contains(t, environ, "PARAM_SOME_NAME_1=minio") - assert.Contains(t, environ, "PARAM_SOME_NAME_IMAGE_REPO=quay.io/argoproj/argo-cd") - assert.Contains(t, environ, "PARAM_SOME_NAME_IMAGE_TAG=v2.4.0") - paramsJson, err := json.Marshal(params) - require.NoError(t, err) - assert.Contains(t, environ, fmt.Sprintf("ARGOCD_APP_PARAMETERS=%s", paramsJson)) -} - -func getApplicationSpec() *ApplicationSpec { - return &ApplicationSpec{ - Source: &ApplicationSource{ - Path: "source", - }, Sources: ApplicationSources{ - { - Path: "sources/source1", - }, { - Path: "sources/source2", - }, - }, - } -} - -func TestGetSource(t *testing.T) { - tests := []struct { - name string - hasSources bool - hasSource bool - appSpec *ApplicationSpec - expectedSource ApplicationSource - }{ - {"GetSource with Source and Sources field present", true, true, getApplicationSpec(), ApplicationSource{Path: "sources/source1"}}, - {"GetSource with only Sources field", true, false, getApplicationSpec(), ApplicationSource{Path: "sources/source1"}}, - {"GetSource with only Source field", false, true, getApplicationSpec(), ApplicationSource{Path: "source"}}, - {"GetSource with no Source and Sources field", false, false, getApplicationSpec(), ApplicationSource{}}, - } - for _, testCase := range tests { - testCopy := testCase - t.Run(testCopy.name, func(t *testing.T) { - t.Parallel() - if !testCopy.hasSources { - testCopy.appSpec.Sources = nil - } - if !testCopy.hasSource { - testCopy.appSpec.Source = nil - } - source := testCopy.appSpec.GetSource() - assert.Equal(t, testCopy.expectedSource, source) - }) - } -} - -func TestGetSources(t *testing.T) { - tests := []struct { - name string - hasSources bool - hasSource bool - appSpec *ApplicationSpec - expectedSources ApplicationSources - }{ - {"GetSources with Source and Sources field present", true, true, getApplicationSpec(), ApplicationSources{ - {Path: "sources/source1"}, - {Path: "sources/source2"}, - }}, - {"GetSources with only Sources field", true, false, getApplicationSpec(), ApplicationSources{ - {Path: "sources/source1"}, - {Path: "sources/source2"}, - }}, - {"GetSources with only Source field", false, true, getApplicationSpec(), ApplicationSources{ - {Path: "source"}, - }}, - {"GetSources with no Source and Sources field", false, false, getApplicationSpec(), ApplicationSources{}}, - } - for _, testCase := range tests { - testCopy := testCase - t.Run(testCopy.name, func(t *testing.T) { - t.Parallel() - if !testCopy.hasSources { - testCopy.appSpec.Sources = nil - } - if !testCopy.hasSource { - testCopy.appSpec.Source = nil - } - sources := testCopy.appSpec.GetSources() - assert.Equal(t, testCopy.expectedSources, sources) - }) - } -} diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go index 15cc07f3c19f3..ef7b43bf4869d 100644 --- a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go @@ -10,7 +10,6 @@ import ( apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" - intstr "k8s.io/apimachinery/pkg/util/intstr" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -294,27 +293,6 @@ func (in *ApplicationList) DeepCopyObject() runtime.Object { return nil } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ApplicationMatchExpression) DeepCopyInto(out *ApplicationMatchExpression) { - *out = *in - if in.Values != nil { - in, out := &in.Values, &out.Values - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationMatchExpression. -func (in *ApplicationMatchExpression) DeepCopy() *ApplicationMatchExpression { - if in == nil { - return nil - } - out := new(ApplicationMatchExpression) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationSet) DeepCopyInto(out *ApplicationSet) { *out = *in @@ -343,26 +321,6 @@ func (in *ApplicationSet) DeepCopyObject() runtime.Object { return nil } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ApplicationSetApplicationStatus) DeepCopyInto(out *ApplicationSetApplicationStatus) { - *out = *in - if in.LastTransitionTime != nil { - in, out := &in.LastTransitionTime, &out.LastTransitionTime - *out = (*in).DeepCopy() - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSetApplicationStatus. -func (in *ApplicationSetApplicationStatus) DeepCopy() *ApplicationSetApplicationStatus { - if in == nil { - return nil - } - out := new(ApplicationSetApplicationStatus) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationSetCondition) DeepCopyInto(out *ApplicationSetCondition) { *out = *in @@ -560,57 +518,6 @@ func (in ApplicationSetNestedGenerators) DeepCopy() ApplicationSetNestedGenerato return *out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ApplicationSetRolloutStep) DeepCopyInto(out *ApplicationSetRolloutStep) { - *out = *in - if in.MatchExpressions != nil { - in, out := &in.MatchExpressions, &out.MatchExpressions - *out = make([]ApplicationMatchExpression, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.MaxUpdate != nil { - in, out := &in.MaxUpdate, &out.MaxUpdate - *out = new(intstr.IntOrString) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSetRolloutStep. -func (in *ApplicationSetRolloutStep) DeepCopy() *ApplicationSetRolloutStep { - if in == nil { - return nil - } - out := new(ApplicationSetRolloutStep) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ApplicationSetRolloutStrategy) DeepCopyInto(out *ApplicationSetRolloutStrategy) { - *out = *in - if in.Steps != nil { - in, out := &in.Steps, &out.Steps - *out = make([]ApplicationSetRolloutStep, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSetRolloutStrategy. -func (in *ApplicationSetRolloutStrategy) DeepCopy() *ApplicationSetRolloutStrategy { - if in == nil { - return nil - } - out := new(ApplicationSetRolloutStrategy) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationSetSpec) DeepCopyInto(out *ApplicationSetSpec) { *out = *in @@ -627,11 +534,6 @@ func (in *ApplicationSetSpec) DeepCopyInto(out *ApplicationSetSpec) { *out = new(ApplicationSetSyncPolicy) **out = **in } - if in.Strategy != nil { - in, out := &in.Strategy, &out.Strategy - *out = new(ApplicationSetStrategy) - (*in).DeepCopyInto(*out) - } return } @@ -655,13 +557,6 @@ func (in *ApplicationSetStatus) DeepCopyInto(out *ApplicationSetStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - if in.ApplicationStatus != nil { - in, out := &in.ApplicationStatus, &out.ApplicationStatus - *out = make([]ApplicationSetApplicationStatus, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } return } @@ -675,27 +570,6 @@ func (in *ApplicationSetStatus) DeepCopy() *ApplicationSetStatus { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ApplicationSetStrategy) DeepCopyInto(out *ApplicationSetStrategy) { - *out = *in - if in.RollingSync != nil { - in, out := &in.RollingSync, &out.RollingSync - *out = new(ApplicationSetRolloutStrategy) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSetStrategy. -func (in *ApplicationSetStrategy) DeepCopy() *ApplicationSetStrategy { - if in == nil { - return nil - } - out := new(ApplicationSetStrategy) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationSetSyncPolicy) DeepCopyInto(out *ApplicationSetSyncPolicy) { *out = *in @@ -997,13 +871,6 @@ func (in *ApplicationSourcePlugin) DeepCopyInto(out *ApplicationSourcePlugin) { } } } - if in.Parameters != nil { - in, out := &in.Parameters, &out.Parameters - *out = make(ApplicationSourcePluginParameters, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } return } @@ -1017,91 +884,10 @@ func (in *ApplicationSourcePlugin) DeepCopy() *ApplicationSourcePlugin { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ApplicationSourcePluginParameter) DeepCopyInto(out *ApplicationSourcePluginParameter) { - *out = *in - if in.String_ != nil { - in, out := &in.String_, &out.String_ - *out = new(string) - **out = **in - } - if in.Map != nil { - in, out := &in.Map, &out.Map - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Array != nil { - in, out := &in.Array, &out.Array - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSourcePluginParameter. -func (in *ApplicationSourcePluginParameter) DeepCopy() *ApplicationSourcePluginParameter { - if in == nil { - return nil - } - out := new(ApplicationSourcePluginParameter) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in ApplicationSourcePluginParameters) DeepCopyInto(out *ApplicationSourcePluginParameters) { - { - in := &in - *out = make(ApplicationSourcePluginParameters, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - return - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSourcePluginParameters. -func (in ApplicationSourcePluginParameters) DeepCopy() ApplicationSourcePluginParameters { - if in == nil { - return nil - } - out := new(ApplicationSourcePluginParameters) - in.DeepCopyInto(out) - return *out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in ApplicationSources) DeepCopyInto(out *ApplicationSources) { - { - in := &in - *out = make(ApplicationSources, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - return - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSources. -func (in ApplicationSources) DeepCopy() ApplicationSources { - if in == nil { - return nil - } - out := new(ApplicationSources) - in.DeepCopyInto(out) - return *out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationSpec) DeepCopyInto(out *ApplicationSpec) { *out = *in - if in.Source != nil { - in, out := &in.Source, &out.Source - *out = new(ApplicationSource) - (*in).DeepCopyInto(*out) - } + in.Source.DeepCopyInto(&out.Source) out.Destination = in.Destination if in.SyncPolicy != nil { in, out := &in.SyncPolicy, &out.SyncPolicy @@ -1125,13 +911,6 @@ func (in *ApplicationSpec) DeepCopyInto(out *ApplicationSpec) { *out = new(int64) **out = **in } - if in.Sources != nil { - in, out := &in.Sources, &out.Sources - *out = make(ApplicationSources, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } return } @@ -1185,11 +964,6 @@ func (in *ApplicationStatus) DeepCopyInto(out *ApplicationStatus) { *out = (*in).DeepCopy() } in.Summary.DeepCopyInto(&out.Summary) - if in.SourceTypes != nil { - in, out := &in.SourceTypes, &out.SourceTypes - *out = make([]ApplicationSourceType, len(*in)) - copy(*out, *in) - } return } @@ -1522,13 +1296,6 @@ func (in *ComparedTo) DeepCopyInto(out *ComparedTo) { *out = *in in.Source.DeepCopyInto(&out.Source) out.Destination = in.Destination - if in.Sources != nil { - in, out := &in.Sources, &out.Sources - *out = make(ApplicationSources, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } return } @@ -2070,36 +1837,6 @@ func (in *ListGenerator) DeepCopy() *ListGenerator { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ManagedNamespaceMetadata) DeepCopyInto(out *ManagedNamespaceMetadata) { - *out = *in - if in.Labels != nil { - in, out := &in.Labels, &out.Labels - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Annotations != nil { - in, out := &in.Annotations, &out.Annotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ManagedNamespaceMetadata. -func (in *ManagedNamespaceMetadata) DeepCopy() *ManagedNamespaceMetadata { - if in == nil { - return nil - } - out := new(ManagedNamespaceMetadata) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MatrixGenerator) DeepCopyInto(out *MatrixGenerator) { *out = *in @@ -2549,53 +2286,6 @@ func (in *PullRequestGeneratorGithub) DeepCopy() *PullRequestGeneratorGithub { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RefTarget) DeepCopyInto(out *RefTarget) { - *out = *in - in.Repo.DeepCopyInto(&out.Repo) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RefTarget. -func (in *RefTarget) DeepCopy() *RefTarget { - if in == nil { - return nil - } - out := new(RefTarget) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in RefTargetRevisionMapping) DeepCopyInto(out *RefTargetRevisionMapping) { - { - in := &in - *out = make(RefTargetRevisionMapping, len(*in)) - for key, val := range *in { - var outVal *RefTarget - if val == nil { - (*out)[key] = nil - } else { - in, out := &val, &outVal - *out = new(RefTarget) - (*in).DeepCopyInto(*out) - } - (*out)[key] = outVal - } - return - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RefTargetRevisionMapping. -func (in RefTargetRevisionMapping) DeepCopy() RefTargetRevisionMapping { - if in == nil { - return nil - } - out := new(RefTargetRevisionMapping) - in.DeepCopyInto(out) - return *out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RepoCreds) DeepCopyInto(out *RepoCreds) { *out = *in @@ -3117,18 +2807,6 @@ func (in *RevisionHistory) DeepCopyInto(out *RevisionHistory) { in, out := &in.DeployStartedAt, &out.DeployStartedAt *out = (*in).DeepCopy() } - if in.Sources != nil { - in, out := &in.Sources, &out.Sources - *out = make(ApplicationSources, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Revisions != nil { - in, out := &in.Revisions, &out.Revisions - *out = make([]string, len(*in)) - copy(*out, *in) - } return } @@ -3450,18 +3128,6 @@ func (in *SyncOperation) DeepCopyInto(out *SyncOperation) { *out = make(SyncOptions, len(*in)) copy(*out, *in) } - if in.Sources != nil { - in, out := &in.Sources, &out.Sources - *out = make(ApplicationSources, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Revisions != nil { - in, out := &in.Revisions, &out.Revisions - *out = make([]string, len(*in)) - copy(*out, *in) - } return } @@ -3506,18 +3172,6 @@ func (in *SyncOperationResult) DeepCopyInto(out *SyncOperationResult) { } } in.Source.DeepCopyInto(&out.Source) - if in.Sources != nil { - in, out := &in.Sources, &out.Sources - *out = make(ApplicationSources, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Revisions != nil { - in, out := &in.Revisions, &out.Revisions - *out = make([]string, len(*in)) - copy(*out, *in) - } return } @@ -3569,11 +3223,6 @@ func (in *SyncPolicy) DeepCopyInto(out *SyncPolicy) { *out = new(RetryStrategy) (*in).DeepCopyInto(*out) } - if in.ManagedNamespaceMetadata != nil { - in, out := &in.ManagedNamespaceMetadata, &out.ManagedNamespaceMetadata - *out = new(ManagedNamespaceMetadata) - (*in).DeepCopyInto(*out) - } return } @@ -3607,11 +3256,6 @@ func (in *SyncPolicyAutomated) DeepCopy() *SyncPolicyAutomated { func (in *SyncStatus) DeepCopyInto(out *SyncStatus) { *out = *in in.ComparedTo.DeepCopyInto(&out.ComparedTo) - if in.Revisions != nil { - in, out := &in.Revisions, &out.Revisions - *out = make([]string, len(*in)) - copy(*out, *in) - } return } diff --git a/reposerver/apiclient/mocks/RepoServerServiceClient.go b/reposerver/apiclient/mocks/RepoServerServiceClient.go index 8c6dcfaee2b72..d84edf791147c 100644 --- a/reposerver/apiclient/mocks/RepoServerServiceClient.go +++ b/reposerver/apiclient/mocks/RepoServerServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.1. DO NOT EDIT. +// Code generated by mockery v2.14.0. DO NOT EDIT. package mocks @@ -7,8 +7,6 @@ import ( apiclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient" - emptypb "google.golang.org/protobuf/types/known/emptypb" - grpc "google.golang.org/grpc" mock "github.com/stretchr/testify/mock" @@ -201,36 +199,6 @@ func (_m *RepoServerServiceClient) ListApps(ctx context.Context, in *apiclient.L return r0, r1 } -// ListPlugins provides a mock function with given fields: ctx, in, opts -func (_m *RepoServerServiceClient) ListPlugins(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*apiclient.PluginList, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - var r0 *apiclient.PluginList - if rf, ok := ret.Get(0).(func(context.Context, *emptypb.Empty, ...grpc.CallOption) *apiclient.PluginList); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*apiclient.PluginList) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, *emptypb.Empty, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // ListRefs provides a mock function with given fields: ctx, in, opts func (_m *RepoServerServiceClient) ListRefs(ctx context.Context, in *apiclient.ListRefsRequest, opts ...grpc.CallOption) (*apiclient.Refs, error) { _va := make([]interface{}, len(opts)) diff --git a/reposerver/apiclient/repository.pb.go b/reposerver/apiclient/repository.pb.go index f19807676943c..395053e10cd0f 100644 --- a/reposerver/apiclient/repository.pb.go +++ b/reposerver/apiclient/repository.pb.go @@ -11,7 +11,6 @@ import ( grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" io "io" math "math" math_bits "math/bits" @@ -45,17 +44,15 @@ type ManifestRequest struct { KubeVersion string `protobuf:"bytes,14,opt,name=kubeVersion,proto3" json:"kubeVersion,omitempty"` ApiVersions []string `protobuf:"bytes,15,rep,name=apiVersions,proto3" json:"apiVersions,omitempty"` // Request to verify the signature when generating the manifests (only for Git repositories) - VerifySignature bool `protobuf:"varint,16,opt,name=verifySignature,proto3" json:"verifySignature,omitempty"` - HelmRepoCreds []*v1alpha1.RepoCreds `protobuf:"bytes,17,rep,name=helmRepoCreds,proto3" json:"helmRepoCreds,omitempty"` - NoRevisionCache bool `protobuf:"varint,18,opt,name=noRevisionCache,proto3" json:"noRevisionCache,omitempty"` - TrackingMethod string `protobuf:"bytes,19,opt,name=trackingMethod,proto3" json:"trackingMethod,omitempty"` - EnabledSourceTypes map[string]bool `protobuf:"bytes,20,rep,name=enabledSourceTypes,proto3" json:"enabledSourceTypes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` - HelmOptions *v1alpha1.HelmOptions `protobuf:"bytes,21,opt,name=helmOptions,proto3" json:"helmOptions,omitempty"` - HasMultipleSources bool `protobuf:"varint,22,opt,name=hasMultipleSources,proto3" json:"hasMultipleSources,omitempty"` - RefSources map[string]*v1alpha1.RefTarget `protobuf:"bytes,23,rep,name=refSources,proto3" json:"refSources,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + VerifySignature bool `protobuf:"varint,16,opt,name=verifySignature,proto3" json:"verifySignature,omitempty"` + HelmRepoCreds []*v1alpha1.RepoCreds `protobuf:"bytes,17,rep,name=helmRepoCreds,proto3" json:"helmRepoCreds,omitempty"` + NoRevisionCache bool `protobuf:"varint,18,opt,name=noRevisionCache,proto3" json:"noRevisionCache,omitempty"` + TrackingMethod string `protobuf:"bytes,19,opt,name=trackingMethod,proto3" json:"trackingMethod,omitempty"` + EnabledSourceTypes map[string]bool `protobuf:"bytes,20,rep,name=enabledSourceTypes,proto3" json:"enabledSourceTypes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + HelmOptions *v1alpha1.HelmOptions `protobuf:"bytes,21,opt,name=helmOptions,proto3" json:"helmOptions,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ManifestRequest) Reset() { *m = ManifestRequest{} } @@ -217,20 +214,6 @@ func (m *ManifestRequest) GetHelmOptions() *v1alpha1.HelmOptions { return nil } -func (m *ManifestRequest) GetHasMultipleSources() bool { - if m != nil { - return m.HasMultipleSources - } - return false -} - -func (m *ManifestRequest) GetRefSources() map[string]*v1alpha1.RefTarget { - if m != nil { - return m.RefSources - } - return nil -} - type ManifestRequestWithFiles struct { // Types that are valid to be assigned to Part: // *ManifestRequestWithFiles_Request @@ -958,124 +941,28 @@ func (m *AppList) GetApps() map[string]string { return nil } -type PluginInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PluginInfo) Reset() { *m = PluginInfo{} } -func (m *PluginInfo) String() string { return proto.CompactTextString(m) } -func (*PluginInfo) ProtoMessage() {} -func (*PluginInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{13} -} -func (m *PluginInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PluginInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PluginInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PluginInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_PluginInfo.Merge(m, src) -} -func (m *PluginInfo) XXX_Size() int { - return m.Size() -} -func (m *PluginInfo) XXX_DiscardUnknown() { - xxx_messageInfo_PluginInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_PluginInfo proto.InternalMessageInfo - -func (m *PluginInfo) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// PluginList returns the list of all cmp v2 plugins running as sidecars -type PluginList struct { - Items []*PluginInfo `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PluginList) Reset() { *m = PluginList{} } -func (m *PluginList) String() string { return proto.CompactTextString(m) } -func (*PluginList) ProtoMessage() {} -func (*PluginList) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{14} -} -func (m *PluginList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PluginList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PluginList.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PluginList) XXX_Merge(src proto.Message) { - xxx_messageInfo_PluginList.Merge(m, src) -} -func (m *PluginList) XXX_Size() int { - return m.Size() -} -func (m *PluginList) XXX_DiscardUnknown() { - xxx_messageInfo_PluginList.DiscardUnknown(m) -} - -var xxx_messageInfo_PluginList proto.InternalMessageInfo - -func (m *PluginList) GetItems() []*PluginInfo { - if m != nil { - return m.Items - } - return nil -} - // RepoServerAppDetailsQuery contains query information for app details request type RepoServerAppDetailsQuery struct { - Repo *v1alpha1.Repository `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Source *v1alpha1.ApplicationSource `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` - Repos []*v1alpha1.Repository `protobuf:"bytes,3,rep,name=repos,proto3" json:"repos,omitempty"` - KustomizeOptions *v1alpha1.KustomizeOptions `protobuf:"bytes,4,opt,name=kustomizeOptions,proto3" json:"kustomizeOptions,omitempty"` - AppName string `protobuf:"bytes,5,opt,name=appName,proto3" json:"appName,omitempty"` - NoCache bool `protobuf:"varint,6,opt,name=noCache,proto3" json:"noCache,omitempty"` - NoRevisionCache bool `protobuf:"varint,7,opt,name=noRevisionCache,proto3" json:"noRevisionCache,omitempty"` - TrackingMethod string `protobuf:"bytes,8,opt,name=trackingMethod,proto3" json:"trackingMethod,omitempty"` - EnabledSourceTypes map[string]bool `protobuf:"bytes,9,rep,name=enabledSourceTypes,proto3" json:"enabledSourceTypes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` - HelmOptions *v1alpha1.HelmOptions `protobuf:"bytes,10,opt,name=helmOptions,proto3" json:"helmOptions,omitempty"` - RefSources map[string]*v1alpha1.RefTarget `protobuf:"bytes,11,rep,name=refSources,proto3" json:"refSources,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Repo *v1alpha1.Repository `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Source *v1alpha1.ApplicationSource `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` + Repos []*v1alpha1.Repository `protobuf:"bytes,3,rep,name=repos,proto3" json:"repos,omitempty"` + KustomizeOptions *v1alpha1.KustomizeOptions `protobuf:"bytes,4,opt,name=kustomizeOptions,proto3" json:"kustomizeOptions,omitempty"` + AppName string `protobuf:"bytes,5,opt,name=appName,proto3" json:"appName,omitempty"` + NoCache bool `protobuf:"varint,6,opt,name=noCache,proto3" json:"noCache,omitempty"` + NoRevisionCache bool `protobuf:"varint,7,opt,name=noRevisionCache,proto3" json:"noRevisionCache,omitempty"` + TrackingMethod string `protobuf:"bytes,8,opt,name=trackingMethod,proto3" json:"trackingMethod,omitempty"` + EnabledSourceTypes map[string]bool `protobuf:"bytes,9,rep,name=enabledSourceTypes,proto3" json:"enabledSourceTypes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + HelmOptions *v1alpha1.HelmOptions `protobuf:"bytes,10,opt,name=helmOptions,proto3" json:"helmOptions,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RepoServerAppDetailsQuery) Reset() { *m = RepoServerAppDetailsQuery{} } func (m *RepoServerAppDetailsQuery) String() string { return proto.CompactTextString(m) } func (*RepoServerAppDetailsQuery) ProtoMessage() {} func (*RepoServerAppDetailsQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{15} + return fileDescriptor_dd8723cfcc820480, []int{13} } func (m *RepoServerAppDetailsQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1174,20 +1061,12 @@ func (m *RepoServerAppDetailsQuery) GetHelmOptions() *v1alpha1.HelmOptions { return nil } -func (m *RepoServerAppDetailsQuery) GetRefSources() map[string]*v1alpha1.RefTarget { - if m != nil { - return m.RefSources - } - return nil -} - // RepoAppDetailsResponse application details type RepoAppDetailsResponse struct { Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` Helm *HelmAppSpec `protobuf:"bytes,3,opt,name=helm,proto3" json:"helm,omitempty"` Kustomize *KustomizeAppSpec `protobuf:"bytes,4,opt,name=kustomize,proto3" json:"kustomize,omitempty"` Directory *DirectoryAppSpec `protobuf:"bytes,5,opt,name=directory,proto3" json:"directory,omitempty"` - Plugin *PluginAppSpec `protobuf:"bytes,6,opt,name=plugin,proto3" json:"plugin,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1197,7 +1076,7 @@ func (m *RepoAppDetailsResponse) Reset() { *m = RepoAppDetailsResponse{} func (m *RepoAppDetailsResponse) String() string { return proto.CompactTextString(m) } func (*RepoAppDetailsResponse) ProtoMessage() {} func (*RepoAppDetailsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{16} + return fileDescriptor_dd8723cfcc820480, []int{14} } func (m *RepoAppDetailsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1254,13 +1133,6 @@ func (m *RepoAppDetailsResponse) GetDirectory() *DirectoryAppSpec { return nil } -func (m *RepoAppDetailsResponse) GetPlugin() *PluginAppSpec { - if m != nil { - return m.Plugin - } - return nil -} - type RepoServerRevisionMetadataRequest struct { // the repo Repo *v1alpha1.Repository `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` @@ -1277,7 +1149,7 @@ func (m *RepoServerRevisionMetadataRequest) Reset() { *m = RepoServerRev func (m *RepoServerRevisionMetadataRequest) String() string { return proto.CompactTextString(m) } func (*RepoServerRevisionMetadataRequest) ProtoMessage() {} func (*RepoServerRevisionMetadataRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{17} + return fileDescriptor_dd8723cfcc820480, []int{15} } func (m *RepoServerRevisionMetadataRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1346,7 +1218,7 @@ func (m *HelmAppSpec) Reset() { *m = HelmAppSpec{} } func (m *HelmAppSpec) String() string { return proto.CompactTextString(m) } func (*HelmAppSpec) ProtoMessage() {} func (*HelmAppSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{18} + return fileDescriptor_dd8723cfcc820480, []int{16} } func (m *HelmAppSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1423,7 +1295,7 @@ func (m *KustomizeAppSpec) Reset() { *m = KustomizeAppSpec{} } func (m *KustomizeAppSpec) String() string { return proto.CompactTextString(m) } func (*KustomizeAppSpec) ProtoMessage() {} func (*KustomizeAppSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{19} + return fileDescriptor_dd8723cfcc820480, []int{17} } func (m *KustomizeAppSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1470,7 +1342,7 @@ func (m *DirectoryAppSpec) Reset() { *m = DirectoryAppSpec{} } func (m *DirectoryAppSpec) String() string { return proto.CompactTextString(m) } func (*DirectoryAppSpec) ProtoMessage() {} func (*DirectoryAppSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{20} + return fileDescriptor_dd8723cfcc820480, []int{18} } func (m *DirectoryAppSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1499,177 +1371,6 @@ func (m *DirectoryAppSpec) XXX_DiscardUnknown() { var xxx_messageInfo_DirectoryAppSpec proto.InternalMessageInfo -type ParameterAnnouncement struct { - // name is the name identifying a parameter. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // title is a human-readable text of the parameter name. - Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` - // tooltip is a human-readable description of the parameter. - Tooltip string `protobuf:"bytes,3,opt,name=tooltip,proto3" json:"tooltip,omitempty"` - // required defines if this given parameter is mandatory. - Required bool `protobuf:"varint,4,opt,name=required,proto3" json:"required,omitempty"` - // itemType determines the primitive data type represented by the parameter. Parameters are always encoded as - // strings, but this field lets them be interpreted as other primitive types. - ItemType string `protobuf:"bytes,5,opt,name=itemType,proto3" json:"itemType,omitempty"` - // collectionType is the type of value this parameter holds - either a single value (a string) or a collection - // (array or map). If collectionType is set, only the field with that type will be used. If collectionType is not - // set, `string` is the default. If collectionType is set to an invalid value, a validation error is thrown. - CollectionType string `protobuf:"bytes,6,opt,name=collectionType,proto3" json:"collectionType,omitempty"` - // string is the default value of the parameter if the parameter is a string. - String_ string `protobuf:"bytes,7,opt,name=string,proto3" json:"string,omitempty"` - // array is the default value of the parameter if the parameter is an array. - Array []string `protobuf:"bytes,8,rep,name=array,proto3" json:"array,omitempty"` - // map is the default value of the parameter if the parameter is a map. - Map map[string]string `protobuf:"bytes,9,rep,name=map,proto3" json:"map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ParameterAnnouncement) Reset() { *m = ParameterAnnouncement{} } -func (m *ParameterAnnouncement) String() string { return proto.CompactTextString(m) } -func (*ParameterAnnouncement) ProtoMessage() {} -func (*ParameterAnnouncement) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{21} -} -func (m *ParameterAnnouncement) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ParameterAnnouncement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ParameterAnnouncement.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ParameterAnnouncement) XXX_Merge(src proto.Message) { - xxx_messageInfo_ParameterAnnouncement.Merge(m, src) -} -func (m *ParameterAnnouncement) XXX_Size() int { - return m.Size() -} -func (m *ParameterAnnouncement) XXX_DiscardUnknown() { - xxx_messageInfo_ParameterAnnouncement.DiscardUnknown(m) -} - -var xxx_messageInfo_ParameterAnnouncement proto.InternalMessageInfo - -func (m *ParameterAnnouncement) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ParameterAnnouncement) GetTitle() string { - if m != nil { - return m.Title - } - return "" -} - -func (m *ParameterAnnouncement) GetTooltip() string { - if m != nil { - return m.Tooltip - } - return "" -} - -func (m *ParameterAnnouncement) GetRequired() bool { - if m != nil { - return m.Required - } - return false -} - -func (m *ParameterAnnouncement) GetItemType() string { - if m != nil { - return m.ItemType - } - return "" -} - -func (m *ParameterAnnouncement) GetCollectionType() string { - if m != nil { - return m.CollectionType - } - return "" -} - -func (m *ParameterAnnouncement) GetString_() string { - if m != nil { - return m.String_ - } - return "" -} - -func (m *ParameterAnnouncement) GetArray() []string { - if m != nil { - return m.Array - } - return nil -} - -func (m *ParameterAnnouncement) GetMap() map[string]string { - if m != nil { - return m.Map - } - return nil -} - -// PluginAppSpec contains details about a plugin-type Application -type PluginAppSpec struct { - ParametersAnnouncement []*ParameterAnnouncement `protobuf:"bytes,1,rep,name=parametersAnnouncement,proto3" json:"parametersAnnouncement,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PluginAppSpec) Reset() { *m = PluginAppSpec{} } -func (m *PluginAppSpec) String() string { return proto.CompactTextString(m) } -func (*PluginAppSpec) ProtoMessage() {} -func (*PluginAppSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{22} -} -func (m *PluginAppSpec) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PluginAppSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PluginAppSpec.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PluginAppSpec) XXX_Merge(src proto.Message) { - xxx_messageInfo_PluginAppSpec.Merge(m, src) -} -func (m *PluginAppSpec) XXX_Size() int { - return m.Size() -} -func (m *PluginAppSpec) XXX_DiscardUnknown() { - xxx_messageInfo_PluginAppSpec.DiscardUnknown(m) -} - -var xxx_messageInfo_PluginAppSpec proto.InternalMessageInfo - -func (m *PluginAppSpec) GetParametersAnnouncement() []*ParameterAnnouncement { - if m != nil { - return m.ParametersAnnouncement - } - return nil -} - type HelmChartsRequest struct { Repo *v1alpha1.Repository `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1681,7 +1382,7 @@ func (m *HelmChartsRequest) Reset() { *m = HelmChartsRequest{} } func (m *HelmChartsRequest) String() string { return proto.CompactTextString(m) } func (*HelmChartsRequest) ProtoMessage() {} func (*HelmChartsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{23} + return fileDescriptor_dd8723cfcc820480, []int{19} } func (m *HelmChartsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1729,7 +1430,7 @@ func (m *HelmChart) Reset() { *m = HelmChart{} } func (m *HelmChart) String() string { return proto.CompactTextString(m) } func (*HelmChart) ProtoMessage() {} func (*HelmChart) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{24} + return fileDescriptor_dd8723cfcc820480, []int{20} } func (m *HelmChart) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1783,7 +1484,7 @@ func (m *HelmChartsResponse) Reset() { *m = HelmChartsResponse{} } func (m *HelmChartsResponse) String() string { return proto.CompactTextString(m) } func (*HelmChartsResponse) ProtoMessage() {} func (*HelmChartsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{25} + return fileDescriptor_dd8723cfcc820480, []int{21} } func (m *HelmChartsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1822,7 +1523,6 @@ func (m *HelmChartsResponse) GetItems() []*HelmChart { func init() { proto.RegisterType((*ManifestRequest)(nil), "repository.ManifestRequest") proto.RegisterMapType((map[string]bool)(nil), "repository.ManifestRequest.EnabledSourceTypesEntry") - proto.RegisterMapType((map[string]*v1alpha1.RefTarget)(nil), "repository.ManifestRequest.RefSourcesEntry") proto.RegisterType((*ManifestRequestWithFiles)(nil), "repository.ManifestRequestWithFiles") proto.RegisterType((*ManifestFileMetadata)(nil), "repository.ManifestFileMetadata") proto.RegisterType((*ManifestFileChunk)(nil), "repository.ManifestFileChunk") @@ -1837,19 +1537,13 @@ func init() { proto.RegisterMapType((map[string]bool)(nil), "repository.ListAppsRequest.EnabledSourceTypesEntry") proto.RegisterType((*AppList)(nil), "repository.AppList") proto.RegisterMapType((map[string]string)(nil), "repository.AppList.AppsEntry") - proto.RegisterType((*PluginInfo)(nil), "repository.PluginInfo") - proto.RegisterType((*PluginList)(nil), "repository.PluginList") proto.RegisterType((*RepoServerAppDetailsQuery)(nil), "repository.RepoServerAppDetailsQuery") proto.RegisterMapType((map[string]bool)(nil), "repository.RepoServerAppDetailsQuery.EnabledSourceTypesEntry") - proto.RegisterMapType((map[string]*v1alpha1.RefTarget)(nil), "repository.RepoServerAppDetailsQuery.RefSourcesEntry") proto.RegisterType((*RepoAppDetailsResponse)(nil), "repository.RepoAppDetailsResponse") proto.RegisterType((*RepoServerRevisionMetadataRequest)(nil), "repository.RepoServerRevisionMetadataRequest") proto.RegisterType((*HelmAppSpec)(nil), "repository.HelmAppSpec") proto.RegisterType((*KustomizeAppSpec)(nil), "repository.KustomizeAppSpec") proto.RegisterType((*DirectoryAppSpec)(nil), "repository.DirectoryAppSpec") - proto.RegisterType((*ParameterAnnouncement)(nil), "repository.ParameterAnnouncement") - proto.RegisterMapType((map[string]string)(nil), "repository.ParameterAnnouncement.MapEntry") - proto.RegisterType((*PluginAppSpec)(nil), "repository.PluginAppSpec") proto.RegisterType((*HelmChartsRequest)(nil), "repository.HelmChartsRequest") proto.RegisterType((*HelmChart)(nil), "repository.HelmChart") proto.RegisterType((*HelmChartsResponse)(nil), "repository.HelmChartsResponse") @@ -1860,124 +1554,104 @@ func init() { } var fileDescriptor_dd8723cfcc820480 = []byte{ - // 1870 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x19, 0xdb, 0x6e, 0x1c, 0x49, - 0xd5, 0x73, 0xb1, 0x3d, 0x73, 0x9c, 0xf8, 0x52, 0x49, 0x9c, 0xce, 0x6c, 0xd6, 0xf2, 0x36, 0x10, - 0x99, 0xcd, 0x6e, 0x8f, 0xe2, 0x68, 0x77, 0x51, 0x16, 0x16, 0x79, 0xbd, 0x49, 0x1c, 0x25, 0x4e, - 0x4c, 0x27, 0x80, 0x16, 0x02, 0xa8, 0xdc, 0x53, 0xd3, 0x53, 0x3b, 0x7d, 0xa9, 0x74, 0x57, 0x0f, - 0x9a, 0x48, 0x3c, 0x20, 0x21, 0x24, 0x7e, 0x00, 0xf1, 0x27, 0x3c, 0xf2, 0xc4, 0xe5, 0x11, 0xf1, - 0x03, 0xa0, 0x7c, 0x09, 0xaa, 0x4b, 0x5f, 0xa7, 0xed, 0x64, 0x35, 0x8e, 0xf7, 0x61, 0x5f, 0xec, - 0xae, 0x53, 0xe7, 0x56, 0xa7, 0xce, 0xb5, 0x06, 0x6e, 0x44, 0x84, 0x85, 0x31, 0x89, 0x26, 0x24, - 0xea, 0xcb, 0x4f, 0xca, 0xc3, 0x68, 0x5a, 0xf8, 0xb4, 0x58, 0x14, 0xf2, 0x10, 0x41, 0x0e, 0xe9, - 0x3d, 0x72, 0x29, 0x1f, 0x25, 0xc7, 0x96, 0x13, 0xfa, 0x7d, 0x1c, 0xb9, 0x21, 0x8b, 0xc2, 0xaf, - 0xe4, 0xc7, 0x87, 0xce, 0xa0, 0x3f, 0xd9, 0xed, 0xb3, 0xb1, 0xdb, 0xc7, 0x8c, 0xc6, 0x7d, 0xcc, - 0x98, 0x47, 0x1d, 0xcc, 0x69, 0x18, 0xf4, 0x27, 0xb7, 0xb0, 0xc7, 0x46, 0xf8, 0x56, 0xdf, 0x25, - 0x01, 0x89, 0x30, 0x27, 0x03, 0xc5, 0xb9, 0xf7, 0x8e, 0x1b, 0x86, 0xae, 0x47, 0xfa, 0x72, 0x75, - 0x9c, 0x0c, 0xfb, 0xc4, 0x67, 0x5c, 0x8b, 0x35, 0xff, 0x72, 0x01, 0xd6, 0x0e, 0x71, 0x40, 0x87, - 0x24, 0xe6, 0x36, 0x79, 0x91, 0x90, 0x98, 0xa3, 0xe7, 0xd0, 0x16, 0xca, 0x18, 0x8d, 0xed, 0xc6, - 0xce, 0xca, 0xee, 0x81, 0x95, 0x6b, 0x63, 0xa5, 0xda, 0xc8, 0x8f, 0xdf, 0x38, 0x03, 0x6b, 0xb2, - 0x6b, 0xb1, 0xb1, 0x6b, 0x09, 0x6d, 0xac, 0x82, 0x36, 0x56, 0xaa, 0x8d, 0x65, 0x67, 0xc7, 0xb2, - 0x25, 0x57, 0xd4, 0x83, 0x4e, 0x44, 0x26, 0x34, 0xa6, 0x61, 0x60, 0x34, 0xb7, 0x1b, 0x3b, 0x5d, - 0x3b, 0x5b, 0x23, 0x03, 0x96, 0x83, 0x70, 0x1f, 0x3b, 0x23, 0x62, 0xb4, 0xb6, 0x1b, 0x3b, 0x1d, - 0x3b, 0x5d, 0xa2, 0x6d, 0x58, 0xc1, 0x8c, 0x3d, 0xc2, 0xc7, 0xc4, 0x7b, 0x48, 0xa6, 0x46, 0x5b, - 0x12, 0x16, 0x41, 0x82, 0x16, 0x33, 0xf6, 0x18, 0xfb, 0xc4, 0x58, 0x94, 0xbb, 0xe9, 0x12, 0x5d, - 0x87, 0x6e, 0x80, 0x7d, 0x12, 0x33, 0xec, 0x10, 0xa3, 0x23, 0xf7, 0x72, 0x00, 0xfa, 0x1d, 0x6c, - 0x14, 0x14, 0x7f, 0x1a, 0x26, 0x91, 0x43, 0x0c, 0x90, 0x47, 0x7f, 0x32, 0xdf, 0xd1, 0xf7, 0xaa, - 0x6c, 0xed, 0x59, 0x49, 0xe8, 0xd7, 0xb0, 0x28, 0x6f, 0xde, 0x58, 0xd9, 0x6e, 0x9d, 0xa9, 0xb5, - 0x15, 0x5b, 0x14, 0xc0, 0x32, 0xf3, 0x12, 0x97, 0x06, 0xb1, 0x71, 0x41, 0x4a, 0x78, 0x36, 0x9f, - 0x84, 0xfd, 0x30, 0x18, 0x52, 0xf7, 0x10, 0x07, 0xd8, 0x25, 0x3e, 0x09, 0xf8, 0x91, 0x64, 0x6e, - 0xa7, 0x42, 0xd0, 0x4b, 0x58, 0x1f, 0x27, 0x31, 0x0f, 0x7d, 0xfa, 0x92, 0x3c, 0x61, 0x82, 0x36, - 0x36, 0x2e, 0x4a, 0x6b, 0x3e, 0x9e, 0x4f, 0xf0, 0xc3, 0x0a, 0x57, 0x7b, 0x46, 0x8e, 0x70, 0x92, - 0x71, 0x72, 0x4c, 0x7e, 0x46, 0x22, 0xe9, 0x5d, 0xab, 0xca, 0x49, 0x0a, 0x20, 0xe5, 0x46, 0x54, - 0xaf, 0x62, 0x63, 0x6d, 0xbb, 0xa5, 0xdc, 0x28, 0x03, 0xa1, 0x1d, 0x58, 0x9b, 0x90, 0x88, 0x0e, - 0xa7, 0x4f, 0xa9, 0x1b, 0x60, 0x9e, 0x44, 0xc4, 0x58, 0x97, 0xae, 0x58, 0x05, 0x23, 0x1f, 0x2e, - 0x8e, 0x88, 0xe7, 0x0b, 0x93, 0xef, 0x47, 0x64, 0x10, 0x1b, 0x1b, 0xd2, 0xbe, 0xf7, 0xe7, 0xbf, - 0x41, 0xc9, 0xce, 0x2e, 0x73, 0x17, 0x8a, 0x05, 0xa1, 0xad, 0x23, 0x45, 0xc5, 0x08, 0x52, 0x8a, - 0x55, 0xc0, 0xe8, 0x06, 0xac, 0xf2, 0x08, 0x3b, 0x63, 0x1a, 0xb8, 0x87, 0x84, 0x8f, 0xc2, 0x81, - 0x71, 0x49, 0x5a, 0xa2, 0x02, 0x45, 0x0e, 0x20, 0x12, 0xe0, 0x63, 0x8f, 0x0c, 0x94, 0x2f, 0x3e, - 0x9b, 0x32, 0x12, 0x1b, 0x97, 0xe5, 0x29, 0x6e, 0x5b, 0x85, 0x0c, 0x55, 0x49, 0x10, 0xd6, 0xdd, - 0x19, 0xaa, 0xbb, 0x01, 0x8f, 0xa6, 0x76, 0x0d, 0x3b, 0x34, 0x86, 0x15, 0x71, 0x8e, 0xd4, 0x15, - 0xae, 0x48, 0x57, 0x78, 0x30, 0x9f, 0x8d, 0x0e, 0x72, 0x86, 0x76, 0x91, 0x3b, 0xb2, 0x00, 0x8d, - 0x70, 0x7c, 0x98, 0x78, 0x9c, 0x32, 0x8f, 0x28, 0x35, 0x62, 0x63, 0x53, 0x9a, 0xa9, 0x66, 0x07, - 0x3d, 0x04, 0x88, 0xc8, 0x30, 0xc5, 0xbb, 0x2a, 0x4f, 0x7e, 0xf3, 0xb4, 0x93, 0xdb, 0x19, 0xb6, - 0x3a, 0x71, 0x81, 0xbc, 0x77, 0x17, 0xae, 0x9e, 0x60, 0x18, 0xb4, 0x0e, 0xad, 0x31, 0x99, 0xca, - 0x84, 0xda, 0xb5, 0xc5, 0x27, 0xba, 0x0c, 0x8b, 0x13, 0xec, 0x25, 0x44, 0xa6, 0xc0, 0x8e, 0xad, - 0x16, 0x77, 0x9a, 0x3f, 0x68, 0xf4, 0xfe, 0xd8, 0x80, 0xb5, 0x8a, 0x98, 0x1a, 0xfa, 0x5f, 0x15, - 0xe9, 0xcf, 0xc0, 0xe9, 0x86, 0xcf, 0x70, 0xe4, 0x12, 0x5e, 0x50, 0xc4, 0xfc, 0x4f, 0x03, 0x8c, - 0xca, 0xf9, 0x7f, 0x4e, 0xf9, 0xe8, 0x1e, 0xf5, 0x48, 0x8c, 0x3e, 0x81, 0xe5, 0x48, 0xc1, 0x74, - 0x99, 0x78, 0xe7, 0x14, 0xb3, 0x1d, 0x2c, 0xd8, 0x29, 0x36, 0xfa, 0x0c, 0x3a, 0x3e, 0xe1, 0x78, - 0x80, 0x39, 0xd6, 0xba, 0x6f, 0xd7, 0x51, 0x0a, 0x29, 0x87, 0x1a, 0xef, 0x60, 0xc1, 0xce, 0x68, - 0xd0, 0x47, 0xb0, 0xe8, 0x8c, 0x92, 0x60, 0x2c, 0x0b, 0xc4, 0xca, 0xee, 0xbb, 0x27, 0x11, 0xef, - 0x0b, 0xa4, 0x83, 0x05, 0x5b, 0x61, 0x7f, 0xbe, 0x04, 0x6d, 0x86, 0x23, 0x6e, 0xde, 0x83, 0xcb, - 0x75, 0x22, 0x44, 0x55, 0x72, 0x46, 0xc4, 0x19, 0xc7, 0x89, 0xaf, 0xcd, 0x9c, 0xad, 0x11, 0x82, - 0x76, 0x4c, 0x5f, 0x2a, 0x53, 0xb7, 0x6c, 0xf9, 0x6d, 0x7e, 0x1f, 0x36, 0x66, 0xa4, 0x89, 0x4b, - 0x55, 0xba, 0x09, 0x0e, 0x17, 0xb4, 0x68, 0x33, 0x81, 0x2b, 0xcf, 0xa4, 0x2d, 0xb2, 0xd4, 0x7c, - 0x1e, 0x75, 0xd6, 0x3c, 0x80, 0xcd, 0xaa, 0xd8, 0x98, 0x85, 0x41, 0x4c, 0x44, 0x94, 0xc8, 0x5c, - 0x46, 0xc9, 0x20, 0xdf, 0x95, 0x5a, 0x74, 0xec, 0x9a, 0x1d, 0xf3, 0xf7, 0x4d, 0xd8, 0xb4, 0x49, - 0x1c, 0x7a, 0x13, 0x92, 0x26, 0x9a, 0xf3, 0x69, 0x15, 0x7e, 0x09, 0x2d, 0xcc, 0x98, 0x76, 0x93, - 0x07, 0x67, 0x56, 0x8c, 0x6d, 0xc1, 0x15, 0x7d, 0x00, 0x1b, 0xd8, 0x3f, 0xa6, 0x6e, 0x12, 0x26, - 0x71, 0x7a, 0x2c, 0xe9, 0x54, 0x5d, 0x7b, 0x76, 0xc3, 0x74, 0xe0, 0xea, 0x8c, 0x09, 0xb4, 0x39, - 0x8b, 0x0d, 0x4d, 0xa3, 0xd2, 0xd0, 0xd4, 0x0a, 0x69, 0x9e, 0x24, 0xe4, 0x1f, 0x0d, 0x58, 0xcf, - 0x43, 0x47, 0xb3, 0xbf, 0x0e, 0x5d, 0x5f, 0xc3, 0x62, 0xa3, 0x21, 0x0b, 0x56, 0x0e, 0x28, 0xf7, - 0x36, 0xcd, 0x6a, 0x6f, 0xb3, 0x09, 0x4b, 0xaa, 0xf5, 0xd4, 0x07, 0xd3, 0xab, 0x92, 0xca, 0xed, - 0x8a, 0xca, 0x5b, 0x00, 0x71, 0x96, 0xbf, 0x8c, 0x25, 0xb9, 0x5b, 0x80, 0x20, 0x13, 0x2e, 0xa8, - 0x4a, 0x68, 0x93, 0x38, 0xf1, 0xb8, 0xb1, 0x2c, 0x31, 0x4a, 0x30, 0x33, 0x84, 0xb5, 0x47, 0x54, - 0x9c, 0x61, 0x18, 0x9f, 0x8f, 0xb3, 0x7f, 0x0c, 0x6d, 0x21, 0x4c, 0x1c, 0xec, 0x38, 0xc2, 0x81, - 0x33, 0x22, 0xa9, 0xad, 0xb2, 0xb5, 0x08, 0x63, 0x8e, 0xdd, 0xd8, 0x68, 0x4a, 0xb8, 0xfc, 0x36, - 0xff, 0xda, 0x54, 0x9a, 0xee, 0x31, 0x16, 0x7f, 0xf3, 0xed, 0x6f, 0x7d, 0x41, 0x6e, 0xcd, 0x16, - 0xe4, 0x8a, 0xca, 0x5f, 0xa7, 0x20, 0x9f, 0x51, 0x99, 0x32, 0x13, 0x58, 0xde, 0x63, 0x4c, 0x28, - 0x82, 0x6e, 0x41, 0x1b, 0x33, 0xa6, 0x0c, 0x5e, 0xc9, 0xc8, 0x1a, 0x45, 0xfc, 0xd7, 0x2a, 0x49, - 0xd4, 0xde, 0x27, 0xd0, 0xcd, 0x40, 0xaf, 0x13, 0xdb, 0x2d, 0x8a, 0xdd, 0x06, 0x50, 0x1d, 0xe7, - 0x83, 0x60, 0x18, 0x8a, 0x2b, 0x15, 0xce, 0xae, 0x49, 0xe5, 0xb7, 0x79, 0x27, 0xc5, 0x90, 0xba, - 0x7d, 0x00, 0x8b, 0x94, 0x13, 0x3f, 0x55, 0x6e, 0xb3, 0xa8, 0x5c, 0xce, 0xc8, 0x56, 0x48, 0xe6, - 0x3f, 0x3b, 0x70, 0x4d, 0xdc, 0xd8, 0x53, 0x19, 0x26, 0x7b, 0x8c, 0x7d, 0x41, 0x38, 0xa6, 0x5e, - 0xfc, 0x93, 0x84, 0x44, 0xd3, 0xb7, 0xec, 0x18, 0x2e, 0x2c, 0xa9, 0x28, 0xd3, 0xf9, 0xee, 0xcc, - 0x87, 0x0f, 0xcd, 0x3e, 0x9f, 0x38, 0x5a, 0x6f, 0x67, 0xe2, 0xa8, 0x9b, 0x00, 0xda, 0xe7, 0x34, - 0x01, 0x9c, 0x3c, 0x04, 0x16, 0x46, 0xcb, 0xa5, 0xf2, 0x68, 0x59, 0xd3, 0x58, 0x2f, 0xbf, 0x69, - 0x63, 0xdd, 0xa9, 0x6d, 0xac, 0xfd, 0xda, 0x38, 0xee, 0x4a, 0x73, 0xff, 0xa8, 0xe8, 0x81, 0x27, - 0xfa, 0xda, 0x3c, 0x2d, 0x36, 0xbc, 0xd5, 0x16, 0xfb, 0xa7, 0xa5, 0x96, 0x59, 0x0d, 0xad, 0x1f, - 0xbd, 0xd9, 0x99, 0xbe, 0x4d, 0xcd, 0xf3, 0x1f, 0x64, 0xcf, 0xc4, 0xc2, 0xdc, 0x06, 0x59, 0x41, - 0x17, 0x75, 0x48, 0x94, 0x56, 0x9d, 0xb4, 0xc4, 0x37, 0xba, 0x09, 0x6d, 0x61, 0x64, 0xdd, 0xd4, - 0x5e, 0x2d, 0xda, 0x53, 0xdc, 0xc4, 0x1e, 0x63, 0x4f, 0x19, 0x71, 0x6c, 0x89, 0x84, 0xee, 0x40, - 0x37, 0x73, 0x7c, 0x1d, 0x59, 0xd7, 0x8b, 0x14, 0x59, 0x9c, 0xa4, 0x64, 0x39, 0xba, 0xa0, 0x1d, - 0xd0, 0x88, 0x38, 0xb2, 0xe5, 0x5b, 0x9c, 0xa5, 0xfd, 0x22, 0xdd, 0xcc, 0x68, 0x33, 0x74, 0x74, - 0x0b, 0x96, 0xd4, 0x94, 0x2f, 0x23, 0x68, 0x65, 0xf7, 0xda, 0x6c, 0x32, 0x4d, 0xa9, 0x34, 0xa2, - 0xf9, 0xf7, 0x06, 0xbc, 0x97, 0x3b, 0x44, 0x1a, 0x4d, 0x69, 0xd7, 0xfd, 0xcd, 0x57, 0xdc, 0x1b, - 0xb0, 0x2a, 0xdb, 0xfc, 0x7c, 0xd8, 0x57, 0xef, 0x4e, 0x15, 0xa8, 0xf9, 0xb7, 0x26, 0xac, 0x14, - 0x2e, 0xa2, 0xae, 0xf0, 0x88, 0xc6, 0x49, 0xde, 0xbf, 0x1c, 0x90, 0x64, 0x72, 0xed, 0xda, 0x05, - 0x08, 0x1a, 0x03, 0x30, 0x1c, 0x61, 0x9f, 0x70, 0x12, 0x89, 0x8c, 0x28, 0x22, 0xe7, 0xe1, 0xfc, - 0x51, 0x7a, 0x94, 0xf2, 0xb4, 0x0b, 0xec, 0x45, 0xe7, 0x27, 0x45, 0xc7, 0x3a, 0x0f, 0xea, 0x15, - 0xfa, 0x2d, 0xac, 0x0e, 0xa9, 0x47, 0x8e, 0x72, 0x45, 0x96, 0xa4, 0x22, 0x4f, 0xe6, 0x57, 0xe4, - 0x5e, 0x91, 0xaf, 0x5d, 0x11, 0x63, 0xbe, 0x0f, 0xeb, 0x55, 0xbf, 0x14, 0x4a, 0x52, 0x1f, 0xbb, - 0x99, 0xb5, 0xf4, 0xca, 0x44, 0xb0, 0x5e, 0xf5, 0x43, 0xf3, 0xbf, 0x4d, 0xb8, 0x92, 0xb1, 0xdb, - 0x0b, 0x82, 0x30, 0x09, 0x1c, 0xf9, 0x00, 0x55, 0x7b, 0x17, 0x97, 0x61, 0x91, 0x53, 0xee, 0x65, - 0x0d, 0x84, 0x5c, 0x88, 0x1a, 0xc0, 0xc3, 0xd0, 0xe3, 0x94, 0xe9, 0x7e, 0x38, 0x5d, 0x2a, 0x1f, - 0x79, 0x91, 0xd0, 0x88, 0x0c, 0x64, 0x44, 0x75, 0xec, 0x6c, 0x2d, 0xf6, 0x44, 0x77, 0x20, 0xdb, - 0x61, 0x65, 0xcc, 0x6c, 0x2d, 0xfd, 0x27, 0xf4, 0x3c, 0xe2, 0x08, 0x73, 0x14, 0x1a, 0xe6, 0x0a, - 0x54, 0x36, 0xe2, 0x3c, 0xa2, 0x81, 0xab, 0xdb, 0x65, 0xbd, 0x12, 0x7a, 0xe2, 0x28, 0xc2, 0x53, - 0xa3, 0x23, 0x0d, 0xa0, 0x16, 0xe8, 0x87, 0xd0, 0xf2, 0x31, 0xd3, 0x05, 0xe3, 0xfd, 0x52, 0x94, - 0xd5, 0x59, 0xc0, 0x3a, 0xc4, 0x4c, 0x65, 0x54, 0x41, 0xd6, 0xfb, 0x18, 0x3a, 0x29, 0xe0, 0x6b, - 0xb5, 0x56, 0x5f, 0xc1, 0xc5, 0x52, 0x10, 0xa3, 0x2f, 0x61, 0x33, 0xf7, 0xa8, 0xa2, 0x40, 0xdd, - 0x4c, 0xbd, 0xf7, 0x5a, 0xcd, 0xec, 0x13, 0x18, 0x98, 0x2f, 0x60, 0x43, 0xb8, 0xcc, 0xfe, 0x08, - 0x47, 0xfc, 0x9c, 0x46, 0x84, 0x4f, 0xa1, 0x9b, 0x89, 0xac, 0xf5, 0x99, 0x1e, 0x74, 0x26, 0xe9, - 0xc3, 0xa0, 0x9a, 0x11, 0xb2, 0xb5, 0xb9, 0x07, 0xa8, 0xa8, 0xaf, 0xce, 0xe4, 0x37, 0xcb, 0xcd, - 0xe5, 0x95, 0x6a, 0xda, 0x96, 0xe8, 0xba, 0xb7, 0xdc, 0xfd, 0xd3, 0x32, 0x6c, 0xe4, 0xa9, 0x50, - 0xfc, 0xa5, 0x0e, 0x41, 0x4f, 0x60, 0xfd, 0xbe, 0x7e, 0xaf, 0x4f, 0x27, 0x3f, 0x74, 0xda, 0x53, - 0x4a, 0xef, 0x7a, 0xfd, 0xa6, 0xd2, 0xc8, 0x5c, 0x40, 0x0e, 0x5c, 0xab, 0x32, 0xcc, 0x5f, 0x6d, - 0xbe, 0x7b, 0x0a, 0xe7, 0x0c, 0xeb, 0x75, 0x22, 0x76, 0x1a, 0xe8, 0x4b, 0x58, 0x2d, 0xbf, 0x2d, - 0xa0, 0x92, 0x2f, 0xd4, 0x3e, 0x77, 0xf4, 0xcc, 0xd3, 0x50, 0x32, 0xfd, 0x9f, 0x8b, 0x02, 0x5e, - 0x1a, 0xb4, 0x91, 0x59, 0x6e, 0x2f, 0xea, 0x1e, 0x22, 0x7a, 0xdf, 0x39, 0x15, 0x27, 0xe3, 0xfe, - 0x29, 0x74, 0xd2, 0xc1, 0xb4, 0x6c, 0xe6, 0xca, 0xb8, 0xda, 0x5b, 0x2f, 0xf3, 0x1b, 0xc6, 0xe6, - 0x02, 0xfa, 0x4c, 0x11, 0x8b, 0xc1, 0x65, 0x96, 0xb8, 0x30, 0x8e, 0xf5, 0x2e, 0xd5, 0x8c, 0x40, - 0xe6, 0x02, 0xfa, 0x31, 0xac, 0x88, 0xaf, 0x23, 0xfd, 0x52, 0xbe, 0x69, 0xa9, 0x1f, 0x66, 0xac, - 0xf4, 0x87, 0x19, 0xeb, 0xae, 0xcf, 0xf8, 0xb4, 0x57, 0x33, 0xa3, 0x68, 0x06, 0xcf, 0xe1, 0xe2, - 0x7d, 0xc2, 0xf3, 0x96, 0x02, 0x7d, 0xef, 0x8d, 0x1a, 0xaf, 0x9e, 0x59, 0x45, 0x9b, 0xed, 0x4a, - 0xcc, 0x05, 0xf4, 0xe7, 0x06, 0x5c, 0xba, 0x4f, 0x78, 0xb5, 0x48, 0xa3, 0x0f, 0xeb, 0x85, 0x9c, - 0x50, 0xcc, 0x7b, 0x8f, 0xe7, 0x8d, 0xdb, 0x32, 0x5b, 0x73, 0x01, 0x1d, 0xc9, 0x63, 0xe7, 0xf1, - 0x87, 0xde, 0xad, 0x0d, 0xb4, 0xcc, 0xfc, 0x5b, 0x27, 0x6d, 0xa7, 0x47, 0xfd, 0x7c, 0xef, 0x5f, - 0xaf, 0xb6, 0x1a, 0xff, 0x7e, 0xb5, 0xd5, 0xf8, 0xdf, 0xab, 0xad, 0xc6, 0x2f, 0x6e, 0xbf, 0xe6, - 0xe7, 0xb6, 0xc2, 0x2f, 0x78, 0x98, 0x51, 0xc7, 0xa3, 0x24, 0xe0, 0xc7, 0x4b, 0xf2, 0xd6, 0x6e, - 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x46, 0x3e, 0x2d, 0xff, 0xe0, 0x1b, 0x00, 0x00, + // 1551 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xdf, 0x6e, 0x1b, 0x45, + 0x17, 0xcf, 0xda, 0x8e, 0x63, 0x9f, 0xb4, 0x89, 0x33, 0xfd, 0xb7, 0xf5, 0x97, 0x46, 0xe9, 0x7e, + 0xdf, 0x57, 0x05, 0x4a, 0x6d, 0x35, 0x15, 0x14, 0xb5, 0x02, 0x29, 0x4d, 0xdb, 0xa4, 0x6a, 0xd3, + 0x84, 0x49, 0x05, 0x02, 0x2a, 0xd0, 0x64, 0x3d, 0x59, 0x0f, 0xf6, 0xee, 0x4e, 0x77, 0x76, 0x8d, + 0x5c, 0x89, 0x0b, 0x5e, 0x81, 0x0b, 0x5e, 0x85, 0x4b, 0xae, 0x40, 0xbd, 0x04, 0x9e, 0x00, 0xf5, + 0x86, 0xd7, 0x40, 0x33, 0xfb, 0xd7, 0xeb, 0x75, 0x5a, 0xe4, 0x34, 0x15, 0x37, 0xf6, 0xcc, 0x99, + 0x33, 0xe7, 0x77, 0xe6, 0xcc, 0xf9, 0x37, 0x0b, 0x57, 0x3c, 0xca, 0x5d, 0x41, 0xbd, 0x01, 0xf5, + 0xda, 0x6a, 0xc8, 0x7c, 0xd7, 0x1b, 0x66, 0x86, 0x2d, 0xee, 0xb9, 0xbe, 0x8b, 0x20, 0xa5, 0x34, + 0x1f, 0x59, 0xcc, 0xef, 0x06, 0x07, 0x2d, 0xd3, 0xb5, 0xdb, 0xc4, 0xb3, 0x5c, 0xee, 0xb9, 0xdf, + 0xa8, 0xc1, 0x35, 0xb3, 0xd3, 0x1e, 0xac, 0xb7, 0x79, 0xcf, 0x6a, 0x13, 0xce, 0x44, 0x9b, 0x70, + 0xde, 0x67, 0x26, 0xf1, 0x99, 0xeb, 0xb4, 0x07, 0xd7, 0x49, 0x9f, 0x77, 0xc9, 0xf5, 0xb6, 0x45, + 0x1d, 0xea, 0x11, 0x9f, 0x76, 0x42, 0xc9, 0xc6, 0x0f, 0x00, 0x8b, 0x3b, 0xc4, 0x61, 0x87, 0x54, + 0xf8, 0x98, 0x3e, 0x0b, 0xa8, 0xf0, 0xd1, 0x53, 0xa8, 0x48, 0x3c, 0x5d, 0x5b, 0xd5, 0xd6, 0xe6, + 0xd7, 0xb7, 0x5b, 0x29, 0x60, 0x2b, 0x06, 0x54, 0x83, 0xaf, 0xcd, 0x4e, 0x6b, 0xb0, 0xde, 0xe2, + 0x3d, 0xab, 0x25, 0x01, 0x5b, 0x19, 0xc0, 0x56, 0x0c, 0xd8, 0xc2, 0x89, 0xe6, 0x58, 0x49, 0x45, + 0x4d, 0xa8, 0x79, 0x74, 0xc0, 0x04, 0x73, 0x1d, 0xbd, 0xb4, 0xaa, 0xad, 0xd5, 0x71, 0x32, 0x47, + 0x3a, 0xcc, 0x39, 0xee, 0x26, 0x31, 0xbb, 0x54, 0x2f, 0xaf, 0x6a, 0x6b, 0x35, 0x1c, 0x4f, 0xd1, + 0x2a, 0xcc, 0x13, 0xce, 0x1f, 0x91, 0x03, 0xda, 0x7f, 0x48, 0x87, 0x7a, 0x45, 0x6d, 0xcc, 0x92, + 0xe4, 0x5e, 0xc2, 0xf9, 0x63, 0x62, 0x53, 0x7d, 0x56, 0xad, 0xc6, 0x53, 0xb4, 0x0c, 0x75, 0x87, + 0xd8, 0x54, 0x70, 0x62, 0x52, 0xbd, 0xa6, 0xd6, 0x52, 0x02, 0xfa, 0x0e, 0x96, 0x32, 0x8a, 0xef, + 0xbb, 0x81, 0x67, 0x52, 0x1d, 0xd4, 0xd1, 0x77, 0xa7, 0x3b, 0xfa, 0x46, 0x5e, 0x2c, 0x1e, 0x47, + 0x42, 0x5f, 0xc1, 0xac, 0xba, 0x5c, 0x7d, 0x7e, 0xb5, 0x7c, 0xac, 0xd6, 0x0e, 0xc5, 0x22, 0x07, + 0xe6, 0x78, 0x3f, 0xb0, 0x98, 0x23, 0xf4, 0x53, 0x0a, 0xe1, 0xc9, 0x74, 0x08, 0x9b, 0xae, 0x73, + 0xc8, 0xac, 0x1d, 0xe2, 0x10, 0x8b, 0xda, 0xd4, 0xf1, 0xf7, 0x94, 0x70, 0x1c, 0x83, 0xa0, 0xe7, + 0xd0, 0xe8, 0x05, 0xc2, 0x77, 0x6d, 0xf6, 0x9c, 0xee, 0x72, 0xb9, 0x57, 0xe8, 0xa7, 0x95, 0x35, + 0x1f, 0x4f, 0x07, 0xfc, 0x30, 0x27, 0x15, 0x8f, 0xe1, 0x48, 0x27, 0xe9, 0x05, 0x07, 0xf4, 0x53, + 0xea, 0x29, 0xef, 0x5a, 0x08, 0x9d, 0x24, 0x43, 0x0a, 0xdd, 0x88, 0x45, 0x33, 0xa1, 0x2f, 0xae, + 0x96, 0x43, 0x37, 0x4a, 0x48, 0x68, 0x0d, 0x16, 0x07, 0xd4, 0x63, 0x87, 0xc3, 0x7d, 0x66, 0x39, + 0xc4, 0x0f, 0x3c, 0xaa, 0x37, 0x94, 0x2b, 0xe6, 0xc9, 0xc8, 0x86, 0xd3, 0x5d, 0xda, 0xb7, 0xa5, + 0xc9, 0x37, 0x3d, 0xda, 0x11, 0xfa, 0x92, 0xb2, 0xef, 0xd6, 0xf4, 0x37, 0xa8, 0xc4, 0xe1, 0x51, + 0xe9, 0x52, 0x31, 0xc7, 0xc5, 0x51, 0xa4, 0x84, 0x31, 0x82, 0x42, 0xc5, 0x72, 0x64, 0x74, 0x05, + 0x16, 0x7c, 0x8f, 0x98, 0x3d, 0xe6, 0x58, 0x3b, 0xd4, 0xef, 0xba, 0x1d, 0xfd, 0x8c, 0xb2, 0x44, + 0x8e, 0x8a, 0x4c, 0x40, 0xd4, 0x21, 0x07, 0x7d, 0xda, 0x09, 0x7d, 0xf1, 0xc9, 0x90, 0x53, 0xa1, + 0x9f, 0x55, 0xa7, 0xb8, 0xd1, 0xca, 0x24, 0xa1, 0x5c, 0x82, 0x68, 0xdd, 0x1b, 0xdb, 0x75, 0xcf, + 0xf1, 0xbd, 0x21, 0x2e, 0x10, 0x87, 0x7a, 0x30, 0x2f, 0xcf, 0x11, 0xbb, 0xc2, 0x39, 0xe5, 0x0a, + 0x0f, 0xa6, 0xb3, 0xd1, 0x76, 0x2a, 0x10, 0x67, 0xa5, 0x37, 0xef, 0xc1, 0x85, 0x09, 0xba, 0xa1, + 0x06, 0x94, 0x7b, 0x74, 0xa8, 0x72, 0x5a, 0x1d, 0xcb, 0x21, 0x3a, 0x0b, 0xb3, 0x03, 0xd2, 0x0f, + 0xa8, 0xca, 0x42, 0x35, 0x1c, 0x4e, 0x6e, 0x95, 0x3e, 0xd4, 0x8c, 0x3f, 0x34, 0xd0, 0x73, 0x67, + 0xfe, 0x8c, 0xf9, 0xdd, 0xfb, 0xac, 0x4f, 0x05, 0xba, 0x09, 0x73, 0x5e, 0x48, 0x8b, 0x12, 0xe4, + 0x7f, 0x8e, 0x30, 0xd5, 0xf6, 0x0c, 0x8e, 0xb9, 0xd1, 0xc7, 0x50, 0xb3, 0xa9, 0x4f, 0x3a, 0xc4, + 0x27, 0x0a, 0x72, 0x7e, 0x7d, 0xb5, 0x68, 0xa7, 0x44, 0xd9, 0x89, 0xf8, 0xb6, 0x67, 0x70, 0xb2, + 0x07, 0xbd, 0x0f, 0xb3, 0x66, 0x37, 0x70, 0x7a, 0x2a, 0x35, 0xce, 0xaf, 0x5f, 0x9a, 0xb4, 0x79, + 0x53, 0x32, 0x6d, 0xcf, 0xe0, 0x90, 0xfb, 0x4e, 0x15, 0x2a, 0x9c, 0x78, 0xbe, 0x71, 0x1f, 0xce, + 0x16, 0x41, 0xc8, 0x7c, 0x6c, 0x76, 0xa9, 0xd9, 0x13, 0x81, 0x1d, 0x59, 0x27, 0x99, 0x23, 0x04, + 0x15, 0xc1, 0x9e, 0x87, 0x16, 0x2a, 0x63, 0x35, 0x36, 0xde, 0x81, 0xa5, 0x31, 0x34, 0x69, 0xcb, + 0x50, 0x37, 0x29, 0xe1, 0x54, 0x04, 0x6d, 0x04, 0x70, 0xee, 0x89, 0xb2, 0x45, 0x92, 0x94, 0x4e, + 0xa2, 0xc2, 0x18, 0xdb, 0x70, 0x3e, 0x0f, 0x2b, 0xb8, 0xeb, 0x08, 0x8a, 0x5a, 0x80, 0x54, 0x14, + 0x33, 0xda, 0x49, 0x57, 0x95, 0x16, 0x35, 0x5c, 0xb0, 0x62, 0x7c, 0x5f, 0x82, 0xf3, 0x98, 0x0a, + 0xb7, 0x3f, 0xa0, 0x71, 0x88, 0x9d, 0x4c, 0x91, 0xfc, 0x12, 0xca, 0x84, 0xf3, 0xc8, 0x4d, 0x1e, + 0x1c, 0x5b, 0x19, 0xc2, 0x52, 0x2a, 0x7a, 0x0f, 0x96, 0x88, 0x7d, 0xc0, 0xac, 0xc0, 0x0d, 0x44, + 0x7c, 0x2c, 0xe5, 0x54, 0x75, 0x3c, 0xbe, 0x60, 0x98, 0x70, 0x61, 0xcc, 0x04, 0x91, 0x39, 0xb3, + 0xa5, 0x5c, 0xcb, 0x95, 0xf2, 0x42, 0x90, 0xd2, 0x24, 0x90, 0x5f, 0x35, 0x68, 0xa4, 0xa1, 0x13, + 0x89, 0x5f, 0x86, 0xba, 0x1d, 0xd1, 0x84, 0xae, 0xa9, 0x54, 0x9d, 0x12, 0x46, 0xab, 0x7a, 0x29, + 0x5f, 0xd5, 0xcf, 0x43, 0x35, 0xec, 0xab, 0xa2, 0x83, 0x45, 0xb3, 0x11, 0x95, 0x2b, 0x39, 0x95, + 0x57, 0x00, 0x44, 0x92, 0x36, 0xf4, 0xaa, 0x5a, 0xcd, 0x50, 0x90, 0x01, 0xa7, 0xc2, 0x1a, 0x80, + 0xa9, 0x08, 0xfa, 0xbe, 0x3e, 0xa7, 0x38, 0x46, 0x68, 0x86, 0x0b, 0x8b, 0x8f, 0x98, 0x3c, 0xc3, + 0xa1, 0x38, 0x19, 0x67, 0xff, 0x00, 0x2a, 0x12, 0x4c, 0x1e, 0xec, 0xc0, 0x23, 0x8e, 0xd9, 0xa5, + 0xb1, 0xad, 0x92, 0xb9, 0x0c, 0x63, 0x9f, 0x58, 0x42, 0x2f, 0x29, 0xba, 0x1a, 0x1b, 0x3f, 0x95, + 0x42, 0x4d, 0x37, 0x38, 0x17, 0x6f, 0xbf, 0xf1, 0x2b, 0x2e, 0x45, 0xe5, 0xf1, 0x52, 0x94, 0x53, + 0xf9, 0x9f, 0x94, 0xa2, 0xe3, 0xaa, 0x0e, 0x01, 0xcc, 0x6d, 0x70, 0x2e, 0x15, 0x41, 0xd7, 0xa1, + 0x42, 0x38, 0x0f, 0x0d, 0x9e, 0xcb, 0xc8, 0x11, 0x8b, 0xfc, 0x8f, 0x54, 0x52, 0xac, 0xcd, 0x9b, + 0x50, 0x4f, 0x48, 0xaf, 0x82, 0xad, 0x67, 0x61, 0xff, 0xaa, 0xc2, 0x45, 0x69, 0xd3, 0x7d, 0xe5, + 0xc8, 0x1b, 0x9c, 0xdf, 0xa5, 0x3e, 0x61, 0x7d, 0xf1, 0x49, 0x40, 0xbd, 0xe1, 0x1b, 0xbe, 0x3a, + 0x0b, 0xaa, 0x61, 0x1c, 0x44, 0x19, 0xe9, 0xd8, 0x1b, 0xe3, 0x48, 0x7c, 0xda, 0x0d, 0x97, 0xdf, + 0x4c, 0x37, 0x5c, 0xd4, 0x9d, 0x56, 0x4e, 0xa8, 0x3b, 0x9d, 0xfc, 0x40, 0xc9, 0x3c, 0x7b, 0xaa, + 0xa3, 0xcf, 0x9e, 0x82, 0xa6, 0x6f, 0xee, 0x75, 0x9b, 0xbe, 0x5a, 0x61, 0xd3, 0x67, 0x17, 0x46, + 0x5a, 0x5d, 0x99, 0xfb, 0xa3, 0xac, 0x03, 0x4f, 0xf4, 0xb5, 0x69, 0xda, 0x3f, 0xf8, 0x37, 0xb4, + 0x7f, 0xbf, 0x6b, 0xb2, 0xea, 0x73, 0x37, 0x3d, 0x77, 0x52, 0x92, 0x64, 0x26, 0x95, 0xc5, 0x21, + 0x94, 0xa3, 0xc6, 0xe8, 0x2a, 0x54, 0xa4, 0x12, 0x51, 0x5b, 0x76, 0x21, 0x6b, 0x43, 0xa9, 0xe9, + 0x06, 0xe7, 0xfb, 0x9c, 0x9a, 0x58, 0x31, 0xa1, 0x5b, 0x50, 0x4f, 0x1c, 0x23, 0xf2, 0xbc, 0xe5, + 0xec, 0x8e, 0xc4, 0x8f, 0xe2, 0x6d, 0x29, 0xbb, 0xdc, 0xdb, 0x61, 0x1e, 0x35, 0x55, 0xd3, 0x32, + 0x3b, 0xbe, 0xf7, 0x6e, 0xbc, 0x98, 0xec, 0x4d, 0xd8, 0x8d, 0x5f, 0x34, 0xb8, 0x9c, 0xde, 0x68, + 0xec, 0x3a, 0x71, 0x13, 0xf8, 0xf6, 0x0b, 0xc0, 0x15, 0x58, 0x50, 0x5d, 0x67, 0xfa, 0xea, 0x0a, + 0x3f, 0x00, 0xe4, 0xa8, 0xc6, 0xcf, 0x25, 0x98, 0xcf, 0x58, 0x55, 0x5e, 0x88, 0x2c, 0xfa, 0xf1, + 0x85, 0xc8, 0xb1, 0xac, 0xe3, 0xea, 0x32, 0x55, 0xbf, 0xae, 0x32, 0x49, 0x1d, 0x67, 0x28, 0xa8, + 0x07, 0xc0, 0x89, 0x47, 0x6c, 0xea, 0x53, 0x4f, 0x86, 0xbf, 0x74, 0xfd, 0x87, 0xd3, 0xbb, 0xe4, + 0x5e, 0x2c, 0x13, 0x67, 0xc4, 0xcb, 0x46, 0x44, 0x41, 0x8b, 0x28, 0xe8, 0xa3, 0x19, 0xfa, 0x16, + 0x16, 0x0e, 0x59, 0x9f, 0xee, 0xa5, 0x8a, 0x54, 0x95, 0x22, 0xbb, 0xd3, 0x2b, 0x72, 0x3f, 0x2b, + 0x17, 0xe7, 0x60, 0x8c, 0x77, 0xa1, 0x91, 0x77, 0x32, 0xa9, 0x24, 0xb3, 0x89, 0x95, 0x58, 0x2b, + 0x9a, 0x19, 0x08, 0x1a, 0x79, 0xa7, 0x32, 0x9e, 0xc1, 0x92, 0x04, 0xd9, 0xec, 0x12, 0xcf, 0x3f, + 0xa1, 0x1e, 0xe7, 0x36, 0xd4, 0x13, 0xc8, 0xc2, 0x1b, 0x6f, 0x42, 0x6d, 0x10, 0xbf, 0xe9, 0xc3, + 0x26, 0x27, 0x99, 0x1b, 0x1b, 0x80, 0xb2, 0xfa, 0x46, 0x81, 0x7c, 0x15, 0x66, 0x99, 0x4f, 0xed, + 0xb8, 0x74, 0x9f, 0xcb, 0x47, 0xad, 0x62, 0xc7, 0x21, 0xcf, 0xfa, 0x8b, 0x2a, 0x2c, 0xa5, 0xc1, + 0x23, 0x7f, 0x99, 0x49, 0xd1, 0x2e, 0x34, 0xb6, 0xa2, 0xaf, 0x69, 0x71, 0xeb, 0x8a, 0x8e, 0x7a, + 0x0b, 0x36, 0x97, 0x8b, 0x17, 0x43, 0x8d, 0x8c, 0x19, 0x64, 0xc2, 0xc5, 0xbc, 0xc0, 0xf4, 0xd9, + 0xf9, 0xbf, 0x23, 0x24, 0x27, 0x5c, 0xaf, 0x82, 0x58, 0xd3, 0xd0, 0xe7, 0xb0, 0x30, 0xfa, 0x38, + 0x42, 0x97, 0xb3, 0x7b, 0x0a, 0xdf, 0x6b, 0x4d, 0xe3, 0x28, 0x96, 0x44, 0xff, 0xa7, 0xb0, 0x98, + 0x7b, 0x29, 0x20, 0x63, 0xb4, 0xa2, 0x14, 0xbd, 0xa4, 0x9a, 0xff, 0x3d, 0x92, 0x27, 0x91, 0x7e, + 0x1b, 0x6a, 0x71, 0x67, 0x3d, 0x6a, 0xe6, 0x5c, 0xbf, 0xdd, 0x6c, 0x8c, 0xca, 0x3b, 0x14, 0xc6, + 0x8c, 0x7c, 0x7b, 0xc7, 0x9d, 0xe3, 0xf8, 0xe6, 0x4c, 0x3f, 0xd9, 0x3c, 0x53, 0xd0, 0xc3, 0xa9, + 0xa3, 0x9d, 0xde, 0xa2, 0x7e, 0x5a, 0x10, 0xd0, 0xff, 0x5f, 0xab, 0x54, 0x36, 0x8d, 0x3c, 0xdb, + 0x78, 0x4d, 0x31, 0x66, 0xd0, 0x8f, 0x1a, 0x9c, 0xd9, 0xa2, 0x7e, 0x3e, 0x2b, 0xa3, 0x6b, 0xc5, + 0x20, 0x13, 0xb2, 0x77, 0xf3, 0xf1, 0xb4, 0x61, 0x37, 0x2a, 0xd6, 0x98, 0x41, 0x7b, 0xea, 0xd8, + 0x69, 0xf8, 0xa0, 0x4b, 0x85, 0x71, 0x92, 0x58, 0x6f, 0x65, 0xd2, 0x72, 0x7c, 0xd4, 0x3b, 0x1b, + 0x2f, 0x5e, 0xae, 0x68, 0xbf, 0xbd, 0x5c, 0xd1, 0xfe, 0x7c, 0xb9, 0xa2, 0x7d, 0x71, 0xe3, 0x15, + 0xdf, 0xb2, 0x33, 0x9f, 0xc7, 0x09, 0x67, 0x66, 0x9f, 0x51, 0xc7, 0x3f, 0xa8, 0xaa, 0x2f, 0xd7, + 0x37, 0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x48, 0x1c, 0x9b, 0xea, 0x3d, 0x17, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2004,8 +1678,6 @@ type RepoServerServiceClient interface { ListRefs(ctx context.Context, in *ListRefsRequest, opts ...grpc.CallOption) (*Refs, error) // ListApps returns a list of apps in the repo ListApps(ctx context.Context, in *ListAppsRequest, opts ...grpc.CallOption) (*AppList, error) - // ListPlugins returns a list of cmp v2 plugins running as sidecar to reposerver - ListPlugins(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*PluginList, error) // Generate manifest for application in specified repo name and revision GetAppDetails(ctx context.Context, in *RepoServerAppDetailsQuery, opts ...grpc.CallOption) (*RepoAppDetailsResponse, error) // Get the meta-data (author, date, tags, message) for a specific revision of the repo @@ -2101,15 +1773,6 @@ func (c *repoServerServiceClient) ListApps(ctx context.Context, in *ListAppsRequ return out, nil } -func (c *repoServerServiceClient) ListPlugins(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*PluginList, error) { - out := new(PluginList) - err := c.cc.Invoke(ctx, "/repository.RepoServerService/ListPlugins", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *repoServerServiceClient) GetAppDetails(ctx context.Context, in *RepoServerAppDetailsQuery, opts ...grpc.CallOption) (*RepoAppDetailsResponse, error) { out := new(RepoAppDetailsResponse) err := c.cc.Invoke(ctx, "/repository.RepoServerService/GetAppDetails", in, out, opts...) @@ -2151,8 +1814,6 @@ type RepoServerServiceServer interface { ListRefs(context.Context, *ListRefsRequest) (*Refs, error) // ListApps returns a list of apps in the repo ListApps(context.Context, *ListAppsRequest) (*AppList, error) - // ListPlugins returns a list of cmp v2 plugins running as sidecar to reposerver - ListPlugins(context.Context, *emptypb.Empty) (*PluginList, error) // Generate manifest for application in specified repo name and revision GetAppDetails(context.Context, *RepoServerAppDetailsQuery) (*RepoAppDetailsResponse, error) // Get the meta-data (author, date, tags, message) for a specific revision of the repo @@ -2183,9 +1844,6 @@ func (*UnimplementedRepoServerServiceServer) ListRefs(ctx context.Context, req * func (*UnimplementedRepoServerServiceServer) ListApps(ctx context.Context, req *ListAppsRequest) (*AppList, error) { return nil, status.Errorf(codes.Unimplemented, "method ListApps not implemented") } -func (*UnimplementedRepoServerServiceServer) ListPlugins(ctx context.Context, req *emptypb.Empty) (*PluginList, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListPlugins not implemented") -} func (*UnimplementedRepoServerServiceServer) GetAppDetails(ctx context.Context, req *RepoServerAppDetailsQuery) (*RepoAppDetailsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAppDetails not implemented") } @@ -2316,24 +1974,6 @@ func _RepoServerService_ListApps_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _RepoServerService_ListPlugins_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(RepoServerServiceServer).ListPlugins(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/repository.RepoServerService/ListPlugins", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RepoServerServiceServer).ListPlugins(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - func _RepoServerService_GetAppDetails_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RepoServerAppDetailsQuery) if err := dec(in); err != nil { @@ -2412,10 +2052,6 @@ var _RepoServerService_serviceDesc = grpc.ServiceDesc{ MethodName: "ListApps", Handler: _RepoServerService_ListApps_Handler, }, - { - MethodName: "ListPlugins", - Handler: _RepoServerService_ListPlugins_Handler, - }, { MethodName: "GetAppDetails", Handler: _RepoServerService_GetAppDetails_Handler, @@ -2463,46 +2099,6 @@ func (m *ManifestRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.RefSources) > 0 { - for k := range m.RefSources { - v := m.RefSources[k] - baseI := i - if v != nil { - { - size, err := v.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintRepository(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintRepository(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintRepository(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xba - } - } - if m.HasMultipleSources { - i-- - if m.HasMultipleSources { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xb0 - } if m.HelmOptions != nil { { size, err := m.HelmOptions.MarshalToSizedBuffer(dAtA[:i]) @@ -3327,7 +2923,7 @@ func (m *AppList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *PluginInfo) Marshal() (dAtA []byte, err error) { +func (m *RepoServerAppDetailsQuery) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -3337,12 +2933,12 @@ func (m *PluginInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PluginInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *RepoServerAppDetailsQuery) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PluginInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RepoServerAppDetailsQuery) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -3351,107 +2947,6 @@ func (m *PluginInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintRepository(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *PluginList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PluginList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PluginList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintRepository(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *RepoServerAppDetailsQuery) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RepoServerAppDetailsQuery) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RepoServerAppDetailsQuery) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RefSources) > 0 { - for k := range m.RefSources { - v := m.RefSources[k] - baseI := i - if v != nil { - { - size, err := v.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintRepository(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintRepository(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintRepository(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x5a - } - } if m.HelmOptions != nil { { size, err := m.HelmOptions.MarshalToSizedBuffer(dAtA[:i]) @@ -3597,18 +3092,6 @@ func (m *RepoAppDetailsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Plugin != nil { - { - size, err := m.Plugin.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintRepository(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } if m.Directory != nil { { size, err := m.Directory.MarshalToSizedBuffer(dAtA[:i]) @@ -3852,154 +3335,6 @@ func (m *DirectoryAppSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ParameterAnnouncement) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ParameterAnnouncement) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ParameterAnnouncement) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Map) > 0 { - for k := range m.Map { - v := m.Map[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintRepository(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintRepository(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintRepository(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Array) > 0 { - for iNdEx := len(m.Array) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Array[iNdEx]) - copy(dAtA[i:], m.Array[iNdEx]) - i = encodeVarintRepository(dAtA, i, uint64(len(m.Array[iNdEx]))) - i-- - dAtA[i] = 0x42 - } - } - if len(m.String_) > 0 { - i -= len(m.String_) - copy(dAtA[i:], m.String_) - i = encodeVarintRepository(dAtA, i, uint64(len(m.String_))) - i-- - dAtA[i] = 0x3a - } - if len(m.CollectionType) > 0 { - i -= len(m.CollectionType) - copy(dAtA[i:], m.CollectionType) - i = encodeVarintRepository(dAtA, i, uint64(len(m.CollectionType))) - i-- - dAtA[i] = 0x32 - } - if len(m.ItemType) > 0 { - i -= len(m.ItemType) - copy(dAtA[i:], m.ItemType) - i = encodeVarintRepository(dAtA, i, uint64(len(m.ItemType))) - i-- - dAtA[i] = 0x2a - } - if m.Required { - i-- - if m.Required { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if len(m.Tooltip) > 0 { - i -= len(m.Tooltip) - copy(dAtA[i:], m.Tooltip) - i = encodeVarintRepository(dAtA, i, uint64(len(m.Tooltip))) - i-- - dAtA[i] = 0x1a - } - if len(m.Title) > 0 { - i -= len(m.Title) - copy(dAtA[i:], m.Title) - i = encodeVarintRepository(dAtA, i, uint64(len(m.Title))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintRepository(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *PluginAppSpec) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PluginAppSpec) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PluginAppSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ParametersAnnouncement) > 0 { - for iNdEx := len(m.ParametersAnnouncement) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ParametersAnnouncement[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintRepository(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *HelmChartsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4221,22 +3556,6 @@ func (m *ManifestRequest) Size() (n int) { l = m.HelmOptions.Size() n += 2 + l + sovRepository(uint64(l)) } - if m.HasMultipleSources { - n += 3 - } - if len(m.RefSources) > 0 { - for k, v := range m.RefSources { - _ = k - _ = v - l = 0 - if v != nil { - l = v.Size() - l += 1 + sovRepository(uint64(l)) - } - mapEntrySize := 1 + len(k) + sovRepository(uint64(len(k))) + l - n += mapEntrySize + 2 + sovRepository(uint64(mapEntrySize)) - } - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -4530,40 +3849,6 @@ func (m *AppList) Size() (n int) { return n } -func (m *PluginInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovRepository(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *PluginList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovRepository(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func (m *RepoServerAppDetailsQuery) Size() (n int) { if m == nil { return 0 @@ -4614,19 +3899,6 @@ func (m *RepoServerAppDetailsQuery) Size() (n int) { l = m.HelmOptions.Size() n += 1 + l + sovRepository(uint64(l)) } - if len(m.RefSources) > 0 { - for k, v := range m.RefSources { - _ = k - _ = v - l = 0 - if v != nil { - l = v.Size() - l += 1 + sovRepository(uint64(l)) - } - mapEntrySize := 1 + len(k) + sovRepository(uint64(len(k))) + l - n += mapEntrySize + 1 + sovRepository(uint64(mapEntrySize)) - } - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -4655,10 +3927,6 @@ func (m *RepoAppDetailsResponse) Size() (n int) { l = m.Directory.Size() n += 1 + l + sovRepository(uint64(l)) } - if m.Plugin != nil { - l = m.Plugin.Size() - n += 1 + l + sovRepository(uint64(l)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -4756,89 +4024,18 @@ func (m *DirectoryAppSpec) Size() (n int) { return n } -func (m *ParameterAnnouncement) Size() (n int) { +func (m *HelmChartsRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovRepository(uint64(l)) - } - l = len(m.Title) - if l > 0 { - n += 1 + l + sovRepository(uint64(l)) - } - l = len(m.Tooltip) - if l > 0 { + if m.Repo != nil { + l = m.Repo.Size() n += 1 + l + sovRepository(uint64(l)) } - if m.Required { - n += 2 - } - l = len(m.ItemType) - if l > 0 { - n += 1 + l + sovRepository(uint64(l)) - } - l = len(m.CollectionType) - if l > 0 { - n += 1 + l + sovRepository(uint64(l)) - } - l = len(m.String_) - if l > 0 { - n += 1 + l + sovRepository(uint64(l)) - } - if len(m.Array) > 0 { - for _, s := range m.Array { - l = len(s) - n += 1 + l + sovRepository(uint64(l)) - } - } - if len(m.Map) > 0 { - for k, v := range m.Map { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovRepository(uint64(len(k))) + 1 + len(v) + sovRepository(uint64(len(v))) - n += mapEntrySize + 1 + sovRepository(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *PluginAppSpec) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ParametersAnnouncement) > 0 { - for _, e := range m.ParametersAnnouncement { - l = e.Size() - n += 1 + l + sovRepository(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *HelmChartsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Repo != nil { - l = m.Repo.Size() - n += 1 + l + sovRepository(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) } return n } @@ -5563,155 +4760,6 @@ func (m *ManifestRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 22: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HasMultipleSources", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.HasMultipleSources = bool(v != 0) - case 23: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RefSources", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.RefSources == nil { - m.RefSources = make(map[string]*v1alpha1.RefTarget) - } - var mapkey string - var mapvalue *v1alpha1.RefTarget - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthRepository - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthRepository - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return ErrInvalidLengthRepository - } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { - return ErrInvalidLengthRepository - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue = &v1alpha1.RefTarget{} - if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - } else { - iNdEx = entryPreIndex - skippy, err := skipRepository(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRepository - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.RefSources[mapkey] = mapvalue - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRepository(dAtA[iNdEx:]) @@ -7362,7 +6410,7 @@ func (m *AppList) Unmarshal(dAtA []byte) error { } return nil } -func (m *PluginInfo) Unmarshal(dAtA []byte) error { +func (m *RepoServerAppDetailsQuery) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7385,17 +6433,17 @@ func (m *PluginInfo) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PluginInfo: wiretype end group for non-group") + return fmt.Errorf("proto: RepoServerAppDetailsQuery: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PluginInfo: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RepoServerAppDetailsQuery: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowRepository @@ -7405,199 +6453,31 @@ func (m *PluginInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthRepository } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthRepository } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipRepository(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRepository - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PluginList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + if m.Repo == nil { + m.Repo = &v1alpha1.Repository{} } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + if err := m.Repo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PluginList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PluginList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, &PluginInfo{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipRepository(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRepository - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RepoServerAppDetailsQuery) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RepoServerAppDetailsQuery: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RepoServerAppDetailsQuery: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Repo == nil { - m.Repo = &v1alpha1.Repository{} - } - if err := m.Repo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7956,135 +6836,6 @@ func (m *RepoServerAppDetailsQuery) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RefSources", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.RefSources == nil { - m.RefSources = make(map[string]*v1alpha1.RefTarget) - } - var mapkey string - var mapvalue *v1alpha1.RefTarget - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthRepository - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthRepository - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return ErrInvalidLengthRepository - } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { - return ErrInvalidLengthRepository - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue = &v1alpha1.RefTarget{} - if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - } else { - iNdEx = entryPreIndex - skippy, err := skipRepository(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRepository - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.RefSources[mapkey] = mapvalue - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRepository(dAtA[iNdEx:]) @@ -8276,50 +7027,14 @@ func (m *RepoAppDetailsResponse) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Plugin", wireType) + default: + iNdEx = preIndex + skippy, err := skipRepository(dAtA[iNdEx:]) + if err != nil { + return err } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Plugin == nil { - m.Plugin = &PluginAppSpec{} - } - if err := m.Plugin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipRepository(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRepository + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRepository } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8822,513 +7537,6 @@ func (m *DirectoryAppSpec) Unmarshal(dAtA []byte) error { } return nil } -func (m *ParameterAnnouncement) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ParameterAnnouncement: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ParameterAnnouncement: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Title = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tooltip", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tooltip = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Required", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Required = bool(v != 0) - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ItemType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ItemType = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CollectionType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CollectionType = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field String_", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.String_ = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Array", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Array = append(m.Array, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Map", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Map == nil { - m.Map = make(map[string]string) - } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthRepository - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthRepository - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthRepository - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthRepository - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipRepository(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRepository - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Map[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipRepository(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRepository - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PluginAppSpec) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PluginAppSpec: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PluginAppSpec: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ParametersAnnouncement", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRepository - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthRepository - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthRepository - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ParametersAnnouncement = append(m.ParametersAnnouncement, &ParameterAnnouncement{}) - if err := m.ParametersAnnouncement[len(m.ParametersAnnouncement)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipRepository(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRepository - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *HelmChartsRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/reposerver/cache/cache.go b/reposerver/cache/cache.go index 61b4ff6abd85b..417df72280284 100644 --- a/reposerver/cache/cache.go +++ b/reposerver/cache/cache.go @@ -62,51 +62,17 @@ func AddCacheFlagsToCmd(cmd *cobra.Command, opts ...func(client *redis.Client)) } } -type refTargetForCacheKey struct { - RepoURL string `json:"repoURL"` - Project string `json:"project"` - TargetRevision string `json:"targetRevision"` - Chart string `json:"chart"` -} - -func refTargetForCacheKeyFromRefTarget(refTarget *appv1.RefTarget) refTargetForCacheKey { - return refTargetForCacheKey{ - RepoURL: refTarget.Repo.Repo, - Project: refTarget.Repo.Project, - TargetRevision: refTarget.TargetRevision, - Chart: refTarget.Chart, - } -} - -type refTargetRevisionMappingForCacheKey map[string]refTargetForCacheKey - -func getRefTargetRevisionMappingForCacheKey(refTargetRevisionMapping appv1.RefTargetRevisionMapping) refTargetRevisionMappingForCacheKey { - res := make(refTargetRevisionMappingForCacheKey) - for k, v := range refTargetRevisionMapping { - res[k] = refTargetForCacheKeyFromRefTarget(v) - } - return res +func appSourceKey(appSrc *appv1.ApplicationSource) uint32 { + return hash.FNVa(appSourceKeyJSON(appSrc)) } -func appSourceKey(appSrc *appv1.ApplicationSource, srcRefs appv1.RefTargetRevisionMapping) uint32 { - return hash.FNVa(appSourceKeyJSON(appSrc, srcRefs)) -} - -type appSourceKeyStruct struct { - AppSrc *appv1.ApplicationSource `json:"appSrc"` - SrcRefs refTargetRevisionMappingForCacheKey `json:"srcRefs"` -} - -func appSourceKeyJSON(appSrc *appv1.ApplicationSource, srcRefs appv1.RefTargetRevisionMapping) string { +func appSourceKeyJSON(appSrc *appv1.ApplicationSource) string { appSrc = appSrc.DeepCopy() if !appSrc.IsHelm() { appSrc.RepoURL = "" // superseded by commitSHA appSrc.TargetRevision = "" // superseded by commitSHA } - appSrcStr, _ := json.Marshal(appSourceKeyStruct{ - AppSrc: appSrc, - SrcRefs: getRefTargetRevisionMappingForCacheKey(srcRefs), - }) + appSrcStr, _ := json.Marshal(appSrc) return string(appSrcStr) } @@ -183,9 +149,9 @@ func (c *Cache) GetGitReferences(repo string, references *[]*plumbing.Reference) return nil } -func manifestCacheKey(revision string, appSrc *appv1.ApplicationSource, srcRefs appv1.RefTargetRevisionMapping, namespace string, trackingMethod string, appLabelKey string, appName string, info ClusterRuntimeInfo) string { +func manifestCacheKey(revision string, appSrc *appv1.ApplicationSource, namespace string, trackingMethod string, appLabelKey string, appName string, info ClusterRuntimeInfo) string { trackingKey := trackingKey(appLabelKey, trackingMethod) - return fmt.Sprintf("mfst|%s|%s|%s|%s|%d", trackingKey, appName, revision, namespace, appSourceKey(appSrc, srcRefs)+clusterRuntimeInfoKey(info)) + return fmt.Sprintf("mfst|%s|%s|%s|%s|%d", trackingKey, appName, revision, namespace, appSourceKey(appSrc)+clusterRuntimeInfoKey(info)) } func trackingKey(appLabelKey string, trackingMethod string) string { @@ -198,11 +164,11 @@ func trackingKey(appLabelKey string, trackingMethod string) string { // LogDebugManifestCacheKeyFields logs all the information included in a manifest cache key. It's intended to be run // before every manifest cache operation to help debug cache misses. -func LogDebugManifestCacheKeyFields(message string, reason string, revision string, appSrc *appv1.ApplicationSource, srcRefs appv1.RefTargetRevisionMapping, clusterInfo ClusterRuntimeInfo, namespace string, trackingMethod string, appLabelKey string, appName string) { +func LogDebugManifestCacheKeyFields(message string, reason string, revision string, appSrc *appv1.ApplicationSource, clusterInfo ClusterRuntimeInfo, namespace string, trackingMethod string, appLabelKey string, appName string) { if log.IsLevelEnabled(log.DebugLevel) { log.WithFields(log.Fields{ "revision": revision, - "appSrc": appSourceKeyJSON(appSrc, srcRefs), + "appSrc": appSourceKeyJSON(appSrc), "namespace": namespace, "trackingKey": trackingKey(appLabelKey, trackingMethod), "appName": appName, @@ -212,8 +178,8 @@ func LogDebugManifestCacheKeyFields(message string, reason string, revision stri } } -func (c *Cache) GetManifests(revision string, appSrc *appv1.ApplicationSource, srcRefs appv1.RefTargetRevisionMapping, clusterInfo ClusterRuntimeInfo, namespace string, trackingMethod string, appLabelKey string, appName string, res *CachedManifestResponse) error { - err := c.cache.GetItem(manifestCacheKey(revision, appSrc, srcRefs, namespace, trackingMethod, appLabelKey, appName, clusterInfo), res) +func (c *Cache) GetManifests(revision string, appSrc *appv1.ApplicationSource, clusterInfo ClusterRuntimeInfo, namespace string, trackingMethod string, appLabelKey string, appName string, res *CachedManifestResponse) error { + err := c.cache.GetItem(manifestCacheKey(revision, appSrc, namespace, trackingMethod, appLabelKey, appName, clusterInfo), res) if err != nil { return err @@ -228,9 +194,9 @@ func (c *Cache) GetManifests(revision string, appSrc *appv1.ApplicationSource, s if hash != res.CacheEntryHash || res.ManifestResponse == nil && res.MostRecentError == "" { log.Warnf("Manifest hash did not match expected value or cached manifests response is empty, treating as a cache miss: %s", appName) - LogDebugManifestCacheKeyFields("deleting manifests cache", "manifest hash did not match or cached response is empty", revision, appSrc, srcRefs, clusterInfo, namespace, trackingMethod, appLabelKey, appName) + LogDebugManifestCacheKeyFields("deleting manifests cache", "manifest hash did not match or cached response is empty", revision, appSrc, clusterInfo, namespace, trackingMethod, appLabelKey, appName) - err = c.DeleteManifests(revision, appSrc, srcRefs, clusterInfo, namespace, trackingMethod, appLabelKey, appName) + err = c.DeleteManifests(revision, appSrc, clusterInfo, namespace, trackingMethod, appLabelKey, appName) if err != nil { return fmt.Errorf("Unable to delete manifest after hash mismatch, %v", err) } @@ -245,7 +211,7 @@ func (c *Cache) GetManifests(revision string, appSrc *appv1.ApplicationSource, s return nil } -func (c *Cache) SetManifests(revision string, appSrc *appv1.ApplicationSource, srcRefs appv1.RefTargetRevisionMapping, clusterInfo ClusterRuntimeInfo, namespace string, trackingMethod string, appLabelKey string, appName string, res *CachedManifestResponse) error { +func (c *Cache) SetManifests(revision string, appSrc *appv1.ApplicationSource, clusterInfo ClusterRuntimeInfo, namespace string, trackingMethod string, appLabelKey string, appName string, res *CachedManifestResponse) error { // Generate and apply the cache entry hash, before writing if res != nil { res = res.shallowCopy() @@ -256,26 +222,26 @@ func (c *Cache) SetManifests(revision string, appSrc *appv1.ApplicationSource, s res.CacheEntryHash = hash } - return c.cache.SetItem(manifestCacheKey(revision, appSrc, srcRefs, namespace, trackingMethod, appLabelKey, appName, clusterInfo), res, c.repoCacheExpiration, res == nil) + return c.cache.SetItem(manifestCacheKey(revision, appSrc, namespace, trackingMethod, appLabelKey, appName, clusterInfo), res, c.repoCacheExpiration, res == nil) } -func (c *Cache) DeleteManifests(revision string, appSrc *appv1.ApplicationSource, srcRefs appv1.RefTargetRevisionMapping, clusterInfo ClusterRuntimeInfo, namespace, trackingMethod, appLabelKey, appName string) error { - return c.cache.SetItem(manifestCacheKey(revision, appSrc, srcRefs, namespace, trackingMethod, appLabelKey, appName, clusterInfo), "", c.repoCacheExpiration, true) +func (c *Cache) DeleteManifests(revision string, appSrc *appv1.ApplicationSource, clusterInfo ClusterRuntimeInfo, namespace, trackingMethod, appLabelKey, appName string) error { + return c.cache.SetItem(manifestCacheKey(revision, appSrc, namespace, trackingMethod, appLabelKey, appName, clusterInfo), "", c.repoCacheExpiration, true) } -func appDetailsCacheKey(revision string, appSrc *appv1.ApplicationSource, srcRefs appv1.RefTargetRevisionMapping, trackingMethod appv1.TrackingMethod) string { +func appDetailsCacheKey(revision string, appSrc *appv1.ApplicationSource, trackingMethod appv1.TrackingMethod) string { if trackingMethod == "" { trackingMethod = argo.TrackingMethodLabel } - return fmt.Sprintf("appdetails|%s|%d|%s", revision, appSourceKey(appSrc, srcRefs), trackingMethod) + return fmt.Sprintf("appdetails|%s|%d|%s", revision, appSourceKey(appSrc), trackingMethod) } -func (c *Cache) GetAppDetails(revision string, appSrc *appv1.ApplicationSource, srcRefs appv1.RefTargetRevisionMapping, res *apiclient.RepoAppDetailsResponse, trackingMethod appv1.TrackingMethod) error { - return c.cache.GetItem(appDetailsCacheKey(revision, appSrc, srcRefs, trackingMethod), res) +func (c *Cache) GetAppDetails(revision string, appSrc *appv1.ApplicationSource, res *apiclient.RepoAppDetailsResponse, trackingMethod appv1.TrackingMethod) error { + return c.cache.GetItem(appDetailsCacheKey(revision, appSrc, trackingMethod), res) } -func (c *Cache) SetAppDetails(revision string, appSrc *appv1.ApplicationSource, srcRefs appv1.RefTargetRevisionMapping, res *apiclient.RepoAppDetailsResponse, trackingMethod appv1.TrackingMethod) error { - return c.cache.SetItem(appDetailsCacheKey(revision, appSrc, srcRefs, trackingMethod), res, c.repoCacheExpiration, res == nil) +func (c *Cache) SetAppDetails(revision string, appSrc *appv1.ApplicationSource, res *apiclient.RepoAppDetailsResponse, trackingMethod appv1.TrackingMethod) error { + return c.cache.SetItem(appDetailsCacheKey(revision, appSrc, trackingMethod), res, c.repoCacheExpiration, res == nil) } func revisionMetadataKey(repoURL, revision string) string { diff --git a/reposerver/cache/cache_test.go b/reposerver/cache/cache_test.go index 747962c5ccaf3..805fad88a44da 100644 --- a/reposerver/cache/cache_test.go +++ b/reposerver/cache/cache_test.go @@ -73,57 +73,50 @@ func TestCache_GetManifests(t *testing.T) { // cache miss q := &apiclient.ManifestRequest{} value := &CachedManifestResponse{} - err := cache.GetManifests("my-revision", &ApplicationSource{}, q.RefSources, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", value) + err := cache.GetManifests("my-revision", &ApplicationSource{}, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", value) assert.Equal(t, ErrCacheMiss, err) // 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) + err = cache.SetManifests("my-revision", &ApplicationSource{}, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", res) assert.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) - assert.Equal(t, ErrCacheMiss, err) - }) - t.Run("expect cache miss because of changed path", func(t *testing.T) { - err = cache.GetManifests("my-revision", &ApplicationSource{Path: "other-path"}, q.RefSources, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", value) - assert.Equal(t, ErrCacheMiss, err) - }) - t.Run("expect cache miss because of changed namespace", func(t *testing.T) { - err = cache.GetManifests("my-revision", &ApplicationSource{}, q.RefSources, q, "other-namespace", "", "my-app-label-key", "my-app-label-value", value) - assert.Equal(t, ErrCacheMiss, err) - }) - t.Run("expect cache miss because of changed app label key", func(t *testing.T) { - err = cache.GetManifests("my-revision", &ApplicationSource{}, q.RefSources, q, "my-namespace", "", "other-app-label-key", "my-app-label-value", value) - assert.Equal(t, ErrCacheMiss, err) - }) - t.Run("expect cache miss because of changed app label value", func(t *testing.T) { - err = cache.GetManifests("my-revision", &ApplicationSource{}, q.RefSources, q, "my-namespace", "", "my-app-label-key", "other-app-label-value", value) - assert.Equal(t, ErrCacheMiss, err) - }) - t.Run("expect cache hit", func(t *testing.T) { - err = cache.GetManifests("my-revision", &ApplicationSource{}, q.RefSources, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", value) - assert.NoError(t, err) - assert.Equal(t, &CachedManifestResponse{ManifestResponse: &apiclient.ManifestResponse{SourceType: "my-source-type"}}, value) - }) + // cache miss + err = cache.GetManifests("other-revision", &ApplicationSource{}, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", value) + assert.Equal(t, ErrCacheMiss, err) + // cache miss + err = cache.GetManifests("my-revision", &ApplicationSource{Path: "other-path"}, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", value) + assert.Equal(t, ErrCacheMiss, err) + // cache miss + err = cache.GetManifests("my-revision", &ApplicationSource{}, q, "other-namespace", "", "my-app-label-key", "my-app-label-value", value) + assert.Equal(t, ErrCacheMiss, err) + // cache miss + err = cache.GetManifests("my-revision", &ApplicationSource{}, q, "my-namespace", "", "other-app-label-key", "my-app-label-value", value) + assert.Equal(t, ErrCacheMiss, err) + // cache miss + err = cache.GetManifests("my-revision", &ApplicationSource{}, q, "my-namespace", "", "my-app-label-key", "other-app-label-value", value) + assert.Equal(t, ErrCacheMiss, err) + // cache hit + err = cache.GetManifests("my-revision", &ApplicationSource{}, q, "my-namespace", "", "my-app-label-key", "my-app-label-value", value) + assert.NoError(t, err) + assert.Equal(t, &CachedManifestResponse{ManifestResponse: &apiclient.ManifestResponse{SourceType: "my-source-type"}}, value) } func TestCache_GetAppDetails(t *testing.T) { cache := newFixtures().Cache // cache miss value := &apiclient.RepoAppDetailsResponse{} - emptyRefSources := map[string]*appv1.RefTarget{} - err := cache.GetAppDetails("my-revision", &ApplicationSource{}, emptyRefSources, value, "") + err := cache.GetAppDetails("my-revision", &ApplicationSource{}, value, "") assert.Equal(t, ErrCacheMiss, err) res := &apiclient.RepoAppDetailsResponse{Type: "my-type"} - err = cache.SetAppDetails("my-revision", &ApplicationSource{}, emptyRefSources, res, "") + err = cache.SetAppDetails("my-revision", &ApplicationSource{}, res, "") assert.NoError(t, err) //cache miss - err = cache.GetAppDetails("other-revision", &ApplicationSource{}, emptyRefSources, value, "") + err = cache.GetAppDetails("other-revision", &ApplicationSource{}, value, "") assert.Equal(t, ErrCacheMiss, err) //cache miss - err = cache.GetAppDetails("my-revision", &ApplicationSource{Path: "other-path"}, emptyRefSources, value, "") + err = cache.GetAppDetails("my-revision", &ApplicationSource{Path: "other-path"}, value, "") assert.Equal(t, ErrCacheMiss, err) // cache hit - err = cache.GetAppDetails("my-revision", &ApplicationSource{}, emptyRefSources, value, "") + err = cache.GetAppDetails("my-revision", &ApplicationSource{}, value, "") assert.NoError(t, err) assert.Equal(t, &apiclient.RepoAppDetailsResponse{Type: "my-type"}, value) } @@ -161,8 +154,7 @@ func TestCachedManifestResponse_HashBehavior(t *testing.T) { NumberOfCachedResponsesReturned: 0, NumberOfConsecutiveFailures: 0, } - q := &apiclient.ManifestRequest{} - err := repoCache.SetManifests(response.Revision, appSrc, q.RefSources, q, response.Namespace, "", appKey, appValue, store) + err := repoCache.SetManifests(response.Revision, appSrc, &apiclient.ManifestRequest{}, response.Namespace, "", appKey, appValue, store) if err != nil { t.Fatal(err) } @@ -193,7 +185,7 @@ func TestCachedManifestResponse_HashBehavior(t *testing.T) { // Retrieve the value using 'GetManifests' and confirm it works retrievedVal := &CachedManifestResponse{} - err = repoCache.GetManifests(response.Revision, appSrc, q.RefSources, q, response.Namespace, "", appKey, appValue, retrievedVal) + err = repoCache.GetManifests(response.Revision, appSrc, &apiclient.ManifestRequest{}, response.Namespace, "", appKey, appValue, retrievedVal) if err != nil { t.Fatal(err) } @@ -216,7 +208,7 @@ func TestCachedManifestResponse_HashBehavior(t *testing.T) { // Retrieve the value using GetManifests and confirm it returns a cache miss retrievedVal = &CachedManifestResponse{} - err = repoCache.GetManifests(response.Revision, appSrc, q.RefSources, q, response.Namespace, "", appKey, appValue, retrievedVal) + err = repoCache.GetManifests(response.Revision, appSrc, &apiclient.ManifestRequest{}, response.Namespace, "", appKey, appValue, retrievedVal) assert.True(t, err == cacheutil.ErrCacheMiss) diff --git a/reposerver/repository/lock.go b/reposerver/repository/lock.go index 05eddf667d82a..06c4aa4acedeb 100644 --- a/reposerver/repository/lock.go +++ b/reposerver/repository/lock.go @@ -1,7 +1,6 @@ package repository import ( - "fmt" "io" "sync" @@ -42,10 +41,7 @@ func (r *repositoryLock) Lock(path string, revision string, allowConcurrent bool if notify { state.cond.Broadcast() } - if err != nil { - return fmt.Errorf("init closer failed: %w", err) - } - return nil + return err }) for { diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go index 19a30f7182cda..8b31f660f78c7 100644 --- a/reposerver/repository/repository.go +++ b/reposerver/repository/repository.go @@ -17,8 +17,6 @@ import ( "strings" "time" - "github.com/golang/protobuf/ptypes/empty" - kubeyaml "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/apimachinery/pkg/api/resource" @@ -70,6 +68,7 @@ import ( const ( cachedManifestGenerationPrefix = "Manifest generation error (cached)" + pluginNotSupported = "config management plugin not supported." helmDepUpMarkerFile = ".argocd-helm-dep-up" allowConcurrencyFile = ".argocd-allow-concurrency" repoSourceFile = ".argocd-source.yaml" @@ -83,8 +82,8 @@ var ErrExceededMaxCombinedManifestFileSize = errors.New("exceeded max combined m type Service struct { gitCredsStore git.CredsStore rootDir string - gitRepoPaths io.TempPaths - chartPaths io.TempPaths + gitRepoPaths *io.TempPaths + chartPaths *io.TempPaths gitRepoInitializer func(rootPath string) goio.Closer repoLock *repositoryLock cache *reposervercache.Cache @@ -118,8 +117,6 @@ func NewService(metricsServer *metrics.MetricsServer, cache *reposervercache.Cac parallelismLimitSemaphore = semaphore.NewWeighted(initConstants.ParallelismLimit) } repoLock := NewRepositoryLock() - gitRandomizedPaths := io.NewRandomizedTempPaths(rootDir) - helmRandomizedPaths := io.NewRandomizedTempPaths(rootDir) return &Service{ parallelismLimitSemaphore: parallelismLimitSemaphore, repoLock: repoLock, @@ -133,8 +130,8 @@ func NewService(metricsServer *metrics.MetricsServer, cache *reposervercache.Cac initConstants: initConstants, now: time.Now, gitCredsStore: gitCredsStore, - gitRepoPaths: gitRandomizedPaths, - chartPaths: helmRandomizedPaths, + gitRepoPaths: io.NewTempPaths(rootDir), + chartPaths: io.NewTempPaths(rootDir), gitRepoInitializer: directoryPermissionInitializer, rootDir: rootDir, } @@ -233,26 +230,6 @@ func (s *Service) ListApps(ctx context.Context, q *apiclient.ListAppsRequest) (* return &res, nil } -// ListPlugins lists the contents of a GitHub repo -func (s *Service) ListPlugins(ctx context.Context, _ *empty.Empty) (*apiclient.PluginList, error) { - pluginSockFilePath := common.GetPluginSockFilePath() - - sockFiles, err := os.ReadDir(pluginSockFilePath) - if err != nil { - return nil, fmt.Errorf("failed to get plugins from dir %v, error=%w", pluginSockFilePath, err) - } - - plugins := []*apiclient.PluginInfo{} - for _, file := range sockFiles { - if file.Type() == os.ModeSocket { - plugins = append(plugins, &apiclient.PluginInfo{Name: strings.TrimSuffix(file.Name(), ".sock")}) - } - } - - res := apiclient.PluginList{Items: plugins} - return &res, nil -} - type operationSettings struct { sem *semaphore.Weighted noCache bool @@ -289,8 +266,7 @@ func (s *Service) runRepoOperation( verifyCommit bool, cacheFn func(cacheKey string, firstInvocation bool) (bool, error), operation func(repoRoot, commitSHA, cacheKey string, ctxSrc operationContextSrc) error, - settings operationSettings, - hasMultipleSources bool) error { + settings operationSettings) error { if sanitizer, ok := grpc.SanitizerFromContext(ctx); ok { // make sure randomized path replaced with '.' in the error message @@ -330,14 +306,6 @@ func (s *Service) runRepoOperation( defer settings.sem.Release(1) } - // do not generate manifests if Path and Chart fields are not set for a source in Multiple Sources - if hasMultipleSources && source.Path == "" && source.Chart == "" { - log.WithFields(map[string]interface{}{ - "source": source, - }).Debugf("not generating manifests as path and chart fields are empty") - return nil - } - if source.IsHelm() { if settings.noCache { err = helmClient.CleanChartCache(source.Chart, revision) @@ -437,6 +405,7 @@ func (s *Service) runRepoOperation( func (s *Service) GenerateManifest(ctx context.Context, q *apiclient.ManifestRequest) (*apiclient.ManifestResponse, error) { var res *apiclient.ManifestResponse var err error + cacheFn := func(cacheKey string, firstInvocation bool) (bool, error) { ok, resp, err := s.getManifestCacheEntry(cacheKey, q, firstInvocation) res = resp @@ -465,7 +434,7 @@ func (s *Service) GenerateManifest(ctx context.Context, q *apiclient.ManifestReq } settings := operationSettings{sem: s.parallelismLimitSemaphore, noCache: q.NoCache, noRevisionCache: q.NoRevisionCache, allowConcurrent: q.ApplicationSource.AllowsConcurrentProcessing()} - err = s.runRepoOperation(ctx, q.Revision, q.Repo, q.ApplicationSource, q.VerifySignature, cacheFn, operation, settings, q.HasMultipleSources) + err = s.runRepoOperation(ctx, q.Revision, q.Repo, q.ApplicationSource, q.VerifySignature, cacheFn, operation, settings) // if the tarDoneCh message is sent it means that the manifest // generation is being managed by the cmp-server. In this case @@ -480,9 +449,6 @@ func (s *Service) GenerateManifest(ctx context.Context, q *apiclient.ManifestReq } } - if q.HasMultipleSources && err == nil && res == nil { - res = &apiclient.ManifestResponse{} - } return res, err } @@ -595,12 +561,6 @@ func (s *Service) runManifestGen(ctx context.Context, repoRoot, commitSHA, cache return responsePromise } -type repoRef struct { - revision string - commitSHA string - key string -} - func (s *Service) runManifestGenAsync(ctx context.Context, repoRoot, commitSHA, cacheKey string, opContextSrc operationContextSrc, q *apiclient.ManifestRequest, ch *generateManifestCh) { defer func() { close(ch.errCh) @@ -614,103 +574,17 @@ func (s *Service) runManifestGenAsync(ctx context.Context, repoRoot, commitSHA, var manifestGenResult *apiclient.ManifestResponse opContext, err := opContextSrc() if err == nil { - if q.HasMultipleSources { - if q.ApplicationSource.Helm != nil { - repoRefs := make(map[string]repoRef) - - // Checkout every one of the referenced sources to the target revision before generating Manifests - for _, valueFile := range q.ApplicationSource.Helm.ValueFiles { - if strings.HasPrefix(valueFile, "$") { - refVar := strings.Split(valueFile, "/")[0] - - refSourceMapping, ok := q.RefSources[refVar] - if !ok { - if len(q.RefSources) == 0 { - ch.errCh <- fmt.Errorf("source referenced %q, but no source has a 'ref' field defined", refVar) - } - refKeys := make([]string, 0) - for refKey := range q.RefSources { - refKeys = append(refKeys, refKey) - } - ch.errCh <- fmt.Errorf("source referenced %q, which is not one of the available sources (%s)", refVar, strings.Join(refKeys, ", ")) - return - } - if refSourceMapping.Chart != "" { - ch.errCh <- fmt.Errorf("source has a 'chart' field defined, but Helm charts are not yet not supported for 'ref' sources") - return - } - normalizedRepoURL := git.NormalizeGitURL(refSourceMapping.Repo.Repo) - closer, ok := repoRefs[normalizedRepoURL] - if ok { - if closer.revision != refSourceMapping.TargetRevision { - ch.errCh <- fmt.Errorf("cannot reference multiple revisions for the same repository (%s references %q while %s references %q)", refVar, refSourceMapping.TargetRevision, closer.key, closer.revision) - return - } - } else { - gitClient, referencedCommitSHA, err := s.newClientResolveRevision(&refSourceMapping.Repo, refSourceMapping.TargetRevision) - if err != nil { - ch.errCh <- fmt.Errorf("failed to get git client for repo %s", q.Repo.Repo) - return - } - - if git.NormalizeGitURL(q.ApplicationSource.RepoURL) == normalizedRepoURL && commitSHA != referencedCommitSHA { - ch.errCh <- fmt.Errorf("cannot reference a different revision of the same repository (%s references %q which resolves to %q while the application references %q which resolves to %q)", refVar, refSourceMapping.TargetRevision, referencedCommitSHA, q.Revision, commitSHA) - return - } - closer, err := s.repoLock.Lock(gitClient.Root(), referencedCommitSHA, true, func() (goio.Closer, error) { - return s.checkoutRevision(gitClient, referencedCommitSHA, s.initConstants.SubmoduleEnabled) - }) - if err != nil { - log.Errorf("failed to acquire lock for referenced source %s", normalizedRepoURL) - ch.errCh <- err - return - } - defer func(closer goio.Closer) { - err := closer.Close() - if err != nil { - log.Errorf("Failed to release repo lock: %v", err) - } - }(closer) - - // Symlink check must happen after acquiring lock. - if !s.initConstants.AllowOutOfBoundsSymlinks { - err := argopath.CheckOutOfBoundsSymlinks(gitClient.Root()) - if err != nil { - oobError := &argopath.OutOfBoundsSymlinkError{} - if errors.As(err, &oobError) { - log.WithFields(log.Fields{ - common.SecurityField: common.SecurityHigh, - "repo": refSourceMapping.Repo, - "revision": refSourceMapping.TargetRevision, - "file": oobError.File, - }).Warn("repository contains out-of-bounds symlink") - ch.errCh <- fmt.Errorf("repository contains out-of-bounds symlinks. file: %s", oobError.File) - return - } else { - ch.errCh <- err - return - } - } - } - - repoRefs[normalizedRepoURL] = repoRef{revision: refSourceMapping.TargetRevision, commitSHA: referencedCommitSHA, key: refVar} - } - } - } - } - } - - manifestGenResult, err = GenerateManifests(ctx, opContext.appPath, repoRoot, commitSHA, q, false, s.gitCredsStore, s.initConstants.MaxCombinedDirectoryManifestsSize, s.gitRepoPaths, WithCMPTarDoneChannel(ch.tarDoneCh), WithCMPTarExcludedGlobs(s.initConstants.CMPTarExcludedGlobs)) + manifestGenResult, err = GenerateManifests(ctx, opContext.appPath, repoRoot, commitSHA, q, false, s.gitCredsStore, s.initConstants.MaxCombinedDirectoryManifestsSize, WithCMPTarDoneChannel(ch.tarDoneCh), WithCMPTarExcludedGlobs(s.initConstants.CMPTarExcludedGlobs)) } if err != nil { // If manifest generation error caching is enabled if s.initConstants.PauseGenerationAfterFailedGenerationAttempts > 0 { - cache.LogDebugManifestCacheKeyFields("getting manifests cache", "GenerateManifests error", cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) + cache.LogDebugManifestCacheKeyFields("getting manifests cache", "GenerateManifests error", cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) // Retrieve a new copy (if available) of the cached response: this ensures we are updating the latest copy of the cache, // rather than a copy of the cache that occurred before (a potentially lengthy) manifest generation. innerRes := &cache.CachedManifestResponse{} - cacheErr := s.cache.GetManifests(cacheKey, appSourceCopy, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName, innerRes) + cacheErr := s.cache.GetManifests(cacheKey, appSourceCopy, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName, innerRes) if cacheErr != nil && cacheErr != reposervercache.ErrCacheMiss { log.Warnf("manifest cache set error %s: %v", appSourceCopy.String(), cacheErr) ch.errCh <- cacheErr @@ -723,12 +597,12 @@ func (s *Service) runManifestGenAsync(ctx context.Context, repoRoot, commitSHA, innerRes.FirstFailureTimestamp = s.now().Unix() } - cache.LogDebugManifestCacheKeyFields("setting manifests cache", "GenerateManifests error", cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) + cache.LogDebugManifestCacheKeyFields("setting manifests cache", "GenerateManifests error", cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) // Update the cache to include failure information innerRes.NumberOfConsecutiveFailures++ innerRes.MostRecentError = err.Error() - cacheErr = s.cache.SetManifests(cacheKey, appSourceCopy, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName, innerRes) + cacheErr = s.cache.SetManifests(cacheKey, appSourceCopy, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName, innerRes) if cacheErr != nil { log.Warnf("manifest cache set error %s: %v", appSourceCopy.String(), cacheErr) ch.errCh <- cacheErr @@ -740,7 +614,7 @@ func (s *Service) runManifestGenAsync(ctx context.Context, repoRoot, commitSHA, return } - cache.LogDebugManifestCacheKeyFields("setting manifests cache", "fresh GenerateManifests response", cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) + cache.LogDebugManifestCacheKeyFields("setting manifests cache", "fresh GenerateManifests response", cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) // Otherwise, no error occurred, so ensure the manifest generation error data in the cache entry is reset before we cache the value manifestGenCacheEntry := cache.CachedManifestResponse{ @@ -752,7 +626,7 @@ func (s *Service) runManifestGenAsync(ctx context.Context, repoRoot, commitSHA, } manifestGenResult.Revision = commitSHA manifestGenResult.VerifyResult = opContext.verificationResult - err = s.cache.SetManifests(cacheKey, appSourceCopy, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName, &manifestGenCacheEntry) + err = s.cache.SetManifests(cacheKey, appSourceCopy, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName, &manifestGenCacheEntry) if err != nil { log.Warnf("manifest cache set error %s/%s: %v", appSourceCopy.String(), cacheKey, err) } @@ -766,10 +640,10 @@ func (s *Service) runManifestGenAsync(ctx context.Context, repoRoot, commitSHA, // and returns true otherwise. // If true is returned, either the second or third parameter (but not both) will contain a value from the cache (a ManifestResponse, or error, respectively) func (s *Service) getManifestCacheEntry(cacheKey string, q *apiclient.ManifestRequest, firstInvocation bool) (bool, *apiclient.ManifestResponse, error) { - cache.LogDebugManifestCacheKeyFields("getting manifests cache", "GenerateManifest API call", cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) + cache.LogDebugManifestCacheKeyFields("getting manifests cache", "GenerateManifest API call", cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) res := cache.CachedManifestResponse{} - err := s.cache.GetManifests(cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName, &res) + err := s.cache.GetManifests(cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName, &res) if err == nil { // The cache contains an existing value @@ -787,10 +661,10 @@ func (s *Service) getManifestCacheEntry(cacheKey string, q *apiclient.ManifestRe // After X minutes, reset the cache and retry the operation (e.g. perhaps the error is ephemeral and has passed) if elapsedTimeInMinutes >= s.initConstants.PauseGenerationOnFailureForMinutes { - cache.LogDebugManifestCacheKeyFields("deleting manifests cache", "manifest hash did not match or cached response is empty", cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) + cache.LogDebugManifestCacheKeyFields("deleting manifests cache", "manifest hash did not match or cached response is empty", cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) // We can now try again, so reset the cache state and run the operation below - err = s.cache.DeleteManifests(cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) + err = s.cache.DeleteManifests(cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) if err != nil { log.Warnf("manifest cache set error %s/%s: %v", q.ApplicationSource.String(), cacheKey, err) } @@ -803,10 +677,10 @@ func (s *Service) getManifestCacheEntry(cacheKey string, q *apiclient.ManifestRe if s.initConstants.PauseGenerationOnFailureForRequests > 0 && res.NumberOfCachedResponsesReturned > 0 { if res.NumberOfCachedResponsesReturned >= s.initConstants.PauseGenerationOnFailureForRequests { - cache.LogDebugManifestCacheKeyFields("deleting manifests cache", "reset after paused generation count", cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) + cache.LogDebugManifestCacheKeyFields("deleting manifests cache", "reset after paused generation count", cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) // We can now try again, so reset the error cache state and run the operation below - err = s.cache.DeleteManifests(cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) + err = s.cache.DeleteManifests(cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) if err != nil { log.Warnf("manifest cache set error %s/%s: %v", q.ApplicationSource.String(), cacheKey, err) } @@ -821,12 +695,12 @@ func (s *Service) getManifestCacheEntry(cacheKey string, q *apiclient.ManifestRe cachedErrorResponse := fmt.Errorf(cachedManifestGenerationPrefix+": %s", res.MostRecentError) if firstInvocation { - cache.LogDebugManifestCacheKeyFields("setting manifests cache", "update error count", cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) + cache.LogDebugManifestCacheKeyFields("setting manifests cache", "update error count", cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName) // Increment the number of returned cached responses and push that new value to the cache // (if we have not already done so previously in this function) res.NumberOfCachedResponsesReturned++ - err = s.cache.SetManifests(cacheKey, q.ApplicationSource, q.RefSources, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName, &res) + err = s.cache.SetManifests(cacheKey, q.ApplicationSource, q, q.Namespace, q.TrackingMethod, q.AppLabelKey, q.AppName, &res) if err != nil { log.Warnf("manifest cache set error %s/%s: %v", q.ApplicationSource.String(), cacheKey, err) } @@ -945,33 +819,7 @@ func runHelmBuild(appPath string, h helm.Helm) error { return os.WriteFile(markerFile, []byte("marker"), 0644) } -func populateRequestRepos(appPath string, q *apiclient.ManifestRequest) error { - repos, err := getHelmDependencyRepos(appPath) - if err != nil { - return err - } - - for _, r := range repos { - if !repoExists(r.Repo, q.Repos) { - repositoryCredential := getRepoCredential(q.HelmRepoCreds, r.Repo) - if repositoryCredential != nil { - if repositoryCredential.EnableOCI { - r.Repo = strings.TrimPrefix(r.Repo, ociPrefix) - } - r.EnableOCI = repositoryCredential.EnableOCI - r.Password = repositoryCredential.Password - r.Username = repositoryCredential.Username - r.SSHPrivateKey = repositoryCredential.SSHPrivateKey - r.TLSClientCertData = repositoryCredential.TLSClientCertData - r.TLSClientCertKey = repositoryCredential.TLSClientCertKey - } - q.Repos = append(q.Repos, r) - } - } - return nil -} - -func helmTemplate(appPath string, repoRoot string, env *v1alpha1.Env, q *apiclient.ManifestRequest, isLocal bool, gitRepoPaths io.TempPaths) ([]*unstructured.Unstructured, error) { +func helmTemplate(appPath string, repoRoot string, env *v1alpha1.Env, q *apiclient.ManifestRequest, isLocal bool) ([]*unstructured.Unstructured, error) { concurrencyAllowed := isConcurrencyAllowed(appPath) if !concurrencyAllowed { manifestGenerateLock.Lock(appPath) @@ -1005,12 +853,26 @@ func helmTemplate(appPath string, repoRoot string, env *v1alpha1.Env, q *apiclie templateOpts.Name = appHelm.ReleaseName } - resolvedValueFiles, err := getResolvedValueFiles(appPath, repoRoot, env, q.GetValuesFileSchemes(), appHelm.ValueFiles, q.RefSources, gitRepoPaths, appHelm.IgnoreMissingValueFiles) - if err != nil { - return nil, err - } + for _, val := range appHelm.ValueFiles { + + // This will resolve val to an absolute path (or an URL) + path, isRemote, err := pathutil.ResolveValueFilePathOrUrl(appPath, repoRoot, env.Envsubst(val), q.GetValuesFileSchemes()) + if err != nil { + return nil, err + } - templateOpts.Values = resolvedValueFiles + if !isRemote { + _, err = os.Stat(string(path)) + if os.IsNotExist(err) { + if appHelm.IgnoreMissingValueFiles { + log.Debugf(" %s values file does not exist", path) + continue + } + } + } + + templateOpts.Values = append(templateOpts.Values, path) + } if appHelm.Values != "" { rand, err := uuid.NewRandom() @@ -1018,12 +880,7 @@ func helmTemplate(appPath string, repoRoot string, env *v1alpha1.Env, q *apiclie return nil, err } p := path.Join(os.TempDir(), rand.String()) - defer func() { - // do not remove the directory if it is the source has Ref field set - if q.ApplicationSource.Ref == "" { - _ = os.RemoveAll(p) - } - }() + defer func() { _ = os.RemoveAll(p) }() err = os.WriteFile(p, []byte(appHelm.Values), 0644) if err != nil { return nil, err @@ -1058,8 +915,24 @@ func helmTemplate(appPath string, repoRoot string, env *v1alpha1.Env, q *apiclie templateOpts.SetString[i] = env.Envsubst(j) } - if err := populateRequestRepos(appPath, q); err != nil { - return nil, fmt.Errorf("failed parsing dependencies: %v", err) + repos, err := getHelmDependencyRepos(appPath) + if err != nil { + return nil, err + } + + for _, r := range repos { + if !repoExists(r.Repo, q.Repos) { + repositoryCredential := getRepoCredential(q.HelmRepoCreds, r.Repo) + if repositoryCredential != nil { + r.EnableOCI = repositoryCredential.EnableOCI + r.Password = repositoryCredential.Password + r.Username = repositoryCredential.Username + r.SSHPrivateKey = repositoryCredential.SSHPrivateKey + r.TLSClientCertData = repositoryCredential.TLSClientCertData + r.TLSClientCertKey = repositoryCredential.TLSClientCertKey + } + q.Repos = append(q.Repos, r) + } } var proxy string @@ -1102,84 +975,6 @@ func helmTemplate(appPath string, repoRoot string, env *v1alpha1.Env, q *apiclie return kube.SplitYAML([]byte(out)) } -func getResolvedValueFiles( - appPath string, - repoRoot string, - env *v1alpha1.Env, - allowedValueFilesSchemas []string, - rawValueFiles []string, - refSources map[string]*v1alpha1.RefTarget, - gitRepoPaths io.TempPaths, - ignoreMissingValueFiles bool, -) ([]pathutil.ResolvedFilePath, error) { - var resolvedValueFiles []pathutil.ResolvedFilePath - for _, rawValueFile := range rawValueFiles { - var isRemote = false - var resolvedPath pathutil.ResolvedFilePath - var err error - - referencedSource := getReferencedSource(rawValueFile, refSources) - if referencedSource != nil { - // If the $-prefixed path appears to reference another source, do env substitution _after_ resolving that source. - resolvedPath, err = getResolvedRefValueFile(rawValueFile, env, allowedValueFilesSchemas, referencedSource.Repo.Repo, gitRepoPaths) - if err != nil { - return nil, err - } - } else { - // This will resolve val to an absolute path (or an URL) - resolvedPath, isRemote, err = pathutil.ResolveValueFilePathOrUrl(appPath, repoRoot, env.Envsubst(rawValueFile), allowedValueFilesSchemas) - if err != nil { - return nil, err - } - } - - if !isRemote { - _, err = os.Stat(string(resolvedPath)) - if os.IsNotExist(err) { - if ignoreMissingValueFiles { - log.Debugf(" %s values file does not exist", resolvedPath) - continue - } - } - } - - resolvedValueFiles = append(resolvedValueFiles, resolvedPath) - } - return resolvedValueFiles, nil -} - -func getResolvedRefValueFile( - rawValueFile string, - env *v1alpha1.Env, - allowedValueFilesSchemas []string, - refSourceRepo string, - gitRepoPaths io.TempPaths, -) (pathutil.ResolvedFilePath, error) { - pathStrings := strings.Split(rawValueFile, "/") - repoPath := gitRepoPaths.GetPathIfExists(git.NormalizeGitURL(refSourceRepo)) - if repoPath == "" { - return "", fmt.Errorf("failed to find repo %q", refSourceRepo) - } - pathStrings[0] = "" // Remove first segment. It will be inserted by pathutil.ResolveValueFilePathOrUrl. - substitutedPath := strings.Join(pathStrings, "/") - - // Resolve the path relative to the referenced repo and block any attempt at traversal. - resolvedPath, _, err := pathutil.ResolveValueFilePathOrUrl(repoPath, repoPath, env.Envsubst(substitutedPath), allowedValueFilesSchemas) - if err != nil { - return "", err - } - return resolvedPath, nil -} - -func getReferencedSource(rawValueFile string, refSources map[string]*v1alpha1.RefTarget) *v1alpha1.RefTarget { - if !strings.HasPrefix(rawValueFile, "$") { - return nil - } - refVar := strings.Split(rawValueFile, "/")[0] - referencedSource := refSources[refVar] - return referencedSource -} - func getRepoCredential(repoCredentials []*v1alpha1.RepoCreds, repoURL string) *v1alpha1.RepoCreds { for _, cred := range repoCredentials { url := strings.TrimPrefix(repoURL, ociPrefix) @@ -1222,7 +1017,7 @@ func WithCMPTarExcludedGlobs(excludedGlobs []string) GenerateManifestOpt { } // GenerateManifests generates manifests from a path. Overrides are applied as a side effect on the given ApplicationSource. -func GenerateManifests(ctx context.Context, appPath, repoRoot, revision string, q *apiclient.ManifestRequest, isLocal bool, gitCredsStore git.CredsStore, maxCombinedManifestQuantity resource.Quantity, gitRepoPaths io.TempPaths, opts ...GenerateManifestOpt) (*apiclient.ManifestResponse, error) { +func GenerateManifests(ctx context.Context, appPath, repoRoot, revision string, q *apiclient.ManifestRequest, isLocal bool, gitCredsStore git.CredsStore, maxCombinedManifestQuantity resource.Quantity, opts ...GenerateManifestOpt) (*apiclient.ManifestResponse, error) { opt := newGenerateManifestOpt(opts...) var targetObjs []*unstructured.Unstructured var dest *v1alpha1.ApplicationDestination @@ -1241,7 +1036,7 @@ func GenerateManifests(ctx context.Context, appPath, repoRoot, revision string, switch appSourceType { case v1alpha1.ApplicationSourceTypeHelm: - targetObjs, err = helmTemplate(appPath, repoRoot, env, q, isLocal, gitRepoPaths) + targetObjs, err = helmTemplate(appPath, repoRoot, env, q, isLocal) case v1alpha1.ApplicationSourceTypeKustomize: kustomizeBinary := "" if q.KustomizeOptions != nil { @@ -1250,25 +1045,15 @@ func GenerateManifests(ctx context.Context, appPath, repoRoot, revision string, k := kustomize.NewKustomizeApp(appPath, q.Repo.GetGitCreds(gitCredsStore), repoURL, kustomizeBinary) targetObjs, _, err = k.Build(q.ApplicationSource.Kustomize, q.KustomizeOptions, env) case v1alpha1.ApplicationSourceTypePlugin: - var plugin *v1alpha1.ConfigManagementPlugin if q.ApplicationSource.Plugin != nil && q.ApplicationSource.Plugin.Name != "" { - plugin = findPlugin(q.Plugins, q.ApplicationSource.Plugin.Name) - } - if plugin != nil { - // argocd-cm deprecated plugin is being used - targetObjs, err = runConfigManagementPlugin(appPath, repoRoot, env, q, q.Repo.GetGitCreds(gitCredsStore), plugin) log.WithFields(map[string]interface{}{ "application": q.AppName, "plugin": q.ApplicationSource.Plugin.Name, }).Warnf(common.ConfigMapPluginDeprecationWarning) + + targetObjs, err = runConfigManagementPlugin(appPath, repoRoot, env, q, q.Repo.GetGitCreds(gitCredsStore)) } else { - // if the named plugin was not found in argocd-cm try sidecar plugin - pluginName := "" - if q.ApplicationSource.Plugin != nil { - pluginName = q.ApplicationSource.Plugin.Name - } - // if pluginName is provided it has to be `-` or just `` if plugin version is empty - targetObjs, err = runConfigManagementPluginSidecars(ctx, appPath, repoRoot, pluginName, env, q, q.Repo.GetGitCreds(gitCredsStore), opt.cmpTarDoneCh, opt.cmpTarExcludedGlobs) + targetObjs, err = runConfigManagementPluginSidecars(ctx, appPath, repoRoot, env, q, q.Repo.GetGitCreds(gitCredsStore), opt.cmpTarDoneCh, opt.cmpTarExcludedGlobs) if err != nil { err = fmt.Errorf("plugin sidecar failed. %s", err.Error()) } @@ -1752,7 +1537,12 @@ func findPlugin(plugins []*v1alpha1.ConfigManagementPlugin, name string) *v1alph return nil } -func runConfigManagementPlugin(appPath, repoRoot string, envVars *v1alpha1.Env, q *apiclient.ManifestRequest, creds git.Creds, plugin *v1alpha1.ConfigManagementPlugin) ([]*unstructured.Unstructured, error) { +func runConfigManagementPlugin(appPath, repoRoot string, envVars *v1alpha1.Env, q *apiclient.ManifestRequest, creds git.Creds) ([]*unstructured.Unstructured, error) { + plugin := findPlugin(q.Plugins, q.ApplicationSource.Plugin.Name) + if plugin == nil { + return nil, fmt.Errorf(pluginNotSupported+" plugin name %s", q.ApplicationSource.Plugin.Name) + } + // Plugins can request to lock the complete repository when they need to // use git client operations. if plugin.LockRepo { @@ -1784,22 +1574,13 @@ func runConfigManagementPlugin(appPath, repoRoot string, envVars *v1alpha1.Env, return kube.SplitYAML([]byte(out)) } -func getPluginEnvs(env *v1alpha1.Env, q *apiclient.ManifestRequest, creds git.Creds, remote bool) ([]string, error) { - envVars := env.Environ() - envVars = append(envVars, "KUBE_VERSION="+text.SemVer(q.KubeVersion)) - envVars = append(envVars, "KUBE_API_VERSIONS="+strings.Join(q.ApiVersions, ",")) - - return getPluginParamEnvs(envVars, q.ApplicationSource.Plugin, creds, remote) -} - -// getPluginParamEnvs gets environment variables for plugin parameter announcement generation. -func getPluginParamEnvs(envVars []string, plugin *v1alpha1.ApplicationSourcePlugin, creds git.Creds, remote bool) ([]string, error) { - env := envVars +func getPluginEnvs(envVars *v1alpha1.Env, q *apiclient.ManifestRequest, creds git.Creds, remote bool) ([]string, error) { + env := envVars.Environ() // Local plugins need also to have access to the local environment variables. - // Remote sidecar plugins will use the environment in the sidecar + // Remote side car plugins will use the environment in the side car // container. if !remote { - env = append(os.Environ(), envVars...) + env = append(os.Environ(), env...) } if creds != nil { closer, environ, err := creds.Environ() @@ -1809,6 +1590,8 @@ func getPluginParamEnvs(envVars []string, plugin *v1alpha1.ApplicationSourcePlug defer func() { _ = closer.Close() }() env = append(env, environ...) } + env = append(env, "KUBE_VERSION="+text.SemVer(q.KubeVersion)) + env = append(env, "KUBE_API_VERSIONS="+strings.Join(q.ApiVersions, ",")) parsedEnv := make(v1alpha1.Env, len(env)) for i, v := range env { @@ -1819,23 +1602,17 @@ func getPluginParamEnvs(envVars []string, plugin *v1alpha1.ApplicationSourcePlug parsedEnv[i] = parsedVar } - if plugin != nil { - pluginEnv := plugin.Env + if q.ApplicationSource.Plugin != nil { + pluginEnv := q.ApplicationSource.Plugin.Env for _, entry := range pluginEnv { newValue := parsedEnv.Envsubst(entry.Value) env = append(env, fmt.Sprintf("ARGOCD_ENV_%s=%s", entry.Name, newValue)) } - paramEnv, err := plugin.Parameters.Environ() - if err != nil { - return nil, fmt.Errorf("failed to generate env vars from parameters: %w", err) - } - env = append(env, paramEnv...) } - return env, nil } -func runConfigManagementPluginSidecars(ctx context.Context, appPath, repoPath, pluginName string, envVars *v1alpha1.Env, q *apiclient.ManifestRequest, creds git.Creds, tarDoneCh chan<- bool, tarExcludedGlobs []string) ([]*unstructured.Unstructured, error) { +func runConfigManagementPluginSidecars(ctx context.Context, appPath, repoPath string, envVars *v1alpha1.Env, q *apiclient.ManifestRequest, creds git.Creds, tarDoneCh chan<- bool, tarExcludedGlobs []string) ([]*unstructured.Unstructured, error) { // compute variables. env, err := getPluginEnvs(envVars, q, creds, true) if err != nil { @@ -1843,7 +1620,7 @@ func runConfigManagementPluginSidecars(ctx context.Context, appPath, repoPath, p } // detect config management plugin server (sidecar) - conn, cmpClient, err := discovery.DetectConfigManagementPlugin(ctx, appPath, pluginName, env, tarExcludedGlobs) + conn, cmpClient, err := discovery.DetectConfigManagementPlugin(ctx, appPath, env, tarExcludedGlobs) if err != nil { return nil, err } @@ -1876,7 +1653,7 @@ func runConfigManagementPluginSidecars(ctx context.Context, appPath, repoPath, p func generateManifestsCMP(ctx context.Context, appPath, repoPath string, env []string, cmpClient pluginclient.ConfigManagementPluginServiceClient, tarDoneCh chan<- bool, tarExcludedGlobs []string) (*pluginclient.ManifestResponse, error) { generateManifestStream, err := cmpClient.GenerateManifest(ctx, grpc_retry.Disable()) if err != nil { - return nil, fmt.Errorf("error getting generateManifestStream: %w", err) + return nil, fmt.Errorf("error getting generateManifestStream: %s", err) } opts := []cmp.SenderOption{ cmp.WithTarDoneChan(tarDoneCh), @@ -1909,31 +1686,27 @@ func (s *Service) GetAppDetails(ctx context.Context, q *apiclient.RepoServerAppD switch appSourceType { case v1alpha1.ApplicationSourceTypeHelm: - if err := populateHelmAppDetails(res, opContext.appPath, repoRoot, q, s.gitRepoPaths); err != nil { + if err := populateHelmAppDetails(res, opContext.appPath, repoRoot, q); err != nil { return err } case v1alpha1.ApplicationSourceTypeKustomize: if err := populateKustomizeAppDetails(res, q, opContext.appPath, commitSHA, s.gitCredsStore); err != nil { return err } - case v1alpha1.ApplicationSourceTypePlugin: - if err := populatePluginAppDetails(ctx, res, opContext.appPath, repoRoot, q, s.gitCredsStore, s.initConstants.CMPTarExcludedGlobs); err != nil { - return fmt.Errorf("failed to populate plugin app details: %w", err) - } } - _ = s.cache.SetAppDetails(revision, q.Source, q.RefSources, res, v1alpha1.TrackingMethod(q.TrackingMethod)) + _ = s.cache.SetAppDetails(revision, q.Source, res, v1alpha1.TrackingMethod(q.TrackingMethod)) return nil } settings := operationSettings{allowConcurrent: q.Source.AllowsConcurrentProcessing(), noCache: q.NoCache, noRevisionCache: q.NoCache || q.NoRevisionCache} - err := s.runRepoOperation(ctx, q.Source.TargetRevision, q.Repo, q.Source, false, cacheFn, operation, settings, false) + err := s.runRepoOperation(ctx, q.Source.TargetRevision, q.Repo, q.Source, false, cacheFn, operation, settings) return res, err } func (s *Service) createGetAppDetailsCacheHandler(res *apiclient.RepoAppDetailsResponse, q *apiclient.RepoServerAppDetailsQuery) func(revision string, _ bool) (bool, error) { return func(revision string, _ bool) (bool, error) { - err := s.cache.GetAppDetails(revision, q.Source, q.RefSources, res, v1alpha1.TrackingMethod(q.TrackingMethod)) + err := s.cache.GetAppDetails(revision, q.Source, res, v1alpha1.TrackingMethod(q.TrackingMethod)) if err == nil { log.Infof("app details cache hit: %s/%s", revision, q.Source.Path) return true, nil @@ -1948,7 +1721,7 @@ func (s *Service) createGetAppDetailsCacheHandler(res *apiclient.RepoAppDetailsR } } -func populateHelmAppDetails(res *apiclient.RepoAppDetailsResponse, appPath string, repoRoot string, q *apiclient.RepoServerAppDetailsQuery, gitRepoPaths io.TempPaths) error { +func populateHelmAppDetails(res *apiclient.RepoAppDetailsResponse, appPath string, repoRoot string, q *apiclient.RepoServerAppDetailsQuery) error { var selectedValueFiles []string if q.Source.Helm != nil { @@ -1986,13 +1759,14 @@ func populateHelmAppDetails(res *apiclient.RepoAppDetailsResponse, appPath strin } else { log.Warnf("Values file %s is not allowed: %v", filepath.Join(appPath, "values.yaml"), err) } - ignoreMissingValueFiles := false - if q.Source.Helm != nil { - ignoreMissingValueFiles = q.Source.Helm.IgnoreMissingValueFiles - } - resolvedSelectedValueFiles, err := getResolvedValueFiles(appPath, repoRoot, &v1alpha1.Env{}, q.GetValuesFileSchemes(), selectedValueFiles, q.RefSources, gitRepoPaths, ignoreMissingValueFiles) - if err != nil { - return fmt.Errorf("failed to resolve value files: %w", err) + var resolvedSelectedValueFiles []pathutil.ResolvedFilePath + // drop not allowed values files + for _, file := range selectedValueFiles { + if resolvedFile, _, err := pathutil.ResolveValueFilePathOrUrl(appPath, repoRoot, file, q.GetValuesFileSchemes()); err == nil { + resolvedSelectedValueFiles = append(resolvedSelectedValueFiles, resolvedFile) + } else { + log.Warnf("Values file %s is not allowed: %v", file, err) + } } params, err := h.GetParameters(resolvedSelectedValueFiles, appPath, repoRoot) if err != nil { @@ -2072,55 +1846,6 @@ func populateKustomizeAppDetails(res *apiclient.RepoAppDetailsResponse, q *apicl return nil } -func populatePluginAppDetails(ctx context.Context, res *apiclient.RepoAppDetailsResponse, appPath string, repoPath string, q *apiclient.RepoServerAppDetailsQuery, store git.CredsStore, tarExcludedGlobs []string) error { - res.Plugin = &apiclient.PluginAppSpec{} - - creds := q.Repo.GetGitCreds(store) - - envVars := []string{ - fmt.Sprintf("ARGOCD_APP_NAME=%s", q.AppName), - fmt.Sprintf("ARGOCD_APP_SOURCE_REPO_URL=%s", q.Repo.Repo), - fmt.Sprintf("ARGOCD_APP_SOURCE_PATH=%s", q.Source.Path), - fmt.Sprintf("ARGOCD_APP_SOURCE_TARGET_REVISION=%s", q.Source.TargetRevision), - } - - env, err := getPluginParamEnvs(envVars, q.Source.Plugin, creds, true) - if err != nil { - return fmt.Errorf("failed to get env vars for plugin: %w", err) - } - - pluginName := "" - if q.Source != nil && q.Source.Plugin != nil { - pluginName = q.Source.Plugin.Name - } - // detect config management plugin server (sidecar) - conn, cmpClient, err := discovery.DetectConfigManagementPlugin(ctx, appPath, pluginName, env, tarExcludedGlobs) - if err != nil { - return fmt.Errorf("failed to detect CMP for app: %w", err) - } - defer io.Close(conn) - - generateManifestStream, err := cmpClient.GetParametersAnnouncement(ctx, grpc_retry.Disable()) - if err != nil { - return fmt.Errorf("error getting generateManifestStream: %w", err) - } - - err = cmp.SendRepoStream(generateManifestStream.Context(), appPath, repoPath, generateManifestStream, env, tarExcludedGlobs) - if err != nil { - return fmt.Errorf("error sending file to cmp-server: %s", err) - } - - announcement, err := generateManifestStream.CloseAndRecv() - if err != nil { - return fmt.Errorf("failed to get parameter anouncement: %w", err) - } - - res.Plugin = &apiclient.PluginAppSpec{ - ParametersAnnouncement: announcement.ParameterAnnouncements, - } - return nil -} - func (s *Service) GetRevisionMetadata(ctx context.Context, q *apiclient.RepoServerRevisionMetadataRequest) (*v1alpha1.RevisionMetadata, error) { if !(git.IsCommitSHA(q.Revision) || git.IsTruncatedCommitSHA(q.Revision)) { return nil, fmt.Errorf("revision %s must be resolved", q.Revision) @@ -2231,27 +1956,14 @@ func (s *Service) newClientResolveRevision(repo *v1alpha1.Repository, revision s func (s *Service) newHelmClientResolveRevision(repo *v1alpha1.Repository, revision string, chart string, noRevisionCache bool) (helm.Client, string, error) { enableOCI := repo.EnableOCI || helm.IsHelmOciRepo(repo.Repo) helmClient := s.newHelmClient(repo.Repo, repo.GetHelmCreds(), enableOCI, repo.Proxy, helm.WithIndexCache(s.cache), helm.WithChartPaths(s.chartPaths)) - if helm.IsVersion(revision) { + // OCI helm registers don't support semver ranges. Assuming that given revision is exact version + if helm.IsVersion(revision) || enableOCI { return helmClient, revision, nil } constraints, err := semver.NewConstraint(revision) if err != nil { return nil, "", fmt.Errorf("invalid revision '%s': %v", revision, err) } - - if enableOCI { - tags, err := helmClient.GetTags(chart, noRevisionCache) - if err != nil { - return nil, "", fmt.Errorf("unable to get tags: %v", err) - } - - version, err := tags.MaxVersion(constraints) - if err != nil { - return nil, "", fmt.Errorf("no version for constraints: %v", err) - } - return helmClient, version.String(), nil - } - index, err := helmClient.GetIndex(noRevisionCache) if err != nil { return nil, "", err @@ -2386,16 +2098,31 @@ func (s *Service) ResolveRevision(ctx context.Context, q *apiclient.ResolveRevis app := q.App ambiguousRevision := q.AmbiguousRevision var revision string - var source = app.Spec.GetSource() - if source.IsHelm() { - _, revision, err := s.newHelmClientResolveRevision(repo, ambiguousRevision, source.Chart, true) + if app.Spec.Source.IsHelm() { + if helm.IsVersion(ambiguousRevision) { + return &apiclient.ResolveRevisionResponse{Revision: ambiguousRevision, AmbiguousRevision: ambiguousRevision}, nil + } + client := helm.NewClient(repo.Repo, repo.GetHelmCreds(), repo.EnableOCI || app.Spec.Source.IsHelmOci(), repo.Proxy, helm.WithChartPaths(s.chartPaths)) + index, err := client.GetIndex(false) + if err != nil { + return &apiclient.ResolveRevisionResponse{Revision: "", AmbiguousRevision: ""}, err + } + entries, err := index.GetEntries(app.Spec.Source.Chart) + if err != nil { + return &apiclient.ResolveRevisionResponse{Revision: "", AmbiguousRevision: ""}, err + } + constraints, err := semver.NewConstraint(ambiguousRevision) + if err != nil { + return &apiclient.ResolveRevisionResponse{Revision: "", AmbiguousRevision: ""}, err + } + version, err := entries.MaxVersion(constraints) if err != nil { return &apiclient.ResolveRevisionResponse{Revision: "", AmbiguousRevision: ""}, err } return &apiclient.ResolveRevisionResponse{ - Revision: revision, - AmbiguousRevision: fmt.Sprintf("%v (%v)", ambiguousRevision, revision), + Revision: version.String(), + AmbiguousRevision: fmt.Sprintf("%v (%v)", ambiguousRevision, version.String()), }, nil } else { gitClient, err := git.NewClient(repo.Repo, repo.GetGitCreds(s.gitCredsStore), repo.IsInsecure(), repo.IsLFSEnabled(), repo.Proxy) diff --git a/reposerver/repository/repository.proto b/reposerver/repository/repository.proto index c5212265d33b7..f6a4e7e0194dc 100644 --- a/reposerver/repository/repository.proto +++ b/reposerver/repository/repository.proto @@ -4,7 +4,6 @@ option go_package = "github.com/argoproj/argo-cd/v2/reposerver/apiclient"; package repository; import "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1/generated.proto"; -import "google/protobuf/empty.proto"; // ManifestRequest is a query for manifest generation. message ManifestRequest { @@ -29,8 +28,6 @@ message ManifestRequest { string trackingMethod = 19; map enabledSourceTypes = 20; github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.HelmOptions helmOptions = 21; - bool hasMultipleSources = 22; - map refSources = 23; } message ManifestRequestWithFiles { @@ -110,15 +107,6 @@ message AppList { map apps = 1; } -message PluginInfo { - string name = 1; -} - -// PluginList returns the list of all cmp v2 plugins running as sidecars -message PluginList { - repeated PluginInfo items = 1; -} - // RepoServerAppDetailsQuery contains query information for app details request message RepoServerAppDetailsQuery { github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1; @@ -131,7 +119,6 @@ message RepoServerAppDetailsQuery { string trackingMethod = 8; map enabledSourceTypes = 9; github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.HelmOptions helmOptions = 10; - map refSources = 11; } // RepoAppDetailsResponse application details @@ -140,7 +127,6 @@ message RepoAppDetailsResponse { HelmAppSpec helm = 3; KustomizeAppSpec kustomize = 4; DirectoryAppSpec directory = 5; - PluginAppSpec plugin = 6; } message RepoServerRevisionMetadataRequest { @@ -174,34 +160,6 @@ message KustomizeAppSpec { message DirectoryAppSpec { } -message ParameterAnnouncement { - // name is the name identifying a parameter. - string name = 1; - // title is a human-readable text of the parameter name. - string title = 2; - // tooltip is a human-readable description of the parameter. - string tooltip = 3; - // required defines if this given parameter is mandatory. - bool required = 4; - // itemType determines the primitive data type represented by the parameter. Parameters are always encoded as - // strings, but this field lets them be interpreted as other primitive types. - string itemType = 5; - // collectionType is the type of value this parameter holds - either a single value (a string) or a collection - // (array or map). If collectionType is set, only the field with that type will be used. If collectionType is not - // set, `string` is the default. If collectionType is set to an invalid value, a validation error is thrown. - string collectionType = 6; - // string is the default value of the parameter if the parameter is a string. - string string = 7; - // array is the default value of the parameter if the parameter is an array. - repeated string array = 8; - // map is the default value of the parameter if the parameter is a map. - map map = 9; -} - -// PluginAppSpec contains details about a plugin-type Application -message PluginAppSpec { - repeated ParameterAnnouncement parametersAnnouncement = 1; -} message HelmChartsRequest { github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1; @@ -243,10 +201,6 @@ service RepoServerService { rpc ListApps(ListAppsRequest) returns (AppList) { } - // ListPlugins returns a list of cmp v2 plugins running as sidecar to reposerver - rpc ListPlugins(google.protobuf.Empty) returns (PluginList) { - } - // Generate manifest for application in specified repo name and revision rpc GetAppDetails(RepoServerAppDetailsQuery) returns (RepoAppDetailsResponse) { } diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go index d8f1df05f44c3..d8cbab3cda6e5 100644 --- a/reposerver/repository/repository_test.go +++ b/reposerver/repository/repository_test.go @@ -35,13 +35,11 @@ import ( fileutil "github.com/argoproj/argo-cd/v2/test/fixture/path" "github.com/argoproj/argo-cd/v2/util/argo" cacheutil "github.com/argoproj/argo-cd/v2/util/cache" - dbmocks "github.com/argoproj/argo-cd/v2/util/db/mocks" "github.com/argoproj/argo-cd/v2/util/git" gitmocks "github.com/argoproj/argo-cd/v2/util/git/mocks" "github.com/argoproj/argo-cd/v2/util/helm" helmmocks "github.com/argoproj/argo-cd/v2/util/helm/mocks" "github.com/argoproj/argo-cd/v2/util/io" - iomocks "github.com/argoproj/argo-cd/v2/util/io/mocks" ) const testSignature = `gpg: Signature made Wed Feb 26 23:22:34 2020 CET @@ -49,14 +47,14 @@ gpg: using RSA key 4AEE18F83AFDEB23 gpg: Good signature from "GitHub (web-flow commit signing) " [ultimate] ` -type clientFunc func(*gitmocks.Client, *helmmocks.Client, *iomocks.TempPaths) +type clientFunc func(*gitmocks.Client) func newServiceWithMocks(root string, signed bool) (*Service, *gitmocks.Client) { root, err := filepath.Abs(root) if err != nil { panic(err) } - return newServiceWithOpt(func(gitClient *gitmocks.Client, helmClient *helmmocks.Client, paths *iomocks.TempPaths) { + return newServiceWithOpt(func(gitClient *gitmocks.Client) { gitClient.On("Init").Return(nil) gitClient.On("Fetch", mock.Anything).Return(nil) gitClient.On("Checkout", mock.Anything, mock.Anything).Return(nil) @@ -68,37 +66,31 @@ func newServiceWithMocks(root string, signed bool) (*Service, *gitmocks.Client) } else { gitClient.On("VerifyCommitSignature", mock.Anything).Return("", nil) } - - chart := "my-chart" - oobChart := "out-of-bounds-chart" - version := "1.1.0" - helmClient.On("GetIndex", true).Return(&helm.Index{Entries: map[string]helm.Entries{ - chart: {{Version: "1.0.0"}, {Version: version}}, - oobChart: {{Version: "1.0.0"}, {Version: version}}, - }}, nil) - helmClient.On("ExtractChart", chart, version).Return("./testdata/my-chart", io.NopCloser, nil) - helmClient.On("ExtractChart", oobChart, version).Return("./testdata2/out-of-bounds-chart", io.NopCloser, nil) - helmClient.On("CleanChartCache", chart, version).Return(nil) - helmClient.On("CleanChartCache", oobChart, version).Return(nil) - helmClient.On("DependencyBuild").Return(nil) - - paths.On("Add", mock.Anything, mock.Anything).Return(root, nil) - paths.On("GetPath", mock.Anything).Return(root, nil) - paths.On("GetPathIfExists", mock.Anything).Return(root, nil) }, root) } func newServiceWithOpt(cf clientFunc, root string) (*Service, *gitmocks.Client) { helmClient := &helmmocks.Client{} gitClient := &gitmocks.Client{} - paths := &iomocks.TempPaths{} - cf(gitClient, helmClient, paths) + cf(gitClient) service := NewService(metrics.NewMetricsServer(), cache.NewCache( cacheutil.NewCache(cacheutil.NewInMemoryCache(1*time.Minute)), 1*time.Minute, 1*time.Minute, ), RepoServerInitConstants{ParallelismLimit: 1}, argo.NewResourceTracking(), &git.NoopCredsStore{}, root) + chart := "my-chart" + oobChart := "out-of-bounds-chart" + version := "1.1.0" + helmClient.On("GetIndex", true).Return(&helm.Index{Entries: map[string]helm.Entries{ + chart: {{Version: "1.0.0"}, {Version: version}}, + oobChart: {{Version: "1.0.0"}, {Version: version}}, + }}, nil) + helmClient.On("ExtractChart", chart, version).Return("./testdata/my-chart", io.NopCloser, nil) + helmClient.On("ExtractChart", oobChart, version).Return("./testdata2/out-of-bounds-chart", io.NopCloser, nil) + helmClient.On("CleanChartCache", chart, version).Return(nil) + helmClient.On("CleanChartCache", oobChart, version).Return(nil) + service.newGitClient = func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, prosy string, opts ...git.ClientOpts) (client git.Client, e error) { return gitClient, nil } @@ -108,7 +100,6 @@ func newServiceWithOpt(cf clientFunc, root string) (*Service, *gitmocks.Client) service.gitRepoInitializer = func(rootPath string) goio.Closer { return io.NopCloser } - service.gitRepoPaths = paths return service, gitClient } @@ -130,15 +121,13 @@ func newServiceWithCommitSHA(root, revision string) *Service { revisionErr = errors.New("not a commit SHA") } - service, gitClient := newServiceWithOpt(func(gitClient *gitmocks.Client, helmClient *helmmocks.Client, paths *iomocks.TempPaths) { + service, gitClient := newServiceWithOpt(func(gitClient *gitmocks.Client) { gitClient.On("Init").Return(nil) gitClient.On("Fetch", mock.Anything).Return(nil) gitClient.On("Checkout", mock.Anything, mock.Anything).Return(nil) gitClient.On("LsRemote", revision).Return(revision, revisionErr) gitClient.On("CommitSHA").Return("632039659e542ed7de0c170a4fcc1c571b288fc0", nil) gitClient.On("Root").Return(root) - paths.On("GetPath", mock.Anything).Return(root, nil) - paths.On("GetPathIfExists", mock.Anything).Return(root, nil) }, root) service.newGitClient = func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, opts ...git.ClientOpts) (client git.Client, e error) { @@ -163,7 +152,7 @@ func TestGenerateYamlManifestInDir(t *testing.T) { assert.Equal(t, countOfManifests, len(res1.Manifests)) // 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) + res2, err := GenerateManifests(context.Background(), "./testdata/concatenated", "/", "", &q, false, &git.NoopCredsStore{}, resource.MustParse("0")) assert.NoError(t, err) assert.Equal(t, 3, len(res2.Manifests)) } @@ -219,7 +208,7 @@ func Test_GenerateManifests_NoOutOfBoundsAccess(t *testing.T) { } q := apiclient.ManifestRequest{Repo: &argoappv1.Repository{}, ApplicationSource: &argoappv1.ApplicationSource{}} - res, err := GenerateManifests(context.Background(), repoDir, "", "", &q, false, &git.NoopCredsStore{}, resource.MustParse("0"), nil) + res, err := GenerateManifests(context.Background(), repoDir, "", "", &q, false, &git.NoopCredsStore{}, resource.MustParse("0")) require.Error(t, err) assert.NotContains(t, err.Error(), mustNotContain) assert.Contains(t, err.Error(), "illegal filepath") @@ -234,7 +223,7 @@ func TestGenerateManifests_MissingSymlinkDestination(t *testing.T) { require.NoError(t, err) q := apiclient.ManifestRequest{Repo: &argoappv1.Repository{}, ApplicationSource: &argoappv1.ApplicationSource{}} - _, err = GenerateManifests(context.Background(), repoDir, "", "", &q, false, &git.NoopCredsStore{}, resource.MustParse("0"), nil) + _, err = GenerateManifests(context.Background(), repoDir, "", "", &q, false, &git.NoopCredsStore{}, resource.MustParse("0")) require.NoError(t, err) } @@ -249,7 +238,7 @@ func TestGenerateManifests_K8SAPIResetCache(t *testing.T) { cachedFakeResponse := &apiclient.ManifestResponse{Manifests: []string{"Fake"}} - err := service.cache.SetManifests(mock.Anything, &src, q.RefSources, &q, "", "", "", "", &cache.CachedManifestResponse{ManifestResponse: cachedFakeResponse}) + err := service.cache.SetManifests(mock.Anything, &src, &q, "", "", "", "", &cache.CachedManifestResponse{ManifestResponse: cachedFakeResponse}) assert.NoError(t, err) res, err := service.GenerateManifest(context.Background(), &q) @@ -271,7 +260,7 @@ func TestGenerateManifests_EmptyCache(t *testing.T) { Repo: &argoappv1.Repository{}, ApplicationSource: &src, } - err := service.cache.SetManifests(mock.Anything, &src, q.RefSources, &q, "", "", "", "", &cache.CachedManifestResponse{ManifestResponse: nil}) + err := service.cache.SetManifests(mock.Anything, &src, &q, "", "", "", "", &cache.CachedManifestResponse{ManifestResponse: nil}) assert.NoError(t, err) res, err := service.GenerateManifest(context.Background(), &q) @@ -296,69 +285,6 @@ func TestHelmManifestFromChartRepo(t *testing.T) { }, response) } -func TestHelmChartReferencingExternalValues(t *testing.T) { - service := newService(".") - spec := argoappv1.ApplicationSpec{ - Sources: []argoappv1.ApplicationSource{ - {RepoURL: "https://helm.example.com", Chart: "my-chart", TargetRevision: ">= 1.0.0", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"$ref/testdata/my-chart/my-chart-values.yaml"}, - }}, - {Ref: "ref", RepoURL: "https://git.example.com/test/repo"}, - }, - } - repoDB := &dbmocks.ArgoDB{} - repoDB.On("GetRepository", context.Background(), "https://git.example.com/test/repo").Return(&argoappv1.Repository{ - Repo: "https://git.example.com/test/repo", - }, nil) - refSources, err := argo.GetRefSources(context.Background(), spec, repoDB) - require.NoError(t, err) - request := &apiclient.ManifestRequest{Repo: &argoappv1.Repository{}, ApplicationSource: &spec.Sources[0], NoCache: true, RefSources: refSources, HasMultipleSources: true} - response, err := service.GenerateManifest(context.Background(), request) - assert.NoError(t, err) - assert.NotNil(t, response) - assert.Equal(t, &apiclient.ManifestResponse{ - Manifests: []string{"{\"apiVersion\":\"v1\",\"kind\":\"ConfigMap\",\"metadata\":{\"name\":\"my-map\"}}"}, - Namespace: "", - Server: "", - Revision: "1.1.0", - SourceType: "Helm", - }, response) -} - -func TestHelmChartReferencingExternalValues_OutOfBounds_Symlink(t *testing.T) { - service := newService(".") - err := os.Mkdir("testdata/oob-symlink", 0755) - require.NoError(t, err) - t.Cleanup(func() { - err = os.RemoveAll("testdata/oob-symlink") - require.NoError(t, err) - }) - // Create a symlink to a file outside of the repo - err = os.Symlink("../../../values.yaml", "./testdata/oob-symlink/oob-symlink.yaml") - // Create a regular file to reference from another source - err = os.WriteFile("./testdata/oob-symlink/values.yaml", []byte("foo: bar"), 0644) - require.NoError(t, err) - spec := argoappv1.ApplicationSpec{ - Sources: []argoappv1.ApplicationSource{ - {RepoURL: "https://helm.example.com", Chart: "my-chart", TargetRevision: ">= 1.0.0", Helm: &argoappv1.ApplicationSourceHelm{ - // Reference `ref` but do not use the oob symlink. The mere existence of the link should be enough to - // cause an error. - ValueFiles: []string{"$ref/testdata/oob-symlink/values.yaml"}, - }}, - {Ref: "ref", RepoURL: "https://git.example.com/test/repo"}, - }, - } - repoDB := &dbmocks.ArgoDB{} - repoDB.On("GetRepository", context.Background(), "https://git.example.com/test/repo").Return(&argoappv1.Repository{ - Repo: "https://git.example.com/test/repo", - }, nil) - refSources, err := argo.GetRefSources(context.Background(), spec, repoDB) - 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) -} - func TestGenerateManifestsUseExactRevision(t *testing.T) { service, gitClient := newServiceWithMocks(".", false) @@ -464,7 +390,7 @@ func TestManifestGenErrorCacheByNumRequests(t *testing.T) { assert.NotNil(t, manifestRequest) cachedManifestResponse := &cache.CachedManifestResponse{} - err := service.cache.GetManifests(mock.Anything, manifestRequest.ApplicationSource, manifestRequest.RefSources, manifestRequest, manifestRequest.Namespace, "", manifestRequest.AppLabelKey, manifestRequest.AppName, cachedManifestResponse) + err := service.cache.GetManifests(mock.Anything, manifestRequest.ApplicationSource, manifestRequest, manifestRequest.Namespace, "", manifestRequest.AppLabelKey, manifestRequest.AppName, cachedManifestResponse) assert.Nil(t, err) return cachedManifestResponse } @@ -1154,37 +1080,28 @@ func TestGenerateHelmWithFileParameter(t *testing.T) { func TestGenerateNullList(t *testing.T) { service := newService(".") - t.Run("null list", func(t *testing.T) { - res1, err := service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ - Repo: &argoappv1.Repository{}, - ApplicationSource: &argoappv1.ApplicationSource{Path: "./testdata/null-list"}, - NoCache: true, - }) - assert.Nil(t, err) - assert.Equal(t, len(res1.Manifests), 1) - assert.Contains(t, res1.Manifests[0], "prometheus-operator-operator") + res1, err := service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ + Repo: &argoappv1.Repository{}, + ApplicationSource: &argoappv1.ApplicationSource{Path: "./testdata/null-list"}, }) + assert.Nil(t, err) + assert.Equal(t, len(res1.Manifests), 1) + assert.Contains(t, res1.Manifests[0], "prometheus-operator-operator") - t.Run("empty list", func(t *testing.T) { - res1, err := service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ - Repo: &argoappv1.Repository{}, - ApplicationSource: &argoappv1.ApplicationSource{Path: "./testdata/empty-list"}, - NoCache: true, - }) - assert.Nil(t, err) - assert.Equal(t, len(res1.Manifests), 1) - assert.Contains(t, res1.Manifests[0], "prometheus-operator-operator") + res1, err = service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ + Repo: &argoappv1.Repository{}, + ApplicationSource: &argoappv1.ApplicationSource{Path: "./testdata/empty-list"}, }) + assert.Nil(t, err) + assert.Equal(t, len(res1.Manifests), 1) + assert.Contains(t, res1.Manifests[0], "prometheus-operator-operator") - t.Run("weird list", func(t *testing.T) { - res1, err := service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ - Repo: &argoappv1.Repository{}, - ApplicationSource: &argoappv1.ApplicationSource{Path: "./testdata/weird-list"}, - NoCache: true, - }) - assert.Nil(t, err) - assert.Len(t, res1.Manifests, 2) + res1, err = service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ + Repo: &argoappv1.Repository{}, + ApplicationSource: &argoappv1.ApplicationSource{Path: "./testdata/weird-list"}, }) + assert.Nil(t, err) + assert.Equal(t, 2, len(res1.Manifests)) } func TestIdentifyAppSourceTypeByAppDirWithKustomizations(t *testing.T) { @@ -1249,7 +1166,7 @@ func TestGenerateFromUTF16(t *testing.T) { Repo: &argoappv1.Repository{}, ApplicationSource: &argoappv1.ApplicationSource{}, } - res1, err := GenerateManifests(context.Background(), "./testdata/utf-16", "/", "", &q, false, &git.NoopCredsStore{}, resource.MustParse("0"), nil) + res1, err := GenerateManifests(context.Background(), "./testdata/utf-16", "/", "", &q, false, &git.NoopCredsStore{}, resource.MustParse("0")) assert.Nil(t, err) assert.Equal(t, 2, len(res1.Manifests)) } @@ -1273,7 +1190,6 @@ func TestListApps(t *testing.T) { "kustomization_yml": "Kustomize", "my-chart": "Helm", "my-chart-2": "Helm", - "oci-dependencies": "Helm", "out-of-bounds-values-file-link": "Helm", "values-files": "Helm", } @@ -1743,7 +1659,7 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { // 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) + err = service.cache.GetManifests(mock.Anything, source, &argoappv1.ClusterInfo{}, "", "", "", "test", res) assert.NoError(t, err) }) }) @@ -2400,7 +2316,7 @@ func TestResolveRevision(t *testing.T) { service := newService(".") repo := &argoappv1.Repository{Repo: "https://github.com/argoproj/argo-cd"} - app := &argoappv1.Application{Spec: argoappv1.ApplicationSpec{Source: &argoappv1.ApplicationSource{}}} + app := &argoappv1.Application{} resolveRevisionResponse, err := service.ResolveRevision(context.Background(), &apiclient.ResolveRevisionRequest{ Repo: repo, App: app, @@ -2422,7 +2338,7 @@ func TestResolveRevisionNegativeScenarios(t *testing.T) { service := newService(".") repo := &argoappv1.Repository{Repo: "https://github.com/argoproj/argo-cd"} - app := &argoappv1.Application{Spec: argoappv1.ApplicationSpec{Source: &argoappv1.ApplicationSource{}}} + app := &argoappv1.Application{} resolveRevisionResponse, err := service.ResolveRevision(context.Background(), &apiclient.ResolveRevisionRequest{ Repo: repo, App: app, @@ -2499,7 +2415,11 @@ func TestInit(t *testing.T) { require.NoError(t, service.Init()) - _, err := os.ReadDir(dir) + repo1Path, err := service.gitRepoPaths.GetPath(git.NormalizeGitURL("https://github.com/argo-cd/test-repo1")) + assert.NoError(t, err) + assert.Equal(t, repoPath, repo1Path) + + _, err = os.ReadDir(dir) require.Error(t, err) require.NoError(t, initGitRepo(path.Join(dir, "repo2"), "https://github.com/argo-cd/test-repo2")) } @@ -2565,7 +2485,6 @@ func Test_findHelmValueFilesInPath(t *testing.T) { } func Test_populateHelmAppDetails(t *testing.T) { - var emptyTempPaths = io.NewRandomizedTempPaths(t.TempDir()) res := apiclient.RepoAppDetailsResponse{} q := apiclient.RepoServerAppDetailsQuery{ Repo: &argoappv1.Repository{}, @@ -2575,18 +2494,17 @@ func Test_populateHelmAppDetails(t *testing.T) { } appPath, err := filepath.Abs("./testdata/values-files/") require.NoError(t, err) - err = populateHelmAppDetails(&res, appPath, appPath, &q, emptyTempPaths) + err = populateHelmAppDetails(&res, appPath, appPath, &q) require.NoError(t, err) assert.Len(t, res.Helm.Parameters, 3) assert.Len(t, res.Helm.ValueFiles, 4) } func Test_populateHelmAppDetails_values_symlinks(t *testing.T) { - var emptyTempPaths = io.NewRandomizedTempPaths(t.TempDir()) t.Run("inbound", func(t *testing.T) { res := apiclient.RepoAppDetailsResponse{} q := apiclient.RepoServerAppDetailsQuery{Repo: &argoappv1.Repository{}, Source: &argoappv1.ApplicationSource{}} - err := populateHelmAppDetails(&res, "./testdata/in-bounds-values-file-link/", "./testdata/in-bounds-values-file-link/", &q, emptyTempPaths) + err := populateHelmAppDetails(&res, "./testdata/in-bounds-values-file-link/", "./testdata/in-bounds-values-file-link/", &q) require.NoError(t, err) assert.NotEmpty(t, res.Helm.Values) assert.NotEmpty(t, res.Helm.Parameters) @@ -2595,180 +2513,9 @@ func Test_populateHelmAppDetails_values_symlinks(t *testing.T) { t.Run("out of bounds", func(t *testing.T) { res := apiclient.RepoAppDetailsResponse{} q := apiclient.RepoServerAppDetailsQuery{Repo: &argoappv1.Repository{}, Source: &argoappv1.ApplicationSource{}} - err := populateHelmAppDetails(&res, "./testdata/out-of-bounds-values-file-link/", "./testdata/out-of-bounds-values-file-link/", &q, emptyTempPaths) + err := populateHelmAppDetails(&res, "./testdata/out-of-bounds-values-file-link/", "./testdata/out-of-bounds-values-file-link/", &q) require.NoError(t, err) assert.Empty(t, res.Helm.Values) assert.Empty(t, res.Helm.Parameters) }) } - -func TestOCIDependencies(t *testing.T) { - src := argoappv1.ApplicationSource{Path: "."} - q := apiclient.ManifestRequest{Repo: &argoappv1.Repository{}, ApplicationSource: &src, HelmRepoCreds: []*argoappv1.RepoCreds{ - {URL: "example.com", Username: "test", Password: "test", EnableOCI: true}, - }} - - err := populateRequestRepos("./testdata/oci-dependencies", &q) - assert.Nil(t, err) - - assert.Equal(t, len(q.Repos), 1) - assert.Equal(t, q.Repos[0].Username, "test") - assert.Equal(t, q.Repos[0].EnableOCI, true) - assert.Equal(t, q.Repos[0].Repo, "example.com") -} - -func Test_getResolvedValueFiles(t *testing.T) { - tempDir := t.TempDir() - paths := io.NewRandomizedTempPaths(tempDir) - paths.Add(git.NormalizeGitURL("https://github.com/org/repo1"), path.Join(tempDir, "repo1")) - - testCases := []struct { - name string - rawPath string - env *argoappv1.Env - refSources map[string]*argoappv1.RefTarget - expectedPath string - expectedErr bool - }{ - { - name: "simple path", - rawPath: "values.yaml", - env: &argoappv1.Env{}, - refSources: map[string]*argoappv1.RefTarget{}, - expectedPath: path.Join(tempDir, "main-repo", "values.yaml"), - }, - { - name: "simple ref", - rawPath: "$ref/values.yaml", - env: &argoappv1.Env{}, - refSources: map[string]*argoappv1.RefTarget{ - "$ref": { - Repo: argoappv1.Repository{ - Repo: "https://github.com/org/repo1", - }, - }, - }, - expectedPath: path.Join(tempDir, "repo1", "values.yaml"), - }, - { - name: "only ref", - rawPath: "$ref", - env: &argoappv1.Env{}, - refSources: map[string]*argoappv1.RefTarget{ - "$ref": { - Repo: argoappv1.Repository{ - Repo: "https://github.com/org/repo1", - }, - }, - }, - expectedErr: true, - }, - { - name: "attempted traversal", - rawPath: "$ref/../values.yaml", - env: &argoappv1.Env{}, - refSources: map[string]*argoappv1.RefTarget{ - "$ref": { - Repo: argoappv1.Repository{ - Repo: "https://github.com/org/repo1", - }, - }, - }, - expectedErr: true, - }, - { - // Since $ref doesn't resolve to a ref target, we assume it's an env var. Since the env var isn't specified, - // it's replaced with an empty string. This is necessary for backwards compatibility with behavior before - // ref targets were introduced. - name: "ref doesn't exist", - rawPath: "$ref/values.yaml", - env: &argoappv1.Env{}, - refSources: map[string]*argoappv1.RefTarget{}, - expectedPath: path.Join(tempDir, "main-repo", "values.yaml"), - }, - { - name: "repo doesn't exist", - rawPath: "$ref/values.yaml", - env: &argoappv1.Env{}, - refSources: map[string]*argoappv1.RefTarget{ - "$ref": { - Repo: argoappv1.Repository{ - Repo: "https://github.com/org/repo2", - }, - }, - }, - expectedErr: true, - }, - { - name: "env var is resolved", - rawPath: "$ref/$APP_PATH/values.yaml", - env: &argoappv1.Env{ - &argoappv1.EnvEntry{ - Name: "APP_PATH", - Value: "app-path", - }, - }, - refSources: map[string]*argoappv1.RefTarget{ - "$ref": { - Repo: argoappv1.Repository{ - Repo: "https://github.com/org/repo1", - }, - }, - }, - expectedPath: path.Join(tempDir, "repo1", "app-path", "values.yaml"), - }, - { - name: "traversal in env var is blocked", - rawPath: "$ref/$APP_PATH/values.yaml", - env: &argoappv1.Env{ - &argoappv1.EnvEntry{ - Name: "APP_PATH", - Value: "..", - }, - }, - refSources: map[string]*argoappv1.RefTarget{ - "$ref": { - Repo: argoappv1.Repository{ - Repo: "https://github.com/org/repo1", - }, - }, - }, - expectedErr: true, - }, - { - name: "env var prefix", - rawPath: "$APP_PATH/values.yaml", - env: &argoappv1.Env{ - &argoappv1.EnvEntry{ - Name: "APP_PATH", - Value: "app-path", - }, - }, - refSources: map[string]*argoappv1.RefTarget{}, - expectedPath: path.Join(tempDir, "main-repo", "app-path", "values.yaml"), - }, - { - name: "unresolved env var", - rawPath: "$APP_PATH/values.yaml", - env: &argoappv1.Env{}, - refSources: map[string]*argoappv1.RefTarget{}, - expectedPath: path.Join(tempDir, "main-repo", "values.yaml"), - }, - } - - for _, tc := range testCases { - tcc := tc - t.Run(tcc.name, func(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.Len(t, resolvedPaths, 1) - assert.Equal(t, tcc.expectedPath, string(resolvedPaths[0])) - } else { - assert.Error(t, err) - assert.Empty(t, resolvedPaths) - } - }) - } -} diff --git a/reposerver/repository/testdata/oci-dependencies/Chart.yaml b/reposerver/repository/testdata/oci-dependencies/Chart.yaml deleted file mode 100644 index 3b39781ed6257..0000000000000 --- a/reposerver/repository/testdata/oci-dependencies/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -name: my-chart -version: 1.1.0 -dependencies: -- name: my-dependency - repository: oci://example.com - version: '*' \ No newline at end of file diff --git a/reposerver/server.go b/reposerver/server.go index 9576604751dfc..b7cf4f9537a5f 100644 --- a/reposerver/server.go +++ b/reposerver/server.go @@ -59,7 +59,7 @@ func NewServer(metricsServer *metrics.MetricsServer, cache *reposervercache.Cach keyPath := fmt.Sprintf("%s/reposerver/tls/tls.key", env.StringFromEnv(common.EnvAppConfigPath, common.DefaultAppConfigPath)) tlsConfig, err = tlsutil.CreateServerTLSConfig(certPath, keyPath, tlsHostList) if err != nil { - return nil, fmt.Errorf("error creating server TLS config: %w", err) + return nil, err } tlsConfCustomizer(tlsConfig) } diff --git a/resource_customizations/cluster.x-k8s.io/Cluster/health.lua b/resource_customizations/cluster.x-k8s.io/Cluster/health.lua index 3d3f1c4e3892d..a34dbc1067204 100644 --- a/resource_customizations/cluster.x-k8s.io/Cluster/health.lua +++ b/resource_customizations/cluster.x-k8s.io/Cluster/health.lua @@ -1,4 +1,5 @@ -function getStatusBasedOnPhase(obj, hs) +function getStatusBasedOnPhase(obj) + hs = {} hs.status = "Progressing" hs.message = "Waiting for clusters" if obj.status ~= nil and obj.status.phase ~= nil then @@ -14,27 +15,27 @@ function getStatusBasedOnPhase(obj, hs) return hs end -function getReadyContitionStatus(obj, hs) +function getReadyContitionMessage(obj) if obj.status ~= nil and obj.status.conditions ~= nil then for i, condition in ipairs(obj.status.conditions) do if condition.type == "Ready" and condition.status == "False" then - hs.status = "Degraded" - hs.message = condition.message - return hs + return condition.message end end end - return hs + return "Condition is unknown" end -hs = {} if obj.spec.paused ~= nil and obj.spec.paused then + hs = {} hs.status = "Suspended" hs.message = "Cluster is paused" return hs end -getStatusBasedOnPhase(obj, hs) -getReadyContitionStatus(obj, hs) +hs = getStatusBasedOnPhase(obj) +if hs.status ~= "Healthy" then + hs.message = getReadyContitionMessage(obj) +end -return hs +return hs \ No newline at end of file diff --git a/resource_customizations/cluster.x-k8s.io/Cluster/health_test.yaml b/resource_customizations/cluster.x-k8s.io/Cluster/health_test.yaml index f147587b23596..a1f887b939899 100644 --- a/resource_customizations/cluster.x-k8s.io/Cluster/health_test.yaml +++ b/resource_customizations/cluster.x-k8s.io/Cluster/health_test.yaml @@ -1,7 +1,7 @@ tests: - healthStatus: status: Progressing - message: 'Waiting for clusters' + message: 'Condition is unknown' inputPath: testdata/progressing_provisioning.yaml - healthStatus: status: Degraded @@ -15,7 +15,3 @@ tests: status: Healthy message: 'Cluster is running' inputPath: testdata/healthy_provisioned.yaml -- healthStatus: - status: Degraded - message: 'Post "https://tvc01.foo.bar/sdk": host "tvc01.foo.bar:443" thumbprint does not match "0A:21:BD:FC:71:40:BD:96"' - inputPath: testdata/error_provisioned.yaml diff --git a/resource_customizations/cluster.x-k8s.io/Cluster/testdata/error_provisioned.yaml b/resource_customizations/cluster.x-k8s.io/Cluster/testdata/error_provisioned.yaml deleted file mode 100644 index e58123aa64205..0000000000000 --- a/resource_customizations/cluster.x-k8s.io/Cluster/testdata/error_provisioned.yaml +++ /dev/null @@ -1,54 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: Cluster -metadata: - labels: - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/version: 0.3.11 - argocd.argoproj.io/instance: test - cluster.x-k8s.io/cluster-name: test - name: test - namespace: test -spec: - clusterNetwork: - pods: - cidrBlocks: - - 10.20.10.0/19 - services: - cidrBlocks: - - 10.10.10.0/19 - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 - kind: KubeadmControlPlane - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: VSphereCluster -status: - conditions: - - lastTransitionTime: '2022-12-14T07:45:14Z' - message: >- - Post "https://tvc01.foo.bar/sdk": host "tvc01.foo.bar:443" - thumbprint does not match - "0A:21:BD:FC:71:40:BD:96" - reason: VCenterUnreachable - severity: Error - status: 'False' - type: Ready - - lastTransitionTime: '2022-11-30T12:04:22Z' - status: 'True' - type: ControlPlaneInitialized - - lastTransitionTime: '2022-11-30T12:10:30Z' - status: 'True' - type: ControlPlaneReady - - lastTransitionTime: '2022-12-14T07:45:14Z' - message: >- - Post "https://tvc01.foo.bar/sdk": host "tvc01.foo.bar:443" - thumbprint does not match - "0A:21:BD:FC:71:40:BD:96" - reason: VCenterUnreachable - severity: Error - status: 'False' - type: InfrastructureReady - controlPlaneReady: true - infrastructureReady: true - observedGeneration: 2 - phase: Provisioned diff --git a/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/health.lua b/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/health.lua deleted file mode 100644 index 18840408ecae8..0000000000000 --- a/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/health.lua +++ /dev/null @@ -1,14 +0,0 @@ -hs = {} - -hs.status = "Progressing" -hs.message = "" - -if obj.status ~= nil and obj.status.currentHealthy ~= nil then - if obj.status.expectedMachines == obj.status.currentHealthy then - hs.status = "Healthy" - else - hs.status = "Degraded" - end -end - -return hs diff --git a/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/health_test.yaml b/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/health_test.yaml deleted file mode 100644 index af03a344afd18..0000000000000 --- a/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/health_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -tests: -- healthStatus: - status: Degraded - message: '' - inputPath: testdata/degraded_expectedMachines.yaml -- healthStatus: - status: Healthy - message: '' - inputPath: testdata/healthy.yaml diff --git a/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/testdata/degraded_expectedMachines.yaml b/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/testdata/degraded_expectedMachines.yaml deleted file mode 100644 index 8e1bc9b55bc18..0000000000000 --- a/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/testdata/degraded_expectedMachines.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineHealthCheck -metadata: - labels: - cluster.x-k8s.io/cluster-name: test - name: test-node-unhealthy-5m -spec: - clusterName: test - maxUnhealthy: 100% - nodeStartupTimeout: 10m0s - selector: - matchLabels: - cluster.x-k8s.io/deployment-name: test-md-workers-0 - unhealthyConditions: - - status: Unknown - timeout: 5m - type: Ready - - status: "False" - timeout: 5m - type: Ready -status: - conditions: - - lastTransitionTime: "2022-10-07T10:33:46Z" - status: "True" - type: RemediationAllowed - currentHealthy: 1 - expectedMachines: 3 - observedGeneration: 3 - remediationsAllowed: 1 - targets: - - test-md-workers-0-76f7db5786-8nl6m - - test-md-workers-0-76f7db5786-jjzvf - - test-md-workers-0-76f7db5786-l4vfb diff --git a/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/testdata/healthy.yaml b/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/testdata/healthy.yaml deleted file mode 100644 index cc2e490b2a46a..0000000000000 --- a/resource_customizations/cluster.x-k8s.io/MachineHealthCheck/testdata/healthy.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineHealthCheck -metadata: - labels: - cluster.x-k8s.io/cluster-name: test - name: test-node-unhealthy-5m -spec: - clusterName: test - maxUnhealthy: 100% - nodeStartupTimeout: 10m0s - selector: - matchLabels: - cluster.x-k8s.io/deployment-name: test-md-workers-0 - unhealthyConditions: - - status: Unknown - timeout: 5m - type: Ready - - status: "False" - timeout: 5m - type: Ready -status: - conditions: - - lastTransitionTime: "2022-10-07T10:33:46Z" - status: "True" - type: RemediationAllowed - currentHealthy: 3 - expectedMachines: 3 - observedGeneration: 3 - remediationsAllowed: 1 - targets: - - test-md-workers-0-76f7db5786-8nl6m - - test-md-workers-0-76f7db5786-jjzvf - - test-md-workers-0-76f7db5786-l4vfb diff --git a/resource_customizations/external-secrets.io/SecretStore/health.lua b/resource_customizations/external-secrets.io/SecretStore/health.lua deleted file mode 100644 index 5c58908ac6e9f..0000000000000 --- a/resource_customizations/external-secrets.io/SecretStore/health.lua +++ /dev/null @@ -1,20 +0,0 @@ -hs = {} -if obj.status ~= nil then - if obj.status.conditions ~= nil then - for i, condition in ipairs(obj.status.conditions) do - if condition.type == "Ready" and condition.status == "False" then - hs.status = "Degraded" - hs.message = condition.message - return hs - end - if condition.type == "Ready" and condition.status == "True" then - hs.status = "Healthy" - hs.message = condition.message - return hs - end - end - end -end -hs.status = "Progressing" -hs.message = "Waiting for SecretStore" -return hs diff --git a/resource_customizations/external-secrets.io/SecretStore/health_test.yaml b/resource_customizations/external-secrets.io/SecretStore/health_test.yaml deleted file mode 100644 index 6e692158e6e10..0000000000000 --- a/resource_customizations/external-secrets.io/SecretStore/health_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -tests: - - healthStatus: - status: Degraded - message: 'unable to validate store' - inputPath: testdata/degraded.yaml - - healthStatus: - status: Healthy - message: 'store validated' - inputPath: testdata/healthy.yaml diff --git a/resource_customizations/external-secrets.io/SecretStore/testdata/degraded.yaml b/resource_customizations/external-secrets.io/SecretStore/testdata/degraded.yaml deleted file mode 100644 index 6fe5150861d2f..0000000000000 --- a/resource_customizations/external-secrets.io/SecretStore/testdata/degraded.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: external-secrets.io/v1beta1 -kind: SecretStore -metadata: - name: vault -spec: - provider: - kubernetes: - auth: - serviceAccount: - name: vault - remoteNamespace: vault - server: - caProvider: - key: ca.crt - name: kube-root-ca.crt - type: ConfigMap - url: https://kubernetes.default -status: - conditions: - - lastTransitionTime: "2022-10-05T13:59:22Z" - message: unable to validate store - reason: ValidationFailed - status: "False" - type: Ready diff --git a/resource_customizations/external-secrets.io/SecretStore/testdata/healthy.yaml b/resource_customizations/external-secrets.io/SecretStore/testdata/healthy.yaml deleted file mode 100644 index e93ca88466920..0000000000000 --- a/resource_customizations/external-secrets.io/SecretStore/testdata/healthy.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: external-secrets.io/v1beta1 -kind: SecretStore -metadata: - name: vault -spec: - provider: - vault: - auth: - kubernetes: - mountPath: foobar - role: vault - secretRef: - key: token - name: vault - caBundle: foobar - namespace: pki - path: secret - server: https://foo.bar - version: v2 - retrySettings: - maxRetries: 5 - retryInterval: 10s -status: - conditions: - - lastTransitionTime: "2022-10-06T15:48:42Z" - message: store validated - reason: Valid - status: "True" - type: Ready diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/health.lua b/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/health.lua deleted file mode 100644 index daf3168907672..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/health.lua +++ /dev/null @@ -1,14 +0,0 @@ -hs = {} -if obj.status.status == "Succeeded" then - hs.status = "Healthy" - hs.message = "KeptnAppVersion is healthy" - return hs -end -if obj.status.status == "Failed" then - hs.status = "Degraded" - hs.message = "KeptnAppVersion is degraded" - return hs -end -hs.status = "Progressing" -hs.message = "KeptnAppVersion is progressing" -return hs \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/health_test.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/health_test.yaml deleted file mode 100644 index 67f34f18154b4..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/health_test.yaml +++ /dev/null @@ -1,13 +0,0 @@ -tests: - - healthStatus: - status: Progressing - message: "KeptnAppVersion is progressing" - inputPath: testdata/progressing.yaml - - healthStatus: - status: Degraded - message: "KeptnAppVersion is degraded" - inputPath: testdata/degraded.yaml - - healthStatus: - status: Healthy - message: "KeptnAppVersion is healthy" - inputPath: testdata/healthy.yaml \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/degraded.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/degraded.yaml deleted file mode 100644 index 047325740e9c4..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/degraded.yaml +++ /dev/null @@ -1,93 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnAppVersion -metadata: - annotations: - traceparent: 00-adc84f15413da737240dde75de2248fb-e3fcbc6fbdd05b1c-01 - creationTimestamp: "2022-12-14T13:17:36Z" - generation: 1 - name: podtato-head-0.1.1 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnApp - name: podtato-head - uid: b0e9773a-3dc7-4639-a4bd-64c8bb3d33ab - resourceVersion: "226500" - uid: 9ae27184-c63d-4e50-bbc7-18e5e289e85c -spec: - appName: podtato-head - preDeploymentEvaluations: - - app-pre-deploy-eval-2 - revision: "1" - traceId: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-3777b2225e0d2dc3-01 - version: 0.1.1 - workloads: - - name: podtato-head-left-arm - version: 0.2.7 - - name: podtato-head-left-leg - version: 0.2.7 - - name: podtato-head-entry - version: 0.2.7 - - name: podtato-head-right-arm - version: 0.1.0 - - name: podtato-head-right-leg - version: 0.2.7 - - name: podtato-head-hat - version: 0.1.0 -status: - currentPhase: Completed - endTime: "2022-12-14T13:19:06Z" - phaseTraceIDs: - "": - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-d566f50faad914b0-01 - AppDeploy: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0ae50f2d844888ab-01 - AppPostDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-f3dd12be90fc6c55-01 - AppPostDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0ebcfa51b9b3a08b-01 - AppPreDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-b5838bedd1703826-01 - AppPreDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-b1c3977a55236160-01 - postDeploymentEvaluationStatus: Succeeded - postDeploymentStatus: Succeeded - preDeploymentEvaluationStatus: Succeeded - preDeploymentEvaluationTaskStatus: - - endTime: "2022-12-14T13:17:41Z" - evaluationDefinitionName: app-pre-deploy-eval-2 - evaluationName: pre-eval-app-pre-deploy-eval-2-48925 - startTime: "2022-12-14T13:17:36Z" - status: Succeeded - preDeploymentStatus: Succeeded - startTime: "2022-12-14T13:17:36Z" - status: Failed - workloadOverallStatus: Failed - workloadStatus: - - status: Failed - workload: - name: podtato-head-left-arm - version: 0.2.7 - - status: Progressing - workload: - name: podtato-head-left-leg - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-entry - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-right-arm - version: 0.1.0 - - status: Succeeded - workload: - name: podtato-head-right-leg - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-hat - version: 0.1.0 \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/healthy.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/healthy.yaml deleted file mode 100644 index 214a2c2183bca..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/healthy.yaml +++ /dev/null @@ -1,93 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnAppVersion -metadata: - annotations: - traceparent: 00-adc84f15413da737240dde75de2248fb-e3fcbc6fbdd05b1c-01 - creationTimestamp: "2022-12-14T13:17:36Z" - generation: 1 - name: podtato-head-0.1.1 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnApp - name: podtato-head - uid: b0e9773a-3dc7-4639-a4bd-64c8bb3d33ab - resourceVersion: "226500" - uid: 9ae27184-c63d-4e50-bbc7-18e5e289e85c -spec: - appName: podtato-head - preDeploymentEvaluations: - - app-pre-deploy-eval-2 - revision: "1" - traceId: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-3777b2225e0d2dc3-01 - version: 0.1.1 - workloads: - - name: podtato-head-left-arm - version: 0.2.7 - - name: podtato-head-left-leg - version: 0.2.7 - - name: podtato-head-entry - version: 0.2.7 - - name: podtato-head-right-arm - version: 0.1.0 - - name: podtato-head-right-leg - version: 0.2.7 - - name: podtato-head-hat - version: 0.1.0 -status: - currentPhase: Completed - endTime: "2022-12-14T13:19:06Z" - phaseTraceIDs: - "": - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-d566f50faad914b0-01 - AppDeploy: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0ae50f2d844888ab-01 - AppPostDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-f3dd12be90fc6c55-01 - AppPostDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0ebcfa51b9b3a08b-01 - AppPreDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-b5838bedd1703826-01 - AppPreDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-b1c3977a55236160-01 - postDeploymentEvaluationStatus: Succeeded - postDeploymentStatus: Succeeded - preDeploymentEvaluationStatus: Succeeded - preDeploymentEvaluationTaskStatus: - - endTime: "2022-12-14T13:17:41Z" - evaluationDefinitionName: app-pre-deploy-eval-2 - evaluationName: pre-eval-app-pre-deploy-eval-2-48925 - startTime: "2022-12-14T13:17:36Z" - status: Succeeded - preDeploymentStatus: Succeeded - startTime: "2022-12-14T13:17:36Z" - status: Succeeded - workloadOverallStatus: Succeeded - workloadStatus: - - status: Succeeded - workload: - name: podtato-head-left-arm - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-left-leg - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-entry - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-right-arm - version: 0.1.0 - - status: Succeeded - workload: - name: podtato-head-right-leg - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-hat - version: 0.1.0 \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/progressing.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/progressing.yaml deleted file mode 100644 index c9b80e7f6dae2..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnAppVersion/testdata/progressing.yaml +++ /dev/null @@ -1,93 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnAppVersion -metadata: - annotations: - traceparent: 00-adc84f15413da737240dde75de2248fb-e3fcbc6fbdd05b1c-01 - creationTimestamp: "2022-12-14T13:17:36Z" - generation: 1 - name: podtato-head-0.1.1 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnApp - name: podtato-head - uid: b0e9773a-3dc7-4639-a4bd-64c8bb3d33ab - resourceVersion: "226500" - uid: 9ae27184-c63d-4e50-bbc7-18e5e289e85c -spec: - appName: podtato-head - preDeploymentEvaluations: - - app-pre-deploy-eval-2 - revision: "1" - traceId: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-3777b2225e0d2dc3-01 - version: 0.1.1 - workloads: - - name: podtato-head-left-arm - version: 0.2.7 - - name: podtato-head-left-leg - version: 0.2.7 - - name: podtato-head-entry - version: 0.2.7 - - name: podtato-head-right-arm - version: 0.1.0 - - name: podtato-head-right-leg - version: 0.2.7 - - name: podtato-head-hat - version: 0.1.0 -status: - currentPhase: Completed - endTime: "2022-12-14T13:19:06Z" - phaseTraceIDs: - "": - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-d566f50faad914b0-01 - AppDeploy: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0ae50f2d844888ab-01 - AppPostDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-f3dd12be90fc6c55-01 - AppPostDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0ebcfa51b9b3a08b-01 - AppPreDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-b5838bedd1703826-01 - AppPreDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-b1c3977a55236160-01 - postDeploymentEvaluationStatus: Succeeded - postDeploymentStatus: Succeeded - preDeploymentEvaluationStatus: Succeeded - preDeploymentEvaluationTaskStatus: - - endTime: "2022-12-14T13:17:41Z" - evaluationDefinitionName: app-pre-deploy-eval-2 - evaluationName: pre-eval-app-pre-deploy-eval-2-48925 - startTime: "2022-12-14T13:17:36Z" - status: Succeeded - preDeploymentStatus: Succeeded - startTime: "2022-12-14T13:17:36Z" - status: Progressing - workloadOverallStatus: Progressing - workloadStatus: - - status: Progressing - workload: - name: podtato-head-left-arm - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-left-leg - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-entry - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-right-arm - version: 0.1.0 - - status: Succeeded - workload: - name: podtato-head-right-leg - version: 0.2.7 - - status: Succeeded - workload: - name: podtato-head-hat - version: 0.1.0 \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/health.lua b/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/health.lua deleted file mode 100644 index 2ea65e96736f2..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/health.lua +++ /dev/null @@ -1,14 +0,0 @@ -hs = {} -if obj.status.overallStatus == "Succeeded" then - hs.status = "Healthy" - hs.message = "KeptnEvaluation is healthy" - return hs -end -if obj.status.overallStatus == "Failed" then - hs.status = "Degraded" - hs.message = "KeptnEvaluation is degraded" - return hs -end -hs.status = "Progressing" -hs.message = "KeptnEvaluation is progressing" -return hs \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/health_test.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/health_test.yaml deleted file mode 100644 index dd0378efbdc6d..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/health_test.yaml +++ /dev/null @@ -1,13 +0,0 @@ -tests: - - healthStatus: - status: Progressing - message: "KeptnEvaluation is progressing" - inputPath: testdata/progressing.yaml - - healthStatus: - status: Degraded - message: "KeptnEvaluation is degraded" - inputPath: testdata/degraded.yaml - - healthStatus: - status: Healthy - message: "KeptnEvaluation is healthy" - inputPath: testdata/healthy.yaml \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/degraded.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/degraded.yaml deleted file mode 100644 index 3054376c411bb..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/degraded.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnEvaluation -metadata: - creationTimestamp: "2022-12-14T13:17:36Z" - generation: 1 - name: pre-eval-app-pre-deploy-eval-2-48925 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnAppVersion - name: podtato-head-0.1.1 - uid: 9ae27184-c63d-4e50-bbc7-18e5e289e85c - resourceVersion: "225737" - uid: 84acabb8-9dca-46ab-b099-4799a732ba43 -spec: - appName: podtato-head - appVersion: 0.1.1 - checkType: pre-eval - evaluationDefinition: app-pre-deploy-eval-2 - retries: 10 - retryInterval: 5s - workloadVersion: "" -status: - endTime: "2022-12-14T13:17:36Z" - evaluationStatus: - available-cpus: - status: Failed - value: "0.25" - overallStatus: Failed - retryCount: 1 - startTime: "2022-12-14T13:17:36Z" \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/healthy.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/healthy.yaml deleted file mode 100644 index 8c74e31c28a51..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/healthy.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnEvaluation -metadata: - creationTimestamp: "2022-12-14T13:17:36Z" - generation: 1 - name: pre-eval-app-pre-deploy-eval-2-48925 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnAppVersion - name: podtato-head-0.1.1 - uid: 9ae27184-c63d-4e50-bbc7-18e5e289e85c - resourceVersion: "225737" - uid: 84acabb8-9dca-46ab-b099-4799a732ba43 -spec: - appName: podtato-head - appVersion: 0.1.1 - checkType: pre-eval - evaluationDefinition: app-pre-deploy-eval-2 - retries: 10 - retryInterval: 5s - workloadVersion: "" -status: - endTime: "2022-12-14T13:17:36Z" - evaluationStatus: - available-cpus: - status: Succeeded - value: "1.3100000000000005" - overallStatus: Succeeded - retryCount: 1 - startTime: "2022-12-14T13:17:36Z" \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/progressing.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/progressing.yaml deleted file mode 100644 index ba504061f9390..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnEvaluation/testdata/progressing.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnEvaluation -metadata: - creationTimestamp: "2022-12-14T13:17:36Z" - generation: 1 - name: pre-eval-app-pre-deploy-eval-2-48925 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnAppVersion - name: podtato-head-0.1.1 - uid: 9ae27184-c63d-4e50-bbc7-18e5e289e85c - resourceVersion: "225737" - uid: 84acabb8-9dca-46ab-b099-4799a732ba43 -spec: - appName: podtato-head - appVersion: 0.1.1 - checkType: pre-eval - evaluationDefinition: app-pre-deploy-eval-2 - retries: 10 - retryInterval: 5s - workloadVersion: "" -status: - endTime: "2022-12-14T13:17:36Z" - evaluationStatus: - available-cpus: - status: Progressing - value: "" - overallStatus: Progressing - retryCount: 1 - startTime: "2022-12-14T13:17:36Z" \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnTask/health.lua b/resource_customizations/lifecycle.keptn.sh/KeptnTask/health.lua deleted file mode 100644 index e22de12347391..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnTask/health.lua +++ /dev/null @@ -1,14 +0,0 @@ -hs = {} -if obj.status.status == "Succeeded" then - hs.status = "Healthy" - hs.message = "KeptnTask is healthy" - return hs -end -if obj.status.status == "Failed" then - hs.status = "Degraded" - hs.message = "KeptnTask is degraded" - return hs -end -hs.status = "Progressing" -hs.message = "KeptnTask is progressing" -return hs \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnTask/health_test.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnTask/health_test.yaml deleted file mode 100644 index 3d07164a65a1c..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnTask/health_test.yaml +++ /dev/null @@ -1,13 +0,0 @@ -tests: - - healthStatus: - status: Progressing - message: "KeptnTask is progressing" - inputPath: testdata/progressing.yaml - - healthStatus: - status: Degraded - message: "KeptnTask is degraded" - inputPath: testdata/degraded.yaml - - healthStatus: - status: Healthy - message: "KeptnTask is healthy" - inputPath: testdata/healthy.yaml \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/degraded.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/degraded.yaml deleted file mode 100644 index 4055a56f702de..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/degraded.yaml +++ /dev/null @@ -1,36 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnTask -metadata: - creationTimestamp: "2022-12-14T13:17:56Z" - generation: 1 - name: pre-pre-deployment-check-entry-31363 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnWorkloadInstance - name: podtato-head-podtato-head-left-leg-0.2.7 - uid: 1376ab23-43d7-4304-89b3-1eea3a895a2d - resourceVersion: "226304" - uid: 2e89a2e6-44ba-47ed-8800-c0194e549ee0 -spec: - app: podtato-head - appVersion: "" - checkType: pre - context: - appName: "" - appVersion: "" - objectType: "" - taskType: "" - workloadName: "" - workloadVersion: "" - parameters: {} - secureParameters: {} - taskDefinition: pre-deployment-check-entry - workload: podtato-head-podtato-head-left-leg - workloadVersion: 0.2.7 -status: - jobName: klc-pre-pre-deployment-check--44910 - startTime: "2022-12-14T13:17:56Z" - status: Failed \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/healthy.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/healthy.yaml deleted file mode 100644 index 4939df9ae329b..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/healthy.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnTask -metadata: - creationTimestamp: "2022-12-14T13:17:56Z" - generation: 1 - name: pre-pre-deployment-check-entry-31363 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnWorkloadInstance - name: podtato-head-podtato-head-left-leg-0.2.7 - uid: 1376ab23-43d7-4304-89b3-1eea3a895a2d - resourceVersion: "226304" - uid: 2e89a2e6-44ba-47ed-8800-c0194e549ee0 -spec: - app: podtato-head - appVersion: "" - checkType: pre - context: - appName: "" - appVersion: "" - objectType: "" - taskType: "" - workloadName: "" - workloadVersion: "" - parameters: {} - secureParameters: {} - taskDefinition: pre-deployment-check-entry - workload: podtato-head-podtato-head-left-leg - workloadVersion: 0.2.7 -status: - endTime: "2022-12-14T13:18:46Z" - jobName: klc-pre-pre-deployment-check--44910 - startTime: "2022-12-14T13:17:56Z" - status: Succeeded \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/progressing.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/progressing.yaml deleted file mode 100644 index 342365cca07a1..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnTask/testdata/progressing.yaml +++ /dev/null @@ -1,36 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnTask -metadata: - creationTimestamp: "2022-12-14T13:17:56Z" - generation: 1 - name: pre-pre-deployment-check-entry-31363 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnWorkloadInstance - name: podtato-head-podtato-head-left-leg-0.2.7 - uid: 1376ab23-43d7-4304-89b3-1eea3a895a2d - resourceVersion: "226304" - uid: 2e89a2e6-44ba-47ed-8800-c0194e549ee0 -spec: - app: podtato-head - appVersion: "" - checkType: pre - context: - appName: "" - appVersion: "" - objectType: "" - taskType: "" - workloadName: "" - workloadVersion: "" - parameters: {} - secureParameters: {} - taskDefinition: pre-deployment-check-entry - workload: podtato-head-podtato-head-left-leg - workloadVersion: 0.2.7 -status: - jobName: klc-pre-pre-deployment-check--44910 - startTime: "2022-12-14T13:17:56Z" - status: Progressing \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/health.lua b/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/health.lua deleted file mode 100644 index 64002013a273f..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/health.lua +++ /dev/null @@ -1,14 +0,0 @@ -hs = {} -if obj.status.status == "Succeeded" then - hs.status = "Healthy" - hs.message = "KeptnWorkloadInstance is healthy" - return hs -end -if obj.status.status == "Failed" then - hs.status = "Degraded" - hs.message = "KeptnWorkloadInstance is degraded" - return hs -end -hs.status = "Progressing" -hs.message = "KeptnWorkloadInstance is progressing" -return hs \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/health_test.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/health_test.yaml deleted file mode 100644 index f27bad67965e9..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/health_test.yaml +++ /dev/null @@ -1,13 +0,0 @@ -tests: - - healthStatus: - status: Progressing - message: "KeptnWorkloadInstance is progressing" - inputPath: testdata/progressing.yaml - - healthStatus: - status: Degraded - message: "KeptnWorkloadInstance is degraded" - inputPath: testdata/degraded.yaml - - healthStatus: - status: Healthy - message: "KeptnWorkloadInstance is healthy" - inputPath: testdata/healthy.yaml \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/degraded.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/degraded.yaml deleted file mode 100644 index 324e4e011802c..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/degraded.yaml +++ /dev/null @@ -1,50 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnWorkloadInstance -metadata: - annotations: - traceparent: 00-5050e556a9aaf22814aa689d0518f4d3-cbcff966a6d32c39-01 - creationTimestamp: "2022-12-14T13:17:36Z" - generation: 2 - name: podtato-head-podtato-head-entry-0.2.7 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnWorkload - name: podtato-head-podtato-head-entry - uid: dcafe814-7f9d-4d50-9a66-f61c81bfe764 - resourceVersion: "226253" - uid: 6987404b-c7b9-40f5-95e9-d5aad55a3f3b -spec: - app: podtato-head - resourceReference: - kind: ReplicaSet - name: podtato-head-entry-6fc8964846 - uid: 2b6e44bf-27e3-4305-a9fb-65d2f412936b - traceId: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0ae50f2d844888ab-01 - version: 0.2.7 - workloadName: podtato-head-podtato-head-entry -status: - currentPhase: PreDeployTasks - deploymentStatus: Succeeded - phaseTraceIDs: - "": - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-ca249d3f6e024547-01 - WorkloadDeploy: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-3be53185e6024eb4-01 - WorkloadPostDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0dc305a08a0ccf14-01 - WorkloadPostDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-4c7cf78cbbc40e14-01 - WorkloadPreDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-5eed0ec5420cfc89-01 - WorkloadPreDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-bef05615fc0138ac-01 - postDeploymentEvaluationStatus: Progressing - postDeploymentStatus: Progressing - preDeploymentEvaluationStatus: Failed - preDeploymentStatus: Failed - startTime: "2022-12-14T13:17:57Z" - status: Failed \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/healthy.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/healthy.yaml deleted file mode 100644 index 491501ac33ca2..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/healthy.yaml +++ /dev/null @@ -1,51 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnWorkloadInstance -metadata: - annotations: - traceparent: 00-5050e556a9aaf22814aa689d0518f4d3-cbcff966a6d32c39-01 - creationTimestamp: "2022-12-14T13:17:36Z" - generation: 2 - name: podtato-head-podtato-head-entry-0.2.7 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnWorkload - name: podtato-head-podtato-head-entry - uid: dcafe814-7f9d-4d50-9a66-f61c81bfe764 - resourceVersion: "226253" - uid: 6987404b-c7b9-40f5-95e9-d5aad55a3f3b -spec: - app: podtato-head - resourceReference: - kind: ReplicaSet - name: podtato-head-entry-6fc8964846 - uid: 2b6e44bf-27e3-4305-a9fb-65d2f412936b - traceId: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0ae50f2d844888ab-01 - version: 0.2.7 - workloadName: podtato-head-podtato-head-entry -status: - currentPhase: Completed - deploymentStatus: Succeeded - endTime: "2022-12-14T13:18:41Z" - phaseTraceIDs: - "": - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-ca249d3f6e024547-01 - WorkloadDeploy: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-3be53185e6024eb4-01 - WorkloadPostDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0dc305a08a0ccf14-01 - WorkloadPostDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-4c7cf78cbbc40e14-01 - WorkloadPreDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-5eed0ec5420cfc89-01 - WorkloadPreDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-bef05615fc0138ac-01 - postDeploymentEvaluationStatus: Succeeded - postDeploymentStatus: Succeeded - preDeploymentEvaluationStatus: Succeeded - preDeploymentStatus: Succeeded - startTime: "2022-12-14T13:17:57Z" - status: Succeeded \ No newline at end of file diff --git a/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/progressing.yaml b/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/progressing.yaml deleted file mode 100644 index b263c95f9299e..0000000000000 --- a/resource_customizations/lifecycle.keptn.sh/KeptnWorkloadInstance/testdata/progressing.yaml +++ /dev/null @@ -1,50 +0,0 @@ -apiVersion: lifecycle.keptn.sh/v1alpha2 -kind: KeptnWorkloadInstance -metadata: - annotations: - traceparent: 00-5050e556a9aaf22814aa689d0518f4d3-cbcff966a6d32c39-01 - creationTimestamp: "2022-12-14T13:17:36Z" - generation: 2 - name: podtato-head-podtato-head-entry-0.2.7 - namespace: podtato-kubectl - ownerReferences: - - apiVersion: lifecycle.keptn.sh/v1alpha2 - blockOwnerDeletion: true - controller: true - kind: KeptnWorkload - name: podtato-head-podtato-head-entry - uid: dcafe814-7f9d-4d50-9a66-f61c81bfe764 - resourceVersion: "226253" - uid: 6987404b-c7b9-40f5-95e9-d5aad55a3f3b -spec: - app: podtato-head - resourceReference: - kind: ReplicaSet - name: podtato-head-entry-6fc8964846 - uid: 2b6e44bf-27e3-4305-a9fb-65d2f412936b - traceId: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0ae50f2d844888ab-01 - version: 0.2.7 - workloadName: podtato-head-podtato-head-entry -status: - currentPhase: Completed - deploymentStatus: Succeeded - phaseTraceIDs: - "": - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-ca249d3f6e024547-01 - WorkloadDeploy: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-3be53185e6024eb4-01 - WorkloadPostDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-0dc305a08a0ccf14-01 - WorkloadPostDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-4c7cf78cbbc40e14-01 - WorkloadPreDeployEvaluations: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-5eed0ec5420cfc89-01 - WorkloadPreDeployTasks: - traceparent: 00-ecdd1f5a7e1068ac9b0d044aa165ca4c-bef05615fc0138ac-01 - postDeploymentEvaluationStatus: Progressing - postDeploymentStatus: Progressing - preDeploymentEvaluationStatus: Succeeded - preDeploymentStatus: Succeeded - startTime: "2022-12-14T13:17:57Z" - status: Progressing \ No newline at end of file diff --git a/resource_customizations/serving.knative.dev/Service/health.lua b/resource_customizations/serving.knative.dev/Service/health.lua deleted file mode 100644 index 9867d8ab09df6..0000000000000 --- a/resource_customizations/serving.knative.dev/Service/health.lua +++ /dev/null @@ -1,40 +0,0 @@ -health_status = {} -health_status.status = "Progressing" -health_status.message = "Waiting for status update." -if obj.status ~= nil and obj.status.conditions ~= nil then - status_true = 0 - status_false = 0 - status_unknown = 0 - health_status.message = "" - for i, condition in pairs(obj.status.conditions) do - if condition.status == "True" and (condition.type == "ConfigurationsReady" or condition.type == "RoutesReady" or condition.type == "Ready") then - status_true = status_true + 1 - elseif condition.status == "False" or condition.status == "Unknown" then - msg = condition.type .. " is " .. condition.status - if condition.reason ~= nil and condition.reason ~= "" then - msg = msg .. ", since " .. condition.reason .. "." - end - if condition.message ~= nil and condition.message ~= "" then - msg = msg .. " " .. condition.message - end - health_status.message = health_status.message .. msg .. "\n" - if condition.status == "False" then - status_false = status_false + 1 - else - status_unknown = status_unknown + 1 - end - end - end - if status_true == 3 and status_false == 0 and status_unknown == 0 then - health_status.message = "Knative Service is healthy." - health_status.status = "Healthy" - return health_status - elseif status_false > 0 then - health_status.status = "Degraded" - return health_status - else - health_status.status = "Progressing" - return health_status - end -end -return health_status \ No newline at end of file diff --git a/resource_customizations/serving.knative.dev/Service/health_test.yaml b/resource_customizations/serving.knative.dev/Service/health_test.yaml deleted file mode 100644 index 88ddbf44f4979..0000000000000 --- a/resource_customizations/serving.knative.dev/Service/health_test.yaml +++ /dev/null @@ -1,13 +0,0 @@ -tests: -- healthStatus: - status: Progressing - message: "Ready is Unknown, since RolloutInProgress. A gradual rollout of the latest revision(s) is in progress.\nRoutesReady is Unknown, since RolloutInProgress. A gradual rollout of the latest revision(s) is in progress.\n" - inputPath: testdata/progressing.yaml -- healthStatus: - status: Degraded - message: "ConfigurationsReady is False, since RevisionFailed. Revision \"helloworld-00002\" failed with message: Container failed with: container exited with no error.\nReady is False, since RevisionFailed. Revision \"helloworld-00002\" failed with message: Container failed with: container exited with no error.\n" - inputPath: testdata/degraded.yaml -- healthStatus: - status: Healthy - message: Knative Service is healthy. - inputPath: testdata/healthy.yaml diff --git a/resource_customizations/serving.knative.dev/Service/testdata/degraded.yaml b/resource_customizations/serving.knative.dev/Service/testdata/degraded.yaml deleted file mode 100644 index cc23d525816f5..0000000000000 --- a/resource_customizations/serving.knative.dev/Service/testdata/degraded.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: serving.knative.dev/v1 -kind: Service -metadata: - name: helloworld - namespace: default -spec: {} -status: - conditions: - - lastTransitionTime: "2022-06-14T03:45:38Z" - message: 'Revision "helloworld-00002" failed with message: Container failed with: container exited with no error.' - reason: RevisionFailed - status: "False" - type: ConfigurationsReady - - lastTransitionTime: "2022-06-14T03:45:38Z" - message: 'Revision "helloworld-00002" failed with message: Container failed with: container exited with no error.' - reason: RevisionFailed - status: "False" - type: Ready - - lastTransitionTime: "2022-06-16T09:35:11Z" - status: "True" - type: RoutesReady diff --git a/resource_customizations/serving.knative.dev/Service/testdata/healthy.yaml b/resource_customizations/serving.knative.dev/Service/testdata/healthy.yaml deleted file mode 100644 index ced6960193ee2..0000000000000 --- a/resource_customizations/serving.knative.dev/Service/testdata/healthy.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: serving.knative.dev/v1 -kind: Service -metadata: - name: helloworld - namespace: default -spec: {} -status: - conditions: - - lastTransitionTime: "2022-06-20T03:52:41Z" - status: "True" - type: ConfigurationsReady - - lastTransitionTime: "2022-06-20T03:52:41Z" - status: "True" - type: Ready - - lastTransitionTime: "2022-06-20T03:52:41Z" - status: "True" - type: RoutesReady diff --git a/resource_customizations/serving.knative.dev/Service/testdata/progressing.yaml b/resource_customizations/serving.knative.dev/Service/testdata/progressing.yaml deleted file mode 100644 index f381e5fc06d80..0000000000000 --- a/resource_customizations/serving.knative.dev/Service/testdata/progressing.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: serving.knative.dev/v1 -kind: Service -metadata: - name: helloworld - namespace: default -spec: {} -status: - conditions: - - lastTransitionTime: "2022-06-20T04:14:22Z" - status: "True" - type: ConfigurationsReady - - lastTransitionTime: "2022-06-20T04:14:22Z" - message: A gradual rollout of the latest revision(s) is in progress. - reason: RolloutInProgress - status: Unknown - type: Ready - - lastTransitionTime: "2022-06-20T04:14:22Z" - message: A gradual rollout of the latest revision(s) is in progress. - reason: RolloutInProgress - status: Unknown - type: RoutesReady diff --git a/resource_customizations/work.karmada.io/ClusterResourceBinding/health.lua b/resource_customizations/work.karmada.io/ClusterResourceBinding/health.lua deleted file mode 100644 index 5098ae9fe2e56..0000000000000 --- a/resource_customizations/work.karmada.io/ClusterResourceBinding/health.lua +++ /dev/null @@ -1,37 +0,0 @@ -health_status = {} -if obj.status == nil then - health_status.status = "Progressing" - health_status.message = "Current resource status is insufficient" - return health_status -end - -if obj.spec.clusters == nil or #obj.spec.clusters == 0 then - health_status.status = "Progressing" - health_status.message = "Current resource status is insufficient" - return health_status -end - -if obj.status.aggregatedStatus == nil or #obj.spec.clusters ~= #obj.status.aggregatedStatus then - health_status.status = "Progressing" - health_status.message = "Current resource status is insufficient" - return health_status -end - -for i, status in ipairs(obj.status.aggregatedStatus) do - if status.health == "Unhealthy" then - health_status.status = "Degraded" - health_status.message = "Current resource status is unhealthy" - return health_status - end - - if status.health == "Unknown" then - if status.applied ~= true then - health_status.status = "Degraded" - health_status.message = "Current resource status is unhealthy" - return health_status - end - end -end - -health_status.status = "Healthy" -return health_status diff --git a/resource_customizations/work.karmada.io/ClusterResourceBinding/health_test.yaml b/resource_customizations/work.karmada.io/ClusterResourceBinding/health_test.yaml deleted file mode 100644 index 3ebee0ec80831..0000000000000 --- a/resource_customizations/work.karmada.io/ClusterResourceBinding/health_test.yaml +++ /dev/null @@ -1,31 +0,0 @@ -tests: - - healthStatus: - status: Progressing - message: "Current resource status is insufficient" - inputPath: testdata/progressing.yaml - - healthStatus: - status: Progressing - message: "Current resource status is insufficient" - inputPath: testdata/progressing_aggregatedStatus.yaml - - healthStatus: - status: Progressing - message: "Current resource status is insufficient" - inputPath: testdata/progressing_cluster.yaml - - healthStatus: - status: Degraded - message: "Current resource status is unhealthy" - inputPath: testdata/degraded_unapplied.yaml - - healthStatus: - status: Degraded - message: "Current resource status is unhealthy" - inputPath: testdata/degraded_unknown.yaml - - healthStatus: - status: Degraded - message: "Current resource status is unhealthy" - inputPath: testdata/degraded_unhealth.yaml - - healthStatus: - status: Healthy - inputPath: testdata/health.yaml - - healthStatus: - status: Healthy - inputPath: testdata/health_unknown.yaml diff --git a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unapplied.yaml b/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unapplied.yaml deleted file mode 100644 index 94d73705c526e..0000000000000 --- a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unapplied.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ClusterResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - clusterpropagationpolicy.karmada.io/name: service-testk4j5t - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - clusters: - - name: member1 - resource: - apiVersion: v1 - kind: Service - name: service-test - namespace: default - resourceVersion: "3943220" - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 -status: - aggregatedStatus: - - applied: false - clusterName: member1 - health: Unhealthy - conditions: - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: All works have been successfully applied - reason: FullyAppliedSuccess - status: "True" - type: FullyApplied - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: Binding has been scheduled - reason: BindingScheduled - status: "True" - type: Scheduled - schedulerObservedGeneration: 2 diff --git a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unhealth.yaml b/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unhealth.yaml deleted file mode 100644 index 6c39b88ebbafc..0000000000000 --- a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unhealth.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ClusterResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - clusterpropagationpolicy.karmada.io/name: service-testk4j5t - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - clusters: - - name: member1 - resource: - apiVersion: v1 - kind: Service - name: service-test - namespace: default - resourceVersion: "3943220" - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 -status: - aggregatedStatus: - - applied: true - clusterName: member1 - health: Unhealthy - conditions: - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: All works have been successfully applied - reason: FullyAppliedSuccess - status: "True" - type: FullyApplied - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: Binding has been scheduled - reason: BindingScheduled - status: "True" - type: Scheduled - schedulerObservedGeneration: 2 diff --git a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unknown.yaml b/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unknown.yaml deleted file mode 100644 index b87e39e87b26f..0000000000000 --- a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/degraded_unknown.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ClusterResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - clusterpropagationpolicy.karmada.io/name: service-testk4j5t - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - clusters: - - name: member1 - resource: - apiVersion: v1 - kind: Service - name: service-test - namespace: default - resourceVersion: "3943220" - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 -status: - aggregatedStatus: - - applied: false - clusterName: member1 - health: Unknown - conditions: - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: All works have been successfully applied - reason: FullyAppliedSuccess - status: "True" - type: FullyApplied - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: Binding has been scheduled - reason: BindingScheduled - status: "True" - type: Scheduled - schedulerObservedGeneration: 2 diff --git a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/health.yaml b/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/health.yaml deleted file mode 100644 index 9e8a87de46c2e..0000000000000 --- a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/health.yaml +++ /dev/null @@ -1,83 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ClusterResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - clusterpropagationpolicy.karmada.io/name: service-testk4j5t - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - clusters: - - name: member1 - - name: member2 - - name: member3 - replicaRequirements: - nodeClaim: - tolerations: - - effect: NoExecute - key: node.kubernetes.io/not-ready - operator: Exists - tolerationSeconds: 300 - - effect: NoExecute - key: node.kubernetes.io/unreachable - operator: Exists - tolerationSeconds: 300 - resourceRequest: - cpu: 250m - memory: 512Mi - replicas: 1 - resource: - apiVersion: apps/v1 - kind: Deployment - name: test1 - namespace: default - resourceVersion: "3663243" - uid: 58ccb955-4da6-4167-9b65-dddadcef569e -status: - aggregatedStatus: - - applied: true - clusterName: member1 - health: Healthy - status: - availableReplicas: 1 - readyReplicas: 1 - replicas: 1 - updatedReplicas: 1 - - applied: true - clusterName: member2 - health: Healthy - status: - replicas: 1 - unavailableReplicas: 1 - updatedReplicas: 1 - - applied: true - clusterName: member3 - health: Healthy - status: - availableReplicas: 1 - readyReplicas: 1 - replicas: 1 - updatedReplicas: 1 - conditions: - - lastTransitionTime: "2022-11-02T02:49:06Z" - message: All works have been successfully applied - reason: FullyAppliedSuccess - status: "True" - type: FullyApplied - - lastTransitionTime: "2022-10-28T09:56:31Z" - message: Binding has been scheduled - reason: BindingScheduled - status: "True" - type: Scheduled - schedulerObservedGeneration: 7 diff --git a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/health_unknown.yaml b/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/health_unknown.yaml deleted file mode 100644 index 4a356a9ffb8bc..0000000000000 --- a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/health_unknown.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ClusterResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - clusterpropagationpolicy.karmada.io/name: service-testk4j5t - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - clusters: - - name: member1 - resource: - apiVersion: v1 - kind: Service - name: service-test - namespace: default - resourceVersion: "3943220" - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 -status: - aggregatedStatus: - - applied: true - clusterName: member1 - health: Unknown - conditions: - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: All works have been successfully applied - reason: FullyAppliedSuccess - status: "True" - type: FullyApplied - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: Binding has been scheduled - reason: BindingScheduled - status: "True" - type: Scheduled - schedulerObservedGeneration: 2 diff --git a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing.yaml b/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing.yaml deleted file mode 100644 index 8d4c5f224ed82..0000000000000 --- a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing.yaml +++ /dev/null @@ -1,41 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ClusterResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - clusterpropagationpolicy.karmada.io/name: service-testk4j5t - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - resource: - apiVersion: v1 - kind: Service - name: test - namespace: default - resourceVersion: "2605059" - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af -status: - conditions: - - lastTransitionTime: "2022-10-27T07:19:50Z" - message: '0/3 clusters are available: 3 cluster(s) didn''t match the placement - cluster affinity constraint.' - reason: BindingFailedScheduling - status: "False" - type: Scheduled - - lastTransitionTime: "2022-10-27T07:19:52Z" - message: Failed to apply all works, see status.aggregatedStatus for details - reason: FullyAppliedFailed - status: "False" - type: FullyApplied - schedulerObservedGeneration: 4 diff --git a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing_aggregatedStatus.yaml b/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing_aggregatedStatus.yaml deleted file mode 100644 index 5e7e851854028..0000000000000 --- a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing_aggregatedStatus.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ClusterResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - clusterpropagationpolicy.karmada.io/name: service-testk4j5t - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - clusters: - - name: member1 - - name: member2 - - name: member3 -status: - aggregatedStatus: - - applied: true - clusterName: member1 - health: Healthy - status: - availableReplicas: 1 - readyReplicas: 1 - replicas: 1 - updatedReplicas: 1 - conditions: - - ansibleResult: - changed: 1 - completion: 2020-06-08T13:41:20.133525 - failures: 0 - ok: 56 - skipped: 82 - lastTransitionTime: "2020-06-04T17:47:31Z" - message: Reconciling - reason: Running - status: "True" - type: Running diff --git a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing_cluster.yaml b/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing_cluster.yaml deleted file mode 100644 index 08d63e3a9cf71..0000000000000 --- a/resource_customizations/work.karmada.io/ClusterResourceBinding/testdata/progressing_cluster.yaml +++ /dev/null @@ -1,34 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ClusterResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - clusterpropagationpolicy.karmada.io/name: service-testk4j5t - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - clusters: [] -status: - conditions: - - ansibleResult: - changed: 1 - completion: 2020-06-08T13:41:20.133525 - failures: 0 - ok: 56 - skipped: 82 - lastTransitionTime: "2020-06-04T17:47:31Z" - message: Reconciling - reason: Running - status: "True" - type: Running diff --git a/resource_customizations/work.karmada.io/ResourceBinding/health.lua b/resource_customizations/work.karmada.io/ResourceBinding/health.lua deleted file mode 100644 index 5098ae9fe2e56..0000000000000 --- a/resource_customizations/work.karmada.io/ResourceBinding/health.lua +++ /dev/null @@ -1,37 +0,0 @@ -health_status = {} -if obj.status == nil then - health_status.status = "Progressing" - health_status.message = "Current resource status is insufficient" - return health_status -end - -if obj.spec.clusters == nil or #obj.spec.clusters == 0 then - health_status.status = "Progressing" - health_status.message = "Current resource status is insufficient" - return health_status -end - -if obj.status.aggregatedStatus == nil or #obj.spec.clusters ~= #obj.status.aggregatedStatus then - health_status.status = "Progressing" - health_status.message = "Current resource status is insufficient" - return health_status -end - -for i, status in ipairs(obj.status.aggregatedStatus) do - if status.health == "Unhealthy" then - health_status.status = "Degraded" - health_status.message = "Current resource status is unhealthy" - return health_status - end - - if status.health == "Unknown" then - if status.applied ~= true then - health_status.status = "Degraded" - health_status.message = "Current resource status is unhealthy" - return health_status - end - end -end - -health_status.status = "Healthy" -return health_status diff --git a/resource_customizations/work.karmada.io/ResourceBinding/health_test.yaml b/resource_customizations/work.karmada.io/ResourceBinding/health_test.yaml deleted file mode 100644 index 3ebee0ec80831..0000000000000 --- a/resource_customizations/work.karmada.io/ResourceBinding/health_test.yaml +++ /dev/null @@ -1,31 +0,0 @@ -tests: - - healthStatus: - status: Progressing - message: "Current resource status is insufficient" - inputPath: testdata/progressing.yaml - - healthStatus: - status: Progressing - message: "Current resource status is insufficient" - inputPath: testdata/progressing_aggregatedStatus.yaml - - healthStatus: - status: Progressing - message: "Current resource status is insufficient" - inputPath: testdata/progressing_cluster.yaml - - healthStatus: - status: Degraded - message: "Current resource status is unhealthy" - inputPath: testdata/degraded_unapplied.yaml - - healthStatus: - status: Degraded - message: "Current resource status is unhealthy" - inputPath: testdata/degraded_unknown.yaml - - healthStatus: - status: Degraded - message: "Current resource status is unhealthy" - inputPath: testdata/degraded_unhealth.yaml - - healthStatus: - status: Healthy - inputPath: testdata/health.yaml - - healthStatus: - status: Healthy - inputPath: testdata/health_unknown.yaml diff --git a/resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unapplied.yaml b/resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unapplied.yaml deleted file mode 100644 index f36b1d330f352..0000000000000 --- a/resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unapplied.yaml +++ /dev/null @@ -1,50 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 2 - labels: - propagationpolicy.karmada.io/name: service-service-testn7qfx - propagationpolicy.karmada.io/namespace: default - name: service-test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: service-test - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 - resourceVersion: "3943290" - uid: 1459071b-e460-4038-8a5d-d2a4803ad6f1 -spec: - clusters: - - name: member1 - - name: member2 - resource: - apiVersion: v1 - kind: Service - name: service-test - namespace: default - resourceVersion: "3943220" - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 -status: - aggregatedStatus: - - applied: false - clusterName: member1 - health: Unhealthy - - clusterName: member2 - health: Unhealthy - conditions: - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: All works have been successfully applied - reason: FullyAppliedSuccess - status: "True" - type: FullyApplied - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: Binding has been scheduled - reason: BindingScheduled - status: "True" - type: Scheduled - schedulerObservedGeneration: 2 diff --git a/resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unhealth.yaml b/resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unhealth.yaml deleted file mode 100644 index c4100598d68a9..0000000000000 --- a/resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unhealth.yaml +++ /dev/null @@ -1,47 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 2 - labels: - propagationpolicy.karmada.io/name: service-service-testn7qfx - propagationpolicy.karmada.io/namespace: default - name: service-test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: service-test - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 - resourceVersion: "3943290" - uid: 1459071b-e460-4038-8a5d-d2a4803ad6f1 -spec: - clusters: - - name: member1 - resource: - apiVersion: v1 - kind: Service - name: service-test - namespace: default - resourceVersion: "3943220" - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 -status: - aggregatedStatus: - - applied: true - clusterName: member1 - health: Unhealthy - conditions: - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: All works have been successfully applied - reason: FullyAppliedSuccess - status: "True" - type: FullyApplied - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: Binding has been scheduled - reason: BindingScheduled - status: "True" - type: Scheduled - schedulerObservedGeneration: 2 diff --git a/resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unknown.yaml b/resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unknown.yaml deleted file mode 100644 index 6c447fd97c817..0000000000000 --- a/resource_customizations/work.karmada.io/ResourceBinding/testdata/degraded_unknown.yaml +++ /dev/null @@ -1,47 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 2 - labels: - propagationpolicy.karmada.io/name: service-service-testn7qfx - propagationpolicy.karmada.io/namespace: default - name: service-test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: service-test - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 - resourceVersion: "3943290" - uid: 1459071b-e460-4038-8a5d-d2a4803ad6f1 -spec: - clusters: - - name: member1 - resource: - apiVersion: v1 - kind: Service - name: service-test - namespace: default - resourceVersion: "3943220" - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 -status: - aggregatedStatus: - - applied: false - clusterName: member1 - health: Unknown - conditions: - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: All works have been successfully applied - reason: FullyAppliedSuccess - status: "True" - type: FullyApplied - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: Binding has been scheduled - reason: BindingScheduled - status: "True" - type: Scheduled - schedulerObservedGeneration: 2 diff --git a/resource_customizations/work.karmada.io/ResourceBinding/testdata/health.yaml b/resource_customizations/work.karmada.io/ResourceBinding/testdata/health.yaml deleted file mode 100644 index 428cf4f1b9f40..0000000000000 --- a/resource_customizations/work.karmada.io/ResourceBinding/testdata/health.yaml +++ /dev/null @@ -1,84 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 7 - labels: - propagationpolicy.karmada.io/name: test1-57dcd6489f - propagationpolicy.karmada.io/namespace: default - name: test1-deployment - namespace: default - ownerReferences: - - apiVersion: apps/v1 - blockOwnerDeletion: true - controller: true - kind: Deployment - name: test1 - uid: 58ccb955-4da6-4167-9b65-dddadcef569e - resourceVersion: "3903091" - uid: a46f5454-f8c5-4c9e-9119-3022aa5943b1 -spec: - clusters: - - name: member1 - - name: member2 - - name: member3 - replicaRequirements: - nodeClaim: - tolerations: - - effect: NoExecute - key: node.kubernetes.io/not-ready - operator: Exists - tolerationSeconds: 300 - - effect: NoExecute - key: node.kubernetes.io/unreachable - operator: Exists - tolerationSeconds: 300 - resourceRequest: - cpu: 250m - memory: 512Mi - replicas: 1 - resource: - apiVersion: apps/v1 - kind: Deployment - name: test1 - namespace: default - resourceVersion: "3663243" - uid: 58ccb955-4da6-4167-9b65-dddadcef569e -status: - aggregatedStatus: - - applied: true - clusterName: member1 - health: Healthy - status: - availableReplicas: 1 - readyReplicas: 1 - replicas: 1 - updatedReplicas: 1 - - applied: true - clusterName: member2 - health: Healthy - status: - replicas: 1 - unavailableReplicas: 1 - updatedReplicas: 1 - - applied: true - clusterName: member3 - health: Healthy - status: - availableReplicas: 1 - readyReplicas: 1 - replicas: 1 - updatedReplicas: 1 - conditions: - - lastTransitionTime: "2022-11-02T02:49:06Z" - message: All works have been successfully applied - reason: FullyAppliedSuccess - status: "True" - type: FullyApplied - - lastTransitionTime: "2022-10-28T09:56:31Z" - message: Binding has been scheduled - reason: BindingScheduled - status: "True" - type: Scheduled - schedulerObservedGeneration: 7 diff --git a/resource_customizations/work.karmada.io/ResourceBinding/testdata/health_unknown.yaml b/resource_customizations/work.karmada.io/ResourceBinding/testdata/health_unknown.yaml deleted file mode 100644 index 47d18438e62fd..0000000000000 --- a/resource_customizations/work.karmada.io/ResourceBinding/testdata/health_unknown.yaml +++ /dev/null @@ -1,47 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 2 - labels: - propagationpolicy.karmada.io/name: service-service-testn7qfx - propagationpolicy.karmada.io/namespace: default - name: service-test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: service-test - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 - resourceVersion: "3943290" - uid: 1459071b-e460-4038-8a5d-d2a4803ad6f1 -spec: - clusters: - - name: member1 - resource: - apiVersion: v1 - kind: Service - name: service-test - namespace: default - resourceVersion: "3943220" - uid: 9c2b39b9-4607-4795-87db-1a54680939d0 -status: - aggregatedStatus: - - applied: true - clusterName: member1 - health: Unknown - conditions: - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: All works have been successfully applied - reason: FullyAppliedSuccess - status: "True" - type: FullyApplied - - lastTransitionTime: "2022-11-03T10:56:30Z" - message: Binding has been scheduled - reason: BindingScheduled - status: "True" - type: Scheduled - schedulerObservedGeneration: 2 diff --git a/resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing.yaml b/resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing.yaml deleted file mode 100644 index 5c8d8a3928373..0000000000000 --- a/resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing.yaml +++ /dev/null @@ -1,42 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - propagationpolicy.karmada.io/name: service-testk4j5t - propagationpolicy.karmada.io/namespace: default - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - resource: - apiVersion: v1 - kind: Service - name: test - namespace: default - resourceVersion: "2605059" - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af -status: - conditions: - - lastTransitionTime: "2022-10-27T07:19:50Z" - message: '0/3 clusters are available: 3 cluster(s) didn''t match the placement - cluster affinity constraint.' - reason: BindingFailedScheduling - status: "False" - type: Scheduled - - lastTransitionTime: "2022-10-27T07:19:52Z" - message: Failed to apply all works, see status.aggregatedStatus for details - reason: FullyAppliedFailed - status: "False" - type: FullyApplied - schedulerObservedGeneration: 4 diff --git a/resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing_aggregatedStatus.yaml b/resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing_aggregatedStatus.yaml deleted file mode 100644 index d4ba59ca0c11b..0000000000000 --- a/resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing_aggregatedStatus.yaml +++ /dev/null @@ -1,47 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - propagationpolicy.karmada.io/name: service-testk4j5t - propagationpolicy.karmada.io/namespace: default - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - clusters: - - name: member1 - - name: member2 - - name: member3 -status: - aggregatedStatus: - - applied: true - clusterName: member1 - health: Healthy - status: - availableReplicas: 1 - readyReplicas: 1 - replicas: 1 - updatedReplicas: 1 - conditions: - - ansibleResult: - changed: 1 - completion: 2020-06-08T13:41:20.133525 - failures: 0 - ok: 56 - skipped: 82 - lastTransitionTime: "2020-06-04T17:47:31Z" - message: Reconciling - reason: Running - status: "True" - type: Running diff --git a/resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing_cluster.yaml b/resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing_cluster.yaml deleted file mode 100644 index 0463820bafd6a..0000000000000 --- a/resource_customizations/work.karmada.io/ResourceBinding/testdata/progressing_cluster.yaml +++ /dev/null @@ -1,35 +0,0 @@ -apiVersion: work.karmada.io/v1alpha2 -kind: ResourceBinding -metadata: - finalizers: - - karmada.io/binding-controller - generation: 5 - labels: - propagationpolicy.karmada.io/name: service-testk4j5t - propagationpolicy.karmada.io/namespace: default - name: test-service - namespace: default - ownerReferences: - - apiVersion: v1 - blockOwnerDeletion: true - controller: true - kind: Service - name: test - uid: 039b0d1a-05cb-40b4-b43a-438b0de386af - resourceVersion: "4106772" - uid: 3932ee50-4c2b-4e77-9bfb-45eeb4ec220f -spec: - clusters: [] -status: - conditions: - - ansibleResult: - changed: 1 - completion: 2020-06-08T13:41:20.133525 - failures: 0 - ok: 56 - skipped: 82 - lastTransitionTime: "2020-06-04T17:47:31Z" - message: Reconciling - reason: Running - status: "True" - type: Running diff --git a/server/application/application.go b/server/application/application.go index dbdce9cafce2e..4202e27d8d5b7 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -37,12 +37,12 @@ import ( argocommon "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" appv1 "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" "github.com/argoproj/argo-cd/v2/reposerver/apiclient" servercache "github.com/argoproj/argo-cd/v2/server/cache" - "github.com/argoproj/argo-cd/v2/server/deeplinks" "github.com/argoproj/argo-cd/v2/server/rbacpolicy" "github.com/argoproj/argo-cd/v2/util/argo" argoutil "github.com/argoproj/argo-cd/v2/util/argo" @@ -54,7 +54,6 @@ import ( "github.com/argoproj/argo-cd/v2/util/lua" "github.com/argoproj/argo-cd/v2/util/manifeststream" "github.com/argoproj/argo-cd/v2/util/rbac" - "github.com/argoproj/argo-cd/v2/util/security" "github.com/argoproj/argo-cd/v2/util/session" "github.com/argoproj/argo-cd/v2/util/settings" ) @@ -211,15 +210,15 @@ func (s *Server) Create(ctx context.Context, q *application.ApplicationCreateReq appNs := s.appNamespaceOrDefault(a.Namespace) if !s.isNamespaceEnabled(appNs) { - return nil, security.NamespaceNotPermittedError(appNs) + return nil, namespaceNotPermittedError(appNs) } created, err := s.appclientset.ArgoprojV1alpha1().Applications(appNs).Create(ctx, a, metav1.CreateOptions{}) if err == nil { - if a.Spec.GetSource().Plugin != nil && a.Spec.GetSource().Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": a.Spec.GetSource().Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -257,13 +256,13 @@ func (s *Server) Create(ctx context.Context, q *application.ApplicationCreateReq return updated, nil } -func (s *Server) queryRepoServer(ctx context.Context, a *appv1.Application, action func( +func (s *Server) queryRepoServer(ctx context.Context, a *v1alpha1.Application, action func( client apiclient.RepoServerServiceClient, repo *appv1.Repository, helmRepos []*appv1.Repository, - helmCreds []*appv1.RepoCreds, - helmOptions *appv1.HelmOptions, - kustomizeOptions *appv1.KustomizeOptions, + helmCreds []*v1alpha1.RepoCreds, + helmOptions *v1alpha1.HelmOptions, + kustomizeOptions *v1alpha1.KustomizeOptions, enabledSourceTypes map[string]bool, ) error) error { @@ -272,7 +271,7 @@ func (s *Server) queryRepoServer(ctx context.Context, a *appv1.Application, acti return fmt.Errorf("error creating repo server client: %w", err) } defer ioutil.Close(closer) - repo, err := s.db.GetRepository(ctx, a.Spec.GetSource().RepoURL) + repo, err := s.db.GetRepository(ctx, a.Spec.Source.RepoURL) if err != nil { return fmt.Errorf("error getting repository: %w", err) } @@ -280,7 +279,7 @@ func (s *Server) queryRepoServer(ctx context.Context, a *appv1.Application, acti if err != nil { return fmt.Errorf("error getting kustomize settings: %w", err) } - kustomizeOptions, err := kustomizeSettings.GetOptions(a.Spec.GetSource()) + kustomizeOptions, err := kustomizeSettings.GetOptions(a.Spec.Source) if err != nil { return fmt.Errorf("error getting kustomize settings options: %w", err) } @@ -335,22 +334,21 @@ func (s *Server) GetManifests(ctx context.Context, q *application.ApplicationMan return nil, err } - source := a.Spec.GetSource() - if source.Plugin != nil && source.Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": source.Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } if !s.isNamespaceEnabled(a.Namespace) { - return nil, security.NamespaceNotPermittedError(a.Namespace) + return nil, namespaceNotPermittedError(a.Namespace) } var manifestInfo *apiclient.ManifestResponse err = s.queryRepoServer(ctx, a, func( client apiclient.RepoServerServiceClient, repo *appv1.Repository, helmRepos []*appv1.Repository, helmCreds []*appv1.RepoCreds, helmOptions *appv1.HelmOptions, kustomizeOptions *appv1.KustomizeOptions, enableGenerateManifests map[string]bool) error { - revision := source.TargetRevision + revision := a.Spec.Source.TargetRevision if q.GetRevision() != "" { revision = q.GetRevision() } @@ -384,7 +382,7 @@ func (s *Server) GetManifests(ctx context.Context, q *application.ApplicationMan AppLabelKey: appInstanceLabelKey, AppName: a.InstanceName(s.ns), Namespace: a.Spec.Destination.Namespace, - ApplicationSource: &source, + ApplicationSource: &a.Spec.Source, Repos: helmRepos, Plugins: plugins, KustomizeOptions: kustomizeOptions, @@ -478,14 +476,13 @@ func (s *Server) GetManifestsWithFiles(stream application.ApplicationService_Get return fmt.Errorf("error getting API resources: %w", err) } - source := a.Spec.GetSource() req := &apiclient.ManifestRequest{ Repo: repo, - Revision: source.TargetRevision, + Revision: a.Spec.Source.TargetRevision, AppLabelKey: appInstanceLabelKey, AppName: a.Name, Namespace: a.Spec.Destination.Namespace, - ApplicationSource: &source, + ApplicationSource: &a.Spec.Source, Repos: helmRepos, Plugins: plugins, KustomizeOptions: kustomizeOptions, @@ -562,10 +559,10 @@ func (s *Server) Get(ctx context.Context, q *application.ApplicationQuery) (*app return nil, err } - if a.Spec.GetSource().Plugin != nil && a.Spec.GetSource().Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": a.Spec.GetSource().Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -604,10 +601,9 @@ func (s *Server) Get(ctx context.Context, q *application.ApplicationQuery) (*app kustomizeOptions *appv1.KustomizeOptions, enabledSourceTypes map[string]bool, ) error { - source := app.Spec.GetSource() _, err := client.GetAppDetails(ctx, &apiclient.RepoServerAppDetailsQuery{ Repo: repo, - Source: &source, + Source: &app.Spec.Source, AppName: appName, KustomizeOptions: kustomizeOptions, Repos: helmRepos, @@ -657,10 +653,10 @@ func (s *Server) ListResourceEvents(ctx context.Context, q *application.Applicat return nil, err } - if a.Spec.GetSource().Plugin != nil && a.Spec.GetSource().Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": a.Spec.GetSource().Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -830,10 +826,10 @@ func (s *Server) Update(ctx context.Context, q *application.ApplicationUpdateReq return nil, err } - if a.Spec.GetSource().Plugin != nil && a.Spec.GetSource().Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": a.Spec.GetSource().Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -859,10 +855,10 @@ func (s *Server) UpdateSpec(ctx context.Context, q *application.ApplicationUpdat return nil, err } - if a.Spec.GetSource().Plugin != nil && a.Spec.GetSource().Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": a.Spec.GetSource().Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -891,10 +887,10 @@ func (s *Server) Patch(ctx context.Context, q *application.ApplicationPatchReque return nil, err } - if app.Spec.GetSource().Plugin != nil && app.Spec.GetSource().Plugin.Name != "" { + if app.Spec.Source.Plugin != nil && app.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": app.Name, - "plugin": app.Spec.GetSource().Plugin.Name, + "plugin": app.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -924,7 +920,7 @@ func (s *Server) Patch(ctx context.Context, q *application.ApplicationPatchReque return nil, status.Error(codes.InvalidArgument, fmt.Sprintf("Patch type '%s' is not supported", q.GetPatchType())) } - newApp := &appv1.Application{} + newApp := &v1alpha1.Application{} err = json.Unmarshal(patchApp, newApp) if err != nil { return nil, fmt.Errorf("error unmarshaling patched app: %w", err) @@ -948,10 +944,10 @@ func (s *Server) Delete(ctx context.Context, q *application.ApplicationDeleteReq return nil, err } - if a.Spec.GetSource().Plugin != nil && a.Spec.GetSource().Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": a.Spec.GetSource().Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -1117,6 +1113,16 @@ func (s *Server) validateAndNormalizeApp(ctx context.Context, app *appv1.Applica return err } } + + // If source is Kustomize add build options + kustomizeSettings, err := s.settingsMgr.GetKustomizeSettings() + if err != nil { + return fmt.Errorf("error getting kustomize settings: %w", err) + } + kustomizeOptions, err := kustomizeSettings.GetOptions(app.Spec.Source) + if err != nil { + return fmt.Errorf("error getting kustomize options from settings: %w", err) + } plugins, err := s.plugins() if err != nil { return fmt.Errorf("error getting plugins: %w", err) @@ -1128,12 +1134,10 @@ func (s *Server) validateAndNormalizeApp(ctx context.Context, app *appv1.Applica var conditions []appv1.ApplicationCondition if validate { - conditions := make([]appv1.ApplicationCondition, 0) - condition, err := argo.ValidateRepo(ctx, app, s.repoClientset, s.db, plugins, s.kubectl, proj, s.settingsMgr) + conditions, err = argo.ValidateRepo(ctx, app, s.repoClientset, s.db, kustomizeOptions, plugins, s.kubectl, proj, s.settingsMgr) if err != nil { return fmt.Errorf("error validating the repo: %w", err) } - conditions = append(conditions, condition...) if len(conditions) > 0 { return status.Errorf(codes.InvalidArgument, "application spec for %s is invalid: %s", app.Name, argo.FormatAppConditions(conditions)) } @@ -1353,11 +1357,10 @@ func (s *Server) ResourceTree(ctx context.Context, q *application.ResourcesQuery return nil, err } - source := a.Spec.GetSource() - if source.Plugin != nil && source.Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": source.Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -1386,7 +1389,7 @@ func (s *Server) WatchResourceTree(q *application.ResourcesQuery, ws application }) } -func (s *Server) RevisionMetadata(ctx context.Context, q *application.RevisionMetadataQuery) (*appv1.RevisionMetadata, error) { +func (s *Server) RevisionMetadata(ctx context.Context, q *application.RevisionMetadataQuery) (*v1alpha1.RevisionMetadata, error) { appName := q.GetName() appNs := s.appNamespaceOrDefault(q.GetAppNamespace()) a, err := s.appLister.Applications(appNs).Get(appName) @@ -1397,15 +1400,14 @@ func (s *Server) RevisionMetadata(ctx context.Context, q *application.RevisionMe return nil, err } - source := a.Spec.GetSource() - if source.Plugin != nil && source.Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": source.Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } - repo, err := s.db.GetRepository(ctx, source.RepoURL) + repo, err := s.db.GetRepository(ctx, a.Spec.Source.RepoURL) if err != nil { return nil, fmt.Errorf("error getting repository by URL: %w", err) } @@ -1445,11 +1447,10 @@ func (s *Server) ManagedResources(ctx context.Context, q *application.ResourcesQ return nil, fmt.Errorf("error verifying rbac: %w", err) } - source := a.Spec.GetSource() - if source.Plugin != nil && source.Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": source.Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -1516,11 +1517,10 @@ func (s *Server) PodLogs(q *application.ApplicationPodLogsQuery, ws application. return err } - source := a.Spec.GetSource() - if source.Plugin != nil && source.Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": source.Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -1737,11 +1737,10 @@ func (s *Server) Sync(ctx context.Context, syncReq *application.ApplicationSyncR return nil, err } - source := a.Spec.GetSource() - if source.Plugin != nil && source.Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": source.Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -1757,8 +1756,8 @@ func (s *Server) Sync(ctx context.Context, syncReq *application.ApplicationSyncR return nil, status.Errorf(codes.FailedPrecondition, "application is deleting") } if a.Spec.SyncPolicy != nil && a.Spec.SyncPolicy.Automated != nil { - if syncReq.GetRevision() != "" && syncReq.GetRevision() != text.FirstNonEmpty(source.TargetRevision, "HEAD") { - return nil, status.Errorf(codes.FailedPrecondition, "Cannot sync to %s: auto-sync currently set to %s", syncReq.GetRevision(), source.TargetRevision) + if syncReq.GetRevision() != "" && syncReq.GetRevision() != text.FirstNonEmpty(a.Spec.Source.TargetRevision, "HEAD") { + return nil, status.Errorf(codes.FailedPrecondition, "Cannot sync to %s: auto-sync currently set to %s", syncReq.GetRevision(), a.Spec.Source.TargetRevision) } } revision, displayRevision, err := s.resolveRevision(ctx, a, syncReq) @@ -1837,11 +1836,10 @@ func (s *Server) Rollback(ctx context.Context, rollbackReq *application.Applicat return nil, err } - source := a.Spec.GetSource() - if source.Plugin != nil && source.Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": source.Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -1895,69 +1893,6 @@ func (s *Server) Rollback(ctx context.Context, rollbackReq *application.Applicat return a, nil } -func (s *Server) ListLinks(ctx context.Context, req *application.ListAppLinksRequest) (*application.LinksResponse, error) { - appName := req.GetName() - appNs := s.appNamespaceOrDefault(req.GetNamespace()) - - a, err := s.appclientset.ArgoprojV1alpha1().Applications(appNs).Get(ctx, appName, metav1.GetOptions{}) - if err != nil { - log.WithFields(map[string]interface{}{ - "application": appName, - "ns": appNs, - }).Errorf("failed to get application, error=%v", err.Error()) - return nil, fmt.Errorf("error getting application") - } - - if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplications, rbacpolicy.ActionGet, a.RBACName(s.ns)); err != nil { - log.WithFields(map[string]interface{}{ - "application": appName, - "ns": appNs, - }).Warnf("unauthorized access to app, error=%v", err.Error()) - return nil, fmt.Errorf("error getting application") - } - - obj, err := kube.ToUnstructured(a) - if err != nil { - return nil, fmt.Errorf("error getting application: %w", err) - } - - deepLinks, err := s.settingsMgr.GetDeepLinks(settings.ApplicationDeepLinks) - if err != nil { - return nil, fmt.Errorf("failed to read application deep links from configmap: %w", err) - } - - finalList, errorList := deeplinks.EvaluateDeepLinksResponse(*obj, deepLinks) - if len(errorList) > 0 { - log.Errorf("errorList while evaluating application deep links, %v", strings.Join(errorList, ", ")) - } - - return finalList, nil -} - -func (s *Server) ListResourceLinks(ctx context.Context, req *application.ApplicationResourceRequest) (*application.LinksResponse, error) { - obj, _, _, _, err := s.getUnstructuredLiveResourceOrApp(ctx, rbacpolicy.ActionGet, req) - if err != nil { - return nil, err - } - - deepLinks, err := s.settingsMgr.GetDeepLinks(settings.ResourceDeepLinks) - if err != nil { - return nil, fmt.Errorf("failed to read application deep links from configmap: %w", err) - } - - obj, err = replaceSecretValues(obj) - if err != nil { - return nil, fmt.Errorf("error replacing secret values: %w", err) - } - - finalList, errorList := deeplinks.EvaluateDeepLinksResponse(*obj, deepLinks) - if len(errorList) > 0 { - log.Errorf("errors while evaluating resource deep links, %v", strings.Join(errorList, ", ")) - } - - return finalList, nil -} - // resolveRevision resolves the revision specified either in the sync request, or the // application source, into a concrete revision that will be used for a sync operation. func (s *Server) resolveRevision(ctx context.Context, app *appv1.Application, syncReq *application.ApplicationSyncRequest) (string, string, error) { @@ -1966,9 +1901,9 @@ func (s *Server) resolveRevision(ctx context.Context, app *appv1.Application, sy } ambiguousRevision := syncReq.GetRevision() if ambiguousRevision == "" { - ambiguousRevision = app.Spec.GetSource().TargetRevision + ambiguousRevision = app.Spec.Source.TargetRevision } - repo, err := s.db.GetRepository(ctx, app.Spec.GetSource().RepoURL) + repo, err := s.db.GetRepository(ctx, app.Spec.Source.RepoURL) if err != nil { return "", "", fmt.Errorf("error getting repository by URL: %w", err) } @@ -1978,8 +1913,7 @@ func (s *Server) resolveRevision(ctx context.Context, app *appv1.Application, sy } defer ioutil.Close(conn) - source := app.Spec.GetSource() - if !source.IsHelm() { + if !app.Spec.Source.IsHelm() { if git.IsCommitSHA(ambiguousRevision) { // If it's already a commit SHA, then no need to look it up return ambiguousRevision, ambiguousRevision, nil @@ -2248,12 +2182,12 @@ func splitStatusPatch(patch []byte) ([]byte, []byte, error) { return nonStatusPatch, statusPatch, nil } -func (s *Server) plugins() ([]*appv1.ConfigManagementPlugin, error) { +func (s *Server) plugins() ([]*v1alpha1.ConfigManagementPlugin, error) { plugins, err := s.settingsMgr.GetConfigManagementPlugins() if err != nil { return nil, fmt.Errorf("error getting config management plugin: %w", err) } - tools := make([]*appv1.ConfigManagementPlugin, len(plugins)) + tools := make([]*v1alpha1.ConfigManagementPlugin, len(plugins)) for i, p := range plugins { p := p tools[i] = &p @@ -2274,11 +2208,10 @@ func (s *Server) GetApplicationSyncWindows(ctx context.Context, q *application.A return nil, err } - source := a.Spec.GetSource() - if source.Plugin != nil && source.Plugin.Name != "" { + if a.Spec.Source.Plugin != nil && a.Spec.Source.Plugin.Name != "" { log.WithFields(map[string]interface{}{ "application": a.Name, - "plugin": source.Plugin.Name, + "plugin": a.Spec.Source.Plugin.Name, }).Warnf(argocommon.ConfigMapPluginDeprecationWarning) } @@ -2299,11 +2232,11 @@ func (s *Server) GetApplicationSyncWindows(ctx context.Context, q *application.A return res, nil } -func (s *Server) inferResourcesStatusHealth(app *appv1.Application) { - if app.Status.ResourceHealthSource == appv1.ResourceHealthLocationAppTree { - tree := &appv1.ApplicationTree{} +func (s *Server) inferResourcesStatusHealth(app *v1alpha1.Application) { + if app.Status.ResourceHealthSource == v1alpha1.ResourceHealthLocationAppTree { + tree := &v1alpha1.ApplicationTree{} if err := s.cache.GetAppResourcesTree(app.Name, tree); err == nil { - healthByKey := map[kube.ResourceKey]*appv1.HealthStatus{} + healthByKey := map[kube.ResourceKey]*v1alpha1.HealthStatus{} for _, node := range tree.Nodes { healthByKey[kube.NewResourceKey(node.Group, node.Kind, node.Namespace, node.Name)] = node.Health } @@ -2315,7 +2248,7 @@ func (s *Server) inferResourcesStatusHealth(app *appv1.Application) { } } -func convertSyncWindows(w *appv1.SyncWindows) []*application.ApplicationSyncWindow { +func convertSyncWindows(w *v1alpha1.SyncWindows) []*application.ApplicationSyncWindow { if w != nil { var windows []*application.ApplicationSyncWindow for _, w := range *w { @@ -2356,5 +2289,9 @@ func (s *Server) appNamespaceOrDefault(appNs string) string { } func (s *Server) isNamespaceEnabled(namespace string) bool { - return security.IsNamespaceEnabled(namespace, s.ns, s.enabledNamespaces) + return namespace == s.ns || glob.MatchStringInList(s.enabledNamespaces, namespace, false) +} + +func namespaceNotPermittedError(namespace string) error { + return fmt.Errorf("namespace '%s' is not permitted", namespace) } diff --git a/server/application/application.proto b/server/application/application.proto index 4fb08a7082c0f..50c22901503d5 100644 --- a/server/application/application.proto +++ b/server/application/application.proto @@ -264,23 +264,6 @@ message ManagedResourcesResponse { repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ResourceDiff items = 1; } -message LinkInfo { - required string title = 1; - required string url = 2; - optional string description = 3; - optional string iconClass = 4; -} - -message LinksResponse { - repeated LinkInfo items = 1; -} - -message ListAppLinksRequest { - required string name = 1; - optional string namespace = 3; -} - - // ApplicationService service ApplicationService { @@ -442,14 +425,4 @@ service ApplicationService { } }; } - - // ListLinks returns the list of all application deep links - rpc ListLinks(ListAppLinksRequest) returns (LinksResponse) { - option (google.api.http).get = "/api/v1/applications/{name}/links"; - } - - // ListResourceLinks returns the list of all resource deep links - rpc ListResourceLinks(ApplicationResourceRequest) returns (LinksResponse) { - option (google.api.http).get = "/api/v1/applications/{name}/resource/links"; - } } diff --git a/server/application/application_test.go b/server/application/application_test.go index 7569734d33b42..7eb6ae3357463 100644 --- a/server/application/application_test.go +++ b/server/application/application_test.go @@ -540,9 +540,6 @@ func TestDeleteApp(t *testing.T) { deleted = true return true, nil, nil }) - fakeAppCs.AddReactor("get", "applications", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { - return true, &appsv1.Application{Spec: appsv1.ApplicationSpec{Source: &appsv1.ApplicationSource{}}}, nil - }) appServer.appclientset = fakeAppCs trueVar := true @@ -867,9 +864,6 @@ func TestGetCachedAppState(t *testing.T) { } appServer := newTestAppServer(testApp, testProj) fakeClientSet := appServer.appclientset.(*apps.Clientset) - fakeClientSet.AddReactor("get", "applications", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { - return true, &appsv1.Application{Spec: appsv1.ApplicationSpec{Source: &appsv1.ApplicationSource{}}}, nil - }) t.Run("NoError", func(t *testing.T) { err := appServer.getCachedAppState(context.Background(), testApp, func() error { return nil @@ -893,9 +887,6 @@ func TestGetCachedAppState(t *testing.T) { appServer.appBroadcaster.OnUpdate(testApp, updated) return true, testApp, nil }) - fakeClientSet.AddReactor("get", "applications", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { - return true, &appsv1.Application{Spec: appsv1.ApplicationSpec{Source: &appsv1.ApplicationSource{}}}, nil - }) fakeClientSet.Unlock() fakeClientSet.AddWatchReactor("applications", func(action kubetesting.Action) (handled bool, ret watch.Interface, err error) { return true, watcher, nil @@ -1095,7 +1086,7 @@ func TestGetAppRefresh_HardRefresh(t *testing.T) { assert.NoError(t, err) require.NotNil(t, getAppDetailsQuery) assert.True(t, getAppDetailsQuery.NoCache) - assert.Equal(t, testApp.Spec.Source, getAppDetailsQuery.Source) + assert.Equal(t, &testApp.Spec.Source, getAppDetailsQuery.Source) assert.NoError(t, err) select { diff --git a/server/application/terminal.go b/server/application/terminal.go index 38368f486b665..4644facee8880 100644 --- a/server/application/terminal.go +++ b/server/application/terminal.go @@ -2,6 +2,7 @@ package application import ( "context" + "fmt" "io" "net/http" @@ -23,9 +24,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/rbac" - "github.com/argoproj/argo-cd/v2/util/security" sessionmgr "github.com/argoproj/argo-cd/v2/util/session" - "github.com/argoproj/argo-cd/v2/util/settings" ) type terminalHandler struct { @@ -36,11 +35,10 @@ type terminalHandler struct { appResourceTreeFn func(ctx context.Context, app *appv1.Application) (*appv1.ApplicationTree, error) allowedShells []string namespace string - enabledNamespaces []string } // NewHandler returns a new terminal handler. -func NewHandler(appLister applisters.ApplicationLister, namespace string, enabledNamespaces []string, db db.ArgoDB, enf *rbac.Enforcer, cache *servercache.Cache, +func NewHandler(appLister applisters.ApplicationLister, namespace string, db db.ArgoDB, enf *rbac.Enforcer, cache *servercache.Cache, appResourceTree AppResourceTreeFn, allowedShells []string) *terminalHandler { return &terminalHandler{ appLister: appLister, @@ -50,7 +48,6 @@ func NewHandler(appLister applisters.ApplicationLister, namespace string, enable appResourceTreeFn: appResourceTree, allowedShells: allowedShells, namespace: namespace, - enabledNamespaces: enabledNamespaces, } } @@ -96,26 +93,6 @@ func isValidContainerName(name string) bool { return len(validationErrors) == 0 } -type GetSettingsFunc func() (*settings.ArgoCDSettings, error) - -// WithFeatureFlagMiddleware is an HTTP middleware to verify if the terminal -// feature is enabled before invoking the main handler -func (s *terminalHandler) WithFeatureFlagMiddleware(getSettings GetSettingsFunc) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - argocdSettings, err := getSettings() - if err != nil { - log.Errorf("error executing WithFeatureFlagMiddleware: error getting settings: %s", err) - http.Error(w, "Failed to get settings", http.StatusBadRequest) - return - } - if !argocdSettings.ExecEnabled { - w.WriteHeader(http.StatusNotFound) - return - } - s.ServeHTTP(w, r) - }) -} - func (s *terminalHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { q := r.URL.Query() @@ -130,8 +107,6 @@ func (s *terminalHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - appNamespace := q.Get("appNamespace") - if !isValidPodName(podName) { http.Error(w, "Pod name is not valid", http.StatusBadRequest) return @@ -152,26 +127,11 @@ func (s *terminalHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { http.Error(w, "Namespace name is not valid", http.StatusBadRequest) return } - if !isValidNamespaceName(appNamespace) { - http.Error(w, "App namespace name is not valid", http.StatusBadRequest) - return - } - - ns := appNamespace - if ns == "" { - ns = s.namespace - } - - if !security.IsNamespaceEnabled(ns, s.namespace, s.enabledNamespaces) { - http.Error(w, security.NamespaceNotPermittedError(ns).Error(), http.StatusForbidden) - return - } - shell := q.Get("shell") // No need to validate. Will only be used if it's in the allow-list. ctx := r.Context() - appRBACName := security.AppRBACName(s.namespace, project, appNamespace, app) + appRBACName := fmt.Sprintf("%s/%s", project, app) if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplications, rbacpolicy.ActionGet, appRBACName); err != nil { http.Error(w, err.Error(), http.StatusUnauthorized) return @@ -183,9 +143,9 @@ func (s *terminalHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } fieldLog := log.WithFields(log.Fields{"application": app, "userName": sessionmgr.Username(ctx), "container": container, - "podName": podName, "namespace": namespace, "project": project, "appNamespace": appNamespace}) + "podName": podName, "namespace": namespace, "cluster": project}) - a, err := s.appLister.Applications(ns).Get(app) + a, err := s.appLister.Applications(s.namespace).Get(app) if err != nil { if apierr.IsNotFound(err) { http.Error(w, "App not found", http.StatusNotFound) diff --git a/server/application/terminal_test.go b/server/application/terminal_test.go index 4e7a2652521bc..778dec4138453 100644 --- a/server/application/terminal_test.go +++ b/server/application/terminal_test.go @@ -10,7 +10,6 @@ import ( "github.com/stretchr/testify/assert" appv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" - "github.com/argoproj/argo-cd/v2/util/security" ) func TestPodExists(t *testing.T) { @@ -196,24 +195,24 @@ func TestTerminalHandler_ServeHTTP_empty_params(t *testing.T) { for _, testValue := range testValues { testValueCopy := testValue - t.Run(testKeyCopy+" "+testValueCopy, func(t *testing.T) { + t.Run(testKeyCopy+ " " + testValueCopy, func(t *testing.T) { t.Parallel() handler := terminalHandler{} params := map[string]string{ - "pod": "valid", + "pod": "valid", "container": "valid", - "app": "valid", - "project": "valid", + "app": "valid", + "project": "valid", "namespace": "valid", } params[testKeyCopy] = testValueCopy var paramsArray []string for key, value := range params { - paramsArray = append(paramsArray, key+"="+value) + paramsArray = append(paramsArray, key + "=" + value) } paramsString := strings.Join(paramsArray, "&") - request := httptest.NewRequest("GET", "https://argocd.example.com/api/v1/terminal?"+paramsString, nil) + request := httptest.NewRequest("GET", "https://argocd.example.com/api/v1/terminal?" + paramsString, nil) recorder := httptest.NewRecorder() handler.ServeHTTP(recorder, request) response := recorder.Result() @@ -222,13 +221,3 @@ func TestTerminalHandler_ServeHTTP_empty_params(t *testing.T) { } } } - -func TestTerminalHandler_ServeHTTP_disallowed_namespace(t *testing.T) { - handler := terminalHandler{namespace: "argocd", enabledNamespaces: []string{"allowed"}} - request := httptest.NewRequest("GET", "https://argocd.example.com/api/v1/terminal?pod=valid&container=valid&appName=valid&projectName=valid&namespace=test&appNamespace=disallowed", nil) - recorder := httptest.NewRecorder() - handler.ServeHTTP(recorder, request) - response := recorder.Result() - assert.Equal(t, http.StatusForbidden, response.StatusCode) - assert.Equal(t, security.NamespaceNotPermittedError("disallowed").Error()+"\n", recorder.Body.String()) -} diff --git a/server/applicationset/applicationset.go b/server/applicationset/applicationset.go index 44ae512d5f1c7..d7844e41b23e2 100644 --- a/server/applicationset/applicationset.go +++ b/server/applicationset/applicationset.go @@ -27,6 +27,7 @@ import ( applisters "github.com/argoproj/argo-cd/v2/pkg/client/listers/application/v1alpha1" servercache "github.com/argoproj/argo-cd/v2/server/cache" "github.com/argoproj/argo-cd/v2/server/rbacpolicy" + apputil "github.com/argoproj/argo-cd/v2/util/appset" "github.com/argoproj/argo-cd/v2/util/argo" argoutil "github.com/argoproj/argo-cd/v2/util/argo" "github.com/argoproj/argo-cd/v2/util/db" @@ -88,7 +89,7 @@ func (s *Server) Get(ctx context.Context, q *applicationset.ApplicationSetGetQue if err != nil { return nil, fmt.Errorf("error getting ApplicationSet: %w", err) } - if err = s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionGet, a.RBACName()); err != nil { + if err = s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionGet, apputil.AppSetRBACName(a)); err != nil { return nil, err } @@ -110,7 +111,7 @@ func (s *Server) List(ctx context.Context, q *applicationset.ApplicationSetListQ newItems := make([]v1alpha1.ApplicationSet, 0) for _, a := range appsetList.Items { - if s.enf.Enforce(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionGet, a.RBACName()) { + if s.enf.Enforce(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionGet, apputil.AppSetRBACName(&a)) { newItems = append(newItems, a) } } @@ -181,7 +182,7 @@ func (s *Server) Create(ctx context.Context, q *applicationset.ApplicationSetCre if !q.Upsert { return nil, status.Errorf(codes.InvalidArgument, "existing ApplicationSet spec is different, use upsert flag to force update") } - if err = s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionUpdate, appset.RBACName()); err != nil { + if err = s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionUpdate, apputil.AppSetRBACName(appset)); err != nil { return nil, err } updated, err := s.updateAppSet(existing, appset, ctx, true) @@ -209,11 +210,11 @@ func (s *Server) updateAppSet(appset *v1alpha1.ApplicationSet, newAppset *v1alph 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 // NOTE: the update check was already verified in the caller to this function - if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionCreate, newAppset.RBACName()); err != nil { + if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionCreate, apputil.AppSetRBACName(newAppset)); err != nil { return nil, err } // They also need 'update' privileges in the old project - if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionUpdate, appset.RBACName()); err != nil { + if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionUpdate, apputil.AppSetRBACName(appset)); err != nil { return nil, err } } @@ -253,7 +254,7 @@ func (s *Server) Delete(ctx context.Context, q *applicationset.ApplicationSetDel return nil, fmt.Errorf("error getting ApplicationSets: %w", err) } - if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionDelete, appset.RBACName()); err != nil { + if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionDelete, apputil.AppSetRBACName(appset)); err != nil { return nil, err } @@ -289,7 +290,7 @@ func (s *Server) validateAppSet(ctx context.Context, appset *v1alpha1.Applicatio func (s *Server) checkCreatePermissions(ctx context.Context, appset *v1alpha1.ApplicationSet, projectName string) error { - if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionCreate, appset.RBACName()); err != nil { + if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionCreate, apputil.AppSetRBACName(appset)); err != nil { return err } diff --git a/server/deeplinks/deeplinks.go b/server/deeplinks/deeplinks.go deleted file mode 100644 index 096521ab2bb0d..0000000000000 --- a/server/deeplinks/deeplinks.go +++ /dev/null @@ -1,63 +0,0 @@ -package deeplinks - -import ( - "bytes" - "fmt" - "text/template" - - "github.com/antonmedv/expr" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/utils/pointer" - - "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" - "github.com/argoproj/argo-cd/v2/util/settings" -) - -func EvaluateDeepLinksResponse(obj unstructured.Unstructured, links []settings.DeepLink) (*application.LinksResponse, []string) { - finalLinks := []*application.LinkInfo{} - errors := []string{} - for _, link := range links { - t, err := template.New("deep-link").Parse(link.URL) - if err != nil { - errors = append(errors, fmt.Sprintf("failed to parse link template '%v', error=%v", link.URL, err.Error())) - continue - } - finalURL := bytes.Buffer{} - err = t.Execute(&finalURL, obj.Object) - if err != nil { - errors = append(errors, fmt.Sprintf("failed to evaluate link template '%v' with resource %v, error=%v", link.URL, obj.GetName(), err.Error())) - continue - } - if link.Condition != nil { - out, err := expr.Eval(*link.Condition, obj.Object) - if err != nil { - errors = append(errors, fmt.Sprintf("failed to evaluate link condition '%v' with resource %v, error=%v", *link.Condition, obj.GetName(), err.Error())) - continue - } - switch resOut := out.(type) { - case bool: - if resOut { - finalLinks = append(finalLinks, &application.LinkInfo{ - Title: pointer.String(link.Title), - Url: pointer.String(finalURL.String()), - Description: link.Description, - IconClass: link.IconClass, - }) - } - default: - errors = append(errors, fmt.Sprintf("link condition '%v' evaluated to non-boolean value for resource %v", *link.Condition, obj.GetName())) - continue - } - } else { - finalLinks = append(finalLinks, &application.LinkInfo{ - Title: pointer.String(link.Title), - Url: pointer.String(finalURL.String()), - Description: link.Description, - IconClass: link.IconClass, - }) - } - } - return &application.LinksResponse{ - Items: finalLinks, - }, errors -} diff --git a/server/deeplinks/deeplinks_test.go b/server/deeplinks/deeplinks_test.go deleted file mode 100644 index 9fc703a7e647c..0000000000000 --- a/server/deeplinks/deeplinks_test.go +++ /dev/null @@ -1,101 +0,0 @@ -package deeplinks - -import ( - "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" - "github.com/argoproj/argo-cd/v2/util/settings" - "github.com/argoproj/gitops-engine/pkg/utils/kube" - "github.com/stretchr/testify/assert" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/utils/pointer" - "reflect" - "strings" - "testing" -) - -type deepLinkTC struct { - obj *unstructured.Unstructured - inputLinks []settings.DeepLink - outputLinks []*application.LinkInfo - error []string -} - -func TestDeepLinks(t *testing.T) { - appObj, err := kube.ToUnstructured(&v1alpha1.Application{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test", - Namespace: "test", - }, - Spec: v1alpha1.ApplicationSpec{ - Destination: v1alpha1.ApplicationDestination{ - Server: "test.com", - Namespace: "testns", - }, - }, - }) - assert.NoError(t, err) - testTable := []deepLinkTC{ - { - obj: appObj, - inputLinks: []settings.DeepLink{{ - Title: "link", - URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", - }}, - outputLinks: []*application.LinkInfo{{ - Title: pointer.String("link"), - Url: pointer.String("http://example.com/test&testns"), - }}, - error: []string{}, - }, - { - obj: appObj, - inputLinks: []settings.DeepLink{ - { - Title: "link", - URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", - Condition: pointer.String(`metadata.name matches "test"`), - }, - { - Title: "link1", - URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", - Condition: pointer.String(`metadata.name matches "test1"`), - }, - { - Title: "link2", - URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", - Condition: pointer.String(`metadata.test matches "test"`), - }}, - outputLinks: []*application.LinkInfo{{ - Title: pointer.String("link"), - Url: pointer.String("http://example.com/test&testns"), - }}, - error: []string{"failed to evaluate link condition 'metadata.test matches \"test\"' with resource test, error=interface conversion: interface {} is nil, not string (1:15)\n | metadata.test matches \"test\"\n | ..............^"}, - }, - { - obj: appObj, - inputLinks: []settings.DeepLink{ - { - Title: "link", - URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", - Condition: pointer.String(`metadata.name matches "test"`), - }, - { - Title: "link1", - URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", - Condition: pointer.String(`1 + 1`), - }}, - outputLinks: []*application.LinkInfo{{ - Title: pointer.String("link"), - Url: pointer.String("http://example.com/test&testns"), - }}, - error: []string{"link condition '1 + 1' evaluated to non-boolean value for resource test"}, - }, - } - - for _, tc := range testTable { - output, err := EvaluateDeepLinksResponse(*tc.obj, tc.inputLinks) - assert.Equal(t, tc.error, err, strings.Join(err, ",")) - assert.Equal(t, reflect.DeepEqual(output.Items, tc.outputLinks), true) - } -} diff --git a/server/extension/extension.go b/server/extension/extension.go deleted file mode 100644 index 0865026e5444c..0000000000000 --- a/server/extension/extension.go +++ /dev/null @@ -1,357 +0,0 @@ -package extension - -import ( - "context" - "encoding/json" - "fmt" - "net" - "net/http" - "net/http/httputil" - "net/url" - "regexp" - "strings" - "time" - - applicationpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" - v1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" - "github.com/argoproj/argo-cd/v2/util/settings" - "github.com/ghodss/yaml" - "github.com/gorilla/mux" - log "github.com/sirupsen/logrus" - "k8s.io/utils/pointer" -) - -const ( - URLPrefix = "/extensions" - HeaderArgoCDApplicationName = "Argocd-Application-Name" - DefaultConnectionTimeout = 2 * time.Second - DefaultKeepAlive = 15 * time.Second - DefaultIdleConnectionTimeout = 60 * time.Second - DefaultMaxIdleConnections = 30 -) - -// ExtensionConfigs defines the configurations for all extensions -// retrieved from Argo CD configmap (argocd-cm). -type ExtensionConfigs struct { - Extensions []ExtensionConfig `json:"extensions"` -} - -// ExtensionConfig defines the configuration for one extension. -type ExtensionConfig struct { - // Name defines the endpoint that will be used to register - // the extension route. Mandatory field. - Name string `json:"name"` - Backend BackendConfig `json:"backend"` -} - -// BackendConfig defines the backend service configurations that will -// be used by an specific extension. An extension can have multiple services -// associated. This is necessary when Argo CD is managing applications in -// external clusters. In this case, each cluster may have its own backend -// service. -type BackendConfig struct { - ProxyConfig - Services []ServiceConfig `json:"services"` -} - -// ProxyConfig allows configuring connection behaviour between Argo CD -// API Server and the backend service. -type ProxyConfig struct { - // ConnectionTimeout is the maximum amount of time a dial to - // the extension server will wait for a connect to complete. - // Default: 2 seconds - ConnectionTimeout time.Duration `json:"connectionTimeout"` - - // KeepAlive specifies the interval between keep-alive probes - // for an active network connection between the API server and - // the extension server. - // Default: 15 seconds - KeepAlive time.Duration `json:"keepAlive"` - - // IdleConnectionTimeout is the maximum amount of time an idle - // (keep-alive) connection between the API server and the extension - // server will remain idle before closing itself. - // Default: 60 seconds - IdleConnectionTimeout time.Duration `json:"idleConnectionTimeout"` - - // MaxIdleConnections controls the maximum number of idle (keep-alive) - // connections between the API server and the extension server. - // Default: 30 - MaxIdleConnections int `json:"maxIdleConnections"` -} - -// ServiceConfig provides the configuration for a backend service. -type ServiceConfig struct { - // URL is the address where the extension backend must be available. - // Mandatory field. - URL string `json:"url"` - - // Cluster if provided, will have to match the application - // destination name to have requests properly forwarded to this - // service URL. - Cluster string `json:"cluster"` -} - -// SettingsGetter defines the contract to retrieve Argo CD Settings. -type SettingsGetter interface { - Get() (*settings.ArgoCDSettings, error) -} - -// DefaultSettingsGetter is the real settings getter implementation. -type DefaultSettingsGetter struct { - settingsMgr *settings.SettingsManager -} - -// NewDefaultSettingsGetter returns a new default settings getter. -func NewDefaultSettingsGetter(mgr *settings.SettingsManager) *DefaultSettingsGetter { - return &DefaultSettingsGetter{ - settingsMgr: mgr, - } -} - -// Get will retrieve the Argo CD settings. -func (s *DefaultSettingsGetter) Get() (*settings.ArgoCDSettings, error) { - return s.settingsMgr.GetSettings() -} - -// ApplicationGetter defines the contract to retrieve the application resource. -type ApplicationGetter interface { - Get(ns, name string) (*v1alpha1.Application, error) -} - -// DefaultApplicationGetter is the real application getter implementation. -type DefaultApplicationGetter struct { - svc applicationpkg.ApplicationServiceServer -} - -// NewDefaultApplicationGetter returns the default application getter. -func NewDefaultApplicationGetter(appSvc applicationpkg.ApplicationServiceServer) *DefaultApplicationGetter { - return &DefaultApplicationGetter{ - svc: appSvc, - } -} - -// Get will retrieve the application resorce for the given namespace and name. -func (a *DefaultApplicationGetter) Get(ns, name string) (*v1alpha1.Application, error) { - query := &applicationpkg.ApplicationQuery{ - Name: pointer.String(name), - AppNamespace: pointer.String(ns), - } - return a.svc.Get(context.Background(), query) -} - -// Manager is the object that will be responsible for registering -// and handling proxy extensions. -type Manager struct { - log *log.Entry - settings SettingsGetter - application ApplicationGetter -} - -// NewManager will initialize a new manager. -func NewManager(sg SettingsGetter, ag ApplicationGetter, log *log.Entry) *Manager { - return &Manager{ - log: log, - settings: sg, - application: ag, - } -} - -func parseAndValidateConfig(config string) (*ExtensionConfigs, error) { - configs := ExtensionConfigs{} - err := yaml.Unmarshal([]byte(config), &configs) - if err != nil { - return nil, fmt.Errorf("invalid yaml: %s", err) - } - err = validateConfigs(&configs) - if err != nil { - return nil, fmt.Errorf("validation error: %s", err) - } - return &configs, nil -} - -func validateConfigs(configs *ExtensionConfigs) error { - nameSafeRegex := regexp.MustCompile(`^[A-Za-z0-9-_]+$`) - for _, ext := range configs.Extensions { - if ext.Name == "" { - return fmt.Errorf("extensions.name must be configured") - } - if !nameSafeRegex.MatchString(ext.Name) { - return fmt.Errorf("invalid extensions.name: only alphanumeric characters, hyphens, and underscores are allowed") - } - svcTotal := len(ext.Backend.Services) - for _, svc := range ext.Backend.Services { - if svc.URL == "" { - return fmt.Errorf("extensions.backend.services.url must be configured") - } - if svcTotal > 1 && svc.Cluster == "" { - return fmt.Errorf("extensions.backend.services.cluster must be configured when defining more than one service per extension") - } - } - } - return nil -} - -// NewProxy will instantiate a new reverse proxy based on the provided -// targetURL and config. -func NewProxy(targetURL string, config ProxyConfig) (*httputil.ReverseProxy, error) { - url, err := url.Parse(targetURL) - if err != nil { - return nil, fmt.Errorf("failed to parse proxy URL: %s", err) - } - proxy := httputil.NewSingleHostReverseProxy(url) - proxy.Transport = newTransport(config) - return proxy, nil -} - -// newTransport will build a new transport to be used in the proxy -// applying default values if not defined in the given config. -func newTransport(config ProxyConfig) *http.Transport { - applyProxyConfigDefaults(&config) - return &http.Transport{ - DialContext: (&net.Dialer{ - Timeout: config.ConnectionTimeout, - KeepAlive: config.KeepAlive, - }).DialContext, - MaxIdleConns: config.MaxIdleConnections, - IdleConnTimeout: config.IdleConnectionTimeout, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - } -} - -func applyProxyConfigDefaults(c *ProxyConfig) { - if c.ConnectionTimeout == 0 { - c.ConnectionTimeout = DefaultConnectionTimeout - } - if c.KeepAlive == 0 { - c.KeepAlive = DefaultKeepAlive - } - if c.IdleConnectionTimeout == 0 { - c.IdleConnectionTimeout = DefaultIdleConnectionTimeout - } - if c.MaxIdleConnections == 0 { - c.MaxIdleConnections = DefaultMaxIdleConnections - } -} - -// RegisterHandlers will retrieve all configured extensions -// and register the respective http handlers in the given -// router. -func (m *Manager) RegisterHandlers(r *mux.Router) error { - m.log.Info("Registering extension handlers...") - config, err := m.settings.Get() - if err != nil { - return fmt.Errorf("error getting settings: %s", err) - } - - if config.ExtensionConfig == "" { - return fmt.Errorf("No extensions configurations found") - } - - extConfigs, err := parseAndValidateConfig(config.ExtensionConfig) - if err != nil { - return fmt.Errorf("error parsing extension config: %s", err) - } - return m.registerExtensions(r, extConfigs) -} - -// registerExtensions will iterate over the given extConfigs and register -// http handlers for every extension. It also registers a list extensions -// handler under the "/extensions/" endpoint. -func (m *Manager) registerExtensions(r *mux.Router, extConfigs *ExtensionConfigs) error { - extRouter := r.PathPrefix(fmt.Sprintf("%s/", URLPrefix)).Subrouter() - for _, ext := range extConfigs.Extensions { - proxyByCluster := make(map[string]*httputil.ReverseProxy) - for _, service := range ext.Backend.Services { - proxy, err := NewProxy(service.URL, ext.Backend.ProxyConfig) - if err != nil { - return fmt.Errorf("error creating proxy: %s", err) - } - proxyByCluster[service.Cluster] = proxy - } - m.log.Infof("Registering handler for %s/%s...", URLPrefix, ext.Name) - extRouter.PathPrefix(fmt.Sprintf("/%s/", ext.Name)). - HandlerFunc(m.CallExtension(ext.Name, proxyByCluster)) - } - return nil -} - -// CallExtension returns a handler func responsible for forwarding requests to the -// extension service. The request will be sanitized by removing sensitive headers. -func (m *Manager) CallExtension(extName string, proxyByCluster map[string]*httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) { - return func(w http.ResponseWriter, r *http.Request) { - sanitizeRequest(r, extName) - if len(proxyByCluster) == 1 { - for _, proxy := range proxyByCluster { - proxy.ServeHTTP(w, r) - return - } - } - appHeader := r.Header.Get(HeaderArgoCDApplicationName) - if appHeader == "" { - msg := fmt.Sprintf("Header %q must be provided", HeaderArgoCDApplicationName) - m.writeErrorResponse(http.StatusBadRequest, msg, w) - return - } - appNamespace, appName, err := getAppName(appHeader) - if err != nil { - msg := fmt.Sprintf("Error getting application name: %s", err) - m.writeErrorResponse(http.StatusBadRequest, msg, w) - return - } - app, err := m.application.Get(appNamespace, appName) - if err != nil { - msg := fmt.Sprintf("Error getting application: %s", err) - m.writeErrorResponse(http.StatusBadRequest, msg, w) - return - } - if app == nil { - msg := fmt.Sprintf("Invalid Application: %s", appHeader) - m.writeErrorResponse(http.StatusBadRequest, msg, w) - return - } - clusterName := app.Spec.Destination.Name - if clusterName == "" { - clusterName = app.Spec.Destination.Server - } - - proxy, ok := proxyByCluster[clusterName] - if !ok { - msg := fmt.Sprintf("No extension configured for cluster %q", clusterName) - m.writeErrorResponse(http.StatusBadRequest, msg, w) - return - } - proxy.ServeHTTP(w, r) - } -} - -func getAppName(appHeader string) (string, string, error) { - parts := strings.Split(appHeader, "/") - if len(parts) != 2 { - return "", "", fmt.Errorf("invalid header value %q: expected format: /", appHeader) - } - return parts[0], parts[1], nil -} - -func sanitizeRequest(r *http.Request, extName string) { - r.URL.Path = strings.TrimPrefix(r.URL.String(), fmt.Sprintf("%s/%s", URLPrefix, extName)) -} - -func (m *Manager) writeErrorResponse(status int, message string, w http.ResponseWriter) { - w.WriteHeader(status) - w.Header().Set("Content-Type", "application/json") - resp := make(map[string]string) - resp["status"] = http.StatusText(status) - resp["message"] = message - jsonResp, err := json.Marshal(resp) - if err != nil { - m.log.Errorf("Error marshaling response for extension: %s", err) - return - } - _, err = w.Write(jsonResp) - if err != nil { - m.log.Errorf("Error writing response for extension: %s", err) - return - } -} diff --git a/server/extension/extension_test.go b/server/extension/extension_test.go deleted file mode 100644 index a6fa7b5d6cf8f..0000000000000 --- a/server/extension/extension_test.go +++ /dev/null @@ -1,342 +0,0 @@ -package extension_test - -import ( - "context" - "fmt" - "io" - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/gorilla/mux" - "github.com/sirupsen/logrus/hooks/test" - "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" - "github.com/argoproj/argo-cd/v2/server/extension" - "github.com/argoproj/argo-cd/v2/server/extension/mocks" - "github.com/argoproj/argo-cd/v2/util/settings" -) - -func TestRegisterHandlers(t *testing.T) { - type fixture struct { - settingsGetterMock *mocks.SettingsGetter - manager *extension.Manager - } - - setup := func() *fixture { - settMock := &mocks.SettingsGetter{} - - logger, _ := test.NewNullLogger() - logEntry := logger.WithContext(context.Background()) - m := extension.NewManager(settMock, nil, logEntry) - - return &fixture{ - settingsGetterMock: settMock, - manager: m, - } - } - t.Run("will register handlers successfully", func(t *testing.T) { - // given - f := setup() - router := mux.NewRouter() - settings := &settings.ArgoCDSettings{ - ExtensionConfig: getExtensionConfigString(), - } - f.settingsGetterMock.On("Get", mock.Anything).Return(settings, nil) - expectedRegexRoutes := []string{ - "^/extensions/", - "^/extensions/external-backend/", - "^/extensions/some-backend/", - "^/extensions/$"} - - // when - err := f.manager.RegisterHandlers(router) - - // then - require.NoError(t, err) - walkFn := func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error { - pathRegex, err := route.GetPathRegexp() - require.NoError(t, err) - assert.Contains(t, expectedRegexRoutes, pathRegex) - return nil - } - err = router.Walk(walkFn) - assert.NoError(t, err) - }) - t.Run("will return error if extension config is invalid", func(t *testing.T) { - // given - type testCase struct { - name string - configYaml string - } - cases := []testCase{ - { - name: "no config", - configYaml: "", - }, - { - name: "no name", - configYaml: getExtensionConfigNoName(), - }, - { - name: "no URL", - configYaml: getExtensionConfigNoURL(), - }, - { - name: "invalid name", - configYaml: getExtensionConfigInvalidName(), - }, - } - - // when - for _, tc := range cases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - // given - f := setup() - router := mux.NewRouter() - settings := &settings.ArgoCDSettings{ - ExtensionConfig: tc.configYaml, - } - f.settingsGetterMock.On("Get", mock.Anything).Return(settings, nil) - - // when - err := f.manager.RegisterHandlers(router) - - // then - assert.Error(t, err) - }) - } - }) -} - -func TestExtensionsHandlers(t *testing.T) { - type fixture struct { - router *mux.Router - appGetterMock *mocks.ApplicationGetter - settingsGetterMock *mocks.SettingsGetter - manager *extension.Manager - } - - setup := func() *fixture { - appMock := &mocks.ApplicationGetter{} - settMock := &mocks.SettingsGetter{} - - logger, _ := test.NewNullLogger() - logEntry := logger.WithContext(context.Background()) - m := extension.NewManager(settMock, appMock, logEntry) - - router := mux.NewRouter() - - return &fixture{ - router: router, - appGetterMock: appMock, - settingsGetterMock: settMock, - manager: m, - } - } - - withExtensionConfig := func(configYaml string, f *fixture) { - settings := &settings.ArgoCDSettings{ - ExtensionConfig: configYaml, - } - f.settingsGetterMock.On("Get", mock.Anything).Return(settings, nil) - } - - startTestServer := func(t *testing.T, f *fixture) *httptest.Server { - err := f.manager.RegisterHandlers(f.router) - if err != nil { - t.Fatalf("error starting test server: %s", err) - } - return httptest.NewServer(f.router) - } - - startBackendTestSrv := func(response string) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, response) - })) - - } - t.Run("proxy will return 404 if no extension endpoint is registered", func(t *testing.T) { - // given - f := setup() - withExtensionConfig(getExtensionConfigString(), f) - ts := startTestServer(t, f) - defer ts.Close() - nonRegisteredEndpoint := "non-registered" - - // when - resp, err := http.Get(fmt.Sprintf("%s/extensions/%s/", ts.URL, nonRegisteredEndpoint)) - - // then - require.NoError(t, err) - require.NotNil(t, resp) - assert.Equal(t, http.StatusNotFound, resp.StatusCode) - }) - t.Run("will call extension backend successfully", func(t *testing.T) { - // given - f := setup() - backendResponse := "some data" - backendEndpoint := "some-backend" - backendSrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, backendResponse) - })) - defer backendSrv.Close() - withExtensionConfig(getExtensionConfig(backendEndpoint, backendSrv.URL), f) - ts := startTestServer(t, f) - defer ts.Close() - - // when - resp, err := http.Get(fmt.Sprintf("%s/extensions/%s/", ts.URL, backendEndpoint)) - - // then - require.NoError(t, err) - require.NotNil(t, resp) - require.Equal(t, http.StatusOK, resp.StatusCode) - body, err := io.ReadAll(resp.Body) - require.NoError(t, err) - actual := strings.TrimSuffix(string(body), "\n") - assert.Equal(t, backendResponse, actual) - }) - t.Run("will route requests with 2 backends for the same extension successfully", func(t *testing.T) { - // given - f := setup() - extName := "some-extension" - - response1 := "response backend 1" - cluster1 := "cluster1" - beSrv1 := startBackendTestSrv(response1) - defer beSrv1.Close() - - response2 := "response backend 2" - cluster2 := "cluster2" - beSrv2 := startBackendTestSrv(response2) - defer beSrv2.Close() - - withExtensionConfig(getExtensionConfigWith2Backends(extName, beSrv1.URL, cluster1, beSrv2.URL, cluster2), f) - ts := startTestServer(t, f) - defer ts.Close() - - app1 := &v1alpha1.Application{ - Spec: v1alpha1.ApplicationSpec{ - Destination: v1alpha1.ApplicationDestination{ - Server: beSrv1.URL, - Name: cluster1, - }, - }, - } - f.appGetterMock.On("Get", "ns1", "app1").Return(app1, nil) - - app2 := &v1alpha1.Application{ - Spec: v1alpha1.ApplicationSpec{ - Destination: v1alpha1.ApplicationDestination{ - Server: beSrv2.URL, - Name: cluster2, - }, - }, - } - f.appGetterMock.On("Get", "ns2", "app2").Return(app2, nil) - - url := fmt.Sprintf("%s/extensions/%s/", ts.URL, extName) - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - t.Fatalf("error creating request: %s", err) - } - req1 := req.Clone(context.Background()) - req1.Header.Add(extension.HeaderArgoCDApplicationName, "ns1/app1") - req2 := req.Clone(context.Background()) - req2.Header.Add(extension.HeaderArgoCDApplicationName, "ns2/app2") - - // when - resp1, err := http.DefaultClient.Do(req1) - require.NoError(t, err) - resp2, err := http.DefaultClient.Do(req2) - require.NoError(t, err) - - // then - require.NotNil(t, resp1) - require.Equal(t, http.StatusOK, resp1.StatusCode) - body, err := io.ReadAll(resp1.Body) - require.NoError(t, err) - actual := strings.TrimSuffix(string(body), "\n") - assert.Equal(t, response1, actual) - - require.NotNil(t, resp2) - require.Equal(t, http.StatusOK, resp2.StatusCode) - body, err = io.ReadAll(resp2.Body) - require.NoError(t, err) - actual = strings.TrimSuffix(string(body), "\n") - assert.Equal(t, response2, actual) - }) -} - -func getExtensionConfig(name, url string) string { - cfg := ` -extensions: -- name: %s - backend: - services: - - url: %s -` - return fmt.Sprintf(cfg, name, url) -} - -func getExtensionConfigWith2Backends(name, url1, clus1, url2, clus2 string) string { - cfg := ` -extensions: -- name: %s - backend: - services: - - url: %s - cluster: %s - - url: %s - cluster: %s -` - return fmt.Sprintf(cfg, name, url1, clus1, url2, clus2) -} - -func getExtensionConfigString() string { - return ` -extensions: -- name: external-backend - backend: - services: - - url: https://httpbin.org -- name: some-backend - backend: - services: - - url: http://localhost:7777 -` -} - -func getExtensionConfigNoName() string { - return ` -extensions: -- backend: - services: - - url: https://httpbin.org -` -} -func getExtensionConfigInvalidName() string { - return ` -extensions: -- name: invalid/name - backend: - services: - - url: https://httpbin.org -` -} - -func getExtensionConfigNoURL() string { - return ` -extensions: -- name: some-backend - backend: - services: - - cluster: some-cluster -` -} diff --git a/server/extension/mocks/ApplicationGetter.go b/server/extension/mocks/ApplicationGetter.go deleted file mode 100644 index bad203f47ebfe..0000000000000 --- a/server/extension/mocks/ApplicationGetter.go +++ /dev/null @@ -1,51 +0,0 @@ -// Code generated by mockery v2.15.0. DO NOT EDIT. - -package mocks - -import ( - v1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" - mock "github.com/stretchr/testify/mock" -) - -// ApplicationGetter is an autogenerated mock type for the ApplicationGetter type -type ApplicationGetter struct { - mock.Mock -} - -// Get provides a mock function with given fields: ns, name -func (_m *ApplicationGetter) Get(ns string, name string) (*v1alpha1.Application, error) { - ret := _m.Called(ns, name) - - var r0 *v1alpha1.Application - if rf, ok := ret.Get(0).(func(string, string) *v1alpha1.Application); ok { - r0 = rf(ns, name) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1alpha1.Application) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(string, string) error); ok { - r1 = rf(ns, name) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type mockConstructorTestingTNewApplicationGetter interface { - mock.TestingT - Cleanup(func()) -} - -// NewApplicationGetter creates a new instance of ApplicationGetter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewApplicationGetter(t mockConstructorTestingTNewApplicationGetter) *ApplicationGetter { - mock := &ApplicationGetter{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/server/extension/mocks/SettingsGetter.go b/server/extension/mocks/SettingsGetter.go deleted file mode 100644 index 303de9c5eeebf..0000000000000 --- a/server/extension/mocks/SettingsGetter.go +++ /dev/null @@ -1,51 +0,0 @@ -// Code generated by mockery v2.15.0. DO NOT EDIT. - -package mocks - -import ( - settings "github.com/argoproj/argo-cd/v2/util/settings" - mock "github.com/stretchr/testify/mock" -) - -// SettingsGetter is an autogenerated mock type for the SettingsGetter type -type SettingsGetter struct { - mock.Mock -} - -// Get provides a mock function with given fields: -func (_m *SettingsGetter) Get() (*settings.ArgoCDSettings, error) { - ret := _m.Called() - - var r0 *settings.ArgoCDSettings - if rf, ok := ret.Get(0).(func() *settings.ArgoCDSettings); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*settings.ArgoCDSettings) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type mockConstructorTestingTNewSettingsGetter interface { - mock.TestingT - Cleanup(func()) -} - -// NewSettingsGetter creates a new instance of SettingsGetter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewSettingsGetter(t mockConstructorTestingTNewSettingsGetter) *SettingsGetter { - mock := &SettingsGetter{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/server/project/project.go b/server/project/project.go index cdb2214c1607f..64790e20fa37e 100644 --- a/server/project/project.go +++ b/server/project/project.go @@ -6,7 +6,8 @@ import ( "reflect" "strings" - "github.com/argoproj/gitops-engine/pkg/utils/kube" + "github.com/argoproj/argo-cd/v2/util/db" + "github.com/argoproj/pkg/sync" "github.com/golang-jwt/jwt/v4" "github.com/google/uuid" @@ -21,15 +22,12 @@ import ( "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/retry" - "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" "github.com/argoproj/argo-cd/v2/pkg/apiclient/project" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned" listersv1alpha1 "github.com/argoproj/argo-cd/v2/pkg/client/listers/application/v1alpha1" - "github.com/argoproj/argo-cd/v2/server/deeplinks" "github.com/argoproj/argo-cd/v2/server/rbacpolicy" "github.com/argoproj/argo-cd/v2/util/argo" - "github.com/argoproj/argo-cd/v2/util/db" jwtutil "github.com/argoproj/argo-cd/v2/util/jwt" "github.com/argoproj/argo-cd/v2/util/rbac" "github.com/argoproj/argo-cd/v2/util/session" @@ -94,7 +92,7 @@ func (s *Server) createToken(ctx context.Context, q *project.ProjectTokenCreateR } err = validateProject(prj) if err != nil { - return nil, fmt.Errorf("error validating project: %w", err) + return nil, err } s.projectLock.Lock(q.Project) @@ -157,39 +155,6 @@ func (s *Server) createToken(ctx context.Context, q *project.ProjectTokenCreateR } -func (s *Server) ListLinks(ctx context.Context, q *project.ListProjectLinksRequest) (*application.LinksResponse, error) { - projName := q.GetName() - - if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceProjects, rbacpolicy.ActionGet, projName); err != nil { - log.WithFields(map[string]interface{}{ - "project": projName, - }).Warnf("unauthorized access to project, error=%v", err.Error()) - return nil, fmt.Errorf("unauthorized access to project %v", projName) - } - - proj, err := s.appclientset.ArgoprojV1alpha1().AppProjects(s.ns).Get(ctx, projName, metav1.GetOptions{}) - if err != nil { - return nil, err - } - - obj, err := kube.ToUnstructured(proj) - if err != nil { - return nil, fmt.Errorf("error getting application: %w", err) - } - - deepLinks, err := s.settingsMgr.GetDeepLinks(settings.ProjectDeepLinks) - if err != nil { - return nil, fmt.Errorf("failed to read application deep links from configmap: %w", err) - } - - finalList, errorList := deeplinks.EvaluateDeepLinksResponse(*obj, deepLinks) - if len(errorList) > 0 { - log.Errorf("errorList while evaluating project deep links, %v", strings.Join(errorList, ", ")) - } - - return finalList, nil -} - // DeleteToken deletes a token in a project func (s *Server) DeleteToken(ctx context.Context, q *project.ProjectTokenDeleteRequest) (*project.EmptyResponse, error) { var resp *project.EmptyResponse @@ -208,7 +173,7 @@ func (s *Server) deleteToken(ctx context.Context, q *project.ProjectTokenDeleteR } err = validateProject(prj) if err != nil { - return nil, fmt.Errorf("error validating project: %w", err) + return nil, err } s.projectLock.Lock(q.Project) @@ -249,7 +214,7 @@ func (s *Server) Create(ctx context.Context, q *project.ProjectCreateRequest) (* q.Project.NormalizePolicies() err := validateProject(q.Project) if err != nil { - return nil, fmt.Errorf("error validating project: %w", err) + return nil, err } res, err := s.appclientset.ArgoprojV1alpha1().AppProjects(s.ns).Create(ctx, q.Project, metav1.CreateOptions{}) if apierr.IsAlreadyExists(err) { @@ -397,7 +362,7 @@ func (s *Server) Update(ctx context.Context, q *project.ProjectUpdateRequest) (* } for _, a := range argo.FilterByProjects(appsList.Items, []string{q.Project.Name}) { - if oldProj.IsSourcePermitted(a.Spec.GetSource()) { + if oldProj.IsSourcePermitted(a.Spec.Source) { srcValidatedApps = append(srcValidatedApps, a) } @@ -415,7 +380,7 @@ func (s *Server) Update(ctx context.Context, q *project.ProjectUpdateRequest) (* invalidDstCount := 0 for _, a := range srcValidatedApps { - if !q.Project.IsSourcePermitted(a.Spec.GetSource()) { + if !q.Project.IsSourcePermitted(a.Spec.Source) { invalidSrcCount++ } } @@ -538,11 +503,11 @@ func (s *Server) NormalizeProjs() error { if proj.NormalizeJWTTokens() { _, err := s.appclientset.ArgoprojV1alpha1().AppProjects(s.ns).Update(context.Background(), &proj, metav1.UpdateOptions{}) if err == nil { - log.Infof("Successfully normalized project %s.", proj.Name) + log.Info(fmt.Sprintf("Successfully normalized project %s.", proj.Name)) break } if !apierr.IsConflict(err) { - log.Warnf("Failed normalize project %s", proj.Name) + log.Warn(fmt.Sprintf("Failed normalize project %s", proj.Name)) break } projGet, err := s.appclientset.ArgoprojV1alpha1().AppProjects(s.ns).Get(context.Background(), proj.Name, metav1.GetOptions{}) diff --git a/server/project/project.proto b/server/project/project.proto index 5cf4bc977a52b..7d175000fbc21 100644 --- a/server/project/project.proto +++ b/server/project/project.proto @@ -9,7 +9,7 @@ package project; import "google/api/annotations.proto"; import "k8s.io/api/core/v1/generated.proto"; import "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1/generated.proto"; -import "github.com/argoproj/argo-cd/v2/server/application/application.proto"; + // ProjectCreateRequest defines project creation parameters. message ProjectCreateRequest { @@ -70,10 +70,6 @@ message DetailedProjectsResponse { repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Cluster clusters = 4; } -message ListProjectLinksRequest { - string name = 1; -} - // ProjectService service ProjectService { @@ -140,10 +136,4 @@ service ProjectService { rpc GetSyncWindowsState(SyncWindowsQuery) returns (SyncWindowsResponse) { option (google.api.http).get = "/api/v1/projects/{name}/syncwindows"; } - - // ListLinks returns all deep links for the particular project - rpc ListLinks(ListProjectLinksRequest) returns (application.LinksResponse) { - option (google.api.http).get = "/api/v1/projects/{name}/links"; - } - } \ No newline at end of file diff --git a/server/project/project_test.go b/server/project/project_test.go index caf0df9f3ebac..00beec73c599b 100644 --- a/server/project/project_test.go +++ b/server/project/project_test.go @@ -69,7 +69,7 @@ func TestProjectServer(t *testing.T) { } existingApp := v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{Name: "test", Namespace: "default"}, - Spec: v1alpha1.ApplicationSpec{Source: &v1alpha1.ApplicationSource{}, Project: "test", Destination: v1alpha1.ApplicationDestination{Namespace: "ns3", Server: "https://server3"}}, + Spec: v1alpha1.ApplicationSpec{Project: "test", Destination: v1alpha1.ApplicationDestination{Namespace: "ns3", Server: "https://server3"}}, } policyTemplate := "p, proj:%s:%s, applications, %s, %s/%s, %s" @@ -166,7 +166,7 @@ func TestProjectServer(t *testing.T) { t.Run("TestRemoveDestinationSuccessful", func(t *testing.T) { existingApp := v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{Name: "test", Namespace: "default"}, - Spec: v1alpha1.ApplicationSpec{Source: &v1alpha1.ApplicationSource{}, Project: "test", Destination: v1alpha1.ApplicationDestination{Namespace: "ns3", Server: "https://server3"}}, + Spec: v1alpha1.ApplicationSpec{Project: "test", Destination: v1alpha1.ApplicationDestination{Namespace: "ns3", Server: "https://server3"}}, } argoDB := db.NewDB("default", settingsMgr, kubeclientset) @@ -183,7 +183,7 @@ func TestProjectServer(t *testing.T) { t.Run("TestRemoveDestinationUsedByApp", func(t *testing.T) { existingApp := v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{Name: "test", Namespace: "default"}, - Spec: v1alpha1.ApplicationSpec{Source: &v1alpha1.ApplicationSource{}, Project: "test", Destination: v1alpha1.ApplicationDestination{Namespace: "ns1", Server: "https://server1"}}, + Spec: v1alpha1.ApplicationSpec{Project: "test", Destination: v1alpha1.ApplicationDestination{Namespace: "ns1", Server: "https://server1"}}, } argoDB := db.NewDB("default", settingsMgr, kubeclientset) @@ -202,7 +202,7 @@ func TestProjectServer(t *testing.T) { t.Run("TestRemoveSourceSuccessful", func(t *testing.T) { existingApp := v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{Name: "test", Namespace: "default"}, - Spec: v1alpha1.ApplicationSpec{Source: &v1alpha1.ApplicationSource{}, Project: "test"}, + Spec: v1alpha1.ApplicationSpec{Project: "test"}, } argoDB := db.NewDB("default", settingsMgr, kubeclientset) @@ -219,7 +219,7 @@ func TestProjectServer(t *testing.T) { t.Run("TestRemoveSourceUsedByApp", func(t *testing.T) { existingApp := v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{Name: "test", Namespace: "default"}, - Spec: v1alpha1.ApplicationSpec{Project: "test", Source: &v1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argo-cd.git"}}, + Spec: v1alpha1.ApplicationSpec{Project: "test", Source: v1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argo-cd.git"}}, } argoDB := db.NewDB("default", settingsMgr, kubeclientset) @@ -240,7 +240,7 @@ func TestProjectServer(t *testing.T) { proj.Spec.SourceRepos = []string{"https://github.com/argoproj/argo-cd.git", "https://github.com/argoproj/*"} existingApp := v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{Name: "test", Namespace: "default"}, - Spec: v1alpha1.ApplicationSpec{Project: "test", Source: &v1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argo-cd.git"}}, + Spec: v1alpha1.ApplicationSpec{Project: "test", Source: v1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argo-cd.git"}}, } argoDB := db.NewDB("default", settingsMgr, kubeclientset) projectServer := NewServer("default", fake.NewSimpleClientset(), apps.NewSimpleClientset(proj, &existingApp), enforcer, sync.NewKeyLock(), nil, nil, projInformer, settingsMgr, argoDB) @@ -262,7 +262,7 @@ func TestProjectServer(t *testing.T) { } existingApp := v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{Name: "test", Namespace: "default"}, - Spec: v1alpha1.ApplicationSpec{Source: &v1alpha1.ApplicationSource{}, Project: "test", Destination: v1alpha1.ApplicationDestination{ + Spec: v1alpha1.ApplicationSpec{Project: "test", Destination: v1alpha1.ApplicationDestination{ Server: "https://server1", Namespace: "org1-team1", }}, diff --git a/server/repository/repository.go b/server/repository/repository.go index f623c11b2c023..f2738ed05e21d 100644 --- a/server/repository/repository.go +++ b/server/repository/repository.go @@ -5,7 +5,6 @@ import ( "reflect" "context" - "github.com/argoproj/gitops-engine/pkg/utils/kube" "github.com/argoproj/gitops-engine/pkg/utils/text" log "github.com/sirupsen/logrus" @@ -13,7 +12,6 @@ import ( "google.golang.org/grpc/status" apierr "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/cache" "github.com/argoproj/argo-cd/v2/common" repositorypkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/repository" @@ -38,9 +36,8 @@ type Server struct { enf *rbac.Enforcer cache *servercache.Cache appLister applisters.ApplicationLister - projLister cache.SharedIndexInformer + projLister applisters.AppProjectNamespaceLister settings *settings.SettingsManager - namespace string } // NewServer returns a new instance of the Repository service @@ -50,8 +47,7 @@ func NewServer( enf *rbac.Enforcer, cache *servercache.Cache, appLister applisters.ApplicationLister, - projLister cache.SharedIndexInformer, - namespace string, + projLister applisters.AppProjectNamespaceLister, settings *settings.SettingsManager, ) *Server { return &Server{ @@ -61,7 +57,6 @@ func NewServer( cache: cache, appLister: appLister, projLister: projLister, - namespace: namespace, settings: settings, } } @@ -252,7 +247,7 @@ func (s *Server) ListApps(ctx context.Context, q *repositorypkg.RepoAppsQuery) ( return nil, errPermissionDenied } // Also ensure the repo is actually allowed in the project in question - if err := s.isRepoPermittedInProject(ctx, q.Repo, q.AppProject); err != nil { + if err := s.isRepoPermittedInProject(q.Repo, q.AppProject); err != nil { return nil, err } @@ -316,7 +311,7 @@ func (s *Server) GetAppDetails(ctx context.Context, q *repositorypkg.RepoAppDeta } } // Ensure the repo is actually allowed in the project in question - if err := s.isRepoPermittedInProject(ctx, q.Source.RepoURL, q.AppProject); err != nil { + if err := s.isRepoPermittedInProject(q.Source.RepoURL, q.AppProject); err != nil { return nil, err } @@ -510,7 +505,6 @@ func (s *Server) ValidateAccess(ctx context.Context, q *repositorypkg.RepoAccess GithubAppInstallationId: q.GithubAppInstallationID, GitHubAppEnterpriseBaseURL: q.GithubAppEnterpriseBaseUrl, Proxy: q.Proxy, - GCPServiceAccountKey: q.GcpServiceAccountKey, } // If repo does not have credentials, check if there are credentials stored @@ -544,8 +538,8 @@ func (s *Server) testRepo(ctx context.Context, repo *appsv1.Repository) error { return err } -func (s *Server) isRepoPermittedInProject(ctx context.Context, repo string, projName string) error { - proj, err := argo.GetAppProjectByName(projName, applisters.NewAppProjectLister(s.projLister.GetIndexer()), s.namespace, s.settings, s.db, ctx) +func (s *Server) isRepoPermittedInProject(repo string, projName string) error { + proj, err := s.projLister.Get(projName) if err != nil { return err } @@ -558,7 +552,7 @@ func (s *Server) isRepoPermittedInProject(ctx context.Context, repo string, proj // isSourceInHistory checks if the supplied application source is either our current application // source, or was something which we synced to previously. func isSourceInHistory(app *v1alpha1.Application, source v1alpha1.ApplicationSource) bool { - if source.Equals(app.Spec.GetSource()) { + if source.Equals(app.Spec.Source) { return true } // Iterate history. When comparing items in our history, use the actual synced revision to diff --git a/server/repository/repository.proto b/server/repository/repository.proto index f941932cf2dae..39cf6cf21aa0f 100644 --- a/server/repository/repository.proto +++ b/server/repository/repository.proto @@ -78,9 +78,7 @@ message RepoAccessQuery { // HTTP/HTTPS proxy to access the repository string proxy = 16; // Reference between project and repository that allow you automatically to be added as item inside SourceRepos project entity - string project = 17; - // Google Cloud Platform service account key - string gcpServiceAccountKey = 18; + string project = 17; } message RepoResponse {} diff --git a/server/repository/repository_test.go b/server/repository/repository_test.go index cdd7ba89c30b7..a76d373976f7b 100644 --- a/server/repository/repository_test.go +++ b/server/repository/repository_test.go @@ -16,7 +16,6 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" - k8scache "k8s.io/client-go/tools/cache" "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/pkg/apiclient/repository" @@ -99,7 +98,7 @@ var ( }, Spec: appsv1.ApplicationSpec{ Project: "default", - Source: &appsv1.ApplicationSource{ + Source: appsv1.ApplicationSource{ RepoURL: "https://test", TargetRevision: "HEAD", Helm: &appsv1.ApplicationSourceHelm{ @@ -124,7 +123,7 @@ var ( } ) -func newAppAndProjLister(objects ...runtime.Object) (applisters.ApplicationLister, k8scache.SharedIndexInformer) { +func newAppAndProjLister(objects ...runtime.Object) (applisters.ApplicationLister, applisters.AppProjectNamespaceLister) { fakeAppsClientset := fakeapps.NewSimpleClientset(objects...) factory := appinformer.NewSharedInformerFactoryWithOptions(fakeAppsClientset, 0, appinformer.WithNamespace(""), appinformer.WithTweakListOptions(func(options *metav1.ListOptions) {})) projInformer := factory.Argoproj().V1alpha1().AppProjects() @@ -138,7 +137,8 @@ func newAppAndProjLister(objects ...runtime.Object) (applisters.ApplicationListe } } appLister := appsInformer.Lister() - return appLister, projInformer.Informer() + projLister := projInformer.Lister().AppProjects(testNamespace) + return appLister, projLister } func Test_createRBACObject(t *testing.T) { @@ -152,14 +152,14 @@ func TestRepositoryServer(t *testing.T) { kubeclientset := fake.NewSimpleClientset(&argocdCM, &argocdSecret) settingsMgr := settings.NewSettingsManager(context.Background(), kubeclientset, testNamespace) enforcer := newEnforcer(kubeclientset) - appLister, projInformer := newAppAndProjLister(defaultProj) + appLister, projLister := newAppAndProjLister(defaultProj) argoDB := db.NewDB("default", settingsMgr, kubeclientset) t.Run("Test_getRepo", func(t *testing.T) { repoServerClient := mocks.RepoServerServiceClient{} repoServerClientset := mocks.Clientset{RepoServerServiceClient: &repoServerClient} - s := NewServer(&repoServerClientset, argoDB, enforcer, nil, appLister, projInformer, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, argoDB, enforcer, nil, appLister, projLister, settingsMgr) url := "https://test" repo, _ := s.getRepo(context.TODO(), url) assert.Equal(t, repo.Repo, url) @@ -170,7 +170,7 @@ func TestRepositoryServer(t *testing.T) { repoServerClient.On("TestRepository", mock.Anything, mock.Anything).Return(&apiclient.TestRepositoryResponse{}, nil) repoServerClientset := mocks.Clientset{RepoServerServiceClient: &repoServerClient} - s := NewServer(&repoServerClientset, argoDB, enforcer, nil, appLister, projInformer, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, argoDB, enforcer, nil, appLister, projLister, settingsMgr) url := "https://test" _, err := s.ValidateAccess(context.TODO(), &repository.RepoAccessQuery{ Repo: url, @@ -188,7 +188,7 @@ func TestRepositoryServer(t *testing.T) { db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) db.On("RepositoryExists", context.TODO(), url).Return(true, nil) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projInformer, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) repo, err := s.Get(context.TODO(), &repository.RepoQuery{ Repo: url, }) @@ -205,7 +205,7 @@ func TestRepositoryServer(t *testing.T) { db.On("GetRepository", context.TODO(), url).Return(nil, errors.New("some error")) db.On("RepositoryExists", context.TODO(), url).Return(true, nil) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projInformer, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) repo, err := s.Get(context.TODO(), &repository.RepoQuery{ Repo: url, }) @@ -222,7 +222,7 @@ func TestRepositoryServer(t *testing.T) { db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) db.On("RepositoryExists", context.TODO(), url).Return(false, nil) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projInformer, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) repo, err := s.Get(context.TODO(), &repository.RepoQuery{ Repo: url, }) @@ -242,7 +242,7 @@ func TestRepositoryServer(t *testing.T) { Project: "proj", }, nil) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projInformer, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) repo, err := s.CreateRepository(context.TODO(), &repository.RepoCreateRequest{ Repo: &appsv1.Repository{ Repo: "test", @@ -266,7 +266,7 @@ func TestRepositoryServer(t *testing.T) { db.On("CreateRepository", context.TODO(), mock.Anything).Return(nil, status.Errorf(codes.AlreadyExists, "repository already exists")) db.On("UpdateRepository", context.TODO(), mock.Anything).Return(nil, nil) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projInformer, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) repo, err := s.CreateRepository(context.TODO(), &repository.RepoCreateRequest{ Repo: &appsv1.Repository{ Repo: "test", @@ -296,7 +296,7 @@ func TestRepositoryServerListApps(t *testing.T) { db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) appLister, projLister := newAppAndProjLister(defaultProj) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.ListApps(context.TODO(), &repository.RepoAppsQuery{ Repo: "https://test", Revision: "HEAD", @@ -317,15 +317,13 @@ func TestRepositoryServerListApps(t *testing.T) { url := "https://test" db := &dbmocks.ArgoDB{} db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) - db.On("GetProjectRepositories", context.TODO(), "default").Return(nil, nil) - db.On("GetProjectClusters", context.TODO(), "default").Return(nil, nil) repoServerClient.On("ListApps", context.TODO(), mock.Anything).Return(&apiclient.AppList{ Apps: map[string]string{ "path/to/dir": "Kustomize", }, }, nil) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.ListApps(context.TODO(), &repository.RepoAppsQuery{ Repo: "https://test", Revision: "HEAD", @@ -348,15 +346,13 @@ func TestRepositoryServerListApps(t *testing.T) { url := "https://test" db := &dbmocks.ArgoDB{} db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) - db.On("GetProjectRepositories", context.TODO(), "default").Return(nil, nil) - db.On("GetProjectClusters", context.TODO(), "default").Return(nil, nil) repoServerClient.On("ListApps", context.TODO(), mock.Anything).Return(&apiclient.AppList{ Apps: map[string]string{ "path/to/dir": "Kustomize", }, }, nil) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.ListApps(context.TODO(), &repository.RepoAppsQuery{ Repo: "https://test", Revision: "HEAD", @@ -383,7 +379,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) appLister, projLister := newAppAndProjLister(defaultProj) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.GetAppDetails(context.TODO(), &repository.RepoAppDetailsQuery{ Source: &appsv1.ApplicationSource{ RepoURL: url, @@ -406,7 +402,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) appLister, projLister := newAppAndProjLister(defaultProj) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.GetAppDetails(context.TODO(), &repository.RepoAppDetailsQuery{ Source: &appsv1.ApplicationSource{ RepoURL: url, @@ -428,7 +424,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) appLister, projLister := newAppAndProjLister(defaultProj) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.GetAppDetails(context.TODO(), &repository.RepoAppDetailsQuery{ Source: &appsv1.ApplicationSource{ RepoURL: url, @@ -448,13 +444,11 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { db := &dbmocks.ArgoDB{} db.On("ListHelmRepositories", context.TODO(), mock.Anything).Return(nil, nil) db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) - db.On("GetProjectRepositories", context.TODO(), "default").Return(nil, nil) - db.On("GetProjectClusters", context.TODO(), "default").Return(nil, nil) expectedResp := apiclient.RepoAppDetailsResponse{Type: "Directory"} repoServerClient.On("GetAppDetails", context.TODO(), mock.Anything).Return(&expectedResp, nil) appLister, projLister := newAppAndProjLister(defaultProj) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.GetAppDetails(context.TODO(), &repository.RepoAppDetailsQuery{ Source: &appsv1.ApplicationSource{ RepoURL: url, @@ -473,13 +467,11 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { url := "https://test" db := &dbmocks.ArgoDB{} db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) - db.On("GetProjectRepositories", context.TODO(), "default").Return(nil, nil) - db.On("GetProjectClusters", context.TODO(), "default").Return(nil, nil) expectedResp := apiclient.RepoAppDetailsResponse{Type: "Directory"} repoServerClient.On("GetAppDetails", context.TODO(), mock.Anything).Return(&expectedResp, nil) appLister, projLister := newAppAndProjLister(defaultProjNoSources) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.GetAppDetails(context.TODO(), &repository.RepoAppDetailsQuery{ Source: &appsv1.ApplicationSource{ RepoURL: url, @@ -499,15 +491,13 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { db := &dbmocks.ArgoDB{} db.On("ListHelmRepositories", context.TODO(), mock.Anything).Return(nil, nil) db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) - db.On("GetProjectRepositories", context.TODO(), "default").Return(nil, nil) - db.On("GetProjectClusters", context.TODO(), "default").Return(nil, nil) expectedResp := apiclient.RepoAppDetailsResponse{Type: "Directory"} repoServerClient.On("GetAppDetails", context.TODO(), mock.Anything).Return(&expectedResp, nil) appLister, projLister := newAppAndProjLister(defaultProj, guestbookApp) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.GetAppDetails(context.TODO(), &repository.RepoAppDetailsQuery{ - Source: guestbookApp.Spec.GetSourcePtr(), + Source: &guestbookApp.Spec.Source, AppName: "guestbook", AppProject: "default", }) @@ -524,9 +514,9 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) appLister, projLister := newAppAndProjLister(defaultProj, guestbookApp) - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.GetAppDetails(context.TODO(), &repository.RepoAppDetailsQuery{ - Source: guestbookApp.Spec.GetSourcePtr(), + Source: &guestbookApp.Spec.Source, AppName: "guestbook", AppProject: "mismatch", }) @@ -545,7 +535,7 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { differentSource := guestbookApp.Spec.Source.DeepCopy() differentSource.Helm.ValueFiles = []string{"/etc/passwd"} - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.GetAppDetails(context.TODO(), &repository.RepoAppDetailsQuery{ Source: differentSource, AppName: "guestbook", @@ -563,15 +553,13 @@ func TestRepositoryServerGetAppDetails(t *testing.T) { db := &dbmocks.ArgoDB{} db.On("GetRepository", context.TODO(), url).Return(&appsv1.Repository{Repo: url}, nil) db.On("ListHelmRepositories", context.TODO(), mock.Anything).Return(nil, nil) - db.On("GetProjectRepositories", context.TODO(), "default").Return(nil, nil) - db.On("GetProjectClusters", context.TODO(), "default").Return(nil, nil) expectedResp := apiclient.RepoAppDetailsResponse{Type: "Directory"} repoServerClient.On("GetAppDetails", context.TODO(), mock.Anything).Return(&expectedResp, nil) appLister, projLister := newAppAndProjLister(defaultProj, guestbookApp) previousSource := guestbookApp.Status.History[0].Source.DeepCopy() previousSource.TargetRevision = guestbookApp.Status.History[0].Revision - s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, testNamespace, settingsMgr) + s := NewServer(&repoServerClientset, db, enforcer, newFixtures().Cache, appLister, projLister, settingsMgr) resp, err := s.GetAppDetails(context.TODO(), &repository.RepoAppDetailsQuery{ Source: previousSource, AppName: "guestbook", diff --git a/server/server.go b/server/server.go index f1302a0f12f45..8336348c86911 100644 --- a/server/server.go +++ b/server/server.go @@ -4,7 +4,6 @@ import ( "context" netCtx "context" "crypto/tls" - "errors" "fmt" goio "io" "io/fs" @@ -31,7 +30,6 @@ import ( "github.com/go-redis/redis/v8" "github.com/golang-jwt/jwt/v4" "github.com/gorilla/handlers" - gmux "github.com/gorilla/mux" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" @@ -62,6 +60,8 @@ import ( accountpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/account" applicationpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" + "github.com/pkg/errors" + applicationsetpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/applicationset" certificatepkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/certificate" clusterpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/cluster" @@ -86,7 +86,6 @@ import ( servercache "github.com/argoproj/argo-cd/v2/server/cache" "github.com/argoproj/argo-cd/v2/server/certificate" "github.com/argoproj/argo-cd/v2/server/cluster" - "github.com/argoproj/argo-cd/v2/server/extension" "github.com/argoproj/argo-cd/v2/server/gpgkey" "github.com/argoproj/argo-cd/v2/server/logout" "github.com/argoproj/argo-cd/v2/server/metrics" @@ -193,7 +192,6 @@ type ArgoCDServer struct { apiFactory api.Factory secretInformer cache.SharedIndexInformer configMapInformer cache.SharedIndexInformer - serviceSet *ArgoCDServiceSet } type ArgoCDServerOpts struct { @@ -218,7 +216,6 @@ type ArgoCDServerOpts struct { ContentSecurityPolicy string ListenHost string ApplicationNamespaces []string - EnableProxyExtension bool } // initializeDefaultProject creates the default project if it does not already exist @@ -423,8 +420,7 @@ func (a *ArgoCDServer) Init(ctx context.Context) { // golang/protobuf). func (a *ArgoCDServer) Run(ctx context.Context, listeners *Listeners) { a.userStateStorage.Init(ctx) - svcSet := newArgoCDServiceSet(a) - a.serviceSet = svcSet + grpcS, appResourceTreeFn := a.newGRPCServer() grpcWebS := grpcweb.WrapServer(grpcS) var httpS *http.Server @@ -461,7 +457,6 @@ func (a *ArgoCDServer) Run(ctx context.Context, listeners *Listeners) { if !a.useTLS() { httpL = tcpm.Match(cmux.HTTP1Fast()) grpcL = tcpm.MatchWithWriters(cmux.HTTP2MatchHeaderFieldSendSettings("content-type", "application/grpc")) - } else { // We first match on HTTP 1.1 methods. httpL = tcpm.Match(cmux.HTTP1Fast()) @@ -710,48 +705,9 @@ func (a *ArgoCDServer) newGRPCServer() (*grpc.Server, application.AppResourceTre grpc_util.PanicLoggerUnaryServerInterceptor(a.log), ))) grpcS := grpc.NewServer(sOpts...) - - versionpkg.RegisterVersionServiceServer(grpcS, a.serviceSet.VersionService) - clusterpkg.RegisterClusterServiceServer(grpcS, a.serviceSet.ClusterService) - applicationpkg.RegisterApplicationServiceServer(grpcS, a.serviceSet.ApplicationService) - applicationsetpkg.RegisterApplicationSetServiceServer(grpcS, a.serviceSet.ApplicationSetService) - notificationpkg.RegisterNotificationServiceServer(grpcS, a.serviceSet.NotificationService) - repositorypkg.RegisterRepositoryServiceServer(grpcS, a.serviceSet.RepoService) - repocredspkg.RegisterRepoCredsServiceServer(grpcS, a.serviceSet.RepoCredsService) - sessionpkg.RegisterSessionServiceServer(grpcS, a.serviceSet.SessionService) - settingspkg.RegisterSettingsServiceServer(grpcS, a.serviceSet.SettingsService) - projectpkg.RegisterProjectServiceServer(grpcS, a.serviceSet.ProjectService) - accountpkg.RegisterAccountServiceServer(grpcS, a.serviceSet.AccountService) - certificatepkg.RegisterCertificateServiceServer(grpcS, a.serviceSet.CertificateService) - gpgkeypkg.RegisterGPGKeyServiceServer(grpcS, a.serviceSet.GpgkeyService) - // Register reflection service on gRPC server. - reflection.Register(grpcS) - grpc_prometheus.Register(grpcS) - errorsutil.CheckError(a.serviceSet.ProjectService.NormalizeProjs()) - return grpcS, a.serviceSet.AppResourceTreeFn -} - -type ArgoCDServiceSet struct { - ClusterService *cluster.Server - RepoService *repository.Server - RepoCredsService *repocreds.Server - SessionService *session.Server - ApplicationService applicationpkg.ApplicationServiceServer - AppResourceTreeFn application.AppResourceTreeFn - ApplicationSetService applicationsetpkg.ApplicationSetServiceServer - ProjectService *project.Server - SettingsService *settings.Server - AccountService *account.Server - NotificationService notificationpkg.NotificationServiceServer - CertificateService *certificate.Server - GpgkeyService *gpgkey.Server - VersionService *version.Server -} - -func newArgoCDServiceSet(a *ArgoCDServer) *ArgoCDServiceSet { kubectl := kubeutil.NewKubectl() clusterService := cluster.NewServer(a.db, a.enf, a.Cache, kubectl) - repoService := repository.NewServer(a.RepoClientset, a.db, a.enf, a.Cache, a.appLister, a.projInformer, a.Namespace, a.settingsMgr) + repoService := repository.NewServer(a.RepoClientset, a.db, a.enf, a.Cache, a.appLister, a.projLister, a.settingsMgr) repoCredsService := repocreds.NewServer(a.RepoClientset, a.db, a.enf, a.settingsMgr) var loginRateLimiter func() (io.Closer, error) if maxConcurrentLoginRequestsCount > 0 { @@ -778,13 +734,13 @@ func newArgoCDServiceSet(a *ArgoCDServer) *ArgoCDServiceSet { applicationSetService := applicationset.NewServer(a.db, a.KubeClientset, a.enf, a.Cache, a.AppClientset, a.appLister, a.appsetInformer, a.appsetLister, a.projLister, a.settingsMgr, a.Namespace, projectLock) 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 - settingsService := settings.NewServer(a.settingsMgr, a.RepoClientset, a, a.DisableAuth, appsInAnyNamespaceEnabled) + settingsService := settings.NewServer(a.settingsMgr, a, a.DisableAuth, appsInAnyNamespaceEnabled) accountService := account.NewServer(a.sessionMgr, a.settingsMgr, a.enf) notificationService := notification.NewServer(a.apiFactory) certificateService := certificate.NewServer(a.RepoClientset, a.db, a.enf) gpgkeyService := gpgkey.NewServer(a.RepoClientset, a.db, a.enf) - versionService := version.NewServer(a, func() (bool, error) { + versionpkg.RegisterVersionServiceServer(grpcS, version.NewServer(a, func() (bool, error) { if a.DisableAuth { return true, nil } @@ -793,24 +749,24 @@ func newArgoCDServiceSet(a *ArgoCDServer) *ArgoCDServiceSet { return false, err } return sett.AnonymousUserEnabled, err - }) - - return &ArgoCDServiceSet{ - ClusterService: clusterService, - RepoService: repoService, - RepoCredsService: repoCredsService, - SessionService: sessionService, - ApplicationService: applicationService, - AppResourceTreeFn: appResourceTreeFn, - ApplicationSetService: applicationSetService, - ProjectService: projectService, - SettingsService: settingsService, - AccountService: accountService, - NotificationService: notificationService, - CertificateService: certificateService, - GpgkeyService: gpgkeyService, - VersionService: versionService, - } + })) + clusterpkg.RegisterClusterServiceServer(grpcS, clusterService) + applicationpkg.RegisterApplicationServiceServer(grpcS, applicationService) + applicationsetpkg.RegisterApplicationSetServiceServer(grpcS, applicationSetService) + notificationpkg.RegisterNotificationServiceServer(grpcS, notificationService) + repositorypkg.RegisterRepositoryServiceServer(grpcS, repoService) + repocredspkg.RegisterRepoCredsServiceServer(grpcS, repoCredsService) + sessionpkg.RegisterSessionServiceServer(grpcS, sessionService) + settingspkg.RegisterSettingsServiceServer(grpcS, settingsService) + projectpkg.RegisterProjectServiceServer(grpcS, projectService) + accountpkg.RegisterAccountServiceServer(grpcS, accountService) + certificatepkg.RegisterCertificateServiceServer(grpcS, certificateService) + gpgkeypkg.RegisterGPGKeyServiceServer(grpcS, gpgkeyService) + // Register reflection service on gRPC server. + reflection.Register(grpcS) + grpc_prometheus.Register(grpcS) + errorsutil.CheckError(projectService.NormalizeProjs()) + return grpcS, appResourceTreeFn } // translateGrpcCookieHeader conditionally sets a cookie on the response. @@ -905,20 +861,41 @@ func (a *ArgoCDServer) newHTTPServer(ctx context.Context, port int, grpcWebHandl } mux.Handle("/api/", handler) - terminal := application.NewHandler(a.appLister, a.Namespace, a.ApplicationNamespaces, a.db, a.enf, a.Cache, appResourceTreeFn, a.settings.ExecShells). - WithFeatureFlagMiddleware(a.settingsMgr.GetSettings) - th := util_session.WithAuthMiddleware(a.DisableAuth, a.sessionMgr, terminal) - mux.Handle("/terminal", th) - - // Dead code for now - // Proxy extension is currently an experimental feature and is disabled - // by default. - // if a.EnableProxyExtension { - // // API server won't panic if extensions fail to register. In - // // this case an error log will be sent and no extension route - // // will be added in mux. - // registerExtensions(mux, a) - // } + terminalHandler := application.NewHandler(a.appLister, a.Namespace, a.db, a.enf, a.Cache, appResourceTreeFn, a.settings.ExecShells) + mux.HandleFunc("/terminal", func(writer http.ResponseWriter, request *http.Request) { + argocdSettings, err := a.settingsMgr.GetSettings() + if err != nil { + http.Error(writer, fmt.Sprintf("Failed to get settings: %v", err), http.StatusBadRequest) + return + } + if !argocdSettings.ExecEnabled { + writer.WriteHeader(http.StatusNotFound) + return + } + + if !a.DisableAuth { + ctx := request.Context() + cookies := request.Cookies() + tokenString, err := httputil.JoinCookies(common.AuthCookieName, cookies) + if err == nil && jwtutil.IsValid(tokenString) { + claims, _, err := a.sessionMgr.VerifyToken(tokenString) + if err != nil { + // nolint:staticcheck + ctx = context.WithValue(ctx, util_session.AuthErrorCtxKey, err) + } else if claims != nil { + // Add claims to the context to inspect for RBAC + // nolint:staticcheck + ctx = context.WithValue(ctx, "claims", claims) + } + request = request.WithContext(ctx) + } else { + writer.WriteHeader(http.StatusUnauthorized) + return + } + } + terminalHandler.ServeHTTP(writer, request) + }) + mustRegisterGWHandler(versionpkg.RegisterVersionServiceHandler, ctx, gwmux, conn) mustRegisterGWHandler(clusterpkg.RegisterClusterServiceHandler, ctx, gwmux, conn) mustRegisterGWHandler(applicationpkg.RegisterApplicationServiceHandler, ctx, gwmux, conn) @@ -964,24 +941,6 @@ func (a *ArgoCDServer) newHTTPServer(ctx context.Context, port int, grpcWebHandl return &httpS } -// registerExtensions will try to register all configured extensions -// in the given mux. If any error is returned while registering -// extensions handlers, no route will be added in the given mux. -// nolint:deadcode,unused,staticcheck -func registerExtensions(mux *http.ServeMux, a *ArgoCDServer) { - sg := extension.NewDefaultSettingsGetter(a.settingsMgr) - ag := extension.NewDefaultApplicationGetter(a.serviceSet.ApplicationService) - em := extension.NewManager(sg, ag, a.log) - r := gmux.NewRouter() - - err := em.RegisterHandlers(r) - if err != nil { - a.log.Errorf("error registering extension handlers: %s", err) - return - } - mux.Handle(fmt.Sprintf("%s/", extension.URLPrefix), r) -} - var extensionsPattern = regexp.MustCompile(`^extension(.*)\.js$`) func (a *ArgoCDServer) serveExtensions(extensionsSharedPath string, w http.ResponseWriter) { diff --git a/server/settings/settings.go b/server/settings/settings.go index ba8a582e58cdd..59e7f999df59d 100644 --- a/server/settings/settings.go +++ b/server/settings/settings.go @@ -2,11 +2,6 @@ package settings import ( "context" - "fmt" - - "github.com/argoproj/argo-cd/v2/reposerver/apiclient" - ioutil "github.com/argoproj/argo-cd/v2/util/io" - "github.com/golang/protobuf/ptypes/empty" "github.com/ghodss/yaml" @@ -20,7 +15,6 @@ import ( // Server provides a Settings service type Server struct { mgr *settings.SettingsManager - repoClient apiclient.Clientset authenticator Authenticator disableAuth bool appsInAnyNamespaceEnabled bool @@ -31,8 +25,8 @@ type Authenticator interface { } // NewServer returns a new instance of the Settings service -func NewServer(mgr *settings.SettingsManager, repoClient apiclient.Clientset, authenticator Authenticator, disableAuth, appsInAnyNamespaceEnabled bool) *Server { - return &Server{mgr: mgr, repoClient: repoClient, authenticator: authenticator, disableAuth: disableAuth, appsInAnyNamespaceEnabled: appsInAnyNamespaceEnabled} +func NewServer(mgr *settings.SettingsManager, authenticator Authenticator, disableAuth, appsInAnyNamespaceEnabled bool) *Server { + return &Server{mgr: mgr, authenticator: authenticator, disableAuth: disableAuth, appsInAnyNamespaceEnabled: appsInAnyNamespaceEnabled} } // Get returns Argo CD settings @@ -62,7 +56,7 @@ func (s *Server) Get(ctx context.Context, q *settingspkg.SettingsQuery) (*settin if err != nil { return nil, err } - plugins, err := s.plugins(ctx) + plugins, err := s.plugins() if err != nil { return nil, err } @@ -158,32 +152,16 @@ func (s *Server) Get(ctx context.Context, q *settingspkg.SettingsQuery) (*settin return &set, nil } -func (s *Server) plugins(ctx context.Context) ([]*settingspkg.Plugin, error) { +func (s *Server) plugins() ([]*settingspkg.Plugin, error) { in, err := s.mgr.GetConfigManagementPlugins() if err != nil { return nil, err } - closer, client, err := s.repoClient.NewRepoServerClient() - if err != nil { - return nil, fmt.Errorf("error creating repo server client: %w", err) - } - defer ioutil.Close(closer) + out := make([]*settingspkg.Plugin, len(in)) + for i, p := range in { + out[i] = &settingspkg.Plugin{Name: p.Name} - pluginList, err := client.ListPlugins(ctx, &empty.Empty{}) - if err != nil { - return nil, fmt.Errorf("failed to list sidecar plugins from reposerver: %w", err) } - out := []*settingspkg.Plugin{} - for _, p := range in { - out = append(out, &settingspkg.Plugin{Name: p.Name}) - - } - if pluginList != nil && len(pluginList.Items) > 0 { - for _, p := range pluginList.Items { - out = append(out, &settingspkg.Plugin{Name: p.Name}) - } - } - return out, nil } diff --git a/server/version/version.go b/server/version/version.go index e899a7ab590d5..dfd88093752a8 100644 --- a/server/version/version.go +++ b/server/version/version.go @@ -13,7 +13,7 @@ import ( sessionmgr "github.com/argoproj/argo-cd/v2/util/session" ) -type Server struct { +type server struct { kustomizeVersion string helmVersion string jsonnetVersion string @@ -21,12 +21,12 @@ type Server struct { disableAuth func() (bool, error) } -func NewServer(authenticator settings.Authenticator, disableAuth func() (bool, error)) *Server { - return &Server{authenticator: authenticator, disableAuth: disableAuth} +func NewServer(authenticator settings.Authenticator, disableAuth func() (bool, error)) *server { + return &server{authenticator: authenticator, disableAuth: disableAuth} } // Version returns the version of the API server -func (s *Server) Version(ctx context.Context, _ *empty.Empty) (*version.VersionMessage, error) { +func (s *server) Version(ctx context.Context, _ *empty.Empty) (*version.VersionMessage, error) { vers := common.GetVersion() disableAuth, err := s.disableAuth() if err != nil { @@ -71,7 +71,7 @@ func (s *Server) Version(ctx context.Context, _ *empty.Empty) (*version.VersionM } // AuthFuncOverride allows the version to be returned without auth -func (s *Server) AuthFuncOverride(ctx context.Context, fullMethodName string) (context.Context, error) { +func (s *server) AuthFuncOverride(ctx context.Context, fullMethodName string) (context.Context, error) { if s.authenticator != nil { // this authenticates the user, but ignores any error, so that we have claims populated ctx, _ = s.authenticator.Authenticate(ctx) diff --git a/test/cmp/plugin.yaml b/test/cmp/plugin.yaml index e68fc3dee74af..2439f3d73ec6c 100644 --- a/test/cmp/plugin.yaml +++ b/test/cmp/plugin.yaml @@ -9,17 +9,3 @@ spec: discover: find: glob: "**/kustomization.yaml" - parameters: - static: - - name: string-param - string: value - - name: array-param - collectionType: array - array: - - value1 - - value2 - - name: map-param - collectionType: map - map: - key: value - key2: value2 diff --git a/test/container/Dockerfile b/test/container/Dockerfile index dbb5cb719dc1a..59943128aa715 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -94,24 +94,26 @@ ARG UID # Prepare user configuration & build environments RUN useradd -l -u ${UID} -d /home/user -s /bin/bash user && \ echo "user ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/user && \ - mkdir -p /home/user/.kube && \ + mkdir -p /home/user/.kube && chmod 777 /home/user/.kube && \ chown -R user /home/user && \ chgrp -R user /home/user && \ HOME=/home/user git config --global user.name "ArgoCD Test User" && \ HOME=/home/user git config --global user.email "noreply@example.com" && \ - mkdir -p /go/pkg && \ + mkdir -p /go/pkg && chmod 777 /go/pkg && \ mkdir -p /var/run/sshd && \ mkdir -p /root/.ssh && \ mkdir -p /go && \ + chmod -R 777 /go && \ chown root /etc/ssh/ssh_host_*_key* && \ chmod 0600 /etc/ssh/ssh_host_*_key && \ - mkdir -p /tmp/go-build-cache && \ - mkdir -p /home/user/.cache && \ + mkdir -p /tmp/go-build-cache && chmod -R 777 /tmp/go-build-cache && \ + mkdir -p /home/user/.cache && chmod 777 /home/user/.cache && \ + chmod -R 777 /usr/local/go && \ 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.4/bin/yarn /usr/local/bin/yarn && \ ln -s /opt/yarn-v1.22.4/bin/yarnpkg /usr/local/bin/yarnpkg && \ - mkdir -p /var/lib/registry + mkdir -p /var/lib/registry && chmod -R 777 /var/lib/registry ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/test/e2e/app_autosync_test.go b/test/e2e/app_autosync_test.go index 6e3c1443285e5..e9da1f659937e 100644 --- a/test/e2e/app_autosync_test.go +++ b/test/e2e/app_autosync_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + . "github.com/argoproj/gitops-engine/pkg/sync/common" "github.com/stretchr/testify/assert" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" diff --git a/test/e2e/app_management_ns_test.go b/test/e2e/app_management_ns_test.go index f9f3a71282644..414b7679fd017 100644 --- a/test/e2e/app_management_ns_test.go +++ b/test/e2e/app_management_ns_test.go @@ -3,9 +3,10 @@ package e2e import ( "context" "fmt" - "os" + "math/rand" "path" "reflect" + "strings" "testing" "time" @@ -35,7 +36,6 @@ import ( projectFixture "github.com/argoproj/argo-cd/v2/test/e2e/fixture/project" repoFixture "github.com/argoproj/argo-cd/v2/test/e2e/fixture/repos" "github.com/argoproj/argo-cd/v2/test/e2e/testdata" - . "github.com/argoproj/argo-cd/v2/util/argo" . "github.com/argoproj/argo-cd/v2/util/errors" "github.com/argoproj/argo-cd/v2/util/io" @@ -285,8 +285,8 @@ func TestNamespacedAppCreation(t *testing.T) { And(func(app *Application) { assert.Equal(t, Name(), app.Name) assert.Equal(t, AppNamespace(), app.Namespace) - assert.Equal(t, RepoURL(RepoURLTypeFile), app.Spec.GetSource().RepoURL) - assert.Equal(t, guestbookPath, app.Spec.GetSource().Path) + assert.Equal(t, RepoURL(RepoURLTypeFile), app.Spec.Source.RepoURL) + assert.Equal(t, guestbookPath, app.Spec.Source.Path) assert.Equal(t, DeploymentNamespace(), app.Spec.Destination.Namespace) assert.Equal(t, KubernetesInternalAPIServerAddr, app.Spec.Destination.Server) }). @@ -314,7 +314,7 @@ func TestNamespacedAppCreation(t *testing.T) { And(func(app *Application) { assert.Equal(t, "label", app.Labels["test"]) assert.Equal(t, "annotation", app.Annotations["test"]) - assert.Equal(t, "master", app.Spec.GetSource().TargetRevision) + assert.Equal(t, "master", app.Spec.Source.TargetRevision) }) } @@ -333,8 +333,8 @@ func TestNamespacedAppCreationWithoutForceUpdate(t *testing.T) { And(func(app *Application) { assert.Equal(t, ctx.AppName(), app.Name) assert.Equal(t, AppNamespace(), app.Namespace) - assert.Equal(t, RepoURL(RepoURLTypeFile), app.Spec.GetSource().RepoURL) - assert.Equal(t, guestbookPath, app.Spec.GetSource().Path) + assert.Equal(t, RepoURL(RepoURLTypeFile), app.Spec.Source.RepoURL) + assert.Equal(t, guestbookPath, app.Spec.Source.Path) assert.Equal(t, DeploymentNamespace(), app.Spec.Destination.Namespace) assert.Equal(t, "in-cluster", app.Spec.Destination.Name) }). @@ -377,20 +377,25 @@ func TestNamespacedDeleteAppResource(t *testing.T) { // demonstrate that we cannot use a standard sync when an immutable field is changed, we must use "force" func TestNamespacedImmutableChange(t *testing.T) { SkipOnEnv(t, "OPENSHIFT") + text := FailOnErr(Run(".", "kubectl", "get", "service", "-n", "kube-system", "kube-dns", "-o", "jsonpath={.spec.clusterIP}")).(string) + parts := strings.Split(text, ".") + n := rand.Intn(254) + ip1 := fmt.Sprintf("%s.%s.%s.%d", parts[0], parts[1], parts[2], n) + ip2 := fmt.Sprintf("%s.%s.%s.%d", parts[0], parts[1], parts[2], n+1) Given(t). - Path("secrets"). + Path("service"). SetTrackingMethod("annotation"). SetAppNamespace(AppNamespace()). When(). CreateApp(). - PatchFile("secrets.yaml", `[{"op": "add", "path": "/data/new-field", "value": "dGVzdA=="}, {"op": "add", "path": "/immutable", "value": true}]`). + PatchFile("service.yaml", fmt.Sprintf(`[{"op": "add", "path": "/spec/clusterIP", "value": "%s"}]`, ip1)). Sync(). Then(). Expect(OperationPhaseIs(OperationSucceeded)). Expect(SyncStatusIs(SyncStatusCodeSynced)). Expect(HealthIs(health.HealthStatusHealthy)). When(). - PatchFile("secrets.yaml", `[{"op": "add", "path": "/data/new-field", "value": "dGVzdDI="}]`). + PatchFile("service.yaml", fmt.Sprintf(`[{"op": "add", "path": "/spec/clusterIP", "value": "%s"}]`, ip2)). IgnoreErrors(). Sync(). DoNotIgnoreErrors(). @@ -399,14 +404,14 @@ func TestNamespacedImmutableChange(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). Expect(ResourceResultNumbering(1)). Expect(ResourceResultMatches(ResourceResult{ - Kind: "Secret", + Kind: "Service", Version: "v1", Namespace: DeploymentNamespace(), - Name: "test-secret", + Name: "my-service", SyncPhase: "Sync", Status: "SyncFailed", HookPhase: "Failed", - Message: `Secret "test-secret" is invalid`, + Message: `Service "my-service" is invalid`, })). // now we can do this will a force Given(). @@ -522,12 +527,12 @@ func TestNamespacedAppRollbackSuccessful(t *testing.T) { ID: 1, Revision: app.Status.Sync.Revision, DeployedAt: metav1.Time{Time: metav1.Now().UTC().Add(-1 * time.Minute)}, - Source: app.Spec.GetSource(), + Source: app.Spec.Source, }, { ID: 2, Revision: "cdb", DeployedAt: metav1.Time{Time: metav1.Now().UTC().Add(-2 * time.Minute)}, - Source: app.Spec.GetSource(), + Source: app.Spec.Source, }} patch, _, err := diff.CreateTwoWayMergePatch(app, appWithHistory, &Application{}) require.NoError(t, err) @@ -764,17 +769,6 @@ func TestNamespacedResourceDiffing(t *testing.T) { }). Given(). When(). - // Now we migrate from client-side apply to server-side apply - // This is necessary, as starting with kubectl 1.26, all previously - // client-side owned fields have ownership migrated to the manager from - // the first ssa. - // More details: https://github.com/kubernetes/kubectl/issues/1337 - PatchApp(`[{ - "op": "add", - "path": "/spec/syncPolicy", - "value": { "syncOptions": ["ServerSideApply=true"] } - }]`). - 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) @@ -1353,8 +1347,8 @@ func TestNamespacedSyncOptionValidateFalse(t *testing.T) { IgnoreErrors(). Sync(). Then(). - // client error. K8s API changed error message w/ 1.25, so for now, we need to check both - Expect(ErrorRegex("error validating data|of type int32", "")). + // client error + Expect(Error("error validating data", "")). When(). PatchFile("deployment.yaml", `[{"op": "add", "path": "/metadata/annotations", "value": {"argocd.argoproj.io/sync-options": "Validate=false"}}]`). Sync(). @@ -1822,12 +1816,12 @@ func TestNamespacedListResource(t *testing.T) { // Given application is set with --sync-option CreateNamespace=true // -// application --dest-namespace does not exist +// application --dest-namespace does not exist // -// Verify application --dest-namespace is created +// Verity application --dest-namespace is created // -// application sync successful -// when application is deleted, --dest-namespace is not deleted +// application sync successful +// when application is deleted, --dest-namespace is not deleted func TestNamespacedNamespaceAutoCreation(t *testing.T) { SkipOnEnv(t, "OPENSHIFT") updatedNamespace := getNewNamespace(t) @@ -1845,7 +1839,12 @@ func TestNamespacedNamespaceAutoCreation(t *testing.T) { When(). CreateApp("--sync-option", "CreateNamespace=true"). Then(). - Expect(NoNamespace(updatedNamespace)). + 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) + assert.Contains(t, err.Error(), "not found") + }). When(). AppSet("--dest-namespace", updatedNamespace). Sync(). @@ -1867,275 +1866,6 @@ func TestNamespacedNamespaceAutoCreation(t *testing.T) { }) } -// Given application is set with --sync-option CreateNamespace=true -// -// application --dest-namespace does not exist -// -// Verify application --dest-namespace is created with managedNamespaceMetadata -func TestNamespacedNamespaceAutoCreationWithMetadata(t *testing.T) { - SkipOnEnv(t, "OPENSHIFT") - updatedNamespace := getNewNamespace(t) - defer func() { - if !t.Skipped() { - _, err := Run("", "kubectl", "delete", "namespace", updatedNamespace) - assert.NoError(t, err) - } - }() - ctx := Given(t) - ctx. - SetAppNamespace(AppNamespace()). - SetTrackingMethod("annotation"). - Timeout(30). - Path("guestbook"). - When(). - CreateFromFile(func(app *Application) { - app.Spec.SyncPolicy = &SyncPolicy{ - SyncOptions: SyncOptions{"CreateNamespace=true"}, - ManagedNamespaceMetadata: &ManagedNamespaceMetadata{ - Labels: map[string]string{"foo": "bar"}, - Annotations: map[string]string{"bar": "bat"}, - }} - }). - Then(). - Expect(NoNamespace(updatedNamespace)). - When(). - AppSet("--dest-namespace", updatedNamespace). - Sync(). - Then(). - Expect(Success("")). - Expect(Namespace(updatedNamespace, func(app *Application, ns *v1.Namespace) { - assert.Empty(t, app.Status.Conditions) - - delete(ns.Labels, "kubernetes.io/metadata.name") - delete(ns.Labels, "argocd.argoproj.io/tracking-id") - delete(ns.Annotations, "argocd.argoproj.io/tracking-id") - delete(ns.Annotations, "kubectl.kubernetes.io/last-applied-configuration") - - assert.Equal(t, map[string]string{"foo": "bar"}, ns.Labels) - assert.Equal(t, map[string]string{"bar": "bat", "argocd.argoproj.io/sync-options": "ServerSideApply=true"}, ns.Annotations) - assert.Equal(t, map[string]string{"foo": "bar"}, app.Spec.SyncPolicy.ManagedNamespaceMetadata.Labels) - assert.Equal(t, map[string]string{"bar": "bat"}, app.Spec.SyncPolicy.ManagedNamespaceMetadata.Annotations) - })). - Expect(OperationPhaseIs(OperationSucceeded)).Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", updatedNamespace, health.HealthStatusHealthy)). - Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", updatedNamespace, health.HealthStatusHealthy)). - Expect(ResourceSyncStatusWithNamespaceIs("Deployment", "guestbook-ui", updatedNamespace, SyncStatusCodeSynced)). - When(). - And(func() { - FailOnErr(AppClientset.ArgoprojV1alpha1().Applications(AppNamespace()).Patch(context.Background(), - ctx.GetName(), types.JSONPatchType, []byte(`[{ "op": "replace", "path": "/spec/syncPolicy/managedNamespaceMetadata/labels", "value": {"new":"label"} }]`), metav1.PatchOptions{})) - }). - Sync(). - Then(). - Expect(Success("")). - Expect(Namespace(updatedNamespace, func(app *Application, ns *v1.Namespace) { - - delete(ns.Labels, "kubernetes.io/metadata.name") - delete(ns.Labels, "argocd.argoproj.io/tracking-id") - delete(ns.Annotations, "kubectl.kubernetes.io/last-applied-configuration") - delete(ns.Annotations, "argocd.argoproj.io/tracking-id") - - assert.Equal(t, map[string]string{"new": "label"}, ns.Labels) - assert.Equal(t, map[string]string{"bar": "bat", "argocd.argoproj.io/sync-options": "ServerSideApply=true"}, ns.Annotations) - assert.Equal(t, map[string]string{"new": "label"}, app.Spec.SyncPolicy.ManagedNamespaceMetadata.Labels) - assert.Equal(t, map[string]string{"bar": "bat"}, app.Spec.SyncPolicy.ManagedNamespaceMetadata.Annotations) - })). - When(). - And(func() { - FailOnErr(AppClientset.ArgoprojV1alpha1().Applications(AppNamespace()).Patch(context.Background(), - ctx.GetName(), types.JSONPatchType, []byte(`[{ "op": "replace", "path": "/spec/syncPolicy/managedNamespaceMetadata/annotations", "value": {"new":"custom-annotation"} }]`), metav1.PatchOptions{})) - }). - Sync(). - Then(). - Expect(Success("")). - Expect(Namespace(updatedNamespace, func(app *Application, ns *v1.Namespace) { - delete(ns.Labels, "kubernetes.io/metadata.name") - delete(ns.Labels, "argocd.argoproj.io/tracking-id") - delete(ns.Annotations, "argocd.argoproj.io/tracking-id") - delete(ns.Annotations, "kubectl.kubernetes.io/last-applied-configuration") - - assert.Equal(t, map[string]string{"new": "label"}, ns.Labels) - assert.Equal(t, map[string]string{"new": "custom-annotation", "argocd.argoproj.io/sync-options": "ServerSideApply=true"}, ns.Annotations) - assert.Equal(t, map[string]string{"new": "label"}, app.Spec.SyncPolicy.ManagedNamespaceMetadata.Labels) - assert.Equal(t, map[string]string{"new": "custom-annotation"}, app.Spec.SyncPolicy.ManagedNamespaceMetadata.Annotations) - })) -} - -// Given application is set with --sync-option CreateNamespace=true -// -// application --dest-namespace does not exist -// -// Verify application namespace manifest takes precedence over managedNamespaceMetadata -func TestNamespacedNamespaceAutoCreationWithMetadataAndNsManifest(t *testing.T) { - SkipOnEnv(t, "OPENSHIFT") - namespace := "guestbook-ui-with-namespace-manifest" - defer func() { - if !t.Skipped() { - _, err := Run("", "kubectl", "delete", "namespace", namespace) - assert.NoError(t, err) - } - }() - - ctx := Given(t) - ctx. - SetAppNamespace(AppNamespace()). - SetTrackingMethod("annotation"). - Timeout(30). - Path("guestbook-with-namespace-manifest"). - When(). - CreateFromFile(func(app *Application) { - app.Spec.SyncPolicy = &SyncPolicy{ - SyncOptions: SyncOptions{"CreateNamespace=true"}, - ManagedNamespaceMetadata: &ManagedNamespaceMetadata{ - Labels: map[string]string{"foo": "bar", "abc": "123"}, - Annotations: map[string]string{"bar": "bat"}, - }} - }). - Then(). - Expect(NoNamespace(namespace)). - When(). - AppSet("--dest-namespace", namespace). - Sync(). - Then(). - Expect(Success("")). - Expect(Namespace(namespace, func(app *Application, ns *v1.Namespace) { - delete(ns.Labels, "kubernetes.io/metadata.name") - delete(ns.Labels, "argocd.argoproj.io/tracking-id") - delete(ns.Labels, "kubectl.kubernetes.io/last-applied-configuration") - delete(ns.Annotations, "argocd.argoproj.io/tracking-id") - delete(ns.Annotations, "kubectl.kubernetes.io/last-applied-configuration") - - // The application namespace manifest takes precedence over what is in managedNamespaceMetadata - assert.Equal(t, map[string]string{"test": "true"}, ns.Labels) - assert.Equal(t, map[string]string{"foo": "bar", "something": "else"}, ns.Annotations) - })). - Expect(OperationPhaseIs(OperationSucceeded)).Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", namespace, health.HealthStatusHealthy)). - Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", namespace, health.HealthStatusHealthy)). - Expect(ResourceSyncStatusWithNamespaceIs("Deployment", "guestbook-ui", namespace, SyncStatusCodeSynced)) -} - -// Given application is set with --sync-option CreateNamespace=true -// -// application --dest-namespace exists -// -// Verify application --dest-namespace is updated with managedNamespaceMetadata labels and annotations -func TestNamespacedNamespaceAutoCreationWithPreexistingNs(t *testing.T) { - SkipOnEnv(t, "OPENSHIFT") - updatedNamespace := getNewNamespace(t) - defer func() { - if !t.Skipped() { - _, err := Run("", "kubectl", "delete", "namespace", updatedNamespace) - assert.NoError(t, err) - } - }() - - existingNs := ` -apiVersion: v1 -kind: Namespace -metadata: - name: %s - labels: - test: "true" - annotations: - something: "whatevs" -` - s := fmt.Sprintf(existingNs, updatedNamespace) - - tmpFile, err := os.CreateTemp("", "") - errors.CheckError(err) - _, err = tmpFile.Write([]byte(s)) - errors.CheckError(err) - - _, err = Run("", "kubectl", "apply", "-f", tmpFile.Name()) - assert.NoError(t, err) - - ctx := Given(t) - ctx. - SetAppNamespace(AppNamespace()). - SetTrackingMethod("annotation"). - Timeout(30). - Path("guestbook"). - When(). - CreateFromFile(func(app *Application) { - app.Spec.SyncPolicy = &SyncPolicy{ - SyncOptions: SyncOptions{"CreateNamespace=true"}, - ManagedNamespaceMetadata: &ManagedNamespaceMetadata{ - Labels: map[string]string{"foo": "bar"}, - Annotations: map[string]string{"bar": "bat"}, - }} - }). - Then(). - Expect(Namespace(updatedNamespace, func(app *Application, ns *v1.Namespace) { - assert.Empty(t, app.Status.Conditions) - - delete(ns.Labels, "kubernetes.io/metadata.name") - delete(ns.Annotations, "kubectl.kubernetes.io/last-applied-configuration") - - assert.Equal(t, map[string]string{"test": "true"}, ns.Labels) - assert.Equal(t, map[string]string{"something": "whatevs"}, ns.Annotations) - })). - When(). - AppSet("--dest-namespace", updatedNamespace). - Sync(). - Then(). - Expect(Success("")). - Expect(Namespace(updatedNamespace, func(app *Application, ns *v1.Namespace) { - assert.Empty(t, app.Status.Conditions) - - delete(ns.Labels, "kubernetes.io/metadata.name") - delete(ns.Labels, "argocd.argoproj.io/tracking-id") - delete(ns.Annotations, "argocd.argoproj.io/tracking-id") - delete(ns.Annotations, "kubectl.kubernetes.io/last-applied-configuration") - - assert.Equal(t, map[string]string{"test": "true", "foo": "bar"}, ns.Labels) - assert.Equal(t, map[string]string{"argocd.argoproj.io/sync-options": "ServerSideApply=true", "something": "whatevs", "bar": "bat"}, ns.Annotations) - })). - When(). - And(func() { - FailOnErr(AppClientset.ArgoprojV1alpha1().Applications(AppNamespace()).Patch(context.Background(), - ctx.GetName(), types.JSONPatchType, []byte(`[{ "op": "add", "path": "/spec/syncPolicy/managedNamespaceMetadata/annotations/something", "value": "hmm" }]`), metav1.PatchOptions{})) - }). - Sync(). - Then(). - Expect(Success("")). - Expect(Namespace(updatedNamespace, func(app *Application, ns *v1.Namespace) { - - assert.Empty(t, app.Status.Conditions) - - delete(ns.Labels, "kubernetes.io/metadata.name") - delete(ns.Labels, "argocd.argoproj.io/tracking-id") - delete(ns.Annotations, "kubectl.kubernetes.io/last-applied-configuration") - delete(ns.Annotations, "argocd.argoproj.io/tracking-id") - - assert.Equal(t, map[string]string{"test": "true", "foo": "bar"}, ns.Labels) - assert.Equal(t, map[string]string{"argocd.argoproj.io/sync-options": "ServerSideApply=true", "something": "hmm", "bar": "bat"}, ns.Annotations) - assert.Equal(t, map[string]string{"something": "hmm", "bar": "bat"}, app.Spec.SyncPolicy.ManagedNamespaceMetadata.Annotations) - })). - When(). - And(func() { - FailOnErr(AppClientset.ArgoprojV1alpha1().Applications(AppNamespace()).Patch(context.Background(), - ctx.GetName(), types.JSONPatchType, []byte(`[{ "op": "remove", "path": "/spec/syncPolicy/managedNamespaceMetadata/annotations/something" }]`), metav1.PatchOptions{})) - }). - Sync(). - Then(). - Expect(Success("")). - Expect(Namespace(updatedNamespace, func(app *Application, ns *v1.Namespace) { - - assert.Empty(t, app.Status.Conditions) - - delete(ns.Labels, "kubernetes.io/metadata.name") - delete(ns.Labels, "argocd.argoproj.io/tracking-id") - delete(ns.Annotations, "kubectl.kubernetes.io/last-applied-configuration") - delete(ns.Annotations, "argocd.argoproj.io/tracking-id") - - assert.Equal(t, map[string]string{"test": "true", "foo": "bar"}, ns.Labels) - assert.Equal(t, map[string]string{"argocd.argoproj.io/sync-options": "ServerSideApply=true", "bar": "bat"}, ns.Annotations) - assert.Equal(t, map[string]string{"bar": "bat"}, app.Spec.SyncPolicy.ManagedNamespaceMetadata.Annotations) - })). - Expect(OperationPhaseIs(OperationSucceeded)).Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", updatedNamespace, health.HealthStatusHealthy)). - Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", updatedNamespace, health.HealthStatusHealthy)). - Expect(ResourceSyncStatusWithNamespaceIs("Deployment", "guestbook-ui", updatedNamespace, SyncStatusCodeSynced)) -} - func TestNamespacedFailedSyncWithRetry(t *testing.T) { Given(t). SetAppNamespace(AppNamespace()). @@ -2202,8 +1932,8 @@ spec: assert.Equal(t, map[string]string{"labels.local/from-file": "file", "labels.local/from-args": "args"}, app.ObjectMeta.Labels) assert.Equal(t, map[string]string{"annotations.local/from-file": "file"}, app.ObjectMeta.Annotations) assert.Equal(t, []string{"resources-finalizer.argocd.argoproj.io"}, app.ObjectMeta.Finalizers) - assert.Equal(t, path, app.Spec.GetSource().Path) - assert.Equal(t, []HelmParameter{{Name: "foo", Value: "foo"}}, app.Spec.GetSource().Helm.Parameters) + assert.Equal(t, path, app.Spec.Source.Path) + assert.Equal(t, []HelmParameter{{Name: "foo", Value: "foo"}}, app.Spec.Source.Helm.Parameters) }) } diff --git a/test/e2e/app_management_test.go b/test/e2e/app_management_test.go index a1152d0f6495b..e7554644e3399 100644 --- a/test/e2e/app_management_test.go +++ b/test/e2e/app_management_test.go @@ -3,8 +3,10 @@ package e2e import ( "context" "fmt" + "math/rand" "reflect" "regexp" + "strings" "testing" "time" @@ -277,8 +279,8 @@ func TestAppCreation(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). And(func(app *Application) { assert.Equal(t, Name(), app.Name) - assert.Equal(t, RepoURL(RepoURLTypeFile), app.Spec.GetSource().RepoURL) - assert.Equal(t, guestbookPath, app.Spec.GetSource().Path) + assert.Equal(t, RepoURL(RepoURLTypeFile), app.Spec.Source.RepoURL) + assert.Equal(t, guestbookPath, app.Spec.Source.Path) assert.Equal(t, DeploymentNamespace(), app.Spec.Destination.Namespace) assert.Equal(t, KubernetesInternalAPIServerAddr, app.Spec.Destination.Server) }). @@ -306,7 +308,7 @@ func TestAppCreation(t *testing.T) { And(func(app *Application) { assert.Equal(t, "label", app.Labels["test"]) assert.Equal(t, "annotation", app.Annotations["test"]) - assert.Equal(t, "master", app.Spec.GetSource().TargetRevision) + assert.Equal(t, "master", app.Spec.Source.TargetRevision) }) } @@ -322,8 +324,8 @@ func TestAppCreationWithoutForceUpdate(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). And(func(app *Application) { assert.Equal(t, ctx.AppName(), app.Name) - assert.Equal(t, RepoURL(RepoURLTypeFile), app.Spec.GetSource().RepoURL) - assert.Equal(t, guestbookPath, app.Spec.GetSource().Path) + assert.Equal(t, RepoURL(RepoURLTypeFile), app.Spec.Source.RepoURL) + assert.Equal(t, guestbookPath, app.Spec.Source.Path) assert.Equal(t, DeploymentNamespace(), app.Spec.Destination.Namespace) assert.Equal(t, "in-cluster", app.Spec.Destination.Name) }). @@ -364,18 +366,23 @@ func TestDeleteAppResource(t *testing.T) { // demonstrate that we cannot use a standard sync when an immutable field is changed, we must use "force" func TestImmutableChange(t *testing.T) { SkipOnEnv(t, "OPENSHIFT") + text := FailOnErr(Run(".", "kubectl", "get", "service", "-n", "kube-system", "kube-dns", "-o", "jsonpath={.spec.clusterIP}")).(string) + parts := strings.Split(text, ".") + n := rand.Intn(254) + ip1 := fmt.Sprintf("%s.%s.%s.%d", parts[0], parts[1], parts[2], n) + ip2 := fmt.Sprintf("%s.%s.%s.%d", parts[0], parts[1], parts[2], n+1) Given(t). - Path("secrets"). + Path("service"). When(). CreateApp(). - PatchFile("secrets.yaml", `[{"op": "add", "path": "/data/new-field", "value": "dGVzdA=="}, {"op": "add", "path": "/immutable", "value": true}]`). + PatchFile("service.yaml", fmt.Sprintf(`[{"op": "add", "path": "/spec/clusterIP", "value": "%s"}]`, ip1)). Sync(). Then(). Expect(OperationPhaseIs(OperationSucceeded)). Expect(SyncStatusIs(SyncStatusCodeSynced)). Expect(HealthIs(health.HealthStatusHealthy)). When(). - PatchFile("secrets.yaml", `[{"op": "add", "path": "/data/new-field", "value": "dGVzdDI="}]`). + PatchFile("service.yaml", fmt.Sprintf(`[{"op": "add", "path": "/spec/clusterIP", "value": "%s"}]`, ip2)). IgnoreErrors(). Sync(). DoNotIgnoreErrors(). @@ -384,14 +391,14 @@ func TestImmutableChange(t *testing.T) { Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). Expect(ResourceResultNumbering(1)). Expect(ResourceResultMatches(ResourceResult{ - Kind: "Secret", + Kind: "Service", Version: "v1", Namespace: DeploymentNamespace(), - Name: "test-secret", + Name: "my-service", SyncPhase: "Sync", Status: "SyncFailed", HookPhase: "Failed", - Message: `Secret "test-secret" is invalid`, + Message: `Service "my-service" is invalid`, })). // now we can do this will a force Given(). @@ -494,12 +501,12 @@ func TestAppRollbackSuccessful(t *testing.T) { ID: 1, Revision: app.Status.Sync.Revision, DeployedAt: metav1.Time{Time: metav1.Now().UTC().Add(-1 * time.Minute)}, - Source: app.Spec.GetSource(), + Source: app.Spec.Source, }, { ID: 2, Revision: "cdb", DeployedAt: metav1.Time{Time: metav1.Now().UTC().Add(-2 * time.Minute)}, - Source: app.Spec.GetSource(), + Source: app.Spec.Source, }} patch, _, err := diff.CreateTwoWayMergePatch(app, appWithHistory, &Application{}) require.NoError(t, err) @@ -742,17 +749,6 @@ func TestResourceDiffing(t *testing.T) { }). Given(). When(). - // Now we migrate from client-side apply to server-side apply - // This is necessary, as starting with kubectl 1.26, all previously - // client-side owned fields have ownership migrated to the manager from - // the first ssa. - // More details: https://github.com/kubernetes/kubectl/issues/1337 - PatchApp(`[{ - "op": "add", - "path": "/spec/syncPolicy", - "value": { "syncOptions": ["ServerSideApply=true"] } - }]`). - 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) @@ -1358,8 +1354,8 @@ func TestSyncOptionValidateFalse(t *testing.T) { IgnoreErrors(). Sync(). Then(). - // client error. K8s API changed error message w/ 1.25, so for now, we need to check both - Expect(ErrorRegex("error validating data|of type int32", "")). + // client error + Expect(Error("error validating data", "")). When(). PatchFile("deployment.yaml", `[{"op": "add", "path": "/metadata/annotations", "value": {"argocd.argoproj.io/sync-options": "Validate=false"}}]`). Sync(). @@ -1907,8 +1903,8 @@ spec: assert.Equal(t, map[string]string{"labels.local/from-file": "file", "labels.local/from-args": "args"}, app.ObjectMeta.Labels) assert.Equal(t, map[string]string{"annotations.local/from-file": "file"}, app.ObjectMeta.Annotations) assert.Equal(t, []string{"resources-finalizer.argocd.argoproj.io"}, app.ObjectMeta.Finalizers) - assert.Equal(t, path, app.Spec.GetSource().Path) - assert.Equal(t, []HelmParameter{{Name: "foo", Value: "foo"}}, app.Spec.GetSource().Helm.Parameters) + assert.Equal(t, path, app.Spec.Source.Path) + assert.Equal(t, []HelmParameter{{Name: "foo", Value: "foo"}}, app.Spec.Source.Helm.Parameters) }) } diff --git a/test/e2e/app_multiple_sources_test.go b/test/e2e/app_multiple_sources_test.go deleted file mode 100644 index f7bf00c143d9b..0000000000000 --- a/test/e2e/app_multiple_sources_test.go +++ /dev/null @@ -1,165 +0,0 @@ -package e2e - -import ( - "testing" - - . "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" - . "github.com/argoproj/argo-cd/v2/util/argo" - "github.com/stretchr/testify/assert" -) - -func TestMultiSourceAppCreation(t *testing.T) { - sources := []ApplicationSource{{ - RepoURL: RepoURL(RepoURLTypeFile), - Path: guestbookPath, - }, { - RepoURL: RepoURL(RepoURLTypeFile), - Path: "two-nice-pods", - }} - ctx := Given(t) - ctx. - Sources(sources). - When(). - CreateMultiSourceAppFromFile(). - Then(). - Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). - And(func(app *Application) { - assert.Equal(t, Name(), app.Name) - for i, source := range app.Spec.GetSources() { - assert.Equal(t, sources[i].RepoURL, source.RepoURL) - assert.Equal(t, sources[i].Path, source.Path) - } - assert.Equal(t, DeploymentNamespace(), app.Spec.Destination.Namespace) - assert.Equal(t, KubernetesInternalAPIServerAddr, app.Spec.Destination.Server) - }). - Expect(Event(EventReasonResourceCreated, "create")). - And(func(_ *Application) { - // app should be listed - output, err := RunCli("app", "list") - assert.NoError(t, err) - assert.Contains(t, output, Name()) - }). - Expect(Success("")). - When().Refresh(RefreshTypeNormal).Then(). - Expect(Success("")). - And(func(app *Application) { - statusByName := map[string]SyncStatusCode{} - for _, r := range app.Status.Resources { - statusByName[r.Name] = r.Status - } - // check if the app has 3 resources, guestbook and 2 pods - assert.Len(t, statusByName, 3) - assert.Equal(t, SyncStatusCodeSynced, statusByName["pod-1"]) - assert.Equal(t, SyncStatusCodeSynced, statusByName["pod-2"]) - assert.Equal(t, SyncStatusCodeSynced, statusByName["guestbook-ui"]) - }) -} - -func TestMultiSourceAppWithHelmExternalValueFiles(t *testing.T) { - sources := []ApplicationSource{{ - RepoURL: RepoURL(RepoURLTypeFile), - Ref: "values", - }, { - RepoURL: "https://github.com/argoproj/argocd-example-apps.git", - TargetRevision: "HEAD", - Path: "helm-guestbook", - Helm: &ApplicationSourceHelm{ - ReleaseName: "helm-guestbook", - ValueFiles: []string{ - "$values/multiple-source-values/values.yaml", - }, - }, - }} - ctx := Given(t) - ctx. - Sources(sources). - When(). - CreateMultiSourceAppFromFile(). - Then(). - Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). - And(func(app *Application) { - assert.Equal(t, Name(), app.Name) - for i, source := range app.Spec.GetSources() { - assert.Equal(t, sources[i].RepoURL, source.RepoURL) - assert.Equal(t, sources[i].Path, source.Path) - } - assert.Equal(t, DeploymentNamespace(), app.Spec.Destination.Namespace) - assert.Equal(t, KubernetesInternalAPIServerAddr, app.Spec.Destination.Server) - }). - Expect(Event(EventReasonResourceCreated, "create")). - And(func(_ *Application) { - // app should be listed - output, err := RunCli("app", "list") - assert.NoError(t, err) - assert.Contains(t, output, Name()) - }). - Expect(Success("")). - When().Refresh(RefreshTypeNormal).Then(). - Expect(Success("")). - And(func(app *Application) { - statusByName := map[string]SyncStatusCode{} - for _, r := range app.Status.Resources { - statusByName[r.Name] = r.Status - } - // check if the app has 3 resources, guestbook and 2 pods - assert.Len(t, statusByName, 1) - assert.Equal(t, SyncStatusCodeSynced, statusByName["helm-guestbook"]) - }) -} - -func TestMultiSourceAppWithSourceOverride(t *testing.T) { - sources := []ApplicationSource{{ - RepoURL: RepoURL(RepoURLTypeFile), - Path: guestbookPath, - }, { - RepoURL: RepoURL(RepoURLTypeFile), - Path: "two-nice-pods", - }, { - RepoURL: RepoURL(RepoURLTypeFile), - Path: "multiple-source-values", - }} - ctx := Given(t) - ctx. - Sources(sources). - When(). - CreateMultiSourceAppFromFile(). - Then(). - Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). - And(func(app *Application) { - assert.Equal(t, Name(), app.Name) - for i, source := range app.Spec.GetSources() { - assert.Equal(t, sources[i].RepoURL, source.RepoURL) - assert.Equal(t, sources[i].Path, source.Path) - } - assert.Equal(t, DeploymentNamespace(), app.Spec.Destination.Namespace) - assert.Equal(t, KubernetesInternalAPIServerAddr, app.Spec.Destination.Server) - }). - Expect(Event(EventReasonResourceCreated, "create")). - And(func(_ *Application) { - // app should be listed - output, err := RunCli("app", "list") - assert.NoError(t, err) - assert.Contains(t, output, Name()) - }). - Expect(Success("")). - When().Refresh(RefreshTypeNormal).Then(). - Expect(Success("")). - And(func(app *Application) { - statusByName := map[string]SyncStatusCode{} - for _, r := range app.Status.Resources { - statusByName[r.Name] = r.Status - } - // check if the app has 3 resources, guestbook and 2 pods - assert.Len(t, statusByName, 3) - assert.Equal(t, SyncStatusCodeSynced, statusByName["pod-1"]) - assert.Equal(t, SyncStatusCodeSynced, statusByName["pod-2"]) - assert.Equal(t, SyncStatusCodeSynced, statusByName["guestbook-ui"]) - - // 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) - assert.Contains(t, output, "foo=bar") - }) -} diff --git a/test/e2e/app_namespaces_test.go b/test/e2e/app_namespaces_test.go index d66cbaa1494ef..8ee41aa0d7f2b 100644 --- a/test/e2e/app_namespaces_test.go +++ b/test/e2e/app_namespaces_test.go @@ -28,8 +28,8 @@ func TestAppCreationInOtherNamespace(t *testing.T) { And(func(app *Application) { assert.Equal(t, ctx.AppName(), app.Name) assert.Equal(t, AppNamespace(), app.Namespace) - assert.Equal(t, RepoURL(RepoURLTypeFile), app.Spec.GetSource().RepoURL) - assert.Equal(t, guestbookPath, app.Spec.GetSource().Path) + assert.Equal(t, RepoURL(RepoURLTypeFile), app.Spec.Source.RepoURL) + assert.Equal(t, guestbookPath, app.Spec.Source.Path) assert.Equal(t, DeploymentNamespace(), app.Spec.Destination.Namespace) assert.Equal(t, KubernetesInternalAPIServerAddr, app.Spec.Destination.Server) }). @@ -57,7 +57,7 @@ func TestAppCreationInOtherNamespace(t *testing.T) { And(func(app *Application) { assert.Equal(t, "label", app.Labels["test"]) assert.Equal(t, "annotation", app.Annotations["test"]) - assert.Equal(t, "master", app.Spec.GetSource().TargetRevision) + assert.Equal(t, "master", app.Spec.Source.TargetRevision) }) } diff --git a/test/e2e/applicationset_test.go b/test/e2e/applicationset_test.go index 913eb73079de1..8ff2e1b67cf97 100644 --- a/test/e2e/applicationset_test.go +++ b/test/e2e/applicationset_test.go @@ -1,9 +1,6 @@ package e2e import ( - "io" - "net/http" - "net/http/httptest" "strings" "testing" "time" @@ -57,7 +54,7 @@ func TestSimpleListGenerator(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -81,7 +78,7 @@ func TestSimpleListGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{cluster}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -149,7 +146,7 @@ func TestSimpleListGeneratorGoTemplate(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -174,7 +171,7 @@ func TestSimpleListGeneratorGoTemplate(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{.cluster}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -242,7 +239,7 @@ func TestSimpleGitDirectoryGenerator(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: name, @@ -275,7 +272,7 @@ func TestSimpleGitDirectoryGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{path.basename}}"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "{{path}}", @@ -351,7 +348,7 @@ func TestSimpleGitDirectoryGeneratorGoTemplate(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: name, @@ -385,7 +382,7 @@ func TestSimpleGitDirectoryGeneratorGoTemplate(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{.path.basename}}"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "{{.path.path}}", @@ -462,7 +459,7 @@ func TestSimpleGitFilesGenerator(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -494,7 +491,7 @@ func TestSimpleGitFilesGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{cluster.name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -571,7 +568,7 @@ func TestSimpleGitFilesGeneratorGoTemplate(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -604,7 +601,7 @@ func TestSimpleGitFilesGeneratorGoTemplate(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{.cluster.name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -680,7 +677,7 @@ func TestSimpleGitFilesPreserveResourcesOnDeletion(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{cluster.name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -741,7 +738,7 @@ func TestSimpleGitFilesPreserveResourcesOnDeletionGoTemplate(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{.cluster.name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -787,215 +784,21 @@ func TestSimpleGitFilesPreserveResourcesOnDeletionGoTemplate(t *testing.T) { }).Then().Expect(Pod(func(p corev1.Pod) bool { return strings.Contains(p.Name, "guestbook-ui") })) } -func githubSCMMockHandler(t *testing.T) func(http.ResponseWriter, *http.Request) { - return func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - switch r.RequestURI { - case "/api/v3/orgs/argoproj/repos?per_page=100": - _, err := io.WriteString(w, `[ - { - "id": 1296269, - "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5", - "name": "argo-cd", - "full_name": "argoproj/argo-cd", - "owner": { - "login": "argoproj", - "id": 1, - "node_id": "MDQ6VXNlcjE=", - "avatar_url": "https://github.com/images/error/argoproj_happy.gif", - "gravatar_id": "", - "url": "https://api.github.com/users/argoproj", - "html_url": "https://github.com/argoproj", - "followers_url": "https://api.github.com/users/argoproj/followers", - "following_url": "https://api.github.com/users/argoproj/following{/other_user}", - "gists_url": "https://api.github.com/users/argoproj/gists{/gist_id}", - "starred_url": "https://api.github.com/users/argoproj/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/argoproj/subscriptions", - "organizations_url": "https://api.github.com/users/argoproj/orgs", - "repos_url": "https://api.github.com/users/argoproj/repos", - "events_url": "https://api.github.com/users/argoproj/events{/privacy}", - "received_events_url": "https://api.github.com/users/argoproj/received_events", - "type": "User", - "site_admin": false - }, - "private": false, - "html_url": "https://github.com/argoproj/argo-cd", - "description": "This your first repo!", - "fork": false, - "url": "https://api.github.com/repos/argoproj/argo-cd", - "archive_url": "https://api.github.com/repos/argoproj/argo-cd/{archive_format}{/ref}", - "assignees_url": "https://api.github.com/repos/argoproj/argo-cd/assignees{/user}", - "blobs_url": "https://api.github.com/repos/argoproj/argo-cd/git/blobs{/sha}", - "branches_url": "https://api.github.com/repos/argoproj/argo-cd/branches{/branch}", - "collaborators_url": "https://api.github.com/repos/argoproj/argo-cd/collaborators{/collaborator}", - "comments_url": "https://api.github.com/repos/argoproj/argo-cd/comments{/number}", - "commits_url": "https://api.github.com/repos/argoproj/argo-cd/commits{/sha}", - "compare_url": "https://api.github.com/repos/argoproj/argo-cd/compare/{base}...{head}", - "contents_url": "https://api.github.com/repos/argoproj/argo-cd/contents/{path}", - "contributors_url": "https://api.github.com/repos/argoproj/argo-cd/contributors", - "deployments_url": "https://api.github.com/repos/argoproj/argo-cd/deployments", - "downloads_url": "https://api.github.com/repos/argoproj/argo-cd/downloads", - "events_url": "https://api.github.com/repos/argoproj/argo-cd/events", - "forks_url": "https://api.github.com/repos/argoproj/argo-cd/forks", - "git_commits_url": "https://api.github.com/repos/argoproj/argo-cd/git/commits{/sha}", - "git_refs_url": "https://api.github.com/repos/argoproj/argo-cd/git/refs{/sha}", - "git_tags_url": "https://api.github.com/repos/argoproj/argo-cd/git/tags{/sha}", - "git_url": "git:github.com/argoproj/argo-cd.git", - "issue_comment_url": "https://api.github.com/repos/argoproj/argo-cd/issues/comments{/number}", - "issue_events_url": "https://api.github.com/repos/argoproj/argo-cd/issues/events{/number}", - "issues_url": "https://api.github.com/repos/argoproj/argo-cd/issues{/number}", - "keys_url": "https://api.github.com/repos/argoproj/argo-cd/keys{/key_id}", - "labels_url": "https://api.github.com/repos/argoproj/argo-cd/labels{/name}", - "languages_url": "https://api.github.com/repos/argoproj/argo-cd/languages", - "merges_url": "https://api.github.com/repos/argoproj/argo-cd/merges", - "milestones_url": "https://api.github.com/repos/argoproj/argo-cd/milestones{/number}", - "notifications_url": "https://api.github.com/repos/argoproj/argo-cd/notifications{?since,all,participating}", - "pulls_url": "https://api.github.com/repos/argoproj/argo-cd/pulls{/number}", - "releases_url": "https://api.github.com/repos/argoproj/argo-cd/releases{/id}", - "ssh_url": "git@github.com:argoproj/argo-cd.git", - "stargazers_url": "https://api.github.com/repos/argoproj/argo-cd/stargazers", - "statuses_url": "https://api.github.com/repos/argoproj/argo-cd/statuses/{sha}", - "subscribers_url": "https://api.github.com/repos/argoproj/argo-cd/subscribers", - "subscription_url": "https://api.github.com/repos/argoproj/argo-cd/subscription", - "tags_url": "https://api.github.com/repos/argoproj/argo-cd/tags", - "teams_url": "https://api.github.com/repos/argoproj/argo-cd/teams", - "trees_url": "https://api.github.com/repos/argoproj/argo-cd/git/trees{/sha}", - "clone_url": "https://github.com/argoproj/argo-cd.git", - "mirror_url": "git:git.example.com/argoproj/argo-cd", - "hooks_url": "https://api.github.com/repos/argoproj/argo-cd/hooks", - "svn_url": "https://svn.github.com/argoproj/argo-cd", - "homepage": "https://github.com", - "language": null, - "forks_count": 9, - "stargazers_count": 80, - "watchers_count": 80, - "size": 108, - "default_branch": "master", - "open_issues_count": 0, - "is_template": false, - "topics": [ - "argoproj", - "atom", - "electron", - "api" - ], - "has_issues": true, - "has_projects": true, - "has_wiki": true, - "has_pages": false, - "has_downloads": true, - "archived": false, - "disabled": false, - "visibility": "public", - "pushed_at": "2011-01-26T19:06:43Z", - "created_at": "2011-01-26T19:01:12Z", - "updated_at": "2011-01-26T19:14:43Z", - "permissions": { - "admin": false, - "push": false, - "pull": true - }, - "template_repository": null - } - ]`) - if err != nil { - t.Fail() - } - case "/api/v3/repos/argoproj/argo-cd/branches?per_page=100": - _, err := io.WriteString(w, `[ - { - "name": "master", - "commit": { - "sha": "c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc", - "url": "https://api.github.com/repos/argoproj/argo-cd/commits/c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc" - }, - "protected": true, - "protection": { - "required_status_checks": { - "enforcement_level": "non_admins", - "contexts": [ - "ci-test", - "linter" - ] - } - }, - "protection_url": "https://api.github.com/repos/argoproj/hello-world/branches/master/protection" - } - ] - `) - if err != nil { - t.Fail() - } - case "/api/v3/repos/argoproj/argo-cd/contents/pkg?ref=master": - _, err := io.WriteString(w, `{ - "type": "file", - "encoding": "base64", - "size": 5362, - "name": "pkg/", - "path": "pkg/", - "content": "encoded content ...", - "sha": "3d21ec53a331a6f037a91c368710b99387d012c1", - "url": "https://api.github.com/repos/octokit/octokit.rb/contents/README.md", - "git_url": "https://api.github.com/repos/octokit/octokit.rb/git/blobs/3d21ec53a331a6f037a91c368710b99387d012c1", - "html_url": "https://github.com/octokit/octokit.rb/blob/master/README.md", - "download_url": "https://raw.githubusercontent.com/octokit/octokit.rb/master/README.md", - "_links": { - "git": "https://api.github.com/repos/octokit/octokit.rb/git/blobs/3d21ec53a331a6f037a91c368710b99387d012c1", - "self": "https://api.github.com/repos/octokit/octokit.rb/contents/README.md", - "html": "https://github.com/octokit/octokit.rb/blob/master/README.md" - } - }`) - if err != nil { - t.Fail() - } - case "/api/v3/repos/argoproj/argo-cd/branches/master": - _, err := io.WriteString(w, `{ - "name": "master", - "commit": { - "sha": "c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc", - "url": "https://api.github.com/repos/octocat/Hello-World/commits/c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc" - }, - "protected": true, - "protection": { - "required_status_checks": { - "enforcement_level": "non_admins", - "contexts": [ - "ci-test", - "linter" - ] - } - }, - "protection_url": "https://api.github.com/repos/octocat/hello-world/branches/master/protection" - }`) - if err != nil { - t.Fail() - } - default: - w.WriteHeader(404) - } - } -} - func TestSimpleSCMProviderGenerator(t *testing.T) { - // Use mocked API response to avoid rate-limiting. - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - githubSCMMockHandler(t)(w, r) - })) - expectedApp := argov1alpha1.Application{ TypeMeta: metav1.TypeMeta{ Kind: "Application", APIVersion: "argoproj.io/v1alpha1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "argo-cd-guestbook", + Name: "argocd-example-apps-guestbook", Namespace: utils.ArgoCDNamespace, Finalizers: []string{"resources-finalizer.argocd.argoproj.io"}, }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ - RepoURL: "git@github.com:argoproj/argo-cd.git", + Source: argov1alpha1.ApplicationSource{ + RepoURL: "git@github.com:argoproj/argocd-example-apps.git", TargetRevision: "master", Path: "guestbook", }, @@ -1007,7 +810,7 @@ func TestSimpleSCMProviderGenerator(t *testing.T) { } // Because you can't &"". - repoMatch := "argo-cd" + repoMatch := "example-apps" Given(t). // Create an SCMProviderGenerator-based ApplicationSet @@ -1019,7 +822,7 @@ func TestSimpleSCMProviderGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{ repository }}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "{{ url }}", TargetRevision: "{{ branch }}", Path: "guestbook", @@ -1035,7 +838,6 @@ func TestSimpleSCMProviderGenerator(t *testing.T) { SCMProvider: &v1alpha1.SCMProviderGenerator{ Github: &v1alpha1.SCMProviderGeneratorGithub{ Organization: "argoproj", - API: ts.URL, }, Filters: []v1alpha1.SCMProviderGeneratorFilter{ { @@ -1050,25 +852,20 @@ func TestSimpleSCMProviderGenerator(t *testing.T) { } func TestSimpleSCMProviderGeneratorGoTemplate(t *testing.T) { - // Use mocked API response to avoid rate-limiting. - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - githubSCMMockHandler(t)(w, r) - })) - expectedApp := argov1alpha1.Application{ TypeMeta: metav1.TypeMeta{ Kind: "Application", APIVersion: "argoproj.io/v1alpha1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "argo-cd-guestbook", + Name: "argocd-example-apps-guestbook", Namespace: utils.ArgoCDNamespace, Finalizers: []string{"resources-finalizer.argocd.argoproj.io"}, }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ - RepoURL: "git@github.com:argoproj/argo-cd.git", + Source: argov1alpha1.ApplicationSource{ + RepoURL: "git@github.com:argoproj/argocd-example-apps.git", TargetRevision: "master", Path: "guestbook", }, @@ -1080,7 +877,7 @@ func TestSimpleSCMProviderGeneratorGoTemplate(t *testing.T) { } // Because you can't &"". - repoMatch := "argo-cd" + repoMatch := "example-apps" Given(t). // Create an SCMProviderGenerator-based ApplicationSet @@ -1093,7 +890,7 @@ func TestSimpleSCMProviderGeneratorGoTemplate(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{ .repository }}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "{{ .url }}", TargetRevision: "{{ .branch }}", Path: "guestbook", @@ -1109,7 +906,6 @@ func TestSimpleSCMProviderGeneratorGoTemplate(t *testing.T) { SCMProvider: &v1alpha1.SCMProviderGenerator{ Github: &v1alpha1.SCMProviderGeneratorGithub{ Organization: "argoproj", - API: ts.URL, }, Filters: []v1alpha1.SCMProviderGeneratorFilter{ { @@ -1136,7 +932,7 @@ func TestCustomApplicationFinalizers(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -1161,7 +957,7 @@ func TestCustomApplicationFinalizers(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -1202,7 +998,7 @@ func TestCustomApplicationFinalizersGoTemplate(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -1228,7 +1024,7 @@ func TestCustomApplicationFinalizersGoTemplate(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -1256,39 +1052,11 @@ func TestCustomApplicationFinalizersGoTemplate(t *testing.T) { Delete().Then().Expect(ApplicationsDoNotExist([]argov1alpha1.Application{expectedApp})) } -func githubPullMockHandler(t *testing.T) func(http.ResponseWriter, *http.Request) { - return func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - switch r.RequestURI { - case "/api/v3/repos/applicationset-test-org/argocd-example-apps/pulls?per_page=100": - _, err := io.WriteString(w, `[ - { - "number": 1, - "labels": [ - { - "name": "preview" - } - ], - "head": { - "ref": "pull-request", - "sha": "824a5c987fdfb2b0629e9dbf5f31636c69ba4772" - } - } -]`) - if err != nil { - t.Fail() - } - default: - w.WriteHeader(404) - } - } -} - func TestSimplePullRequestGenerator(t *testing.T) { - // Use mocked API response to avoid rate-limiting. - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - githubPullMockHandler(t)(w, r) - })) + + if utils.IsGitHubAPISkippedTest(t) { + return + } expectedApp := argov1alpha1.Application{ TypeMeta: metav1.TypeMeta{ @@ -1302,7 +1070,7 @@ func TestSimplePullRequestGenerator(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "git@github.com:applicationset-test-org/argocd-example-apps.git", TargetRevision: "824a5c987fdfb2b0629e9dbf5f31636c69ba4772", Path: "kustomize-guestbook", @@ -1327,7 +1095,7 @@ func TestSimplePullRequestGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "guestbook-{{ number }}"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "git@github.com:applicationset-test-org/argocd-example-apps.git", TargetRevision: "{{ head_sha }}", Path: "kustomize-guestbook", @@ -1345,7 +1113,6 @@ func TestSimplePullRequestGenerator(t *testing.T) { { PullRequest: &v1alpha1.PullRequestGenerator{ Github: &v1alpha1.PullRequestGeneratorGithub{ - API: ts.URL, Owner: "applicationset-test-org", Repo: "argocd-example-apps", Labels: []string{ @@ -1360,10 +1127,10 @@ func TestSimplePullRequestGenerator(t *testing.T) { } func TestSimplePullRequestGeneratorGoTemplate(t *testing.T) { - // Use mocked API response to avoid rate-limiting. - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - githubPullMockHandler(t)(w, r) - })) + + if utils.IsGitHubAPISkippedTest(t) { + return + } expectedApp := argov1alpha1.Application{ TypeMeta: metav1.TypeMeta{ @@ -1374,11 +1141,10 @@ func TestSimplePullRequestGeneratorGoTemplate(t *testing.T) { Name: "guestbook-1", Namespace: utils.ArgoCDNamespace, Finalizers: []string{"resources-finalizer.argocd.argoproj.io"}, - Labels: map[string]string{"app": "preview"}, }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "git@github.com:applicationset-test-org/argocd-example-apps.git", TargetRevision: "824a5c987fdfb2b0629e9dbf5f31636c69ba4772", Path: "kustomize-guestbook", @@ -1401,12 +1167,10 @@ func TestSimplePullRequestGeneratorGoTemplate(t *testing.T) { Spec: v1alpha1.ApplicationSetSpec{ GoTemplate: true, Template: v1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ - Name: "guestbook-{{ .number }}", - Labels: map[string]string{"app": "{{index .labels 0}}"}}, + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "guestbook-{{ .number }}"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "git@github.com:applicationset-test-org/argocd-example-apps.git", TargetRevision: "{{ .head_sha }}", Path: "kustomize-guestbook", @@ -1424,7 +1188,6 @@ func TestSimplePullRequestGeneratorGoTemplate(t *testing.T) { { PullRequest: &v1alpha1.PullRequestGenerator{ Github: &v1alpha1.PullRequestGeneratorGithub{ - API: ts.URL, Owner: "applicationset-test-org", Repo: "argocd-example-apps", Labels: []string{ @@ -1453,7 +1216,7 @@ func TestGitGeneratorPrivateRepo(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: fixture.RepoURL(fixture.RepoURLTypeHTTPS), TargetRevision: "HEAD", Path: name, @@ -1483,7 +1246,7 @@ func TestGitGeneratorPrivateRepo(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{path.basename}}"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: fixture.RepoURL(fixture.RepoURLTypeHTTPS), TargetRevision: "HEAD", Path: "{{path}}", @@ -1528,7 +1291,7 @@ func TestGitGeneratorPrivateRepoGoTemplate(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: fixture.RepoURL(fixture.RepoURLTypeHTTPS), TargetRevision: "HEAD", Path: name, @@ -1559,7 +1322,7 @@ func TestGitGeneratorPrivateRepoGoTemplate(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{.path.basename}}"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: fixture.RepoURL(fixture.RepoURLTypeHTTPS), TargetRevision: "HEAD", Path: "{{.path.path}}", diff --git a/test/e2e/cluster_generator_test.go b/test/e2e/cluster_generator_test.go index c09fc9ed2fa34..dd3b98000bb31 100644 --- a/test/e2e/cluster_generator_test.go +++ b/test/e2e/cluster_generator_test.go @@ -26,7 +26,7 @@ func TestSimpleClusterGenerator(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -53,7 +53,7 @@ func TestSimpleClusterGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -119,7 +119,7 @@ func TestClusterGeneratorWithLocalCluster(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -177,7 +177,7 @@ func TestClusterGeneratorWithLocalCluster(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -236,7 +236,7 @@ func TestSimpleClusterGeneratorAddingCluster(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -268,7 +268,7 @@ func TestSimpleClusterGeneratorAddingCluster(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -318,7 +318,7 @@ func TestSimpleClusterGeneratorDeletingCluster(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -351,7 +351,7 @@ func TestSimpleClusterGeneratorDeletingCluster(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", diff --git a/test/e2e/cluster_test.go b/test/e2e/cluster_test.go index 671acb735e193..b29e069a648ab 100644 --- a/test/e2e/cluster_test.go +++ b/test/e2e/cluster_test.go @@ -133,25 +133,6 @@ func TestClusterListDenied(t *testing.T) { }) } -func TestClusterSet(t *testing.T) { - EnsureCleanState(t) - defer RecordTestRun(t) - clusterFixture. - GivenWithSameState(t). - Project(ProjectName). - Name("in-cluster"). - Namespaces([]string{"namespace-edit-1", "namespace-edit-2"}). - Server(KubernetesInternalAPIServerAddr). - When(). - SetNamespaces(). - GetByName("in-cluster"). - Then(). - AndCLIOutput(func(output string, err error) { - assert.True(t, strings.Contains(output, "namespace-edit-1")) - assert.True(t, strings.Contains(output, "namespace-edit-2")) - }) -} - func TestClusterGet(t *testing.T) { SkipIfAlreadyRun(t) EnsureCleanState(t) @@ -296,7 +277,7 @@ func TestClusterDelete(t *testing.T) { _, err = fixture.Run("", "kubectl", "get", "clusterrolebinding", "argocd-manager-role-binding") if err != nil { - t.Errorf("Expected no error from not finding clusterrolebinding argocd-manager-role-binding but got:\n%s", err.Error()) + t.Errorf("Expected no error from not finding clusterrole argocd-manager-role but got:\n%s", err.Error()) } clstAction.DeleteByName(). @@ -318,6 +299,6 @@ func TestClusterDelete(t *testing.T) { output, err = fixture.Run("", "kubectl", "get", "clusterrolebinding", "argocd-manager-role-binding") if err == nil { - t.Errorf("Expected error from not finding clusterrolebinding argocd-manager-role-binding but got:\n%s", output) + t.Errorf("Expected error from not finding clusterrole argocd-manager-role but got:\n%s", output) } } diff --git a/test/e2e/clusterdecisiongenerator_e2e_test.go b/test/e2e/clusterdecisiongenerator_e2e_test.go index 44993dd409fde..5a352f191e1d4 100644 --- a/test/e2e/clusterdecisiongenerator_e2e_test.go +++ b/test/e2e/clusterdecisiongenerator_e2e_test.go @@ -27,7 +27,7 @@ func TestSimpleClusterDecisionResourceGenerator(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -65,7 +65,7 @@ func TestSimpleClusterDecisionResourceGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -129,7 +129,7 @@ func TestSimpleClusterDecisionResourceGeneratorAddingCluster(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -176,7 +176,7 @@ func TestSimpleClusterDecisionResourceGeneratorAddingCluster(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -224,7 +224,7 @@ func TestSimpleClusterDecisionResourceGeneratorDeletingClusterSecret(t *testing. }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -272,7 +272,7 @@ func TestSimpleClusterDecisionResourceGeneratorDeletingClusterSecret(t *testing. ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -321,7 +321,7 @@ func TestSimpleClusterDecisionResourceGeneratorDeletingClusterFromResource(t *te }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", @@ -376,7 +376,7 @@ func TestSimpleClusterDecisionResourceGeneratorDeletingClusterFromResource(t *te ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{name}}-guestbook"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "guestbook", diff --git a/test/e2e/custom_tool_test.go b/test/e2e/custom_tool_test.go index cd587f42693b6..18b9d5ecfb3e1 100644 --- a/test/e2e/custom_tool_test.go +++ b/test/e2e/custom_tool_test.go @@ -113,7 +113,7 @@ func TestCustomToolWithEnv(t *testing.T) { Path("guestbook"). When(). CreateFromFile(func(app *Application) { - app.Spec.GetSource().Plugin.Env = Env{{ + app.Spec.Source.Plugin.Env = Env{{ Name: "FOO", Value: "bar", }} @@ -240,27 +240,6 @@ func TestCMPDiscoverWithFindGlob(t *testing.T) { Expect(HealthIs(health.HealthStatusHealthy)) } -//Discover by Plugin Name -func TestCMPDiscoverWithPluginName(t *testing.T) { - Given(t). - And(func() { - go startCMPServer("./testdata/cmp-find-glob") - time.Sleep(1 * time.Second) - os.Setenv("ARGOCD_BINARY_NAME", "argocd") - }). - Path("guestbook"). - When(). - CreateFromFile(func(app *Application) { - // specifically mention the plugin to use (name is based on - - app.Spec.Source.Plugin = &ApplicationSourcePlugin{Name: "cmp-find-glob-v1.0"} - }). - Sync(). - Then(). - Expect(OperationPhaseIs(OperationSucceeded)). - Expect(SyncStatusIs(SyncStatusCodeSynced)). - Expect(HealthIs(health.HealthStatusHealthy)) -} - //Discover by Find command func TestCMPDiscoverWithFindCommandWithEnv(t *testing.T) { pluginName := "cmp-find-command" diff --git a/test/e2e/fixture/app/actions.go b/test/e2e/fixture/app/actions.go index c8df055f1b8ac..928ca39b651fd 100644 --- a/test/e2e/fixture/app/actions.go +++ b/test/e2e/fixture/app/actions.go @@ -95,7 +95,7 @@ func (a *Actions) CreateFromFile(handler func(app *Application), flags ...string }, Spec: ApplicationSpec{ Project: a.context.project, - Source: &ApplicationSource{ + Source: ApplicationSource{ RepoURL: fixture.RepoURL(a.context.repoURLType), Path: a.context.path, }, @@ -105,15 +105,14 @@ func (a *Actions) CreateFromFile(handler func(app *Application), flags ...string }, }, } - source := app.Spec.GetSource() if a.context.namePrefix != "" || a.context.nameSuffix != "" { - source.Kustomize = &ApplicationSourceKustomize{ + app.Spec.Source.Kustomize = &ApplicationSourceKustomize{ NamePrefix: a.context.namePrefix, NameSuffix: a.context.nameSuffix, } } if a.context.configManagementPlugin != "" { - source.Plugin = &ApplicationSourcePlugin{ + app.Spec.Source.Plugin = &ApplicationSourcePlugin{ Name: a.context.configManagementPlugin, } } @@ -123,9 +122,8 @@ func (a *Actions) CreateFromFile(handler func(app *Application), flags ...string } if a.context.directoryRecurse { - source.Directory = &ApplicationSourceDirectory{Recurse: true} + app.Spec.Source.Directory = &ApplicationSourceDirectory{Recurse: true} } - app.Spec.Source = &source handler(app) data := grpc.MustMarshal(app) @@ -143,43 +141,6 @@ func (a *Actions) CreateFromFile(handler func(app *Application), flags ...string return a } -func (a *Actions) CreateMultiSourceAppFromFile(flags ...string) *Actions { - a.context.t.Helper() - app := &Application{ - ObjectMeta: v1.ObjectMeta{ - Name: a.context.AppName(), - Namespace: a.context.AppNamespace(), - }, - Spec: ApplicationSpec{ - Project: a.context.project, - Sources: a.context.sources, - Destination: ApplicationDestination{ - Server: a.context.destServer, - Namespace: fixture.DeploymentNamespace(), - }, - SyncPolicy: &SyncPolicy{ - Automated: &SyncPolicyAutomated{ - SelfHeal: true, - }, - }, - }, - } - - data := grpc.MustMarshal(app) - tmpFile, err := os.CreateTemp("", "") - errors.CheckError(err) - _, err = tmpFile.Write(data) - errors.CheckError(err) - - args := append([]string{ - "app", "create", - "-f", tmpFile.Name(), - }, flags...) - defer tmpFile.Close() - a.runCli(args...) - return a -} - func (a *Actions) CreateWithNoNameSpace(args ...string) *Actions { args = a.prepareCreateAppArgs(args) // are you adding new context values? if you only use them for this func, then use args instead @@ -310,9 +271,6 @@ func (a *Actions) Sync(args ...string) *Actions { } if a.context.resource != "" { - // Waiting for the app to be successfully created. - // Else the sync would fail to retrieve the app resources. - a.context.Sleep(5) args = append(args, "--resource", a.context.resource) } diff --git a/test/e2e/fixture/app/context.go b/test/e2e/fixture/app/context.go index 0aa94a33ac906..923884cb69fa6 100644 --- a/test/e2e/fixture/app/context.go +++ b/test/e2e/fixture/app/context.go @@ -43,7 +43,6 @@ type Context struct { helmPassCredentials bool helmSkipCrds bool trackingMethod v1alpha1.TrackingMethod - sources []v1alpha1.ApplicationSource } type ContextArgs struct { @@ -366,8 +365,3 @@ func (c *Context) SetTrackingMethod(trackingMethod string) *Context { func (c *Context) GetTrackingMethod() v1alpha1.TrackingMethod { return c.trackingMethod } - -func (c *Context) Sources(sources []v1alpha1.ApplicationSource) *Context { - c.sources = sources - return c -} diff --git a/test/e2e/fixture/app/expectation.go b/test/e2e/fixture/app/expectation.go index 14f978c84a402..e06d2462461e7 100644 --- a/test/e2e/fixture/app/expectation.go +++ b/test/e2e/fixture/app/expectation.go @@ -87,19 +87,6 @@ func NoConditions() Expectation { } } -func Namespace(name string, block func(app *Application, ns *v1.Namespace)) Expectation { - return func(c *Consequences) (state, string) { - ns, err := namespace(name) - - if err != nil { - return failed, fmt.Sprintf("namespace not found %s", err.Error()) - } - - block(c.app(), ns) - return succeeded, fmt.Sprintf("namespace %s assertions passed", name) - } -} - func HealthIs(expected health.HealthStatusCode) Expectation { return func(c *Consequences) (state, string) { actual := c.app().Status.Health.Status @@ -231,23 +218,6 @@ func pods() (*v1.PodList, error) { return pods, err } -func NoNamespace(name string) Expectation { - return func(c *Consequences) (state, string) { - _, err := namespace(name) - - if err != nil { - return succeeded, "namespace not found" - } - - return failed, fmt.Sprintf("found namespace %s", name) - } -} - -func namespace(name string) (*v1.Namespace, error) { - fixture.KubeClientset.CoreV1() - return fixture.KubeClientset.CoreV1().Namespaces().Get(context.Background(), name, metav1.GetOptions{}) -} - func event(namespace string, reason string, message string) Expectation { return func(c *Consequences) (state, string) { list, err := fixture.KubeClientset.CoreV1().Events(namespace).List(context.Background(), metav1.ListOptions{ diff --git a/test/e2e/fixture/applicationsets/expectation.go b/test/e2e/fixture/applicationsets/expectation.go index e8be81b906d7e..592ef34ef3907 100644 --- a/test/e2e/fixture/applicationsets/expectation.go +++ b/test/e2e/fixture/applicationsets/expectation.go @@ -192,10 +192,10 @@ func filterFields(input argov1alpha1.Application) argov1alpha1.Application { Finalizers: metaCopy.Finalizers, }, Spec: argov1alpha1.ApplicationSpec{ - Source: &argov1alpha1.ApplicationSource{ - Path: spec.GetSource().Path, - RepoURL: spec.GetSource().RepoURL, - TargetRevision: spec.GetSource().TargetRevision, + Source: argov1alpha1.ApplicationSource{ + Path: spec.Source.Path, + RepoURL: spec.Source.RepoURL, + TargetRevision: spec.Source.TargetRevision, }, Destination: argov1alpha1.ApplicationDestination{ Server: spec.Destination.Server, diff --git a/test/e2e/fixture/cluster/actions.go b/test/e2e/fixture/cluster/actions.go index 3f047e8f9b03e..56576534c5106 100644 --- a/test/e2e/fixture/cluster/actions.go +++ b/test/e2e/fixture/cluster/actions.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "log" - "strings" "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" @@ -104,18 +103,6 @@ func (a *Actions) Get() *Actions { return a } -func (a *Actions) GetByName(name string) *Actions { - a.context.t.Helper() - a.runCli("cluster", "get", name) - return a -} - -func (a *Actions) SetNamespaces() *Actions { - a.context.t.Helper() - a.runCli("cluster", "set", a.context.name, "--namespace", strings.Join(a.context.namespaces, ",")) - return a -} - func (a *Actions) DeleteByName() *Actions { a.context.t.Helper() diff --git a/test/e2e/fixture/cluster/context.go b/test/e2e/fixture/cluster/context.go index 236be6a3a3913..8bc2cf4b1357b 100644 --- a/test/e2e/fixture/cluster/context.go +++ b/test/e2e/fixture/cluster/context.go @@ -12,12 +12,11 @@ import ( type Context struct { t *testing.T // seconds - timeout int - name string - project string - server string - upsert bool - namespaces []string + timeout int + name string + project string + server string + upsert bool } func Given(t *testing.T) *Context { @@ -46,11 +45,6 @@ func (c *Context) Server(server string) *Context { return c } -func (c *Context) Namespaces(namespaces []string) *Context { - c.namespaces = namespaces - return c -} - func (c *Context) And(block func()) *Context { block() return c diff --git a/test/e2e/helm_test.go b/test/e2e/helm_test.go index 318fad17d97eb..7c304a2e9e1de 100644 --- a/test/e2e/helm_test.go +++ b/test/e2e/helm_test.go @@ -121,7 +121,7 @@ func TestHelmValues(t *testing.T) { AppSet("--values", "foo.yml"). Then(). And(func(app *Application) { - assert.Equal(t, []string{"foo.yml"}, app.Spec.GetSource().Helm.ValueFiles) + assert.Equal(t, []string{"foo.yml"}, app.Spec.Source.Helm.ValueFiles) }) } @@ -132,14 +132,14 @@ func TestHelmIgnoreMissingValueFiles(t *testing.T) { Declarative("declarative-apps/invalid-helm.yaml"). Then(). And(func(app *Application) { - assert.Equal(t, []string{"does-not-exist-values.yaml"}, app.Spec.GetSource().Helm.ValueFiles) - assert.Equal(t, false, app.Spec.GetSource().Helm.IgnoreMissingValueFiles) + assert.Equal(t, []string{"does-not-exist-values.yaml"}, app.Spec.Source.Helm.ValueFiles) + assert.Equal(t, false, app.Spec.Source.Helm.IgnoreMissingValueFiles) }). When(). AppSet("--ignore-missing-value-files"). Then(). And(func(app *Application) { - assert.Equal(t, true, app.Spec.GetSource().Helm.IgnoreMissingValueFiles) + assert.Equal(t, true, app.Spec.Source.Helm.IgnoreMissingValueFiles) }). When(). Sync(). @@ -151,7 +151,7 @@ func TestHelmIgnoreMissingValueFiles(t *testing.T) { AppUnSet("--ignore-missing-value-files"). Then(). And(func(app *Application) { - assert.Equal(t, false, app.Spec.GetSource().Helm.IgnoreMissingValueFiles) + assert.Equal(t, false, app.Spec.Source.Helm.IgnoreMissingValueFiles) }). When(). IgnoreErrors(). @@ -170,21 +170,21 @@ func TestHelmValuesMultipleUnset(t *testing.T) { AppSet("--values", "foo.yml", "--values", "baz.yml"). Then(). And(func(app *Application) { - assert.NotNil(t, app.Spec.GetSource().Helm) - assert.Equal(t, []string{"foo.yml", "baz.yml"}, app.Spec.GetSource().Helm.ValueFiles) + assert.NotNil(t, app.Spec.Source.Helm) + assert.Equal(t, []string{"foo.yml", "baz.yml"}, app.Spec.Source.Helm.ValueFiles) }). When(). AppUnSet("--values", "foo.yml"). Then(). And(func(app *Application) { - assert.NotNil(t, app.Spec.GetSource().Helm) - assert.Equal(t, []string{"baz.yml"}, app.Spec.GetSource().Helm.ValueFiles) + assert.NotNil(t, app.Spec.Source.Helm) + assert.Equal(t, []string{"baz.yml"}, app.Spec.Source.Helm.ValueFiles) }). When(). AppUnSet("--values", "baz.yml"). Then(). And(func(app *Application) { - assert.Nil(t, app.Spec.GetSource().Helm) + assert.Nil(t, app.Spec.Source.Helm) }) } @@ -200,13 +200,13 @@ func TestHelmValuesLiteralFileLocal(t *testing.T) { if err != nil { panic(err) } - assert.Equal(t, string(data), app.Spec.GetSource().Helm.Values) + assert.Equal(t, string(data), app.Spec.Source.Helm.Values) }). When(). AppUnSet("--values-literal"). Then(). And(func(app *Application) { - assert.Nil(t, app.Spec.GetSource().Helm) + assert.Nil(t, app.Spec.Source.Helm) }) } @@ -242,13 +242,13 @@ func TestHelmValuesLiteralFileRemote(t *testing.T) { AppSet("--values-literal-file", "http://"+address). Then(). And(func(app *Application) { - assert.Equal(t, "a: b", app.Spec.GetSource().Helm.Values) + assert.Equal(t, "a: b", app.Spec.Source.Helm.Values) }). When(). AppUnSet("--values-literal"). Then(). And(func(app *Application) { - assert.Nil(t, app.Spec.GetSource().Helm) + assert.Nil(t, app.Spec.Source.Helm) }) } @@ -274,7 +274,7 @@ func TestHelmReleaseName(t *testing.T) { AppSet("--release-name", "foo"). Then(). And(func(app *Application) { - assert.Equal(t, "foo", app.Spec.GetSource().Helm.ReleaseName) + assert.Equal(t, "foo", app.Spec.Source.Helm.ReleaseName) }) } @@ -286,7 +286,7 @@ func TestHelmSet(t *testing.T) { AppSet("--helm-set", "foo=bar", "--helm-set", "foo=baz", "--helm-set", "app=$ARGOCD_APP_NAME"). Then(). And(func(app *Application) { - assert.Equal(t, []HelmParameter{{Name: "foo", Value: "baz"}, {Name: "app", Value: "$ARGOCD_APP_NAME"}}, app.Spec.GetSource().Helm.Parameters) + assert.Equal(t, []HelmParameter{{Name: "foo", Value: "baz"}, {Name: "app", Value: "$ARGOCD_APP_NAME"}}, app.Spec.Source.Helm.Parameters) }) } @@ -298,7 +298,7 @@ func TestHelmSetString(t *testing.T) { AppSet("--helm-set-string", "foo=bar", "--helm-set-string", "foo=baz", "--helm-set-string", "app=$ARGOCD_APP_NAME"). Then(). And(func(app *Application) { - assert.Equal(t, []HelmParameter{{Name: "foo", Value: "baz", ForceString: true}, {Name: "app", Value: "$ARGOCD_APP_NAME", ForceString: true}}, app.Spec.GetSource().Helm.Parameters) + assert.Equal(t, []HelmParameter{{Name: "foo", Value: "baz", ForceString: true}, {Name: "app", Value: "$ARGOCD_APP_NAME", ForceString: true}}, app.Spec.Source.Helm.Parameters) }) } @@ -310,7 +310,7 @@ func TestHelmSetFile(t *testing.T) { AppSet("--helm-set-file", "foo=bar.yaml", "--helm-set-file", "foo=baz.yaml"). Then(). And(func(app *Application) { - assert.Equal(t, []HelmFileParameter{{Name: "foo", Path: "baz.yaml"}}, app.Spec.GetSource().Helm.FileParameters) + assert.Equal(t, []HelmFileParameter{{Name: "foo", Path: "baz.yaml"}}, app.Spec.Source.Helm.FileParameters) }) } diff --git a/test/e2e/kustomize_test.go b/test/e2e/kustomize_test.go index e6840e7b95eba..cb69d0c448a32 100644 --- a/test/e2e/kustomize_test.go +++ b/test/e2e/kustomize_test.go @@ -175,7 +175,7 @@ func TestKustomizeImages(t *testing.T) { AppSet("--kustomize-image", "alpine:foo", "--kustomize-image", "alpine:bar"). Then(). And(func(app *Application) { - assert.Contains(t, app.Spec.GetSource().Kustomize.Images, KustomizeImage("alpine:bar")) + assert.Contains(t, app.Spec.Source.Kustomize.Images, KustomizeImage("alpine:bar")) }) } @@ -188,7 +188,7 @@ func TestKustomizeNameSuffix(t *testing.T) { AppSet("--namesuffix", "-suf"). Then(). And(func(app *Application) { - assert.Contains(t, app.Spec.GetSource().Kustomize.NameSuffix, "-suf") + assert.Contains(t, app.Spec.Source.Kustomize.NameSuffix, "-suf") }) } @@ -201,25 +201,25 @@ func TestKustomizeUnsetOverride(t *testing.T) { AppSet("--namesuffix", "-suf"). Then(). And(func(app *Application) { - assert.Contains(t, app.Spec.GetSource().Kustomize.NameSuffix, "-suf") + assert.Contains(t, app.Spec.Source.Kustomize.NameSuffix, "-suf") }). When(). AppUnSet("--namesuffix"). Then(). And(func(app *Application) { - assert.Nil(t, app.Spec.GetSource().Kustomize) + assert.Nil(t, app.Spec.Source.Kustomize) }). When(). AppSet("--kustomize-image", "alpine:foo", "--kustomize-image", "alpine:bar"). Then(). And(func(app *Application) { - assert.Contains(t, app.Spec.GetSource().Kustomize.Images, KustomizeImage("alpine:bar")) + assert.Contains(t, app.Spec.Source.Kustomize.Images, KustomizeImage("alpine:bar")) }). When(). //AppUnSet("--kustomize-image=alpine"). AppUnSet("--kustomize-image", "alpine", "--kustomize-image", "alpine"). Then(). And(func(app *Application) { - assert.Nil(t, app.Spec.GetSource().Kustomize) + assert.Nil(t, app.Spec.Source.Kustomize) }) } diff --git a/test/e2e/matrix_e2e_test.go b/test/e2e/matrix_e2e_test.go index f6b923f24b7a4..fe084806d8803 100644 --- a/test/e2e/matrix_e2e_test.go +++ b/test/e2e/matrix_e2e_test.go @@ -27,7 +27,7 @@ func TestListMatrixGenerator(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: name, @@ -64,7 +64,7 @@ func TestListMatrixGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{values.name}}-{{path.basename}}"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "{{path}}", @@ -151,7 +151,7 @@ func TestClusterMatrixGenerator(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: name, @@ -190,7 +190,7 @@ func TestClusterMatrixGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{name}}-{{path.basename}}"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "{{path}}", diff --git a/test/e2e/merge_e2e_test.go b/test/e2e/merge_e2e_test.go index 6a3de30f19f84..96ab00621edb2 100644 --- a/test/e2e/merge_e2e_test.go +++ b/test/e2e/merge_e2e_test.go @@ -28,7 +28,7 @@ func TestListMergeGenerator(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: name, @@ -60,7 +60,7 @@ func TestListMergeGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{path.basename}}-{{name-suffix}}"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "{{path}}", @@ -148,7 +148,7 @@ func TestClusterMergeGenerator(t *testing.T) { }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: name, @@ -187,7 +187,7 @@ func TestClusterMergeGenerator(t *testing.T) { ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{name}}-{{path.basename}}-{{values.name-suffix}}"}, Spec: argov1alpha1.ApplicationSpec{ Project: "default", - Source: &argov1alpha1.ApplicationSource{ + Source: argov1alpha1.ApplicationSource{ RepoURL: "https://github.com/argoproj/argocd-example-apps.git", TargetRevision: "HEAD", Path: "{{path}}", diff --git a/test/e2e/project_management_test.go b/test/e2e/project_management_test.go index 4cfe088ef5de4..d8aa7836da83b 100644 --- a/test/e2e/project_management_test.go +++ b/test/e2e/project_management_test.go @@ -329,7 +329,7 @@ func TestUseJWTToken(t *testing.T) { Name: appName, }, Spec: v1alpha1.ApplicationSpec{ - Source: &v1alpha1.ApplicationSource{ + Source: v1alpha1.ApplicationSource{ RepoURL: fixture.RepoURL(fixture.RepoURLTypeFile), Path: "guestbook", }, @@ -377,9 +377,9 @@ func TestUseJWTToken(t *testing.T) { roleGetResult, err = fixture.RunCli("proj", "role", "get", projectName, roleName) assert.NoError(t, err) - assert.True(t, strings.Contains(roleGetResult, strconv.FormatInt(newProj.Status.JWTTokensByRole[roleName].Items[0].IssuedAt, 10))) + 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)) + _, err = fixture.RunCli("proj", "role", "delete-token", projectName, roleName, strconv.FormatInt((newProj.Status.JWTTokensByRole[roleName].Items[0].IssuedAt), 10)) assert.NoError(t, err) newProj, err = fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.ArgoCDNamespace).Get(context.Background(), projectName, metav1.GetOptions{}) assert.NoError(t, err) @@ -564,10 +564,6 @@ func TestGetVirtualProjectNoMatch(t *testing.T) { "--path", guestbookPath, "--project", proj.Name, "--dest-server", v1alpha1.KubernetesInternalAPIServerAddr, "--dest-namespace", fixture.DeploymentNamespace()) assert.NoError(t, err) - // Waiting for the app to be successfully created. - // Else the sync would fail to retrieve the app resources. - time.Sleep(time.Second * 2) - //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) @@ -605,10 +601,6 @@ func TestGetVirtualProjectMatch(t *testing.T) { "--path", guestbookPath, "--project", proj.Name, "--dest-server", v1alpha1.KubernetesInternalAPIServerAddr, "--dest-namespace", fixture.DeploymentNamespace()) assert.NoError(t, err) - // Waiting for the app to be successfully created. - // Else the sync would fail to retrieve the app resources. - time.Sleep(time.Second * 2) - //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) diff --git a/test/e2e/testdata/data.go b/test/e2e/testdata/data.go index 7d88f6b856e2b..84ed0eb2f5648 100644 --- a/test/e2e/testdata/data.go +++ b/test/e2e/testdata/data.go @@ -5,7 +5,4 @@ import _ "embed" var ( //go:embed ssa-revision-history/deployment.yaml SSARevisionHistoryDeployment string - - //go:embed guestbook/guestbook-ui-deployment.yaml - GuestbookDeployment string ) diff --git a/test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-deployment.yaml b/test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-deployment.yaml deleted file mode 100644 index bf3375672f70c..0000000000000 --- a/test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-deployment.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: guestbook-ui - labels: - test: "true" -spec: - replicas: 0 - revisionHistoryLimit: 3 - selector: - matchLabels: - app: guestbook-ui - template: - metadata: - labels: - app: guestbook-ui - spec: - containers: - - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 - imagePullPolicy: IfNotPresent - name: guestbook-ui - ports: - - containerPort: 80 diff --git a/test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-namespace.yaml b/test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-namespace.yaml deleted file mode 100644 index ceda849716ccb..0000000000000 --- a/test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-namespace.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: guestbook-ui-with-namespace-manifest - labels: - test: "true" - annotations: - foo: bar - something: else diff --git a/test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-svc.yaml b/test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-svc.yaml deleted file mode 100644 index e8a4a27fbae40..0000000000000 --- a/test/e2e/testdata/guestbook-with-namespace-manifest/guestbook-ui-svc.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: guestbook-ui -spec: - ports: - - port: 80 - targetPort: 80 - selector: - app: guestbook-ui diff --git a/test/e2e/testdata/guestbook-with-namespace-manifest/kustomization.yaml b/test/e2e/testdata/guestbook-with-namespace-manifest/kustomization.yaml deleted file mode 100644 index 2fc095b980adb..0000000000000 --- a/test/e2e/testdata/guestbook-with-namespace-manifest/kustomization.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -resources: - - ./guestbook-ui-namespace.yaml - - ./guestbook-ui-deployment.yaml - - ./guestbook-ui-svc.yaml diff --git a/test/e2e/testdata/multiple-source-values/pod-1.yaml b/test/e2e/testdata/multiple-source-values/pod-1.yaml deleted file mode 100644 index fa65ca29a4a80..0000000000000 --- a/test/e2e/testdata/multiple-source-values/pod-1.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: pod-1 - labels: - foo: bar -spec: - containers: - - name: main - image: quay.io/argoprojlabs/argocd-e2e-container:0.1 - imagePullPolicy: IfNotPresent - command: - - "true" - restartPolicy: Never diff --git a/test/e2e/testdata/multiple-source-values/values.yaml b/test/e2e/testdata/multiple-source-values/values.yaml deleted file mode 100644 index 71ffd9f273f08..0000000000000 --- a/test/e2e/testdata/multiple-source-values/values.yaml +++ /dev/null @@ -1 +0,0 @@ -replicas: 3 diff --git a/test/manifests/cmp/README.md b/test/manifests/cmp/README.md deleted file mode 100644 index 86759c1d1f59f..0000000000000 --- a/test/manifests/cmp/README.md +++ /dev/null @@ -1,15 +0,0 @@ -This folder contains an Argo CD configuration file to allow -testing CMP plugins locally. The Kustomize project will: - -- Install Argo CD in the current k8s context -- Patch repo server configuring a test CMP plugin -- Install an application that can be used to interact with the CMP plugin - -To install Argo CD with this Kustomize project run the following -command: - -`kustomize build ./test/manifests/cmp | sed 's/imagePullPolicy: Always/imagePullPolicy: Never/g' | kubectl apply -f -` - -In Argo CD UI login with user/pass: admin/password - -An application with name `cmp-sidecar` should be available for testing. diff --git a/test/manifests/cmp/app.yaml b/test/manifests/cmp/app.yaml deleted file mode 100644 index 1a3e66bb3810a..0000000000000 --- a/test/manifests/cmp/app.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: plugin-test-app -spec: - project: default - source: - repoURL: https://github.com/argoproj/argo-cd.git - path: test/manifests/cmp/app - plugin: - env: - - name: FOO - value: bar - - name: REV - value: test-$ARGOCD_APP_REVISION - parameters: - - name: array-param - array: - - override - - values - destination: - namespace: default - server: https://kubernetes.default.svc diff --git a/test/manifests/cmp/app/subdir/sidecar.yaml b/test/manifests/cmp/app/subdir/sidecar.yaml deleted file mode 100644 index aff782f0712f7..0000000000000 --- a/test/manifests/cmp/app/subdir/sidecar.yaml +++ /dev/null @@ -1,4 +0,0 @@ -# This yaml is used mainly to trigger the CMP plugin -# for testing purposes. In real world, it should contain -# proper kubernetes manifest files. -name: sidecar-plugin diff --git a/test/manifests/cmp/kustomization.yaml b/test/manifests/cmp/kustomization.yaml deleted file mode 100644 index f0f55a990250e..0000000000000 --- a/test/manifests/cmp/kustomization.yaml +++ /dev/null @@ -1,15 +0,0 @@ -resources: - - ../../../manifests/namespace-install - - ../../../manifests/crds - - ../../../manifests/cluster-rbac - - plugin.yaml - - app.yaml - -patchesStrategicMerge: - - repo-patch.yaml - - secret-patch.yaml - -images: - - name: quay.io/argoproj/argocd - newName: argocd - newTag: param diff --git a/test/manifests/cmp/plugin.yaml b/test/manifests/cmp/plugin.yaml deleted file mode 100644 index fc24632385833..0000000000000 --- a/test/manifests/cmp/plugin.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-plugin-config -data: - plugin.yaml: | - apiVersion: argoproj.io/v1alpha1 - kind: ConfigManagementPlugin - metadata: - name: my-plugin - spec: - version: v1.0 - init: - command: [sh , -c, 'echo "params: $ARGOCD_APP_PARAMETERS"'] - generate: - command: [jq, -n, '{"kind": "ConfigMap", "apiVersion": "v1", "metadata": { "name": env.ARGOCD_APP_NAME, "namespace": env.ARGOCD_APP_NAMESPACE, "annotations": {"test": "annotation test", "KubeVersion": env.KUBE_VERSION }}, "data": { "params": env.ARGOCD_APP_PARAMETERS } }'] - discover: - fileName: "./subdir/s*.yaml" - parameters: - static: - - name: string-param - string: default-string-value - - name: array-param - array: [default, items] - collectionType: array - - name: map-param - map: - some: value - collectionType: map diff --git a/test/manifests/cmp/repo-patch.yaml b/test/manifests/cmp/repo-patch.yaml deleted file mode 100644 index e9398bf5043ed..0000000000000 --- a/test/manifests/cmp/repo-patch.yaml +++ /dev/null @@ -1,40 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app.kubernetes.io/name: argocd-repo-server - app.kubernetes.io/part-of: argocd - app.kubernetes.io/component: repo-server - name: argocd-repo-server -spec: - selector: - matchLabels: - app.kubernetes.io/name: argocd-repo-server - template: - metadata: - labels: - app.kubernetes.io/name: argocd-repo-server - spec: - serviceAccountName: argocd-repo-server - automountServiceAccountToken: false - containers: - - name: my-plugin - command: [/var/run/argocd/argocd-cmp-server] - image: stedolan/jq - securityContext: - runAsNonRoot: true - runAsUser: 999 - volumeMounts: - - mountPath: /var/run/argocd - name: var-files - - mountPath: /home/argocd/cmp-server/plugins - name: plugins - - mountPath: /home/argocd/cmp-server/config/plugin.yaml - subPath: plugin.yaml - name: my-plugin-config - volumes: - - configMap: - name: my-plugin-config - name: my-plugin-config - - emptyDir: {} - name: cmp-tmp diff --git a/test/manifests/cmp/secret-patch.yaml b/test/manifests/cmp/secret-patch.yaml deleted file mode 100644 index adf583420a8e4..0000000000000 --- a/test/manifests/cmp/secret-patch.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: argocd-secret - labels: - app.kubernetes.io/name: argocd-secret - app.kubernetes.io/part-of: argocd -stringData: - # admin.password is "password" - admin.password: $2a$10$RncPyHW/B5ll2Z3J8s.IBOnbZ9uoJ4JhHLKzj5lzG/kU1KN1Oj3/K - admin.passwordMtime: 2019-03-20T17:54:53Z -type: Opaque diff --git a/test/testutil.go b/test/testutil.go index bccf0cef23a3f..6f8a74f8c46dc 100644 --- a/test/testutil.go +++ b/test/testutil.go @@ -2,7 +2,6 @@ package test import ( "context" - "encoding/json" "fmt" "log" "net" @@ -83,20 +82,6 @@ func YamlToUnstructured(yamlStr string) *unstructured.Unstructured { return &unstructured.Unstructured{Object: obj} } -// ToMap converts any object to a map[string]interface{} -func ToMap(obj interface{}) map[string]interface{} { - data, err := json.Marshal(obj) - if err != nil { - panic(err) - } - var res map[string]interface{} - err = json.Unmarshal(data, &res) - if err != nil { - panic(err) - } - return res -} - // GetTestDir will return the full directory path of the // calling test file. func GetTestDir(t *testing.T) string { diff --git a/ui/package.json b/ui/package.json index b5fcdc9808a2b..dda288e167792 100644 --- a/ui/package.json +++ b/ui/package.json @@ -19,7 +19,7 @@ "dagre": "^0.8.5", "deepmerge": "^3.2.0", "foundation-sites": "^6.7.4", - "git-url-parse": "^13.1.0", + "git-url-parse": "^11.6.0", "js-yaml": "^3.14.1", "json-merge-patch": "^0.2.3", "lodash-es": "^4.17.21", @@ -37,7 +37,7 @@ "react-helmet": "^5.2.0", "react-hot-loader": "^3.1.3", "react-moment": "^0.9.7", - "react-paginate": "^8.1.4", + "react-paginate": "^6.5.0", "react-router": "^4.3.1", "react-router-dom": "^4.2.2", "react-svg-piechart": "^2.4.2", @@ -59,18 +59,18 @@ "devDependencies": { "@babel/core": "^7.7.2", "@babel/preset-env": "^7.7.1", - "@babel/preset-react": "^7.18.6", + "@babel/preset-react": "^7.7.0", "@babel/preset-typescript": "^7.7.2", "@types/classnames": "^2.2.3", - "@types/cookie": "^0.5.1", + "@types/cookie": "^0.3.1", "@types/dagre": "^0.7.40", "@types/deepmerge": "^2.2.0", "@types/git-url-parse": "^9.0.1", "@types/jest": "^24.0.13", "@types/js-yaml": "^3.11.2", - "@types/lodash-es": "^4.17.6", + "@types/lodash-es": "^4.17.5", "@types/minimatch": "^3.0.3", - "@types/prop-types": "^15.7.5", + "@types/prop-types": "^15.5.2", "@types/react": "^16.8.5", "@types/react-autocomplete": "^1.8.4", "@types/react-dom": "^16.9.14", @@ -81,7 +81,7 @@ "@types/react-router-dom": "^4.2.3", "@types/react-test-renderer": "^16.8.3", "add": "^2.0.6", - "babel-jest": "^26.6.3", + "babel-jest": "^24.9.0", "babel-loader": "^8.0.6", "codecov": "^3.7.2", "copy-webpack-plugin": "^6.1.1", @@ -105,7 +105,7 @@ "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", "tslint-plugin-prettier": "^2.0.1", - "tslint-react": "^5.0.0", + "tslint-react": "^3.4.0", "typescript": "^4.0.3", "webpack": "^5.70.0", "webpack-cli": "^4.9.2", diff --git a/ui/src/app/applications/components/application-conditions/application-conditions.tsx b/ui/src/app/applications/components/application-conditions/application-conditions.tsx index 5c174caaa1425..d131e90701d3e 100644 --- a/ui/src/app/applications/components/application-conditions/application-conditions.tsx +++ b/ui/src/app/applications/components/application-conditions/application-conditions.tsx @@ -4,7 +4,7 @@ import {Timestamp} from '../../../shared/components'; import * as models from '../../../shared/models'; import {getConditionCategory} from '../utils'; -import './application-conditions.scss'; +require('./application-conditions.scss'); export const ApplicationConditions = ({conditions}: {conditions: models.ApplicationCondition[]}) => { return ( diff --git a/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx b/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx index db87258b6bea3..9f4a8e19eff31 100644 --- a/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx +++ b/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx @@ -10,11 +10,11 @@ import {ApplicationRetryOptions} from '../application-retry-options/application- import {ApplicationSyncOptionsField} from '../application-sync-options/application-sync-options'; import {RevisionFormField} from '../revision-form-field/revision-form-field'; import {SetFinalizerOnApplication} from './set-finalizer-on-application'; -import './application-create-panel.scss'; -import {getAppDefaultSource} from '../utils'; const jsonMergePatch = require('json-merge-patch'); +require('./application-create-panel.scss'); + const appTypes = new Array<{field: string; type: models.AppSourceType}>( {type: 'Helm', field: 'helm'}, {type: 'Kustomize', field: 'kustomize'}, @@ -39,7 +39,6 @@ const DEFAULT_APP: Partial = { repoURL: '', targetRevision: 'HEAD' }, - sources: [], project: '' } }; @@ -81,17 +80,16 @@ const AutoSyncFormField = ReactFormField((props: {fieldApi: FieldApi; className: }); function normalizeAppSource(app: models.Application, type: string): boolean { - const source = getAppDefaultSource(app); - const repoType = (source.hasOwnProperty('chart') && 'helm') || 'git'; + const repoType = (app.spec.source.hasOwnProperty('chart') && 'helm') || 'git'; if (repoType !== type) { if (type === 'git') { - source.path = source.chart; - delete source.chart; - source.targetRevision = 'HEAD'; + app.spec.source.path = app.spec.source.chart; + delete app.spec.source.chart; + app.spec.source.targetRevision = 'HEAD'; } else { - source.chart = source.path; - delete source.path; - source.targetRevision = ''; + app.spec.source.chart = app.spec.source.path; + delete app.spec.source.path; + app.spec.source.targetRevision = ''; } return true; } diff --git a/ui/src/app/applications/components/application-deployment-history/application-deployment-history.tsx b/ui/src/app/applications/components/application-deployment-history/application-deployment-history.tsx index b612c9ed9056c..e4eca6c36700b 100644 --- a/ui/src/app/applications/components/application-deployment-history/application-deployment-history.tsx +++ b/ui/src/app/applications/components/application-deployment-history/application-deployment-history.tsx @@ -6,7 +6,8 @@ import * as models from '../../../shared/models'; import {services} from '../../../shared/services'; import {ApplicationParameters} from '../application-parameters/application-parameters'; import {RevisionMetadataRows} from './revision-metadata-rows'; -import './application-deployment-history.scss'; + +require('./application-deployment-history.scss'); export const ApplicationDeploymentHistory = ({ app, @@ -32,13 +33,13 @@ export const ApplicationDeploymentHistory = ({
    selectDeployment(index)}>
    - Deployed At: + Deployed At:

    - Time to deploy: + Time to deploy:
    {(info.deployStartedAt && ) || 'Unknown'}
    diff --git a/ui/src/app/applications/components/application-details/application-details.scss b/ui/src/app/applications/components/application-details/application-details.scss index 9f7433d2f7e14..4ea04076f8aaa 100644 --- a/ui/src/app/applications/components/application-details/application-details.scss +++ b/ui/src/app/applications/components/application-details/application-details.scss @@ -274,74 +274,3 @@ $header: 120px; } } } - - -@media screen and (max-width: map-get($breakpoints, large)) { -.sliding-panel__body { - padding: 4px !important; -} -.sliding-panel--is-middle .sliding-panel__wrapper { - width: 90% !important; -} -.sliding-panel--is-middle .sliding-panel__body { - padding: 18px !important; -} -.sliding-panel__close { - z-index: 2 !important; -} -.top-bar__title { - display: none; -} - -.top-bar__left-side { - white-space: normal !important; -} -.top-bar__left-side > div { - display: block !important; -} -.top-bar__right-side { - justify-content: right !important; -} -.application-status-panel.row { - flex-flow: unset; -} -.application-status-panel__item label { - margin-right: 0; -} -.application-status-panel__item { - padding: 5px 10px; -} - -.white-box, .tabs__content { - padding: 4px !important; -} -.white-box__details-row .columns.small-3 { - overflow-wrap: unset !important; - overflow: scroll; -} -.white-box__details-row .columns.small-9{ - padding-left: 4px; -} - -.resource-details__header h1 { - font-size: 16px; -} -.resource-details__header { - margin-top: 30px; - padding-right: 4px; -} - -.tabs__nav a:first-child, .tabs__nav a { - margin-left: 0 !important; -} - -.editable-panel__buttons { - top: unset; -} -} - -@media screen and (max-width: map-get($breakpoints, medium)) { -.sb-page-wrapper .top-bar.row { - display: none !important; -} -} \ No newline at end of file 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 c1c0da6736510..874b52d400540 100644 --- a/ui/src/app/applications/components/application-details/application-details.tsx +++ b/ui/src/app/applications/components/application-details/application-details.tsx @@ -1,4 +1,4 @@ -import {DropDownMenu, NotificationType, SlidingPanel, Tooltip} from 'argo-ui'; +import {DropDownMenu, NotificationType, SlidingPanel} from 'argo-ui'; import * as classNames from 'classnames'; import * as PropTypes from 'prop-types'; import * as React from 'react'; @@ -16,7 +16,7 @@ import {AppDetailsPreferences, AppsDetailsViewKey, AppsDetailsViewType, services import {ApplicationConditions} from '../application-conditions/application-conditions'; import {ApplicationDeploymentHistory} from '../application-deployment-history/application-deployment-history'; import {ApplicationOperationState} from '../application-operation-state/application-operation-state'; -import {PodGroupType, PodView} from '../application-pod-view/pod-view'; +import {PodView} from '../application-pod-view/pod-view'; import {ApplicationResourceTree, ResourceTreeNode} from '../application-resource-tree/application-resource-tree'; import {ApplicationStatusPanel} from '../application-status-panel/application-status-panel'; import {ApplicationSyncPanel} from '../application-sync-panel/application-sync-panel'; @@ -24,13 +24,12 @@ import {ResourceDetails} from '../resource-details/resource-details'; import * as AppUtils from '../utils'; import {ApplicationResourceList} from './application-resource-list'; import {Filters, FiltersProps} from './application-resource-filter'; -import {getAppDefaultSource, urlPattern, helpTip} from '../utils'; +import {urlPattern} from '../utils'; import {ResourceStatus} from '../../../shared/models'; import {ApplicationsDetailsAppDropdown} from './application-details-app-dropdown'; import {useSidebarTarget} from '../../../sidebar/sidebar'; -import './application-details.scss'; -import {AppViewExtension, ExtensionComponentProps} from '../../../shared/services/extensions-service'; +require('./application-details.scss'); interface ApplicationDetailsState { page: number; @@ -40,8 +39,6 @@ interface ApplicationDetailsState { filteredGraph?: any[]; truncateNameOnRight?: boolean; collapsedNodes?: string[]; - extensions?: AppViewExtension[]; - extensionsMap?: {[key: string]: AppViewExtension}; } interface FilterInput { @@ -82,13 +79,7 @@ export class ApplicationDetails extends React.Component) { super(props); - const extensions = services.extensions.getAppViewExtensions(); - const extensionsMap: {[key: string]: AppViewExtension} = {}; - extensions.forEach(ext => { - extensionsMap[ext.title] = ext; - }); - - this.state = {page: 0, groupedResources: [], slidingPanelPage: 0, filteredGraph: [], truncateNameOnRight: false, collapsedNodes: [], extensions, extensionsMap}; + this.state = {page: 0, groupedResources: [], slidingPanelPage: 0, filteredGraph: [], truncateNameOnRight: false, collapsedNodes: []}; if (typeof this.props.match.params.appnamespace === 'undefined') { this.appNamespace = ''; } else { @@ -169,7 +160,6 @@ export class ApplicationDetails extends React.Component combineLatest([this.loadAppInfo(name, this.appNamespace), services.viewPreferences.getPreferences(), q]).pipe( map(items => { - const application = items[0].application; const pref = items[1].appDetails; const params = items[2]; if (params.get('resource') != null) { @@ -180,27 +170,10 @@ export class ApplicationDetails extends React.Component { const statusByKey = new Map(); application.status.resources.forEach(res => statusByKey.set(AppUtils.nodeKey(res), res)); @@ -373,18 +346,6 @@ export class ApplicationDetails extends React.Component - {this.state.extensions && - (this.state.extensions || []).map(ext => ( - { - this.appContext.apis.navigation.goto('.', {view: ext.title}); - services.viewPreferences.updatePreferences({appDetails: {...pref, view: ext.title}}); - }} - /> - ))}
    ) @@ -489,9 +450,6 @@ export class ApplicationDetails extends React.Component AppUtils.renderResourceButtons(node, application, tree, this.appContext, this.appChanged)} /> - )) || - (this.state.extensionsMap[pref.view] != null && ( - )) || (
    services.viewPreferences.getPreferences()}> @@ -602,7 +560,7 @@ export class ApplicationDetails extends React.Component
    SHA:
    - +
    @@ -655,7 +613,6 @@ export class ApplicationDetails extends React.Component {prop.actionLabel}; - const hasMultipleSources = app.spec.sources && app.spec.sources.length > 0; return [ { iconClassName: 'fa fa-info-circle', @@ -681,18 +638,9 @@ export class ApplicationDetails extends React.Component - - {helpTip('Rollback is not supported for apps with multiple sources')} - - ) : ( - - ), - action: () => { - this.setRollbackPanelVisible(0); - }, - disabled: !app.status.operationState || hasMultipleSources + title: , + action: () => this.setRollbackPanelVisible(0), + disabled: !app.status.operationState }, { iconClassName: 'fa fa-times-circle', @@ -897,8 +845,3 @@ Are you sure you want to disable auto-sync and rollback application '${this.prop await AppUtils.deleteApplication(this.props.match.params.name, this.appNamespace, this.appContext.apis); } } - -const ExtensionView = (props: {extension: AppViewExtension; application: models.Application; tree: models.ApplicationTree}) => { - const {extension, application, tree} = props; - return ; -}; diff --git a/ui/src/app/applications/components/application-details/application-resource-list.tsx b/ui/src/app/applications/components/application-details/application-resource-list.tsx index febe268ccd688..e890ed44720e2 100644 --- a/ui/src/app/applications/components/application-details/application-resource-list.tsx +++ b/ui/src/app/applications/components/application-details/application-resource-list.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import * as models from '../../../shared/models'; import {ResourceIcon} from '../resource-icon'; import {ResourceLabel} from '../resource-label'; -import {ComparisonStatusIcon, HealthStatusIcon, nodeKey, createdOrNodeKey} from '../utils'; +import {ComparisonStatusIcon, HealthStatusIcon, nodeKey} from '../utils'; import {Consumer} from '../../../shared/context'; import * as _ from 'lodash'; @@ -24,13 +24,12 @@ export const ApplicationResourceList = ({
    NAME
    GROUP/KIND
    SYNC ORDER
    -
    NAMESPACE
    -
    CREATED AT
    -
    STATUS
    +
    NAMESPACE
    +
    STATUS
    {resources - .sort((first, second) => -createdOrNodeKey(first).localeCompare(createdOrNodeKey(second))) + .sort((first, second) => nodeKey(first).localeCompare(nodeKey(second))) .map(res => (
    onNodeClick(nodeKey(res))}>
    @@ -47,7 +46,7 @@ export const ApplicationResourceList = ({ {ctx => ( - + @@ -57,9 +56,8 @@ export const ApplicationResourceList = ({
    {[res.group, res.kind].filter(item => !!item).join('/')}
    {res.syncWave || '-'}
    -
    {res.namespace}
    -
    {res.createdAt}
    -
    +
    {res.namespace}
    +
    {res.health && ( {res.health.status}   diff --git a/ui/src/app/applications/components/application-node-info/application-node-info.tsx b/ui/src/app/applications/components/application-node-info/application-node-info.tsx index 17b7a5d853bff..69194e3094a34 100644 --- a/ui/src/app/applications/components/application-node-info/application-node-info.tsx +++ b/ui/src/app/applications/components/application-node-info/application-node-info.tsx @@ -3,31 +3,28 @@ import * as deepMerge from 'deepmerge'; import * as moment from 'moment'; import * as React from 'react'; -import {YamlEditor, ClipboardText} from '../../../shared/components'; -import {DeepLinks} from '../../../shared/components/deep-links'; +import {YamlEditor} from '../../../shared/components'; import * as models from '../../../shared/models'; import {services} from '../../../shared/services'; -import {ResourceTreeNode} from '../application-resource-tree/application-resource-tree'; import {ApplicationResourcesDiff} from '../application-resources-diff/application-resources-diff'; import {ComparisonStatusIcon, formatCreationTimestamp, getPodStateReason, HealthStatusIcon} from '../utils'; -import './application-node-info.scss'; +require('./application-node-info.scss'); export const ApplicationNodeInfo = (props: { application: models.Application; node: models.ResourceNode; live: models.State; - links: models.LinksResponse; controlled: {summary: models.ResourceStatus; state: models.ResourceDiff}; }) => { const attributes: {title: string; value: any}[] = [ {title: 'KIND', value: props.node.kind}, - {title: 'NAME', value: }, - {title: 'NAMESPACE', value: } + {title: 'NAME', value: props.node.name}, + {title: 'NAMESPACE', value: props.node.namespace} ]; if (props.node.createdAt) { attributes.push({ - title: 'CREATED AT', + title: 'CREATED_AT', value: formatCreationTimestamp(props.node.createdAt) }); } @@ -60,8 +57,6 @@ export const ApplicationNodeInfo = (props: { hostNames = (status.loadBalancer.ingress || []).map((item: any) => item.hostname || item.ip).join(', '); } attributes.push({title: 'HOSTNAMES', value: hostNames}); - } else if (props.node.kind === 'ReplicaSet') { - attributes.push({title: 'REPLICAS', value: `${props.live.spec?.replicas || 0}/${props.live.status?.readyReplicas || 0}/${props.live.spec?.replicas || 0}`}); } } @@ -89,25 +84,6 @@ export const ApplicationNodeInfo = (props: { attributes.push({title: 'HEALTH DETAILS', value: props.controlled.summary.health.message}); } } - } else if (props.node && (props.node as ResourceTreeNode).health) { - const treeNode = props.node as ResourceTreeNode; - if (treeNode && treeNode.health) { - attributes.push({ - title: 'HEALTH', - value: ( - - {treeNode.health.message || treeNode.health.status} - - ) - } as any); - } - } - - if (props.links) { - attributes.push({ - title: 'LINKS', - value: - }); } const tabs: Tab[] = [ diff --git a/ui/src/app/applications/components/application-operation-state/application-operation-state.tsx b/ui/src/app/applications/components/application-operation-state/application-operation-state.tsx index 0f5bbac2615a2..9235945afa3d6 100644 --- a/ui/src/app/applications/components/application-operation-state/application-operation-state.tsx +++ b/ui/src/app/applications/components/application-operation-state/application-operation-state.tsx @@ -9,7 +9,7 @@ import * as models from '../../../shared/models'; import {services} from '../../../shared/services'; import * as utils from '../utils'; -import './application-operation-state.scss'; +require('./application-operation-state.scss'); interface Props { application: models.Application; @@ -78,7 +78,7 @@ export const ApplicationOperationState: React.StatelessComponent = ({appl const confirmed = await ctx.apis.popup.confirm('Terminate operation', 'Are you sure you want to terminate operation?'); if (confirmed) { try { - await services.applications.terminateOperation(application.metadata.name, application.metadata.namespace); + await services.applications.terminateOperation(application.metadata.name); } catch (e) { ctx.apis.notifications.show({ content: , @@ -93,7 +93,7 @@ export const ApplicationOperationState: React.StatelessComponent = ({appl }); } if (operationState.syncResult) { - operationAttributes.push({title: 'REVISION', value: }); + operationAttributes.push({title: 'REVISION', value: }); } let initiator = ''; if (operationState.operation.initiatedBy) { 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 330e6f0362c59..8318c9f9ec1f2 100644 --- a/ui/src/app/applications/components/application-parameters/application-parameters.tsx +++ b/ui/src/app/applications/components/application-parameters/application-parameters.tsx @@ -9,8 +9,6 @@ import {services} from '../../../shared/services'; import {ImageTagFieldEditor} from './kustomize'; import * as kustomize from './kustomize-image'; import {VarsInputField} from './vars-input-field'; -import {concatMaps} from '../../../shared/utils'; -import {getAppDefaultSource} from '../utils'; const TextWithMetadataField = ReactFormField((props: {metadata: {value: string}; fieldApi: FieldApi; className: string}) => { const { @@ -113,7 +111,7 @@ export const ApplicationParameters = (props: { noReadonlyMode?: boolean; }) => { const app = props.application; - const source = getAppDefaultSource(app); + const source = props.application.spec.source; const [removedOverrides, setRemovedOverrides] = React.useState(new Array()); let attributes: EditablePanelItem[] = []; @@ -121,7 +119,7 @@ export const ApplicationParameters = (props: { if (props.details.type === 'Kustomize' && props.details.kustomize) { attributes.push({ title: 'VERSION', - view: (source.kustomize && source.kustomize.version) || default, + view: (app.spec.source.kustomize && app.spec.source.kustomize.version) || default, edit: (formApi: FormApi) => ( services.authService.settings()}> {settings => @@ -135,13 +133,13 @@ export const ApplicationParameters = (props: { attributes.push({ title: 'NAME PREFIX', - view: source.kustomize && source.kustomize.namePrefix, + view: app.spec.source.kustomize && app.spec.source.kustomize.namePrefix, edit: (formApi: FormApi) => }); attributes.push({ title: 'NAME SUFFIX', - view: source.kustomize && source.kustomize.nameSuffix, + view: app.spec.source.kustomize && app.spec.source.kustomize.nameSuffix, edit: (formApi: FormApi) => }); @@ -179,7 +177,7 @@ export const ApplicationParameters = (props: { } else if (props.details.type === 'Helm' && props.details.helm) { attributes.push({ title: 'VALUES FILES', - view: (source.helm && (source.helm.valueFiles || []).join(', ')) || 'No values files selected', + view: (app.spec.source.helm && (app.spec.source.helm.valueFiles || []).join(', ')) || 'No values files selected', edit: (formApi: FormApi) => ( ) }); - attributes.push({ - title: 'VALUES', - view: source.helm && ( - -
    {source.helm.values}
    -
    - ), - edit: (formApi: FormApi) => ( -
    -
    -                        
    -                    
    -
    - ) - }); + if (app?.spec?.source?.helm?.values) { + attributes.push({ + title: 'VALUES', + view: app.spec.source.helm && ( + +
    {app.spec.source.helm.values}
    +
    + ), + edit: (formApi: FormApi) => ( +
    +
    +                            
    +                        
    + {props.details.helm.values && ( +
    + + +
    {props.details.helm.values}
    +
    +
    + )} +
    + ) + }); + } const paramsByName = new Map(); (props.details.helm.parameters || []).forEach(param => paramsByName.set(param.name, param)); const overridesByName = new Map(); @@ -256,7 +264,7 @@ export const ApplicationParameters = (props: { } else if (props.details.type === 'Plugin') { attributes.push({ title: 'NAME', - view: source.plugin && source.plugin.name, + view: app.spec.source.plugin && app.spec.source.plugin.name, edit: (formApi: FormApi) => ( services.authService.settings()}> {(settings: AuthSettings) => ( @@ -267,41 +275,11 @@ export const ApplicationParameters = (props: { }); attributes.push({ title: 'ENV', - view: source.plugin && (source.plugin.env || []).map(i => `${i.name}='${i.value}'`).join(' '), + view: app.spec.source.plugin && (app.spec.source.plugin.env || []).map(i => `${i.name}='${i.value}'`).join(' '), edit: (formApi: FormApi) => }); - if (props.details.plugin.parametersAnnouncement) { - for (const announcement of props.details.plugin.parametersAnnouncement) { - const liveParam = app.spec.source.plugin.parameters?.find(param => param.name === announcement.name); - if (announcement.collectionType === undefined || announcement.collectionType === '' || announcement.collectionType === 'string') { - attributes.push({ - title: announcement.title ?? announcement.name, - view: liveParam?.string || announcement.string, - edit: () => liveParam?.string || announcement.string - }); - } else if (announcement.collectionType === 'array') { - attributes.push({ - title: announcement.title ?? announcement.name, - view: (liveParam?.array || announcement.array || []).join(' '), - edit: () => (liveParam?.array || announcement.array || []).join(' ') - }); - } else if (announcement.collectionType === 'map') { - const entries = concatMaps(announcement.map, liveParam?.map).entries(); - attributes.push({ - title: announcement.title ?? announcement.name, - view: Array.from(entries) - .map(([key, value]) => `${key}='${value}'`) - .join(' '), - edit: () => - Array.from(entries) - .map(([key, value]) => `${key}='${value}'`) - .join(' ') - }); - } - } - } } else if (props.details.type === 'Directory') { - const directory = source.directory || ({} as ApplicationSourceDirectory); + const directory = app.spec.source.directory || ({} as ApplicationSourceDirectory); attributes.push({ title: 'DIRECTORY RECURSE', view: (!!directory.recurse).toString(), @@ -309,7 +287,7 @@ export const ApplicationParameters = (props: { }); attributes.push({ title: 'TOP-LEVEL ARGUMENTS', - view: ((directory?.jsonnet && directory?.jsonnet.tlas) || []).map((i, j) => ( + view: ((directory.jsonnet && directory.jsonnet.tlas) || []).map((i, j) => ( @@ -325,18 +303,6 @@ export const ApplicationParameters = (props: { )), edit: (formApi: FormApi) => }); - - attributes.push({ - title: 'INCLUDE', - view: directory && directory.include, - edit: (formApi: FormApi) => - }); - - attributes.push({ - title: 'EXCLUDE', - view: directory && directory.exclude, - edit: (formApi: FormApi) => - }); } return ( @@ -344,7 +310,6 @@ export const ApplicationParameters = (props: { save={ props.save && (async (input: models.Application) => { - const src = getAppDefaultSource(input); function isDefined(item: any) { return item !== null && item !== undefined; } @@ -352,11 +317,11 @@ export const ApplicationParameters = (props: { return item !== null && item !== undefined && item.match(/:/); } - if (src.helm && src.helm.parameters) { - src.helm.parameters = src.helm.parameters.filter(isDefined); + if (input.spec.source.helm && input.spec.source.helm.parameters) { + input.spec.source.helm.parameters = input.spec.source.helm.parameters.filter(isDefined); } - if (src.kustomize && src.kustomize.images) { - src.kustomize.images = src.kustomize.images.filter(isDefinedWithVersion); + if (input.spec.source.kustomize && input.spec.source.kustomize.images) { + input.spec.source.kustomize.images = input.spec.source.kustomize.images.filter(isDefinedWithVersion); } await props.save(input, {}); setRemovedOverrides(new Array()); diff --git a/ui/src/app/applications/components/application-pod-view/pod-view.scss b/ui/src/app/applications/components/application-pod-view/pod-view.scss index 24b2b79a9f33f..b2251e8f2432a 100644 --- a/ui/src/app/applications/components/application-pod-view/pod-view.scss +++ b/ui/src/app/applications/components/application-pod-view/pod-view.scss @@ -7,13 +7,6 @@ $pods-per-column: 4; $max-rows: 5; $num-stats: 2; -$pod-age-icon-clr: #ffce25; - -.circle-icon { - color: $pod-age-icon-clr; - font-size: 10px; -} - .pod-view { &__settings { align-items: center; @@ -74,7 +67,7 @@ $pod-age-icon-clr: #ffce25; margin: 1em 0; padding: 10px; border-radius: 3px; - background-color: $argo-color-gray-3; + background-color: $argo-color-gray-3; color: $argo-color-gray-6; div { display: flex; @@ -156,7 +149,7 @@ $pod-age-icon-clr: #ffce25; } &__new-pod-icon { background: none; - color: $pod-age-icon-clr; + color: #FFCE25; display: block; left: 20px; margin: 0px; @@ -245,4 +238,4 @@ $pod-age-icon-clr: #ffce25; } } } -} +} \ No newline at end of file diff --git a/ui/src/app/applications/components/application-pod-view/pod-view.tsx b/ui/src/app/applications/components/application-pod-view/pod-view.tsx index 5d9493872c4a6..aee6c01907fb9 100644 --- a/ui/src/app/applications/components/application-pod-view/pod-view.tsx +++ b/ui/src/app/applications/components/application-pod-view/pod-view.tsx @@ -51,7 +51,6 @@ export class PodView extends React.Component { {prefs => { const podPrefs = prefs.appDetails.podView || ({} as PodViewPreferences); const groups = this.processTree(podPrefs.sortMode, this.props.tree.hosts || []) || []; - return (
    @@ -107,9 +106,7 @@ export class PodView extends React.Component {
    {group.resourceStatus.health && }   - {group.resourceStatus.status && ( - - )} + {group.resourceStatus.status && }
    )}
    @@ -174,14 +171,6 @@ export class PodView extends React.Component { {pod.createdAt} ago ({{pod.createdAt}}) -
    - {isYoungerThanXMinutes(pod, 30) && ( - -   - pod age less than 30min - - )} -
    )}
    @@ -285,7 +274,6 @@ export class PodView extends React.Component { ), action: () => { - this.appContext.apis.navigation.goto('.', {podSortMode: mode}); services.viewPreferences.updatePreferences({appDetails: {...prefs.appDetails, podView: {...podPrefs, sortMode: mode}}}); } })); @@ -319,7 +307,6 @@ export class PodView extends React.Component { const statusByKey = new Map(); this.props.app.status?.resources?.forEach(res => statusByKey.set(nodeKey(res), res)); - (tree.nodes || []).forEach((rnode: ResourceTreeNode) => { // make sure each node has not null/undefined parentRefs field rnode.parentRefs = rnode.parentRefs || []; @@ -328,7 +315,6 @@ export class PodView extends React.Component { parentsFor[rnode.uid] = rnode.parentRefs as PodGroup[]; const fullName = nodeKey(rnode); const status = statusByKey.get(fullName); - if ((rnode.parentRefs || []).length === 0) { rnode.root = rnode; } @@ -339,7 +325,7 @@ export class PodView extends React.Component { ...rnode, info: (rnode.info || []).filter(i => !i.name.includes('Resource.')), createdAt: rnode.createdAt, - resourceStatus: {health: rnode.health, status: status ? status.status : null, requiresPruning: status && status.requiresPruning ? true : false}, + resourceStatus: {health: rnode.health, status: status ? status.status : null}, renderMenu: () => this.props.nodeMenu(rnode), renderQuickStarts: () => this.props.quickStarts(rnode) }; diff --git a/ui/src/app/applications/components/application-resource-tree/application-resource-tree.scss b/ui/src/app/applications/components/application-resource-tree/application-resource-tree.scss index 74ad1e53a79fc..19e7e3364ecc5 100644 --- a/ui/src/app/applications/components/application-resource-tree/application-resource-tree.scss +++ b/ui/src/app/applications/components/application-resource-tree/application-resource-tree.scss @@ -93,9 +93,7 @@ } &--orphaned { - @include themify($themes) { - background-color: themed('light-argo-gray-2'); - } + background-color: lighten($argo-color-gray-4, 10%); } &--load-balancer { diff --git a/ui/src/app/applications/components/application-resource-tree/application-resource-tree.tsx b/ui/src/app/applications/components/application-resource-tree/application-resource-tree.tsx index 1bd6b42df814a..c6b250356bb56 100644 --- a/ui/src/app/applications/components/application-resource-tree/application-resource-tree.tsx +++ b/ui/src/app/applications/components/application-resource-tree/application-resource-tree.tsx @@ -16,6 +16,7 @@ import { ComparisonStatusIcon, deletePodAction, getAppOverridesCount, + getExternalUrls, HealthStatusIcon, isAppNode, isYoungerThanXMinutes, @@ -26,7 +27,6 @@ import { import {NodeUpdateAnimation} from './node-update-animation'; import {PodGroup} from '../application-pod-view/pod-view'; import {ArrowConnector} from './arrow-connector'; -import './application-resource-tree.scss'; function treeNodeKey(node: NodeId & {uid?: string}) { return node.uid || nodeKey(node); @@ -34,6 +34,8 @@ function treeNodeKey(node: NodeId & {uid?: string}) { const color = require('color'); +require('./application-resource-tree.scss'); + export interface ResourceTreeNode extends models.ResourceNode { status?: models.SyncStatusCode; health?: models.HealthStatus; @@ -375,7 +377,10 @@ function renderPodGroup(props: ApplicationResourceTreeProps, id: string, node: R } const appNode = isAppNode(node); const rootNode = !node.root; - const extLinks: string[] = props.app.status.summary.externalURLs; + let extLinks: string[] = props.app.status.summary.externalURLs; + if (rootNode) { + extLinks = getExternalUrls(props.app.metadata.annotations, props.app.status.summary.externalURLs); + } const podGroupChildren = childMap.get(treeNodeKey(node)); const nonPodChildren = podGroupChildren?.reduce((acc, child) => { if (child.kind !== 'Pod') { @@ -428,7 +433,7 @@ function renderPodGroup(props: ApplicationResourceTreeProps, id: string, node: R {appNode && !rootNode && ( {ctx => ( - + )} @@ -601,8 +606,11 @@ function renderResourceNode(props: ApplicationResourceTreeProps, id: string, nod } const appNode = isAppNode(node); const rootNode = !node.root; - const extLinks: string[] = props.app.status.summary.externalURLs; + let extLinks: string[] = props.app.status.summary.externalURLs; const childCount = nodesHavingChildren.get(node.uid); + if (rootNode) { + extLinks = getExternalUrls(props.app.metadata.annotations, props.app.status.summary.externalURLs); + } return (
    props.onNodeClick && props.onNodeClick(fullName)} @@ -644,7 +652,7 @@ function renderResourceNode(props: ApplicationResourceTreeProps, id: string, nod {appNode && !rootNode && ( {ctx => ( - + )} diff --git a/ui/src/app/applications/components/application-resources-diff/application-resources-diff.tsx b/ui/src/app/applications/components/application-resources-diff/application-resources-diff.tsx index 18eb941981a37..3eeb6975f4d66 100644 --- a/ui/src/app/applications/components/application-resources-diff/application-resources-diff.tsx +++ b/ui/src/app/applications/components/application-resources-diff/application-resources-diff.tsx @@ -8,7 +8,7 @@ import * as models from '../../../shared/models'; import {services} from '../../../shared/services'; import {IndividualDiffSection} from './individual-diff-section'; -import './application-resources-diff.scss'; +require('./application-resources-diff.scss'); export interface ApplicationResourcesDiffProps { states: models.ResourceDiff[]; diff --git a/ui/src/app/applications/components/application-resources-diff/individual-diff-section.tsx b/ui/src/app/applications/components/application-resources-diff/individual-diff-section.tsx index 7d82659cbfdc7..1a3a876890045 100644 --- a/ui/src/app/applications/components/application-resources-diff/individual-diff-section.tsx +++ b/ui/src/app/applications/components/application-resources-diff/individual-diff-section.tsx @@ -3,7 +3,7 @@ import {useState} from 'react'; import {Diff, Hunk} from 'react-diff-view'; import 'react-diff-view/style/index.css'; -import './application-resources-diff.scss'; +require('./application-resources-diff.scss'); export interface IndividualDiffSectionProps { file: any; diff --git a/ui/src/app/applications/components/application-retry-options/application-retry-options.tsx b/ui/src/app/applications/components/application-retry-options/application-retry-options.tsx index 48b72de19551e..165c57e0714a7 100644 --- a/ui/src/app/applications/components/application-retry-options/application-retry-options.tsx +++ b/ui/src/app/applications/components/application-retry-options/application-retry-options.tsx @@ -5,7 +5,7 @@ import {omit} from 'lodash-es'; import {NumberField} from '../../../shared/components'; import * as models from '../../../shared/models'; -import './application-retry-options.scss'; +require('./application-retry-options.scss'); const durationRegex = /^([\d\.]+[HMS])+$/i; const durationRegexError = 'Should be 1h10m10s/10h10m/10m/10s'; diff --git a/ui/src/app/applications/components/application-retry-view/application-retry-view.tsx b/ui/src/app/applications/components/application-retry-view/application-retry-view.tsx index a97d9d5b98609..6fcd11e313522 100644 --- a/ui/src/app/applications/components/application-retry-view/application-retry-view.tsx +++ b/ui/src/app/applications/components/application-retry-view/application-retry-view.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import * as models from '../../../shared/models'; -import './application-retry-view.scss'; +require('./application-retry-view.scss'); function buildRetryOptionView(label: string, data: string | number) { const result = data || 'not installed'; 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 443a841f5785f..d2d5646b0c751 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 @@ -5,11 +5,10 @@ import {Revision} from '../../../shared/components/revision'; import {Timestamp} from '../../../shared/components/timestamp'; import * as models from '../../../shared/models'; import {services} from '../../../shared/services'; -import {ApplicationSyncWindowStatusIcon, ComparisonStatusIcon, getAppDefaultSource, getAppOperationState} from '../utils'; -import {getConditionCategory, HealthStatusIcon, OperationState, syncStatusMessage} from '../utils'; +import {ApplicationSyncWindowStatusIcon, ComparisonStatusIcon, getAppOperationState, getConditionCategory, HealthStatusIcon, OperationState, syncStatusMessage} from '../utils'; import {RevisionMetadataPanel} from './revision-metadata-panel'; -import './application-status-panel.scss'; +require('./application-status-panel.scss'); interface Props { application: models.Application; @@ -64,7 +63,7 @@ export const ApplicationStatusPanel = ({application, showOperation, showConditio const infos = cntByCategory.get('info'); const warnings = cntByCategory.get('warning'); const errors = cntByCategory.get('error'); - const source = getAppDefaultSource(application); + return (
    @@ -83,25 +82,24 @@ export const ApplicationStatusPanel = ({application, showOperation, showConditio title: 'CURRENT 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.' }, - source.chart ? null : () => showMetadataInfo(application.status.sync ? application.status.sync.revision : '') + application.spec.source.chart ? null : () => showMetadataInfo(application.status.sync ? application.status.sync.revision : '') )}
    -
    {syncStatusMessage(application)}
    +
    {syncStatusMessage(application)}
    - {application.status && application.status.sync && application.status.sync.revision && !application.spec.source.chart && ( -
    +
    + {application.status && application.status.sync && application.status.sync.revision && ( -
    - )} -
    {application.spec.syncPolicy?.automated ? 'Auto sync is enabled.' : 'Auto sync is not enabled.'}
    + )} +
    {appOperationState && ( @@ -115,15 +113,15 @@ export const ApplicationStatusPanel = ({application, showOperation, showConditio daysSinceLastSynchronized + ' days since last sync. Click for the status of that sync.' }, - source.chart ? null : () => showMetadataInfo(appOperationState.syncResult ? appOperationState.syncResult.revision : '') + application.spec.source.chart ? null : () => showMetadataInfo(appOperationState.syncResult ? appOperationState.syncResult.revision : '') )}
    showOperation && showOperation()}> {' '} {appOperationState.syncResult && appOperationState.syncResult.revision && ( -
    - To +
    + To
    )}
    @@ -135,7 +133,7 @@ export const ApplicationStatusPanel = ({application, showOperation, showConditio )) ||
    {appOperationState.message}
    } 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 9e75c3bb4e78a..ec7dcbc41838b 100644 --- a/ui/src/app/applications/components/application-summary/application-summary.tsx +++ b/ui/src/app/applications/components/application-summary/application-summary.tsx @@ -21,15 +21,14 @@ import {services} from '../../../shared/services'; import {ApplicationSyncOptionsField} from '../application-sync-options/application-sync-options'; import {RevisionFormField} from '../revision-form-field/revision-form-field'; -import {ComparisonStatusIcon, HealthStatusIcon, syncStatusMessage, urlPattern, formatCreationTimestamp, getAppDefaultSource, getAppSpecDefaultSource} from '../utils'; +import {ComparisonStatusIcon, HealthStatusIcon, syncStatusMessage, urlPattern, formatCreationTimestamp} from '../utils'; import {ApplicationRetryOptions} from '../application-retry-options/application-retry-options'; import {ApplicationRetryView} from '../application-retry-view/application-retry-view'; import {Link} from 'react-router-dom'; import {EditNotificationSubscriptions, useEditNotificationSubscriptions} from './edit-notification-subscriptions'; import {EditAnnotations} from './edit-annotations'; -import './application-summary.scss'; -import {DeepLinks} from '../../../shared/components/deep-links'; +require('./application-summary.scss'); function swap(array: any[], a: number, b: number) { array = array.slice(); @@ -44,8 +43,7 @@ export interface ApplicationSummaryProps { export const ApplicationSummary = (props: ApplicationSummaryProps) => { const app = JSON.parse(JSON.stringify(props.app)) as models.Application; - const source = getAppDefaultSource(app); - const isHelm = source.hasOwnProperty('chart'); + const isHelm = app.spec.source.hasOwnProperty('chart'); const initialState = app.spec.destination.server === undefined ? 'NAME' : 'URL'; const [destFormat, setDestFormat] = React.useState(initialState); const [changeSync, setChangeSync] = React.useState(false); @@ -153,12 +151,12 @@ export const ApplicationSummary = (props: ApplicationSummaryProps) => { edit: (formApi: FormApi) => }, { - title: 'CREATED AT', + title: 'CREATED_AT', view: formatCreationTimestamp(app.metadata.creationTimestamp) }, { title: 'REPO URL', - view: , + view: , edit: (formApi: FormApi) => }, ...(isHelm @@ -167,16 +165,16 @@ export const ApplicationSummary = (props: ApplicationSummaryProps) => { title: 'CHART', view: ( - {source.chart}:{source.targetRevision} + {app.spec.source.chart}:{app.spec.source.targetRevision} ), edit: (formApi: FormApi) => ( services.repos.charts(src.repoURL).catch(() => new Array())}> {(charts: models.HelmChart[]) => (
    -
    +
    { />
    { const chartInfo = data.charts.find(chart => chart.name === data.chart); return (chartInfo && chartInfo.versions) || new Array(); }}> {(versions: string[]) => ( -
    +
    { : [ { title: 'TARGET REVISION', - view: , - edit: (formApi: FormApi) => + view: , + edit: (formApi: FormApi) => }, { title: 'PATH', - view: ( - - {source.path ?? ''} - - ), + view: app.spec.source.path, edit: (formApi: FormApi) => } ]), @@ -295,14 +289,6 @@ export const ApplicationSummary = (props: ApplicationSummaryProps) => { {app.status.health.status} ) - }, - { - title: 'LINKS', - view: ( - services.applications.getLinks(app.metadata.name)} input={app} key='appLinks'> - {(links: models.LinksResponse) => } - - ) } ]; @@ -455,11 +441,11 @@ export const ApplicationSummary = (props: ApplicationSummaryProps) => { return (
    - {source.plugin && typeof source.plugin.name === 'string' && source.plugin.name !== '' && ( + {app.spec.source.plugin && typeof app.spec.source.plugin.name === 'string' && app.spec.source.plugin.name !== '' && (
    This Application uses a plugin which will no longer be supported starting with - Argo CD version 2.6. Contact your Argo CD administrator to make sure they upgrade the '{source.plugin.name}' plugin before upgrading to Argo CD 2.6. See the{' '} - 2.4-to-2.5 upgrade notes for details. + Argo CD version 2.6. Contact your Argo CD administrator to make sure they upgrade the '{app.spec.source.plugin.name}' plugin before upgrading to Argo CD 2.6. + See the 2.4-to-2.5 upgrade notes for details.
    )} any}) => { const [form, setForm] = React.useState(null); @@ -21,7 +21,6 @@ export const ApplicationSyncPanel = ({application, selectedResource, hide}: {app const syncResIndex = appResources.findIndex(item => nodeKey(item) === selectedResource); const syncStrategy = {} as models.SyncStrategy; const [isPending, setPending] = React.useState(false); - const source = getAppDefaultSource(application); return ( @@ -48,7 +47,7 @@ export const ApplicationSyncPanel = ({application, selectedResource, hide}: {app {isVisible && (
    i === syncResIndex || syncResIndex === -1), syncOptions: application.spec.syncPolicy ? application.spec.syncPolicy.syncOptions : [] }} @@ -120,7 +119,7 @@ export const ApplicationSyncPanel = ({application, selectedResource, hide}: {app {formApi => (
    - Synchronizing application manifests from {source.repoURL} + Synchronizing application manifests from {application.spec.source.repoURL}
    diff --git a/ui/src/app/applications/components/application-urls.tsx b/ui/src/app/applications/components/application-urls.tsx index e6dc82458156d..1d64bc8a43b9f 100644 --- a/ui/src/app/applications/components/application-urls.tsx +++ b/ui/src/app/applications/components/application-urls.tsx @@ -1,6 +1,5 @@ import {DropDownMenu} from 'argo-ui'; import * as React from 'react'; -import {isValidURL} from '../../shared/utils'; export class InvalidExternalLinkError extends Error { constructor(message: string) { @@ -23,10 +22,25 @@ export class ExternalLink { this.title = url; this.ref = url; } - if (!isValidURL(this.ref)) { + if (!ExternalLink.isValidURL(this.ref)) { throw new InvalidExternalLinkError('Invalid URL'); } } + + private static isValidURL(url: string): boolean { + try { + const parsedUrl = new URL(url); + return parsedUrl.protocol !== 'javascript:' && parsedUrl.protocol !== 'data:'; + } catch (TypeError) { + try { + // Try parsing as a relative URL. + const parsedUrl = new URL(url, window.location.origin); + return parsedUrl.protocol !== 'javascript:' && parsedUrl.protocol !== 'data:'; + } catch (TypeError) { + return false; + } + } + } } export const ApplicationURLs = ({urls}: {urls: string[]}) => { diff --git a/ui/src/app/applications/components/applications-list/applications-filter.tsx b/ui/src/app/applications/components/applications-list/applications-filter.tsx index 4d6e9d78c631d..8fea3b15d4bee 100644 --- a/ui/src/app/applications/components/applications-list/applications-filter.tsx +++ b/ui/src/app/applications/components/applications-list/applications-filter.tsx @@ -2,16 +2,15 @@ import {useData, Checkbox} from 'argo-ui/v2'; import * as minimatch from 'minimatch'; import * as React from 'react'; import {Context} from '../../../shared/context'; -import {Application, ApplicationDestination, Cluster, HealthStatusCode, HealthStatuses, SyncPolicy, SyncStatusCode, SyncStatuses} from '../../../shared/models'; +import {Application, ApplicationDestination, Cluster, HealthStatusCode, HealthStatuses, SyncStatusCode, SyncStatuses} from '../../../shared/models'; import {AppsListPreferences, services} from '../../../shared/services'; import {Filter, FiltersGroup} from '../filter/filter'; import * as LabelSelector from '../label-selector'; -import {ComparisonStatusIcon, getAppDefaultSource, HealthStatusIcon} from '../utils'; +import {ComparisonStatusIcon, HealthStatusIcon} from '../utils'; export interface FilterResult { repos: boolean; sync: boolean; - autosync: boolean; health: boolean; namespaces: boolean; clusters: boolean; @@ -23,20 +22,12 @@ export interface FilteredApp extends Application { filterResult: FilterResult; } -function getAutoSyncStatus(syncPolicy?: SyncPolicy) { - if (!syncPolicy || !syncPolicy.automated) { - return 'Disabled'; - } - return 'Enabled'; -} - export function getFilterResults(applications: Application[], pref: AppsListPreferences): FilteredApp[] { return applications.map(app => ({ ...app, filterResult: { - repos: pref.reposFilter.length === 0 || pref.reposFilter.includes(getAppDefaultSource(app).repoURL), + repos: pref.reposFilter.length === 0 || pref.reposFilter.includes(app.spec.source.repoURL), sync: pref.syncFilter.length === 0 || pref.syncFilter.includes(app.status.sync.status), - autosync: pref.autoSyncFilter.length === 0 || pref.autoSyncFilter.includes(getAutoSyncStatus(app.spec.syncPolicy)), health: pref.healthFilter.length === 0 || pref.healthFilter.includes(app.status.health.status), namespaces: pref.namespacesFilter.length === 0 || pref.namespacesFilter.some(ns => app.spec.destination.namespace && minimatch(app.spec.destination.namespace, ns)), favourite: !pref.showFavorites || (pref.favoritesAppList && pref.favoritesAppList.includes(app.metadata.name)), @@ -250,32 +241,6 @@ const FavoriteFilter = (props: AppFilterProps) => { ); }; -function getAutoSyncOptions(apps: FilteredApp[]) { - const counts = getCounts(apps, 'autosync', app => getAutoSyncStatus(app.spec.syncPolicy), ['Enabled', 'Disabled']); - return [ - { - label: 'Enabled', - icon: , - count: counts.get('Enabled') - }, - { - label: 'Disabled', - icon: , - count: counts.get('Disabled') - } - ]; -} - -const AutoSyncFilter = (props: AppFilterProps) => ( - props.onChange({...props.pref, autoSyncFilter: s})} - options={getAutoSyncOptions(props.apps)} - collapsed={props.collapsed || false} - /> -); - export const ApplicationsFilter = (props: AppFilterProps) => { return ( @@ -286,7 +251,6 @@ export const ApplicationsFilter = (props: AppFilterProps) => { - ); }; diff --git a/ui/src/app/applications/components/applications-list/applications-labels.tsx b/ui/src/app/applications/components/applications-list/applications-labels.tsx index 3f401f452e107..80b7a9989dd12 100644 --- a/ui/src/app/applications/components/applications-list/applications-labels.tsx +++ b/ui/src/app/applications/components/applications-list/applications-labels.tsx @@ -1,14 +1,13 @@ import * as React from 'react'; import {Tooltip} from 'argo-ui'; import {Application} from '../../../shared/models'; -import {getAppDefaultSource} from '../utils'; -import './applications-labels.scss'; +require('./applications-labels.scss'); export const ApplicationsLabels = ({app}: {app: Application}) => { const labels = ( <> - {getAppDefaultSource(app).targetRevision || 'HEAD'} + {app.spec.source.targetRevision || 'HEAD'} {Object.keys(app.metadata.labels || {}).map(label => ( {`${label}=${app.metadata.labels[label]}`} ))} diff --git a/ui/src/app/applications/components/applications-list/applications-list.scss b/ui/src/app/applications/components/applications-list/applications-list.scss index fbe03245e94e6..5325f63878942 100644 --- a/ui/src/app/applications/components/applications-list/applications-list.scss +++ b/ui/src/app/applications/components/applications-list/applications-list.scss @@ -4,9 +4,6 @@ .applications-list { padding: 1em; - @media screen and (max-width: 1024px) { - padding: 0; - } min-height: 88vh; &__title { font-weight: bolder; @@ -211,11 +208,3 @@ i.menu_icon { vertical-align: middle; } - -.argo-button { - i { - @media screen and (max-width: map-get($breakpoints, large)) { - margin: 0 auto !important; - } - } -} \ No newline at end of file diff --git a/ui/src/app/applications/components/applications-list/applications-list.tsx b/ui/src/app/applications/components/applications-list/applications-list.tsx index 42ee2da8a6899..d0498d06d7657 100644 --- a/ui/src/app/applications/components/applications-list/applications-list.tsx +++ b/ui/src/app/applications/components/applications-list/applications-list.tsx @@ -7,7 +7,7 @@ import {RouteComponentProps} from 'react-router'; import {combineLatest, from, merge, Observable} from 'rxjs'; import {bufferTime, delay, filter, map, mergeMap, repeat, retryWhen} from 'rxjs/operators'; import {AddAuthToToolbar, ClusterCtx, DataLoader, EmptyState, ObservableQuery, Page, Paginate, Query, Spinner} from '../../../shared/components'; -import {AuthSettingsCtx, Consumer, Context, ContextApis} from '../../../shared/context'; +import {Consumer, Context, ContextApis} from '../../../shared/context'; import * as models from '../../../shared/models'; import {AppsListViewKey, AppsListPreferences, AppsListViewType, HealthStatusBarPreferences, services} from '../../../shared/services'; import {ApplicationCreatePanel} from '../application-create-panel/application-create-panel'; @@ -22,14 +22,11 @@ import {ApplicationTiles} from './applications-tiles'; import {ApplicationsRefreshPanel} from '../applications-refresh-panel/applications-refresh-panel'; import {useSidebarTarget} from '../../../sidebar/sidebar'; -import './applications-list.scss'; -import './flex-top-bar.scss'; +require('./applications-list.scss'); +require('./flex-top-bar.scss'); const EVENTS_BUFFER_TIMEOUT = 500; const WATCH_RETRY_TIMEOUT = 500; - -// The applications list/watch API supports only selected set of fields. -// Make sure to register any new fields in the `appFields` map of `pkg/apiclient/application/forwarder_overwrite.go`. const APP_FIELDS = [ 'metadata.name', 'metadata.namespace', @@ -40,7 +37,6 @@ const APP_FIELDS = [ 'spec', 'operation.sync', 'status.sync.status', - 'status.sync.revision', 'status.health', 'status.operationState.phase', 'status.operationState.operation.sync', @@ -112,12 +108,6 @@ const ViewPref = ({children}: {children: (pref: AppsListPreferences & {page: num .split(',') .filter(item => !!item); } - if (params.get('autoSync') != null) { - viewPref.autosyncFilter = params - .get('autoSync') - .split(',') - .filter(item => !!item); - } if (params.get('health') != null) { viewPref.healthFilter = params .get('health') @@ -197,7 +187,6 @@ const SearchBar = (props: {content: string; ctx: ContextApis; apps: models.Appli const {useKeybinding} = React.useContext(KeybindingContext); const [isFocused, setFocus] = React.useState(false); - const useAuthSettingsCtx = React.useContext(AuthSettingsCtx); useKeybinding({ keys: Key.SLASH, @@ -266,7 +255,7 @@ const SearchBar = (props: {content: string; ctx: ContextApis; apps: models.Appli }} onChange={e => ctx.navigation.goto('.', {search: e.target.value}, {replace: true})} value={content || ''} - items={apps.map(app => AppUtils.appQualifiedName(app, useAuthSettingsCtx?.appsInAnyNamespaceEnabled))} + items={apps.map(app => app.metadata.namespace + '/' + app.metadata.name)} /> ); }; @@ -292,7 +281,7 @@ const FlexTopBar = (props: {toolbar: Toolbar | Observable}) => { style={{marginRight: 2}} key={i}> {item.iconClassName && } - {item.title} + {item.title} ))} @@ -340,7 +329,6 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { { proj: newPref.projectsFilter.join(','), sync: newPref.syncFilter.join(','), - autoSync: newPref.autoSyncFilter.join(','), health: newPref.healthFilter.join(','), namespace: newPref.namespacesFilter.join(','), cluster: newPref.clustersFilter.join(','), @@ -470,7 +458,7 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => {
    {applications.length === 0 && pref.projectsFilter?.length === 0 && (pref.labelsFilter || []).length === 0 ? ( -

    No applications available to you just yet

    +

    No applications yet

    Create new application to start managing resources in your cluster
    - +
    Project:
    @@ -93,16 +92,7 @@ export const ApplicationsTable = (props: {
    Name:
    - - {app.metadata.name} -
    - - {app.metadata.creationTimestamp} - - - }> + {app.metadata.name}
    @@ -114,7 +104,7 @@ export const ApplicationsTable = (props: {
    Source:
    - +
    @@ -128,7 +118,6 @@ export const ApplicationsTable = (props: {
    -
    {app.status.health.status}
    diff --git a/ui/src/app/applications/components/applications-list/applications-tiles.tsx b/ui/src/app/applications/components/applications-list/applications-tiles.tsx index c07f3b156b133..81716a1564ef7 100644 --- a/ui/src/app/applications/components/applications-list/applications-tiles.tsx +++ b/ui/src/app/applications/components/applications-list/applications-tiles.tsx @@ -7,10 +7,10 @@ import {Consumer, Context, AuthSettingsCtx} from '../../../shared/context'; import * as models from '../../../shared/models'; import {ApplicationURLs} from '../application-urls'; import * as AppUtils from '../utils'; -import {getAppDefaultSource, OperationState} from '../utils'; +import {OperationState} from '../utils'; import {services} from '../../../shared/services'; -import './applications-tiles.scss'; +require('./applications-tiles.scss'); export interface ApplicationTilesProps { applications: models.Application[]; @@ -53,7 +53,7 @@ export const ApplicationTiles = ({applications, syncApplication, refreshApplicat const appRef = {ref: React.useRef(null), set: false}; const appContainerRef = React.useRef(null); const appsPerRow = useItemsPerContainer(appRef.ref, appContainerRef); - const useAuthSettingsCtx = React.useContext(AuthSettingsCtx); + const authSettingsCtx = React.useContext(AuthSettingsCtx); const {useKeybinding} = React.useContext(KeybindingContext); @@ -108,197 +108,194 @@ export const ApplicationTiles = ({applications, syncApplication, refreshApplicat
    - {applications.map((app, i) => { - const source = getAppDefaultSource(app); - return ( -
    + {applications.map((app, i) => ( +
    +
    -
    - ctx.navigation.goto( - `/applications/${app.metadata.namespace}/${app.metadata.name}`, - {view: pref.appDetails.view}, - {event: e} - ) - }> -
    -
    -
    0 ? 'columns small-10' : 'columns small-11'}> - - - - {AppUtils.appQualifiedName(app, useAuthSettingsCtx?.appsInAnyNamespaceEnabled)} - + className='row' + onClick={e => + ctx.navigation.goto(`/applications/${app.metadata.namespace}/${app.metadata.name}`, {view: pref.appDetails.view}, {event: e}) + }> +
    +
    +
    0 + ? 'columns small-10' + : 'columns small-11' + }> + + + + {AppUtils.appQualifiedName(app, authSettingsCtx?.appsInAnyNamespaceEnabled)} + + +
    +
    0 + ? 'columns small-2' + : 'columns small-1' + }> +
    + + +
    -
    0 ? 'columns small-2' : 'columns small-1'}> -
    - - - - -
    -
    -
    -
    - Project: -
    -
    {app.spec.project}
    +
    +
    +
    + Project:
    -
    -
    - Labels: -
    -
    - - {Object.keys(app.metadata.labels || {}) - .map(label => ({label, value: app.metadata.labels[label]})) - .map(item => ( -
    - {item.label}={item.value} -
    - ))} -
    - }> - +
    {app.spec.project}
    +
    +
    +
    + Labels: +
    +
    + {Object.keys(app.metadata.labels || {}) - .map(label => `${label}=${app.metadata.labels[label]}`) - .join(', ')} - - -
    + .map(label => ({label, value: app.metadata.labels[label]})) + .map(item => ( +
    + {item.label}={item.value} +
    + ))} +
    + }> + + {Object.keys(app.metadata.labels || {}) + .map(label => `${label}=${app.metadata.labels[label]}`) + .join(', ')} + +
    -
    -
    - Status: -
    -
    - {app.status.health.status} -   - {app.status.sync.status} -   - -
    +
    +
    +
    + Status:
    -
    -
    - Repository: -
    -
    - - {source.repoURL} - -
    +
    + {app.status.health.status} +   + {app.status.sync.status} +   +
    -
    -
    - Target Revision: -
    -
    {source.targetRevision || 'HEAD'}
    +
    +
    +
    + Repository:
    - {source.path && ( -
    -
    - Path: -
    -
    {source.path}
    -
    - )} - {source.chart && ( -
    -
    - Chart: -
    -
    {source.chart}
    -
    - )} -
    -
    - Destination: -
    -
    - -
    +
    + + {app.spec.source.repoURL} +
    -
    -
    - Namespace: -
    -
    {app.spec.destination.namespace}
    +
    +
    +
    + Target Revision:
    +
    {app.spec.source.targetRevision}
    +
    + {app.spec.source.path && (
    -
    - Created At: +
    + Path:
    -
    {AppUtils.formatCreationTimestamp(app.metadata.creationTimestamp)}
    +
    {app.spec.source.path}
    + )} + {app.spec.source.chart && (
    - + )} +
    +
    + Destination: +
    +
    + +
    +
    +
    +
    + Namespace: +
    +
    {app.spec.destination.namespace}
    +
    +
    - ); - })} +
    + ))}
    ); }} diff --git a/ui/src/app/applications/components/applications-sync-panel/applications-sync-panel.tsx b/ui/src/app/applications/components/applications-sync-panel/applications-sync-panel.tsx index 0c97b75eb0b70..71d2f4c512421 100644 --- a/ui/src/app/applications/components/applications-sync-panel/applications-sync-panel.tsx +++ b/ui/src/app/applications/components/applications-sync-panel/applications-sync-panel.tsx @@ -8,7 +8,7 @@ import {services} from '../../../shared/services'; import {ApplicationRetryOptions} from '../application-retry-options/application-retry-options'; import {ApplicationManualSyncFlags, ApplicationSyncOptions, FORCE_WARNING, SyncFlags} from '../application-sync-options/application-sync-options'; import {ApplicationSelector} from '../../../shared/components'; -import {confirmSyncingAppOfApps, getAppDefaultSource} from '../utils'; +import {confirmSyncingAppOfApps} from '../utils'; interface Progress { percentage: number; @@ -99,7 +99,7 @@ export const ApplicationsSyncPanel = ({show, apps, hide}: {show: boolean; apps: .sync( app.metadata.name, app.metadata.namespace, - getAppDefaultSource(app).targetRevision, + app.spec.source.targetRevision, syncFlags.Prune || false, syncFlags.DryRun || false, syncStrategy, diff --git a/ui/src/app/applications/components/filter/filter.tsx b/ui/src/app/applications/components/filter/filter.tsx index b333022513f3c..2200fb707c7df 100644 --- a/ui/src/app/applications/components/filter/filter.tsx +++ b/ui/src/app/applications/components/filter/filter.tsx @@ -15,7 +15,6 @@ interface FilterProps { retry?: () => void; loading?: boolean; radio?: boolean; - collapsed?: boolean; } export interface CheckboxOption { @@ -78,7 +77,7 @@ export const Filter = (props: FilterProps) => { const [values, setValues] = React.useState(init); const [tags, setTags] = React.useState([]); const [input, setInput] = React.useState(''); - const [collapsed, setCollapsed] = React.useState(props.collapsed || false); + const [collapsed, setCollapsed] = React.useState(false); const [options, setOptions] = React.useState(props.options); React.useEffect(() => { diff --git a/ui/src/app/applications/components/pod-terminal-viewer/pod-terminal-viewer.tsx b/ui/src/app/applications/components/pod-terminal-viewer/pod-terminal-viewer.tsx index 62080741c249f..60aa775497fd6 100644 --- a/ui/src/app/applications/components/pod-terminal-viewer/pod-terminal-viewer.tsx +++ b/ui/src/app/applications/components/pod-terminal-viewer/pod-terminal-viewer.tsx @@ -11,7 +11,6 @@ import {Context} from '../../../shared/context'; import {ErrorNotification, NotificationType} from 'argo-ui'; export interface PodTerminalViewerProps { applicationName: string; - applicationNamespace: string; projectName: string; selectedNode: models.ResourceNode; podState: models.State; @@ -25,15 +24,7 @@ export interface ShellFrame { cols?: number; } -export const PodTerminalViewer: React.FC = ({ - selectedNode, - applicationName, - applicationNamespace, - projectName, - podState, - containerName, - onClickContainer -}) => { +export const PodTerminalViewer: React.FC = ({selectedNode, applicationName, projectName, podState, containerName, onClickContainer}) => { const terminalRef = React.useRef(null); const appContext = React.useContext(Context); // used to show toast const fitAddon = new FitAddon(); @@ -154,7 +145,7 @@ export const PodTerminalViewer: React.FC = ({ webSocket = new WebSocket( `${ location.protocol === 'https:' ? 'wss' : 'ws' - }://${url}/terminal?pod=${name}&container=${containerName}&appName=${applicationName}&appNamespace=${applicationNamespace}&projectName=${projectName}&namespace=${namespace}` + }://${url}/terminal?pod=${name}&container=${containerName}&appName=${applicationName}&projectName=${projectName}&namespace=${namespace}` ); webSocket.onopen = onConnectionOpen; webSocket.onclose = onConnectionClose; diff --git a/ui/src/app/applications/components/resource-details/resource-details.tsx b/ui/src/app/applications/components/resource-details/resource-details.tsx index 8f8500e20268b..eb94298ff9215 100644 --- a/ui/src/app/applications/components/resource-details/resource-details.tsx +++ b/ui/src/app/applications/components/resource-details/resource-details.tsx @@ -1,4 +1,4 @@ -import {DataLoader, DropDown, Tab, Tabs} from 'argo-ui'; +import {DataLoader, Tab, Tabs} from 'argo-ui'; import * as React from 'react'; import {useState} from 'react'; import {EventsList, YamlEditor} from '../../../shared/components'; @@ -129,7 +129,6 @@ export const ResourceDetails = (props: ResourceDetailsProps) => { content: ( { key='appDetails' input={application} load={app => - services.repos.appDetails(AppUtils.getAppDefaultSource(app), app.metadata.name, app.spec.project).catch(() => ({ + services.repos.appDetails(app.spec.source, app.metadata.name, app.spec.project).catch(() => ({ type: 'Directory' as AppSourceType, - path: AppUtils.getAppDefaultSource(app).path + path: application.spec.source.path })) }> {(details: RepoAppDetails) => ( @@ -286,8 +285,7 @@ export const ResourceDetails = (props: ResourceDetailsProps) => { const execEnabled = settings.execEnabled; const logsAllowed = await services.accounts.canI('logs', 'get', application.spec.project + '/' + application.metadata.name); const execAllowed = await services.accounts.canI('exec', 'create', application.spec.project + '/' + application.metadata.name); - const links = await services.applications.getResourceLinks(application.metadata.name, application.metadata.namespace, selectedNode); - return {controlledState, liveState, events, podState, execEnabled, execAllowed, logsAllowed, links}; + return {controlledState, liveState, events, podState, execEnabled, execAllowed, logsAllowed}; }}> {data => ( @@ -309,23 +307,11 @@ export const ResourceDetails = (props: ResourceDetailsProps) => { onClick={() => appContext.navigation.goto('.', {deploy: AppUtils.nodeKey(selectedNode)}, {replace: true})} style={{marginLeft: 'auto', marginRight: '5px'}} className='argo-button argo-button--base'> - SYNC + SYNC - - ( - - )}> - {() => AppUtils.renderResourceActionMenu(selectedNode, application, tree, {apis: appContext})} -
    { title: 'SUMMARY', icon: 'fa fa-file-alt', key: 'summary', - content: ( - - ) + content: } ], data.execEnabled, diff --git a/ui/src/app/applications/components/utils.test.tsx b/ui/src/app/applications/components/utils.test.tsx index b7208f1854561..8c453fdea9744 100644 --- a/ui/src/app/applications/components/utils.test.tsx +++ b/ui/src/app/applications/components/utils.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import * as renderer from 'react-test-renderer'; import {Application, HealthStatus, HealthStatuses, OperationPhases, ResourceResult, ResultCodes, SyncStatuses} from '../../shared/models'; -import {ComparisonStatusIcon, getAppOperationState, getOperationType, HealthStatusIcon, OperationState, ResourceResultIcon} from './utils'; +import {ComparisonStatusIcon, getAppOperationState, getExternalUrls, getOperationType, HealthStatusIcon, OperationState, ResourceResultIcon} from './utils'; const zero = new Date(0).toISOString(); @@ -28,6 +28,38 @@ test('getAppOperationState.Status', () => { expect(state.phase).toBe(OperationPhases.Error); }); +test('getExternalUrls One URL from annotation, Empty External URL array', () => { + const links = getExternalUrls( + { + 'link.argocd.argoproj.io/external-link' : 'https://github.com/argoproj/argo-cd' + }, [] + ); + expect(links.length).toBe(1); + expect(links[0]).toBe('https://github.com/argoproj/argo-cd'); +}); + +test('getExternalUrls One URL from annotation, null URL array', () => { + const links = getExternalUrls( + { + 'link.argocd.argoproj.io/external-link' : 'https://github.com/argoproj/argo-cd' + }, null + ); + expect(links.length).toBe(1); + expect(links[0]).toBe('https://github.com/argoproj/argo-cd'); +}); + +test('getExternalUrls One URL from annotation, One External URL array', () => { + const links = getExternalUrls( + { + 'link.argocd.argoproj.io/external-link' : 'https://github.com/argoproj/argo-cd' + }, ['http://ingress-url:1234'] + ); + + expect(links.length).toBe(2); + expect(links[0]).toBe('http://ingress-url:1234'); + expect(links[1]).toBe('https://github.com/argoproj/argo-cd'); +}); + test('getOperationType.Delete', () => { const state = getOperationType({metadata: {deletionTimestamp: zero.toString()}} as Application); diff --git a/ui/src/app/applications/components/utils.tsx b/ui/src/app/applications/components/utils.tsx index 4b9bf94eee09a..75bdf9cdd80a2 100644 --- a/ui/src/app/applications/components/utils.tsx +++ b/ui/src/app/applications/components/utils.tsx @@ -1,4 +1,4 @@ -import {models, DataLoader, FormField, MenuItem, NotificationType, Tooltip} from 'argo-ui'; +import {DataLoader, FormField, MenuItem, NotificationType, Tooltip} from 'argo-ui'; import {ActionButton} from 'argo-ui/v2'; import * as classNames from 'classnames'; import * as React from 'react'; @@ -21,19 +21,16 @@ export interface NodeId { namespace: string; name: string; group: string; - createdAt?: appModels.Time; } -type ActionMenuItem = MenuItem & {disabled?: boolean; tooltip?: string}; +export const ExternalLinkAnnotation = 'link.argocd.argoproj.io/external-link'; + +type ActionMenuItem = MenuItem & {disabled?: boolean}; export function nodeKey(node: NodeId) { return [node.group, node.kind, node.namespace, node.name].join('/'); } -export function createdOrNodeKey(node: NodeId) { - return node?.createdAt || nodeKey(node); -} - export function isSameNode(first: NodeId, second: NodeId) { return nodeKey(first) === nodeKey(second); } @@ -243,10 +240,10 @@ export const ComparisonStatusIcon = ({ break; case appModels.SyncStatuses.OutOfSync: const requiresPruning = resource && resource.requiresPruning; - className = requiresPruning ? 'fa fa-trash' : 'fa fa-arrow-alt-circle-up'; + className = requiresPruning ? 'fa fa-times-circle' : 'fa fa-arrow-alt-circle-up'; title = 'OutOfSync'; if (requiresPruning) { - title = `${title} (This resource is not present in the application's source. It will be deleted from Kubernetes if the prune option is enabled during sync.)`; + title = `${title} (requires pruning)`; } color = COLORS.sync.out_of_sync; break; @@ -395,37 +392,6 @@ export const deletePopup = async (ctx: ContextApis, resource: ResourceTreeNode, ); }; -function getResourceActionsMenuItems(resource: ResourceTreeNode, metadata: models.Metadata, appContext: AppContext): Observable { - return services.applications - .getResourceActions(metadata.name, metadata.namespace, resource) - .then(actions => { - return actions.map( - action => - ({ - title: action.name, - disabled: !!action.disabled, - action: async () => { - try { - const confirmed = await appContext.apis.popup.confirm( - `Execute '${action.name}' action?`, - `Are you sure you want to execute '${action.name}' action?` - ); - if (confirmed) { - await services.applications.runResourceAction(metadata.name, metadata.namespace, resource, action.name); - } - } catch (e) { - appContext.apis.notifications.show({ - content: , - type: NotificationType.Error - }); - } - } - } as MenuItem) - ); - }) - .catch(() => [] as MenuItem[]); -} - function getActionItems( resource: ResourceTreeNode, application: appModels.Application, @@ -489,25 +455,38 @@ function getActionItems( }) .catch(() => [] as MenuItem[]); - const resourceActions = getResourceActionsMenuItems(resource, application.metadata, appContext); - - const links = services.applications.getResourceLinks(application.metadata.name, application.metadata.namespace, resource).then(data => { - return (data.items || []).map( - link => - ({ - title: link.title, - iconClassName: `fa ${link.iconClass ? link.iconClass : 'fa-external-link'}`, - action: () => window.open(link.url, '_blank'), - tooltip: link.description - } as MenuItem) - ); - }); - + const resourceActions = services.applications + .getResourceActions(application.metadata.name, application.metadata.namespace, resource) + .then(actions => { + return actions.map( + action => + ({ + title: action.name, + disabled: !!action.disabled, + action: async () => { + try { + const confirmed = await appContext.apis.popup.confirm( + `Execute '${action.name}' action?`, + `Are you sure you want to execute '${action.name}' action?` + ); + if (confirmed) { + await services.applications.runResourceAction(application.metadata.name, application.metadata.namespace, resource, action.name); + } + } catch (e) { + appContext.apis.notifications.show({ + content: , + type: NotificationType.Error + }); + } + } + } as MenuItem) + ); + }) + .catch(() => [] as MenuItem[]); return combineLatest( from([items]), // this resolves immediately concat([[] as MenuItem[]], resourceActions), // this resolves at first to [] and then whatever the API returns - concat([[] as MenuItem[]], execAction), // this resolves at first to [] and then whatever the API returns - concat([[] as MenuItem[]], links) // this resolves at first to [] and then whatever the API returns + concat([[] as MenuItem[]], execAction) // this resolves at first to [] and then whatever the API returns ).pipe(map(res => ([] as MenuItem[]).concat(...res))); } @@ -526,43 +505,6 @@ export function renderResourceMenu( } else { menuItems = getActionItems(resource, application, tree, appContext, appChanged, false); } - return ( - menuItems}> - {items => ( -
      - {items.map((item, i) => ( -
    • { - e.stopPropagation(); - if (!item.disabled) { - item.action(); - document.body.click(); - } - }}> - {item.tooltip ? ( - -
      - {item.iconClassName && } {item.title} -
      -
      - ) : ( - <> - {item.iconClassName && } {item.title} - - )} -
    • - ))} -
    - )} -
    - ); -} - -export function renderResourceActionMenu(resource: ResourceTreeNode, application: appModels.Application, tree: appModels.ApplicationTree, appContext: AppContext): React.ReactNode { - const menuItems = getResourceActionsMenuItems(resource, application.metadata, appContext); - return ( menuItems}> {items => ( @@ -627,14 +569,12 @@ export function renderResourceButtons( } export function syncStatusMessage(app: appModels.Application) { - const source = getAppDefaultSource(app); - const rev = app.status.sync.revision || source.targetRevision || 'HEAD'; - let message = source.targetRevision || 'HEAD'; - + const rev = app.status.sync.revision || app.spec.source.targetRevision || 'HEAD'; + let message = app.spec.source.targetRevision || 'HEAD'; if (app.status.sync.revision) { - if (source.chart) { + if (app.spec.source.chart) { message += ' (' + app.status.sync.revision + ')'; - } else if (app.status.sync.revision.length >= 7 && !app.status.sync.revision.startsWith(source.targetRevision)) { + } else if (app.status.sync.revision.length >= 7 && !app.status.sync.revision.startsWith(app.spec.source.targetRevision)) { message += ' (' + app.status.sync.revision.substr(0, 7) + ')'; } } @@ -643,7 +583,7 @@ export function syncStatusMessage(app: appModels.Application) { return ( To{' '} - + {message} {' '} @@ -652,7 +592,7 @@ export function syncStatusMessage(app: appModels.Application) { return ( From{' '} - + {message} {' '} @@ -822,6 +762,20 @@ export const getAppOperationState = (app: appModels.Application): appModels.Oper } }; +export function getExternalUrls(annotations: {[name: string]: string}, urls: string[]): string[] { + if (!annotations) { + return urls; + } + const extLinks = urls || []; + const extLink: string = annotations[ExternalLinkAnnotation]; + if (extLink) { + if (!extLinks.includes(extLink)) { + extLinks.push(extLink); + } + } + return extLinks; +} + export function getOperationType(application: appModels.Application) { const operation = application.operation || (application.status && application.status.operationState && application.status.operationState.operation); if (application.metadata.deletionTimestamp && !application.operation) { @@ -957,29 +911,15 @@ export function isAppNode(node: appModels.ResourceNode) { } export function getAppOverridesCount(app: appModels.Application) { - const source = getAppDefaultSource(app); - if (source.kustomize && source.kustomize.images) { - return source.kustomize.images.length; + if (app.spec.source.kustomize && app.spec.source.kustomize.images) { + return app.spec.source.kustomize.images.length; } - if (source.helm && source.helm.parameters) { - return source.helm.parameters.length; + if (app.spec.source.helm && app.spec.source.helm.parameters) { + return app.spec.source.helm.parameters.length; } return 0; } -// getAppDefaultSource gets the first app source from `sources` or, if that list is missing or empty, the `source` -// field. -export function getAppDefaultSource(app?: appModels.Application) { - if (!app) { - return null; - } - return app.spec.sources && app.spec.sources.length > 0 ? app.spec.sources[0] : app.spec.source; -} - -export function getAppSpecDefaultSource(spec: appModels.ApplicationSpec) { - return spec.sources && spec.sources.length > 0 ? spec.sources[0] : spec.source; -} - export function isAppRefreshing(app: appModels.Application) { return !!(app.metadata.annotations && app.metadata.annotations[appModels.AnnotationRefreshKey]); } diff --git a/ui/src/app/settings/components/certs-list/certs-list.tsx b/ui/src/app/settings/components/certs-list/certs-list.tsx index 14a57facf124e..dde86a0ccee4c 100644 --- a/ui/src/app/settings/components/certs-list/certs-list.tsx +++ b/ui/src/app/settings/components/certs-list/certs-list.tsx @@ -35,9 +35,9 @@ export class CertsList extends React.Component> { public render() { return ( ) => timer(0, 1000).pipe(mergeMap(() => from(services.clusters.get(url, ''))))}> {(cluster: Cluster) => ( ) => const item = await services.clusters.get(updated.server, ''); item.name = updated.name; item.namespaces = updated.namespaces; - item.labels = updated.labels; - item.annotations = updated.annotations; - loaderRef.current.setData(await services.clusters.update(item, 'name', 'namespaces', 'labels', 'annotations')); + loaderRef.current.setData(await services.clusters.update(item, 'name', 'namespaces')); }} title='GENERAL' items={[ @@ -85,20 +83,6 @@ export const ClusterDetails = (props: RouteComponentProps<{server: string}>) => title: 'NAMESPACES', view: ((cluster.namespaces || []).length === 0 && 'All namespaces') || cluster.namespaces.join(', '), edit: formApi => - }, - { - title: 'LABELS', - view: Object.keys(cluster.labels || []) - .map(label => `${label}=${cluster.labels[label]}`) - .join(' '), - edit: formApi => - }, - { - title: 'ANNOTATIONS', - view: Object.keys(cluster.annotations || []) - .map(annotation => `${annotation}=${cluster.annotations[annotation]}`) - .join(' '), - edit: formApi => } ]} /> diff --git a/ui/src/app/settings/components/project-details/project-details.tsx b/ui/src/app/settings/components/project-details/project-details.tsx index 224c2e1e45e12..7bed89c99e928 100644 --- a/ui/src/app/settings/components/project-details/project-details.tsx +++ b/ui/src/app/settings/components/project-details/project-details.tsx @@ -16,7 +16,6 @@ import {ProjectEvents} from '../project-events/project-events'; import {ProjectRoleEditPanel} from '../project-role-edit-panel/project-role-edit-panel'; import {ProjectSyncWindowsEditPanel} from '../project-sync-windows-edit-panel/project-sync-windows-edit-panel'; import {ResourceListsPanel} from './resource-lists-panel'; -import {DeepLinks} from '../../../shared/components/deep-links'; require('./project-details.scss'); @@ -576,14 +575,6 @@ export class ProjectDetails extends React.Component `${label}=${proj.metadata.labels[label]}`) .join(' '), edit: (formApi: FormApi) => - }, - { - title: 'LINKS', - view: ( -
    - services.projects.getLinks(proj.metadata.name)}>{links => } -
    - ) } ]} /> 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 fe69df45ddaa5..611d190475023 100644 --- a/ui/src/app/settings/components/repos-list/repos-list.tsx +++ b/ui/src/app/settings/components/repos-list/repos-list.tsx @@ -53,15 +53,6 @@ interface NewGitHubAppRepoParams { project?: string; } -interface NewGoogleCloudSourceRepoParams { - type: string; - name: string; - url: string; - gcpServiceAccountKey: string; - proxy: string; - project?: string; -} - interface NewSSHRepoCredsParams { url: string; sshPrivateKey: string; @@ -73,7 +64,6 @@ interface NewHTTPSRepoCredsParams { password: string; tlsClientCertData: string; tlsClientCertKey: string; - proxy: string; } interface NewGitHubAppRepoCredsParams { @@ -84,19 +74,12 @@ interface NewGitHubAppRepoCredsParams { githubAppEnterpriseBaseURL: string; tlsClientCertData: string; tlsClientCertKey: string; - proxy: string; -} - -interface NewGoogleCloudSourceRepoCredsParams { - url: string; - gcpServiceAccountKey: string; } export enum ConnectionMethod { SSH = 'via SSH', HTTPS = 'via HTTPS', - GITHUBAPP = 'via GitHub App', - GOOGLECLOUD = 'via Google Cloud' + GITHUBAPP = 'via GitHub App' } export class ReposList extends React.Component< @@ -139,8 +122,8 @@ export class ReposList extends React.Component< {method.toUpperCase()}

    )} - items={[ConnectionMethod.SSH, ConnectionMethod.HTTPS, ConnectionMethod.GITHUBAPP, ConnectionMethod.GOOGLECLOUD].map( - (connectMethod: ConnectionMethod.SSH | ConnectionMethod.HTTPS | ConnectionMethod.GITHUBAPP | ConnectionMethod.GOOGLECLOUD) => ({ + items={[ConnectionMethod.SSH, ConnectionMethod.HTTPS, ConnectionMethod.GITHUBAPP].map( + (connectMethod: ConnectionMethod.SSH | ConnectionMethod.HTTPS | ConnectionMethod.GITHUBAPP) => ({ title: connectMethod.toUpperCase(), action: () => { onSelection(connectMethod); @@ -185,12 +168,6 @@ export class ReposList extends React.Component< githubAppInstallationId: !githubAppValues.githubAppInstallationId && 'GitHub App installation ID is required', githubAppPrivateKey: !githubAppValues.githubAppPrivateKey && 'GitHub App private Key is required' }; - case ConnectionMethod.GOOGLECLOUD: - const googleCloudValues = params as NewGoogleCloudSourceRepoParams; - return { - url: (!googleCloudValues.url && 'Repo URL is required') || (this.credsTemplate && !this.isHTTPSUrl(googleCloudValues.url) && 'Not a valid HTTPS URL'), - gcpServiceAccountKey: !googleCloudValues.gcpServiceAccountKey && 'GCP service account key is required' - }; } } @@ -238,8 +215,6 @@ export class ReposList extends React.Component< return (params: FormValues) => this.connectHTTPSRepo(params as NewHTTPSRepoParams); case ConnectionMethod.GITHUBAPP: return (params: FormValues) => this.connectGitHubAppRepo(params as NewGitHubAppRepoParams); - case ConnectionMethod.GOOGLECLOUD: - return (params: FormValues) => this.connectGoogleCloudSourceRepo(params as NewGoogleCloudSourceRepoParams); } } @@ -572,29 +547,6 @@ export class ReposList extends React.Component<
    )} - {this.state.method === ConnectionMethod.GOOGLECLOUD && ( -
    -

    CONNECT REPO USING GOOGLE CLOUD

    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - )} )} @@ -678,8 +630,7 @@ export class ReposList extends React.Component< username: params.username, password: params.password, tlsClientCertData: params.tlsClientCertData, - tlsClientCertKey: params.tlsClientCertKey, - proxy: params.proxy + tlsClientCertKey: params.tlsClientCertKey }); } else { this.setState({connecting: true}); @@ -725,8 +676,7 @@ export class ReposList extends React.Component< githubAppInstallationId: params.githubAppInstallationId, githubAppEnterpriseBaseURL: params.githubAppEnterpriseBaseURL, tlsClientCertData: params.tlsClientCertData, - tlsClientCertKey: params.tlsClientCertKey, - proxy: params.proxy + tlsClientCertKey: params.tlsClientCertKey }); } else { this.setState({connecting: true}); @@ -745,30 +695,6 @@ export class ReposList extends React.Component< } } - // Connect a new repository or create a repository credentials for GitHub App repositories - private async connectGoogleCloudSourceRepo(params: NewGoogleCloudSourceRepoParams) { - if (this.credsTemplate) { - this.createGoogleCloudSourceCreds({ - url: params.url, - gcpServiceAccountKey: params.gcpServiceAccountKey - }); - } else { - this.setState({connecting: true}); - try { - await services.repos.createGoogleCloudSource(params); - this.repoLoader.reload(); - this.showConnectRepo = false; - } catch (e) { - this.appContext.apis.notifications.show({ - content: , - type: NotificationType.Error - }); - } finally { - this.setState({connecting: false}); - } - } - } - private async createHTTPSCreds(params: NewHTTPSRepoCredsParams) { try { await services.repocreds.createHTTPS(params); @@ -808,19 +734,6 @@ export class ReposList extends React.Component< } } - private async createGoogleCloudSourceCreds(params: NewGoogleCloudSourceRepoCredsParams) { - try { - await services.repocreds.createGoogleCloudSource(params); - this.credsLoader.reload(); - this.showConnectRepo = false; - } catch (e) { - this.appContext.apis.notifications.show({ - content: , - type: NotificationType.Error - }); - } - } - // Remove a repository from the configuration private async disconnectRepo(repo: string) { const confirmed = await this.appContext.apis.popup.confirm('Disconnect repository', `Are you sure you want to disconnect '${repo}'?`); diff --git a/ui/src/app/settings/components/settings-overview/settings-overview.tsx b/ui/src/app/settings/components/settings-overview/settings-overview.tsx index 102c2c28b1510..e2af9ec69cad3 100644 --- a/ui/src/app/settings/components/settings-overview/settings-overview.tsx +++ b/ui/src/app/settings/components/settings-overview/settings-overview.tsx @@ -13,8 +13,8 @@ const settings = [ path: './repos' }, { - title: 'Repository certificates and known hosts', - description: 'Configure repository certificates and known hosts for connecting Git repositories', + title: 'Certificates', + description: 'Configure certificates for connecting Git repositories', path: './certs' }, { diff --git a/ui/src/app/shared/components/application-selector/application-selector.tsx b/ui/src/app/shared/components/application-selector/application-selector.tsx index 786d39c4cd6cd..6b7b74212bf05 100644 --- a/ui/src/app/shared/components/application-selector/application-selector.tsx +++ b/ui/src/app/shared/components/application-selector/application-selector.tsx @@ -6,7 +6,7 @@ import {appInstanceName, appQualifiedName, ComparisonStatusIcon, HealthStatusIco import {AuthSettingsCtx} from '../../context'; export const ApplicationSelector = ({apps, formApi}: {apps: models.Application[]; formApi: FormFunctionProps}) => { - const useAuthSettingsCtx = React.useContext(AuthSettingsCtx); + const authSettingsCtx = React.useContext(AuthSettingsCtx); return ( <>
    ))} - {/*
    services.viewPreferences.updatePreferences({...props.pref, hideSidebar: !props.pref.hideSidebar})} className='sidebar__collapse-button'> +
    services.viewPreferences.updatePreferences({...props.pref, hideSidebar: !props.pref.hideSidebar})} className='sidebar__collapse-button'> -
    */} +
    {props.pref.hideSidebar && (
    services.viewPreferences.updatePreferences({...props.pref, hideSidebar: !props.pref.hideSidebar})} className='sidebar__collapse-button'> From a8b36af049131d614132ec3370eeacaea752c403 Mon Sep 17 00:00:00 2001 From: Sharath Chandra Date: Mon, 27 Feb 2023 17:42:05 +0530 Subject: [PATCH 07/17] OP-19494 - Based on the condition display argo related details --- ui/src/app/app.tsx | 46 +++++++++---------- .../application-details.tsx | 10 ++-- .../components/applications-container.tsx | 2 + ui/src/app/sidebar/sidebar.tsx | 31 +++++++++---- 4 files changed, 54 insertions(+), 35 deletions(-) diff --git a/ui/src/app/app.tsx b/ui/src/app/app.tsx index 6d986266d8439..b474c86b3ca84 100644 --- a/ui/src/app/app.tsx +++ b/ui/src/app/app.tsx @@ -42,29 +42,29 @@ interface NavItem { } const navItems: NavItem[] = [ - // { - // title: 'Applications', - // tooltip: 'Manage your applications, and diagnose health problems.', - // path: '/applications', - // iconClassName: 'argo-icon argo-icon-application' - // }, - // { - // title: 'Settings', - // tooltip: 'Manage your repositories, projects, settings', - // path: '/settings', - // iconClassName: 'argo-icon argo-icon-settings' - // }, - // { - // title: 'User Info', - // path: '/user-info', - // iconClassName: 'fa fa-user-circle' - // }, - // { - // title: 'Documentation', - // tooltip: 'Read the documentation, and get help and assistance.', - // path: '/help', - // iconClassName: 'argo-icon argo-icon-docs' - // } + { + title: 'Applications', + tooltip: 'Manage your applications, and diagnose health problems.', + path: '/applications', + iconClassName: 'argo-icon argo-icon-application' + }, + { + title: 'Settings', + tooltip: 'Manage your repositories, projects, settings', + path: '/settings', + iconClassName: 'argo-icon argo-icon-settings' + }, + { + title: 'User Info', + path: '/user-info', + iconClassName: 'fa fa-user-circle' + }, + { + title: 'Documentation', + tooltip: 'Read the documentation, and get help and assistance.', + path: '/help', + iconClassName: 'argo-icon argo-icon-docs' + } ]; const versionLoader = services.version.version(); 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 bccb6e926d6a7..81822423d49c9 100644 --- a/ui/src/app/applications/components/application-details/application-details.tsx +++ b/ui/src/app/applications/components/application-details/application-details.tsx @@ -134,6 +134,10 @@ export class ApplicationDetails extends React.Component} + breadcrumbs: this.pathHasOpsmx() ? [] : [ + {title: 'Applications', path: '/applications'}, + {title: } ], actionMenu: {items: this.getApplicationActionMenu(application, true)}, tools: ( diff --git a/ui/src/app/applications/components/applications-container.tsx b/ui/src/app/applications/components/applications-container.tsx index 756f7ea22f2d8..37c2181bdc621 100644 --- a/ui/src/app/applications/components/applications-container.tsx +++ b/ui/src/app/applications/components/applications-container.tsx @@ -8,7 +8,9 @@ export const ApplicationsContainer = (props: RouteComponentProps) => ( + + diff --git a/ui/src/app/sidebar/sidebar.tsx b/ui/src/app/sidebar/sidebar.tsx index 971ac8fae1a65..298a156cc3f3d 100644 --- a/ui/src/app/sidebar/sidebar.tsx +++ b/ui/src/app/sidebar/sidebar.tsx @@ -28,10 +28,20 @@ export const useSidebarTarget = () => { return sidebarTarget; }; +const checkUrlIncludesOpsmx = (param: string) => { + let urlSplit = param.split('/') + if(urlSplit[urlSplit.length-2] == 'opsmx' && urlSplit[urlSplit.length-1] == 'details'){ + return true; + }else{ + return false; + } +} + export const Sidebar = (props: SidebarProps) => { const context = React.useContext(Context); const [version, loading, error] = useData(() => services.version.version()); const locationPath = context.history.location.pathname; + const pathHasOpsmx = checkUrlIncludesOpsmx(locationPath); const tooltipProps = { placement: 'right', @@ -46,13 +56,16 @@ export const Sidebar = (props: SidebarProps) => { return (
    - {/*
    - Argo {!props.pref.hideSidebar && 'Argo CD'} -
    -
    - {loading ? 'Loading...' : error?.state ? 'Unknown' : version?.Version || 'Unknown'} -
    */} - {(props.navItems || []).map(item => ( + {!pathHasOpsmx ? +
    + Argo {!props.pref.hideSidebar && 'Argo CD'} +
    +
    + {loading ? 'Loading...' : error?.state ? 'Unknown' : version?.Version || 'Unknown'} +
    +
    + : null} + {((pathHasOpsmx ? [] : props.navItems) || []).map(item => (
    {
    ))} -
    services.viewPreferences.updatePreferences({...props.pref, hideSidebar: !props.pref.hideSidebar})} className='sidebar__collapse-button'> + {!pathHasOpsmx ?
    services.viewPreferences.updatePreferences({...props.pref, hideSidebar: !props.pref.hideSidebar})} className='sidebar__collapse-button'> -
    +
    : null} {props.pref.hideSidebar && (
    services.viewPreferences.updatePreferences({...props.pref, hideSidebar: !props.pref.hideSidebar})} className='sidebar__collapse-button'> From b5ad09cb89d5f79976f1a88e6391954483fc9c6b Mon Sep 17 00:00:00 2001 From: Siddhu Date: Tue, 28 Feb 2023 17:23:13 +0530 Subject: [PATCH 08/17] OP-19575-Implement-ISD-theme-for-Argo-CD --- .../components/filter/filter.scss | 4 +- .../applications/components/filter/filter.tsx | 2 +- ui/src/app/index.html | 1 + ui/src/assets/styles.css | 102 ++++++++++++++++++ 4 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 ui/src/assets/styles.css diff --git a/ui/src/app/applications/components/filter/filter.scss b/ui/src/app/applications/components/filter/filter.scss index 0f46addc74d5e..ca1f875ca88c2 100644 --- a/ui/src/app/applications/components/filter/filter.scss +++ b/ui/src/app/applications/components/filter/filter.scss @@ -25,7 +25,7 @@ $slate: #191826; background: $slate; &:hover { - background: $sidebar-color !important; + background: $sidebar-color; } } } @@ -118,7 +118,7 @@ $slate: #191826; background: $slate; &:hover { - background: $sidebar-color !important; + background: $sidebar-color; } } } diff --git a/ui/src/app/applications/components/filter/filter.tsx b/ui/src/app/applications/components/filter/filter.tsx index 2200fb707c7df..c1b3f99e51c49 100644 --- a/ui/src/app/applications/components/filter/filter.tsx +++ b/ui/src/app/applications/components/filter/filter.tsx @@ -148,7 +148,7 @@ export const Filter = (props: FilterProps) => { setValues(update); }} style={{width: '100%'}} - inputStyle={{marginBottom: '0.5em', backgroundColor: 'black', border: 'none'}} + inputStyle={{marginBottom: '0.5em', backgroundColor: '#4b7293', border: 'none' , color: '#fff'}} /> )} {((props.field ? tags : options) || []).map((opt, i) => ( diff --git a/ui/src/app/index.html b/ui/src/app/index.html index 540c5d7a3a21b..74cc59fd60f57 100644 --- a/ui/src/app/index.html +++ b/ui/src/app/index.html @@ -9,6 +9,7 @@ + diff --git a/ui/src/assets/styles.css b/ui/src/assets/styles.css new file mode 100644 index 0000000000000..3b915bcafe53c --- /dev/null +++ b/ui/src/assets/styles.css @@ -0,0 +1,102 @@ +:root { + --sidebar-background: #39546a; + --filter-background: #4b729366; + --filter-background-active: #4b7293; + --page-and-panel-background: #f8f8f8; + --button-primary: #149cb5; + --button-secondary: #d7e8ed; + --button-disabled: #149cb5; + --primary: #6fe5ff; +} + +.top-bar { + background: var(--sidebar-background) !important; +} + +.top-bar__breadcrumbs { + color: var(--primary) !important;; +} + +.filter ::placeholder { + color: #fff !important; +} + +.filter__item { + background-color: var(--filter-background) !important; +} + +.filter__item .checkbox{ + border: 2px solid #fff !important; +} + +.filter__item--selected { + background-color: var(--filter-background-active) !important; +} + +.sidebar, +.nav-bar { + background: var(--sidebar-background) !important; +} + +.page__content-wrapper { + background: var(--page-and-panel-background) !important; +} + +.sliding-panel__header, +.sliding-panel__body { + background: var(--page-and-panel-background) !important; +} + +.argo-button { + border-radius: 4px !important; +} + +/* primary */ +.argo-button--base, +.argo-button--base:hover { + background: var(--button-primary) !important; + color: #fff !important; +} + +.argo-button--base:hover, +.argo-button:hover { + background-color: var(--button-secondary) !important; + color: #000 !important; +} + +/* secondary */ +.argo-button--base-o { + color: var(--button-primary) !important; + box-shadow: inset 0 0 0 1px var(--button-primary) !important; +} + +.argo-button--base-o:hover, +.argo-button--base-o:focus { + background: var(--button-secondary) !important; + color: #000 !important; + box-shadow: inset 0 0 0 1px var(--button-secondary) !important; +} + +/* disabled */ +.argo-button.disabled, +.argo-button[disabled] { + background: var(--button-disabled) !important; + opacity: .3 !important; + color: #fff !important; +} + +a, +/* title of the each item in list in settings page */ +.settings-overview__redirect-panel__title, +.selected, +.top-bar__title { + color: var(--primary) !important; +} + +.tabs__indicator { + background: var(--primary) !important; +} + +.applications-list__search { + border-radius: 3px !important; +} \ No newline at end of file From e55a8c1f4ee28adb1a847f62b85487f10d57d500 Mon Sep 17 00:00:00 2001 From: Siddhu Date: Tue, 28 Feb 2023 18:43:37 +0530 Subject: [PATCH 09/17] OP-19575-Add suggested changes regarding Top-Bar --- ui/src/assets/styles.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ui/src/assets/styles.css b/ui/src/assets/styles.css index 3b915bcafe53c..bdfa84bd88c37 100644 --- a/ui/src/assets/styles.css +++ b/ui/src/assets/styles.css @@ -9,6 +9,10 @@ --primary: #6fe5ff; } +.top-bar + .top-bar { + background: #fff !important; +} + .top-bar { background: var(--sidebar-background) !important; } @@ -38,7 +42,8 @@ background: var(--sidebar-background) !important; } -.page__content-wrapper { +.page__content-wrapper, +.page__top-bar { background: var(--page-and-panel-background) !important; } From d3d275c5754cb7a46b7a5127779c34e778cf7936 Mon Sep 17 00:00:00 2001 From: Siddhu Date: Wed, 1 Mar 2023 16:05:52 +0530 Subject: [PATCH 10/17] OP-19575-changes regarding Top-Bar in application listing page --- ui/src/assets/styles.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/src/assets/styles.css b/ui/src/assets/styles.css index bdfa84bd88c37..5605b293ea6cc 100644 --- a/ui/src/assets/styles.css +++ b/ui/src/assets/styles.css @@ -9,7 +9,8 @@ --primary: #6fe5ff; } -.top-bar + .top-bar { +.top-bar + .top-bar, +.page__content-wrapper .top-bar { background: #fff !important; } From ecd8bb9ad6c1d2b8ce3234d67751a36efc835a21 Mon Sep 17 00:00:00 2001 From: Satya Kiran Date: Tue, 28 Mar 2023 15:51:33 +0530 Subject: [PATCH 11/17] OP-19920 --- ui/src/assets/styles.css | 71 +++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/ui/src/assets/styles.css b/ui/src/assets/styles.css index 5605b293ea6cc..5b3a9e180ba44 100644 --- a/ui/src/assets/styles.css +++ b/ui/src/assets/styles.css @@ -1,7 +1,7 @@ :root { - --sidebar-background: #39546a; - --filter-background: #4b729366; - --filter-background-active: #4b7293; + --sidebar-background: #fff; /*#4c6d95; #39546a; */ + --filter-background: #fff; /*#4b729366; */ + --filter-background-active: #fff;/* #4b7293; */ --page-and-panel-background: #f8f8f8; --button-primary: #149cb5; --button-secondary: #d7e8ed; @@ -15,11 +15,11 @@ } .top-bar { - background: var(--sidebar-background) !important; + /* background: var(--sidebar-background) !important; */ } .top-bar__breadcrumbs { - color: var(--primary) !important;; + /* color: var(--primary) !important;; */ } .filter ::placeholder { @@ -31,16 +31,29 @@ } .filter__item .checkbox{ - border: 2px solid #fff !important; + border: 2px solid rgb(0 0 0 / 70%) !important; +} + +.filter__item--selected .checkbox{ + border: none !important; } .filter__item--selected { background-color: var(--filter-background-active) !important; + color: black !important; } .sidebar, .nav-bar { background: var(--sidebar-background) !important; + box-shadow: 1px 0px 3px 0px rgb(0 0 0 / 10%) !important; + z-index: 1 !important; + margin-right: 1px !important; + color: rgb(0 0 0 / 70%) !important; +} + +.cd-layout__content.cd-layout__content--sb-expanded { + z-index: 0; } .page__content-wrapper, @@ -68,6 +81,14 @@ .argo-button:hover { background-color: var(--button-secondary) !important; color: #000 !important; + font-weight: lighter; +} + + +.argo-button--base:hover i, +.argo-button:hover i { + /* font-weight: lighter; */ + opacity: 0.5; } /* secondary */ @@ -94,9 +115,12 @@ a, /* title of the each item in list in settings page */ .settings-overview__redirect-panel__title, -.selected, +.selected { + /* color: var(--primary) !important; */ +} + .top-bar__title { - color: var(--primary) !important; + /* color: var(--primary) !important; */ } .tabs__indicator { @@ -105,4 +129,35 @@ a, .applications-list__search { border-radius: 3px !important; +} + +.autocomplete__input::placeholder { + color: transparent !important; +} + +.filters-group__header, .filter__header { + color: rgb(0 0 0 / 70%) !important; +} + +input.autocomplete__input.input { + background: white !important; + border-radius: 0px; + border: 1px solid black !important; +} + +.sidebar__nav-item.sidebar__nav-item--active { + color: white !important; + background: var(--button-primary) !important; +} + +.sidebar__nav-item, .sidebar__nav-item i { + color: rgb(0 0 0 / 70%) !important; +} + +.sidebar__nav-item--active i { + color: white !important; +} + +.filter__item__label { + color: rgb(0 0 0 / 70%) !important; } \ No newline at end of file From 3e6ab5736e4214cb01f8c5fe6270041b6e2fc679 Mon Sep 17 00:00:00 2001 From: Satya Kiran Date: Thu, 30 Mar 2023 16:02:49 +0530 Subject: [PATCH 12/17] popup and border style fixes --- ui/src/assets/styles.css | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ui/src/assets/styles.css b/ui/src/assets/styles.css index 5b3a9e180ba44..8c293c817fd44 100644 --- a/ui/src/assets/styles.css +++ b/ui/src/assets/styles.css @@ -160,4 +160,15 @@ input.autocomplete__input.input { .filter__item__label { color: rgb(0 0 0 / 70%) !important; +} + +.cd-layout:has(.sliding-panel--opened) { + display: inline; +} + +.application-resource-tree__node { + box-shadow: 0px 0px 3px 1px #ccd6dd !important; +} +.settings-overview__redirect-panel, .user-info-overview__panel, .argo-table-list__row { + box-shadow: 0px 0px 4px 1px rgb(0 0 0 / 10%) !important; } \ No newline at end of file From 3fce8ab1cd59297a5945e5160dcc2ee4f42ecfd2 Mon Sep 17 00:00:00 2001 From: NagendraOpsmx <80510611+NagendraOpsmx@users.noreply.github.com> Date: Wed, 24 Jan 2024 16:17:16 +0530 Subject: [PATCH 13/17] Argo App creation via Isd changes (#14) --- .../components/applications-container.tsx | 1 + .../applications-list/applications-list.tsx | 27 +++++++++++++++++-- .../app/shared/components/layout/layout.tsx | 18 +++++++++++-- ui/src/app/sidebar/sidebar.tsx | 7 +++-- ui/src/assets/styles.css | 8 ++++++ 5 files changed, 53 insertions(+), 8 deletions(-) diff --git a/ui/src/app/applications/components/applications-container.tsx b/ui/src/app/applications/components/applications-container.tsx index 37c2181bdc621..883218dbfee7c 100644 --- a/ui/src/app/applications/components/applications-container.tsx +++ b/ui/src/app/applications/components/applications-container.tsx @@ -7,6 +7,7 @@ import {ApplicationsList} from './applications-list/applications-list'; export const ApplicationsContainer = (props: RouteComponentProps) => ( + diff --git a/ui/src/app/applications/components/applications-list/applications-list.tsx b/ui/src/app/applications/components/applications-list/applications-list.tsx index d0498d06d7657..68c685e5da161 100644 --- a/ui/src/app/applications/components/applications-list/applications-list.tsx +++ b/ui/src/app/applications/components/applications-list/applications-list.tsx @@ -297,11 +297,22 @@ const FlexTopBar = (props: {toolbar: Toolbar | Observable}) => { ); }; +const checkUrlIncludesOpsmx = (param: string) => { + let urlSplit = param?.split('/') + if(urlSplit && urlSplit[urlSplit.length-2] == 'opsmx' && urlSplit[urlSplit.length-1] == 'creation'){ + return true; + } + return false; +} + export const ApplicationsList = (props: RouteComponentProps<{}>) => { const query = new URLSearchParams(props.location.search); const appInput = tryJsonParse(query.get('new')); const syncAppsInput = tryJsonParse(query.get('syncApps')); const refreshAppsInput = tryJsonParse(query.get('refreshApps')); + const context = React.useContext(Context); + const locationPath = context.history.location.pathname; + const pathHasOpsmx = checkUrlIncludesOpsmx(locationPath); const [createApi, setCreateApi] = React.useState(null); const clusters = React.useMemo(() => services.clusters.list(), []); const [isAppCreatePending, setAppCreatePending] = React.useState(false); @@ -573,7 +584,11 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { ctx.navigation.goto('.', {new: null}, {replace: true})} + onClose={() => { + if(pathHasOpsmx){ + window.parent.postMessage({msg:'closeEvent'},'*') + } + ctx.navigation.goto('.', {new: null}, {replace: true})}} header={
    {' '} @@ -601,6 +620,10 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { setAppCreatePending(true); try { await services.applications.create(app); + //iframe msg alert needed + if(pathHasOpsmx){ + window.parent.postMessage({msg:'saveEvent'},'*') + } ctx.navigation.goto('.', {new: null}, {replace: true}); } catch (e) { ctx.notifications.show({ diff --git a/ui/src/app/shared/components/layout/layout.tsx b/ui/src/app/shared/components/layout/layout.tsx index 2b9c448f5150b..733435e8d0201 100644 --- a/ui/src/app/shared/components/layout/layout.tsx +++ b/ui/src/app/shared/components/layout/layout.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import {Sidebar} from '../../../sidebar/sidebar'; import {ViewPreferences} from '../../services'; +import { Context } from '../../context'; require('./layout.scss'); @@ -12,11 +13,24 @@ export interface LayoutProps { isExtension?: boolean; } -export const Layout = (props: LayoutProps) => ( +const checkUrlIncludesOpsmx = (param: string) => { + let urlSplit = param?.split('/') + if(urlSplit && urlSplit[urlSplit.length-2] == 'opsmx' && urlSplit[urlSplit.length-1] == 'creation'){ + return true; + } + return false; +} + +export const Layout = (props: LayoutProps) => { + const context = React.useContext(Context); + const locationPath = context.history.location.pathname; + const pathHasOpsmx = checkUrlIncludesOpsmx(locationPath); + return (
    -
    +
    {props.children}
    ); +} diff --git a/ui/src/app/sidebar/sidebar.tsx b/ui/src/app/sidebar/sidebar.tsx index 298a156cc3f3d..ce5679e6cfa53 100644 --- a/ui/src/app/sidebar/sidebar.tsx +++ b/ui/src/app/sidebar/sidebar.tsx @@ -29,12 +29,11 @@ export const useSidebarTarget = () => { }; const checkUrlIncludesOpsmx = (param: string) => { - let urlSplit = param.split('/') - if(urlSplit[urlSplit.length-2] == 'opsmx' && urlSplit[urlSplit.length-1] == 'details'){ + let urlSplit = param?.split('/') + if(urlSplit && urlSplit[urlSplit.length-2] == 'opsmx' && (urlSplit[urlSplit.length-1] == 'details' || urlSplit[urlSplit.length-1] == 'creation')){ return true; - }else{ - return false; } + return false; } export const Sidebar = (props: SidebarProps) => { diff --git a/ui/src/assets/styles.css b/ui/src/assets/styles.css index 8c293c817fd44..03145fc8e055a 100644 --- a/ui/src/assets/styles.css +++ b/ui/src/assets/styles.css @@ -171,4 +171,12 @@ input.autocomplete__input.input { } .settings-overview__redirect-panel, .user-info-overview__panel, .argo-table-list__row { box-shadow: 0px 0px 4px 1px rgb(0 0 0 / 10%) !important; +} + +.opsmx_hide .sliding-panel__wrapper{ + width:100% !important +} + +.opsmx_hide .page__top-bar, .opsmx_hide .sidebar { + display: none; } \ No newline at end of file From ac8d1daed1f32106d96e0b9a62dc56b00996555c Mon Sep 17 00:00:00 2001 From: NagendraOpsmx <80510611+NagendraOpsmx@users.noreply.github.com> Date: Wed, 31 Jan 2024 11:41:47 +0530 Subject: [PATCH 14/17] initial loader event (#15) --- .../components/applications-list/applications-list.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/app/applications/components/applications-list/applications-list.tsx b/ui/src/app/applications/components/applications-list/applications-list.tsx index 68c685e5da161..a57422d3bef35 100644 --- a/ui/src/app/applications/components/applications-list/applications-list.tsx +++ b/ui/src/app/applications/components/applications-list/applications-list.tsx @@ -300,6 +300,7 @@ const FlexTopBar = (props: {toolbar: Toolbar | Observable}) => { const checkUrlIncludesOpsmx = (param: string) => { let urlSplit = param?.split('/') if(urlSplit && urlSplit[urlSplit.length-2] == 'opsmx' && urlSplit[urlSplit.length-1] == 'creation'){ + window.parent.postMessage({msg:'loadEvent'},'*'); return true; } return false; From 8ec16681553a6da045aa01e3f5aaf076156f080a Mon Sep 17 00:00:00 2001 From: NagendraOpsmx <80510611+NagendraOpsmx@users.noreply.github.com> Date: Thu, 1 Feb 2024 17:28:14 +0530 Subject: [PATCH 15/17] fix:Event loader moved to create page (#17) --- .../application-create-panel/application-create-panel.tsx | 6 +++++- .../components/applications-list/applications-list.tsx | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx b/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx index 9f4a8e19eff31..b17238481c46e 100644 --- a/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx +++ b/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx @@ -101,12 +101,13 @@ export const ApplicationCreatePanel = (props: { onAppChanged: (app: models.Application) => any; createApp: (app: models.Application) => any; getFormApi: (api: FormApi) => any; + externalPath?: boolean; }) => { const [yamlMode, setYamlMode] = React.useState(false); const [explicitPathType, setExplicitPathType] = React.useState<{path: string; type: models.AppSourceType}>(null); const [destFormat, setDestFormat] = React.useState('URL'); const [retry, setRetry] = React.useState(false); - + const pathHasOpsmx = props.externalPath; function normalizeTypeFields(formApi: FormApi, type: models.AppSourceType) { const app = formApi.getFormState().values; for (const item of appTypes) { @@ -129,6 +130,9 @@ export const ApplicationCreatePanel = (props: { ]).then(([projects, clusters, reposInfo]) => ({projects, clusters, reposInfo})) }> {({projects, clusters, reposInfo}) => { + if (pathHasOpsmx) { + window.parent.postMessage({msg:'loadEvent'},'*'); + } const repos = reposInfo.map(info => info.repo).sort(); const app = deepMerge(DEFAULT_APP, props.app || {}); const repoInfo = reposInfo.find(info => info.repo === app.spec.source.repoURL); diff --git a/ui/src/app/applications/components/applications-list/applications-list.tsx b/ui/src/app/applications/components/applications-list/applications-list.tsx index a57422d3bef35..fc4bdb602e817 100644 --- a/ui/src/app/applications/components/applications-list/applications-list.tsx +++ b/ui/src/app/applications/components/applications-list/applications-list.tsx @@ -300,7 +300,6 @@ const FlexTopBar = (props: {toolbar: Toolbar | Observable}) => { const checkUrlIncludesOpsmx = (param: string) => { let urlSplit = param?.split('/') if(urlSplit && urlSplit[urlSplit.length-2] == 'opsmx' && urlSplit[urlSplit.length-1] == 'creation'){ - window.parent.postMessage({msg:'loadEvent'},'*'); return true; } return false; @@ -636,6 +635,7 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { } }} app={appInput} + externalPath = {pathHasOpsmx} onAppChanged={app => ctx.navigation.goto('.', {new: JSON.stringify(app)}, {replace: true})} /> )} From 2ce31a24ec096d9af7a671b6803fc9b2bfc69672 Mon Sep 17 00:00:00 2001 From: NagendraOpsmx <80510611+NagendraOpsmx@users.noreply.github.com> Date: Wed, 7 Feb 2024 17:48:16 +0530 Subject: [PATCH 16/17] Argo app created to be logged in backend, ux issue (#18) --- .../application-create-panel/application-create-panel.tsx | 2 +- .../components/applications-list/applications-list.tsx | 6 +++--- ui/src/app/applications/components/utils.tsx | 2 +- ui/src/app/sidebar/sidebar.scss | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx b/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx index b17238481c46e..acf804853a1b5 100644 --- a/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx +++ b/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx @@ -131,7 +131,7 @@ export const ApplicationCreatePanel = (props: { }> {({projects, clusters, reposInfo}) => { if (pathHasOpsmx) { - window.parent.postMessage({msg:'loadEvent'},'*'); + window.parent.postMessage(window.btoa(JSON.stringify({msg:'loadEvent'})),'*') } const repos = reposInfo.map(info => info.repo).sort(); const app = deepMerge(DEFAULT_APP, props.app || {}); diff --git a/ui/src/app/applications/components/applications-list/applications-list.tsx b/ui/src/app/applications/components/applications-list/applications-list.tsx index fc4bdb602e817..9780c5d2d4bd5 100644 --- a/ui/src/app/applications/components/applications-list/applications-list.tsx +++ b/ui/src/app/applications/components/applications-list/applications-list.tsx @@ -586,7 +586,7 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { isShown={!!appInput} onClose={() => { if(pathHasOpsmx){ - window.parent.postMessage({msg:'closeEvent'},'*') + window.parent.postMessage(window.btoa(JSON.stringify({msg:'closeEvent'})),'*') } ctx.navigation.goto('.', {new: null}, {replace: true})}} header={ @@ -603,7 +603,7 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { qe-id='applications-list-button-cancel' onClick={() => { if(pathHasOpsmx){ - window.parent.postMessage({msg:'closeEvent'},'*') + window.parent.postMessage(window.btoa(JSON.stringify({msg:'closeEvent'})),'*') } ctx.navigation.goto('.', {new: null}, {replace: true})}} className='argo-button argo-button--base-o'> @@ -622,7 +622,7 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { await services.applications.create(app); //iframe msg alert needed if(pathHasOpsmx){ - window.parent.postMessage({msg:'saveEvent'},'*') + window.parent.postMessage(window.btoa(JSON.stringify({msg:'saveEvent',appName:app['metadata']['name']})),'*') } ctx.navigation.goto('.', {new: null}, {replace: true}); } catch (e) { diff --git a/ui/src/app/applications/components/utils.tsx b/ui/src/app/applications/components/utils.tsx index 2c4b09e0f26c2..38b213a1c4199 100644 --- a/ui/src/app/applications/components/utils.tsx +++ b/ui/src/app/applications/components/utils.tsx @@ -120,7 +120,7 @@ export async function deleteApplication(appName: string, appNamespace: string, a } } }, - {name: 'argo-icon-warning', color: 'info'}, + {name: 'argo-icon-warning', color: ''}, '', {propagationPolicy: 'foreground'} ); diff --git a/ui/src/app/sidebar/sidebar.scss b/ui/src/app/sidebar/sidebar.scss index ebe206bcb8ca6..5ccf9016d833b 100644 --- a/ui/src/app/sidebar/sidebar.scss +++ b/ui/src/app/sidebar/sidebar.scss @@ -13,7 +13,7 @@ color: white; background-color: $silver-lining; overflow: auto; - z-index: 0; + z-index: 0 !important; &__logo { justify-content: center; From 2edec7502e30227f9c310a3c957a221defdf3257 Mon Sep 17 00:00:00 2001 From: NagendraOpsmx <80510611+NagendraOpsmx@users.noreply.github.com> Date: Mon, 4 Mar 2024 17:42:26 +0530 Subject: [PATCH 17/17] encoded event listner msg earlier removed (#19) --- .../application-create-panel/application-create-panel.tsx | 2 +- .../components/applications-list/applications-list.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx b/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx index acf804853a1b5..104d600594c06 100644 --- a/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx +++ b/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx @@ -131,7 +131,7 @@ export const ApplicationCreatePanel = (props: { }> {({projects, clusters, reposInfo}) => { if (pathHasOpsmx) { - window.parent.postMessage(window.btoa(JSON.stringify({msg:'loadEvent'})),'*') + window.parent.postMessage({msg:'loadEvent'},'*') } const repos = reposInfo.map(info => info.repo).sort(); const app = deepMerge(DEFAULT_APP, props.app || {}); diff --git a/ui/src/app/applications/components/applications-list/applications-list.tsx b/ui/src/app/applications/components/applications-list/applications-list.tsx index 9780c5d2d4bd5..7d2b4e27c1207 100644 --- a/ui/src/app/applications/components/applications-list/applications-list.tsx +++ b/ui/src/app/applications/components/applications-list/applications-list.tsx @@ -586,7 +586,7 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { isShown={!!appInput} onClose={() => { if(pathHasOpsmx){ - window.parent.postMessage(window.btoa(JSON.stringify({msg:'closeEvent'})),'*') + window.parent.postMessage({msg:'closeEvent'},'*') } ctx.navigation.goto('.', {new: null}, {replace: true})}} header={ @@ -603,7 +603,7 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { qe-id='applications-list-button-cancel' onClick={() => { if(pathHasOpsmx){ - window.parent.postMessage(window.btoa(JSON.stringify({msg:'closeEvent'})),'*') + window.parent.postMessage({msg:'closeEvent'},'*') } ctx.navigation.goto('.', {new: null}, {replace: true})}} className='argo-button argo-button--base-o'> @@ -622,7 +622,7 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { await services.applications.create(app); //iframe msg alert needed if(pathHasOpsmx){ - window.parent.postMessage(window.btoa(JSON.stringify({msg:'saveEvent',appName:app['metadata']['name']})),'*') + window.parent.postMessage({msg:'saveEvent',appName:app['metadata']['name']},'*') } ctx.navigation.goto('.', {new: null}, {replace: true}); } catch (e) {