From 52e4741f8c9ac375dafbd92b7bb4de9c75e370cf Mon Sep 17 00:00:00 2001 From: Jaideep Rao Date: Thu, 8 Feb 2024 01:10:21 -0500 Subject: [PATCH] code-refactoring: adding utility and helper functions (#1228) * fix: don't set phase to available during host reconciliation (#918) * upgrade golangci-lint Signed-off-by: Jaideep Rao * fix phase reconciliation during host reconciliation Signed-off-by: Jaideep Rao * address review comment Signed-off-by: Jaideep Rao * set phase to pending if ingress not found Signed-off-by: Jaideep Rao --------- Signed-off-by: Jaideep Rao * update owners file (#953) * Move to only adding two roles for managed namespaces (#954) * Move to only adding two roles for managed namespaces --------- Signed-off-by: Salem Elrahal Co-authored-by: Salem Elrahal * feat: expose operator metrics (#928) Track and expose custom operator performance metrics --------- Signed-off-by: Jaideep Rao * add build.os config for readthedocs (#967) * setup 0.8.0 (#966) * feat: Add conversion webhook for ArgoCD v1alpha1 to v1beta1 migration (#964) * Add ArgoCD v1beta1 & deprecate v1alpha1 - Add new ArgoCD v1beta1 api - Mark ArgoCD v1alpha1 as deprecated & add back the removed sso fields - Use server side validation for "kubectl apply" as client side results into failure due to exceeding annotation size limit. Signed-off-by: Siddhesh Ghadi Add funcs for ArgoCD alpha to beta conversion Signed-off-by: Siddhesh Ghadi Add conversion webhook - Create webhook & setup webhook server on 9443 - Disable operator namespaced install via OLM so that OLM can handle certs for webhook server - For manual install, user needs to explicitly configure cert manager to inject certs and enable webhook server in operator by setting env ENABLE_CONVERSION_WEBHOOK="true" Signed-off-by: Siddhesh Ghadi Resolve local build issues Signed-off-by: Siddhesh Ghadi Tweak webhook configs Signed-off-by: Siddhesh Ghadi Update operator installation docs Signed-off-by: Siddhesh Ghadi Add e2e tests Signed-off-by: Siddhesh Ghadi Minor updates Signed-off-by: Siddhesh Ghadi Fix go-lint ci failure Signed-off-by: Siddhesh Ghadi Update docs Signed-off-by: Siddhesh Ghadi Remove webhook from 0.7.0 bundle Signed-off-by: Siddhesh Ghadi Add spaces in bundle Signed-off-by: Siddhesh Ghadi * update 0.8.0 bundle Signed-off-by: Siddhesh Ghadi --------- Signed-off-by: Siddhesh Ghadi * chore(deps): bump pygments from 2.7.4 to 2.15.0 in /docs (#950) Bumps [pygments](https://github.com/pygments/pygments) from 2.7.4 to 2.15.0. - [Release notes](https://github.com/pygments/pygments/releases) - [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES) - [Commits](https://github.com/pygments/pygments/compare/2.7.4...2.15.0) --- updated-dependencies: - dependency-name: pygments dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: upgrade RH-SSO from 7.5 to 7.6 (#977) * upgrade RH-SSO from 7.5 to 7.6 Signed-off-by: iam-veeramalla * fix: failing tests Signed-off-by: iam-veeramalla * fix: failing tests Signed-off-by: iam-veeramalla --------- Signed-off-by: iam-veeramalla * refactor: Remove dead code (#979) * Remove dead code Signed-off-by: Siddhesh Ghadi * Fix import Signed-off-by: Siddhesh Ghadi * Fix imports Signed-off-by: Siddhesh Ghadi --------- Signed-off-by: Siddhesh Ghadi * Replace ArgoCD v1alpha1 references with v1beta1 (#975) Signed-off-by: Siddhesh Ghadi * refactor: Remove deprecated .spec.resourceCustomizations (#973) * Remove .spec.resourceCustomizations code Signed-off-by: Siddhesh Ghadi * Update docs Signed-off-by: Siddhesh Ghadi * Update docs Signed-off-by: Siddhesh Ghadi * Address review comments Signed-off-by: Siddhesh Ghadi * Fix typo Signed-off-by: Siddhesh Ghadi --------- Signed-off-by: Siddhesh Ghadi * upgrade ArgoCD version to 2.8.2 and update the CRDs (#984) * upgrade ArgoCD version to 2.8.2 and update the CRDs Signed-off-by: ishitasequeira * Update argocd image Signed-off-by: ishitasequeira --------- Signed-off-by: ishitasequeira * chore: Update ArgoCD v1alpha1 deprecation message (#988) * Update ArgoCD v1alpha1 deprecation message Signed-off-by: Siddhesh Ghadi * Run code gen Signed-off-by: Siddhesh Ghadi --------- Signed-off-by: Siddhesh Ghadi * Add support for tls self signed certs in AppSet Gitlab SCM Provider (#985) * add support for tls self signed certs in AppSet Gitlab SCM Provider Signed-off-by: ishitasequeira * add e2e test Signed-off-by: ishitasequeira * add unit tests Signed-off-by: ishitasequeira * renamed field ScmRootCaPath to SCMRootCaPath Signed-off-by: ishitasequeira * Add documentation and address comments Signed-off-by: ishitasequeira * Address comments Signed-off-by: ishitasequeira --------- Signed-off-by: ishitasequeira * chore(deps): bump github.com/argoproj/argo-cd/v2 from 2.8.2 to 2.8.3 (#992) Bumps [github.com/argoproj/argo-cd/v2](https://github.com/argoproj/argo-cd) from 2.8.2 to 2.8.3. - [Release notes](https://github.com/argoproj/argo-cd/releases) - [Changelog](https://github.com/argoproj/argo-cd/blob/master/CHANGELOG.md) - [Commits](https://github.com/argoproj/argo-cd/compare/v2.8.2...v2.8.3) --- updated-dependencies: - dependency-name: github.com/argoproj/argo-cd/v2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: pick up argo cd v2.8.3 (#993) Signed-off-by: iam-veeramalla * fix: replace deprecated syntax in kustomization.yaml (#1000) Signed-off-by: minchao * Missing syntax-highlighting, toggle button for screen mode in argocd-operator docs (#1002) * Update requirements.txt added markdown= 3.3.7 and markdown-include=0.6.0 Signed-off-by: Surajyadav * Delete docs/assets/extra.css deleted extra.css Signed-off-by: Surajyadav * Update mkdocs.yml added markdown_extension markdown_include with codehighlight and toggle for screen mode Signed-off-by: Surajyadav * Update mkdocs.yml Signed-off-by: Surajyadav --------- Signed-off-by: Surajyadav * fix: keycloak probes failure and intermittent perforamance issues (#1007) * fix: keycloak probes failure results in pod crash Signed-off-by: iam-veeramalla * fix: use latest keycloak image to handle performance issue Signed-off-by: iam-veeramalla --------- Signed-off-by: iam-veeramalla * bug: fix heathcheck subkey generation for resources with no group (#1013) * account for empty group during resource customization config subkey generation --------- Signed-off-by: Jaideep Rao * chore(deps): bump golang.org/x/net from 0.11.0 to 0.17.0 (#1019) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.11.0 to 0.17.0. - [Commits](https://github.com/golang/net/compare/v0.11.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add labelSelector option to filter the ArgoCD instances for reconciliation (#961) * Added labelselector string to map conversion Signed-off-by: Raghavi Shirur * Changed data-type for labelSelector to parse string Signed-off-by: Raghavi Shirur * Added code to reconcile selected ArgoCD instances based on label selector Signed-off-by: Raghavi Shirur * remove comments Signed-off-by: Raghavi Shirur * Updated argoCD label fetch, renamed env var Signed-off-by: Raghavi Shirur * Updated unit test and yaml Signed-off-by: Raghavi Shirur * Updated unit test Signed-off-by: Raghavi Shirur * Fix yaml env ValueFrom field Signed-off-by: Raghavi Shirur * Added comments and labelSelector check in main.go Signed-off-by: Raghavi Shirur * removed label-selector option from manifest Signed-off-by: Raghavi Shirur * updated label-selector format in manifests Signed-off-by: Raghavi Shirur * added label selector logs Signed-off-by: Raghavi Shirur * go mod tidy Signed-off-by: Raghavi Shirur * added e2e tests for label-selector Signed-off-by: Raghavi Shirur * restructured kuttl files and added operator patch file Signed-off-by: Raghavi Shirur * go mod tidy Signed-off-by: Raghavi Shirur * corrected kuttl tests for cm failure Signed-off-by: Raghavi Shirur * Added documentation for Environment Variable ARGOCD_LABEL_SELECTOR Signed-off-by: Raghavi Shirur * cleanup Signed-off-by: Raghavi Shirur * improved unit tests and some minor changes Signed-off-by: Raghavi Shirur * kuttl rerun Signed-off-by: Raghavi Shirur * removed env var Signed-off-by: Raghavi Shirur * misc modifications Signed-off-by: Raghavi Shirur * argocd-operator csv correction Signed-off-by: Raghavi Shirur * fix bundle error Signed-off-by: Raghavi Shirur * fix bundle error Signed-off-by: Raghavi Shirur * fix manifests build Signed-off-by: Raghavi Shirur Signed-off-by: Ishita Sequeira Signed-off-by: Raghavi Shirur * Added more unit test cases Signed-off-by: Raghavi Shirur * rebase Signed-off-by: Raghavi Shirur * removed excess reconcilers Signed-off-by: Raghavi Shirur * minor fix Signed-off-by: Raghavi Shirur * removed extraneous test case and cleaned manager.yaml Signed-off-by: Raghavi Shirur * cleaned manager.yaml Signed-off-by: Raghavi Shirur * fix make bundle issue Signed-off-by: Raghavi Shirur * fix make bundle issue Signed-off-by: Raghavi Shirur --------- Signed-off-by: Raghavi Shirur Signed-off-by: Ishita Sequeira Co-authored-by: ishitasequeira * fix: address CVE-2023-39325 (#1022) *address CVE-2023-39325 - upgrade to golang v1.20.10 - disable http/2 for webhook and metrics server, use http/1.1 by default but make it a configurable flag - upgarde k8s library packages to v0.28.3 - Add new structs for keycloak API that were previously part of the (now deprecated) keycloak-operator repo - upgrade to controller-runtime to v0.16.3 - refactor all unit tests --------- Signed-off-by: Jaideep Rao * Add gcp cherry-pick bot config (#1023) Signed-off-by: Siddhesh Ghadi * Add .github/dependabot.yml to enable auto dependency version updates (#1025) * feat(dex): add optional env field (#1005) * feat(dex): add optional env field Signed-off-by: Robert Deusser * fix: remove non-default configuration Signed-off-by: Robert Deusser * fix: v1alpha1 is deprecated Signed-off-by: Robert Deusser * fix: convert dex spec between api versions Signed-off-by: Robert Deusser * fix: ensure there is no diff in the bundle Signed-off-by: Robert Deusser --------- Signed-off-by: Robert Deusser * fix: replace deprecated AddToScheme with Install, and deprecated SchemeGroupVersion with GroupVersion. (#1066) Signed-off-by: Cheng Fang * allow enabling ArgoCD workloads independently (#1021) * allow enabling ArgoCD core workloads independently Signed-off-by: ishitasequeira * fix lint Signed-off-by: ishitasequeira * check for dependent component urls if dependent components are disabled Signed-off-by: ishitasequeira * fix build Signed-off-by: ishitasequeira * fix make bundle Signed-off-by: ishitasequeira * fix tests Signed-off-by: ishitasequeira * Update flags for each component Signed-off-by: ishitasequeira * Update configuration using remote flag Signed-off-by: ishitasequeira * fix CI Signed-off-by: ishitasequeira * Address comments Signed-off-by: ishitasequeira * Addressed feedback Signed-off-by: ishitasequeira * update conversion webhook Signed-off-by: ishitasequeira * fix make build Signed-off-by: ishitasequeira --------- Signed-off-by: ishitasequeira * chore(deps): bump argoproj/argocd in /build/util (#1080) Bumps argoproj/argocd from `d40da8f` to `644c386`. --- updated-dependencies: - dependency-name: argoproj/argocd dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: upgrade Argo CD for release v.9.0 (#1082) * feat: upgrade Argo CD for release v.9.0 Signed-off-by: iam-veeramalla * fix: unit test failures Signed-off-by: iam-veeramalla --------- Signed-off-by: iam-veeramalla * fix the logic for applicationset resources reconcilation when spec.applicationset.enabled is false (#1089) * fix the logic for applicationset resources reconciliation when spec.applicationset.enabled is false Signed-off-by: ishitasequeira Signed-off-by: Raghavi Shirur Signed-off-by: ishitasequeira * fix tests Signed-off-by: ishitasequeira Signed-off-by: Raghavi Shirur Signed-off-by: ishitasequeira * delete repo server when repo.enabled is set to false Signed-off-by: ishitasequeira Signed-off-by: Raghavi Shirur Signed-off-by: ishitasequeira * Update status.Phase based on component enabled flag Signed-off-by: ishitasequeira Signed-off-by: Raghavi Shirur Signed-off-by: ishitasequeira * Added kuttl tests Signed-off-by: Raghavi Shirur Signed-off-by: ishitasequeira * Added namespace creation step Signed-off-by: Raghavi Shirur Signed-off-by: ishitasequeira * delete services created for resources Signed-off-by: ishitasequeira * delete server deployment when enabled flag set to false Signed-off-by: ishitasequeira * fix e2e test Signed-off-by: ishitasequeira * fix log message Signed-off-by: ishitasequeira * revert kuttl test timeout Signed-off-by: ishitasequeira * Added test for reverse scenario Signed-off-by: Raghavi Shirur * Dir rename Signed-off-by: Raghavi Shirur * Added e2e test for ha mode Signed-off-by: Raghavi Shirur --------- Signed-off-by: ishitasequeira Signed-off-by: Raghavi Shirur Co-authored-by: Raghavi Shirur * docs: enabling/disabling individual argocd core components (#1098) * Add documentation for enabling/disabling argocd core components Signed-off-by: ishitasequeira * rephrase doc Signed-off-by: ishitasequeira * Address comments Signed-off-by: ishitasequeira --------- Signed-off-by: ishitasequeira * fix: Proper reference to where to find default admin password (#1094) Signed-off-by: ikegentz * adding applicationsets in server rbac policy rule (#1140) Signed-off-by: Mangaal * remove extra argoutils Signed-off-by: Jaideep Rao * fix logic to allow processor operation to be less than default value (#1146) * fix logic to allow operation processors to be less than default value --------- Signed-off-by: Anand Kumar Singh * Use correct repo-server address for notification controller (#1125) Signed-off-by: Siddhesh Ghadi * remove notifs files Signed-off-by: Jaideep Rao * separating general code from configmaps Signed-off-by: Jaideep Rao --------- Signed-off-by: Jaideep Rao Signed-off-by: Salem Elrahal Signed-off-by: Siddhesh Ghadi Signed-off-by: dependabot[bot] Signed-off-by: iam-veeramalla Signed-off-by: ishitasequeira Signed-off-by: minchao Signed-off-by: Surajyadav Signed-off-by: Raghavi Shirur Signed-off-by: Ishita Sequeira Signed-off-by: Robert Deusser Signed-off-by: Cheng Fang Signed-off-by: ikegentz Signed-off-by: Mangaal Signed-off-by: Anand Kumar Singh Co-authored-by: Regina Scott <50851526+reginapizza@users.noreply.github.com> Co-authored-by: Salem Elrahal Co-authored-by: Salem Elrahal Co-authored-by: Siddhesh Ghadi <61187612+svghadi@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Abhishek Veeramalla Co-authored-by: Ishita Sequeira <46771830+ishitasequeira@users.noreply.github.com> Co-authored-by: Minchao Co-authored-by: Suraj yadav Co-authored-by: Raghavi Co-authored-by: ishitasequeira Co-authored-by: Cheng Fang Co-authored-by: Robert Deusser <5935071+rdeusser@users.noreply.github.com> Co-authored-by: Isaac Gentz Co-authored-by: Mangaal <44372157+Mangaal@users.noreply.github.com> Co-authored-by: Anand Kumar Singh --- common/defaults.go | 3 + common/keys.go | 10 +- controllers/argocd/argocdcommon/helper.go | 54 +++++ controllers/argocd/configmap.go | 4 +- controllers/argocd/instance.go | 237 ++++++++++++++++++++++ pkg/util/string.go | 10 + 6 files changed, 311 insertions(+), 7 deletions(-) create mode 100644 controllers/argocd/instance.go diff --git a/common/defaults.go b/common/defaults.go index 1c6256729..85ae81701 100644 --- a/common/defaults.go +++ b/common/defaults.go @@ -104,6 +104,9 @@ const ( // ArgoCDDefaultRSAKeySize is the default RSA key size when not specified. ArgoCDDefaultRSAKeySize = 2048 + // ArgoCDDefaultServer is the default server address + ArgoCDDefaultServer = "https://kubernetes.default.svc" + // ArgoCDDefaultSSHKnownHosts is the default SSH Known hosts data. ArgoCDDefaultSSHKnownHosts = `[ssh.github.com]:443 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg= [ssh.github.com]:443 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl diff --git a/common/keys.go b/common/keys.go index d93ab55ee..55375fdf1 100644 --- a/common/keys.go +++ b/common/keys.go @@ -114,18 +114,18 @@ const ( // ArgoCDKeyTLSCACert is the key for TLS CA certificates. ArgoCDKeyTLSCACert = "ca.crt" - // ArgoCDPolicyMatcherMode is the key for matchers function for casbin. + // ArgoCDKeyPolicyMatcherMode is the key for matchers function for casbin. // There are two options for this, 'glob' for glob matcher or 'regex' for regex matcher. - ArgoCDPolicyMatcherMode = "policy.matchMode" + ArgoCDKeyPolicyMatcherMode = "policy.matchMode" // ArgoCDKeyUsersAnonymousEnabled is the configuration key for anonymous user access. ArgoCDKeyUsersAnonymousEnabled = "users.anonymous.enabled" - // ArgoCDDefaultServer is the default server address - ArgoCDDefaultServer = "https://kubernetes.default.svc" - // ArgoCDDexSecretKey is used to reference Dex secret from Argo CD secret into Argo CD configmap ArgoCDDexSecretKey = "oidc.dex.clientSecret" + + ArgoCDKeyKustomizeVersion = "kustomize.version." + ArgoCDKeyResourceCustomizations = "resource.customizations." ) // openshift.io keys diff --git a/controllers/argocd/argocdcommon/helper.go b/controllers/argocd/argocdcommon/helper.go index 6a998b3af..9b857ab2e 100644 --- a/controllers/argocd/argocdcommon/helper.go +++ b/controllers/argocd/argocdcommon/helper.go @@ -5,14 +5,43 @@ import ( "reflect" "github.com/argoproj-labs/argocd-operator/pkg/util" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" + rbacv1 "k8s.io/api/rbac/v1" ) +// FieldToCompare contains a field from an existing resource, the same field in the desired state of the resource, and an action to be taken after comparison type FieldToCompare struct { Existing interface{} Desired interface{} ExtraAction func() } +// FieldCompFnCm is a function type for comparing fields of two ConfigMaps. +type FieldCompFnCm func(*corev1.ConfigMap, *corev1.ConfigMap) []FieldToCompare + +// FieldCompFnDeployment is a function type for comparing fields of two Deployments. +type FieldCompFnDeployment func(appsv1.Deployment, appsv1.Deployment) []FieldToCompare + +// FieldCompFnSecret is a function type for comparing fields of two Secrets. +type FieldCompFnSecret func(corev1.Secret, corev1.Secret) []FieldToCompare + +// FieldCompFnService is a function type for comparing fields of two Services. +type FieldCompFnService func(corev1.Service, corev1.Service) []FieldToCompare + +// FieldCompFnIngress is a function type for comparing fields of two Ingresses. +type FieldCompFnIngress func(networkingv1.Ingress, networkingv1.Ingress) []FieldToCompare + +// FieldCompFnRole is a function type for comparing fields of two Roles. +type FieldCompFnRole func(rbacv1.Role, rbacv1.Role) []FieldToCompare + +// FieldCompFnRoleBinding is a function type for comparing fields of two RoleBindings. +type FieldCompFnRoleBinding func(rbacv1.RoleBinding, rbacv1.RoleBinding) []FieldToCompare + +// FieldCompFnStatefulSet is a function type for comparing fields of two StatefulSets. +type FieldCompFnStatefulSet func(appsv1.StatefulSet, appsv1.StatefulSet) []FieldToCompare + // UpdateIfChanged accepts a slice of fields to be compared, along with a bool ptr. It compares all the provided fields, updating any fields and setting the bool ptr to true if a drift is detected func UpdateIfChanged(ftc []FieldToCompare, changed *bool) { for _, field := range ftc { @@ -51,3 +80,28 @@ func IsMergable(extraArgs []string, cmd []string) error { } return nil } + +// GetValueOrDefault returns the value if it's non-empty, otherwise returns the default value. +func GetValueOrDefault(value interface{}, defaultValue interface{}) interface{} { + if util.IsPtr(value) { + if reflect.ValueOf(value).IsNil() { + return defaultValue + } + return reflect.ValueOf(value).String() + } + + switch v := value.(type) { + case string: + if len(v) > 0 { + return v + } + return defaultValue + case map[string]string: + if len(v) > 0 { + return v + } + return defaultValue + } + + return defaultValue +} diff --git a/controllers/argocd/configmap.go b/controllers/argocd/configmap.go index 7843ac484..7e010743e 100644 --- a/controllers/argocd/configmap.go +++ b/controllers/argocd/configmap.go @@ -590,8 +590,8 @@ func (r *ReconcileArgoCD) reconcileRBACConfigMap(cm *corev1.ConfigMap, cr *argop } // Default Policy Matcher Mode - if cr.Spec.RBAC.PolicyMatcherMode != nil && cm.Data[common.ArgoCDPolicyMatcherMode] != *cr.Spec.RBAC.PolicyMatcherMode { - cm.Data[common.ArgoCDPolicyMatcherMode] = *cr.Spec.RBAC.PolicyMatcherMode + if cr.Spec.RBAC.PolicyMatcherMode != nil && cm.Data[common.ArgoCDKeyPolicyMatcherMode] != *cr.Spec.RBAC.PolicyMatcherMode { + cm.Data[common.ArgoCDKeyPolicyMatcherMode] = *cr.Spec.RBAC.PolicyMatcherMode changed = true } diff --git a/controllers/argocd/instance.go b/controllers/argocd/instance.go new file mode 100644 index 000000000..07a98155f --- /dev/null +++ b/controllers/argocd/instance.go @@ -0,0 +1,237 @@ +package argocd + +import ( + "fmt" + "reflect" + + argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" + "github.com/argoproj-labs/argocd-operator/common" + "github.com/argoproj-labs/argocd-operator/controllers/argocd/argocdcommon" + "github.com/argoproj-labs/argocd-operator/pkg/argoutil" + "github.com/argoproj-labs/argocd-operator/pkg/util" + "gopkg.in/yaml.v2" +) + +const ( + healthKey = "health" + ignoreDIffKey = "ignoreDifferences" + actionsKey = "actions" + allKey = "all" +) + +// getApplicationInstanceLabelKey returns the application instance label key for the given ArgoCD. +func (r *ArgoCDReconciler) getApplicationInstanceLabelKey() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.ApplicationInstanceLabelKey, common.ArgoCDDefaultApplicationInstanceLabelKey).(string) +} + +// getCAConfigMapName returns the CA ConfigMap name for the given ArgoCD. +func (r *ArgoCDReconciler) getCAConfigMapName() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.TLS.CA.ConfigMapName, argoutil.GenerateResourceName(r.Instance.Name, common.ArgoCDCASuffix)).(string) +} + +// getSCMRootCAConfigMapName returns the SCMRootCA ConfigMap name for the given ArgoCD ApplicationSet Controller. +func (r *ArgoCDReconciler) getSCMRootCAConfigMapName() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.ApplicationSet.SCMRootCAConfigMap, "").(string) +} + +// getConfigManagementPlugins returns the config management plugins for the given ArgoCD. +func (r *ArgoCDReconciler) getConfigManagementPlugins() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.ConfigManagementPlugins, common.ArgoCDDefaultConfigManagementPlugins).(string) +} + +// getGATrackingID returns the google analytics tracking ID for the given Argo CD. +func (r *ArgoCDReconciler) getGATrackingID() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.GATrackingID, common.ArgoCDDefaultGATrackingID).(string) +} + +// getHelpChatURL returns the help chat URL for the given Argo CD. +func (r *ArgoCDReconciler) getHelpChatURL() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.HelpChatURL, common.ArgoCDDefaultHelpChatURL).(string) +} + +// getHelpChatText returns the help chat text for the given Argo CD. +func (r *ArgoCDReconciler) getHelpChatText() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.HelpChatText, common.ArgoCDDefaultHelpChatText).(string) +} + +// getKustomizeBuildOptions returns the kuztomize build options for the given ArgoCD. +func (r *ArgoCDReconciler) getKustomizeBuildOptions() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.KustomizeBuildOptions, common.ArgoCDDefaultKustomizeBuildOptions).(string) +} + +// getOIDCConfig returns the OIDC configuration for the given instance. +func (r *ArgoCDReconciler) getOIDCConfig() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.OIDCConfig, common.ArgoCDDefaultOIDCConfig).(string) +} + +// getRBACPolicy will return the RBAC policy for the given ArgoCD instance. +func (r *ArgoCDReconciler) getRBACPolicy() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.RBAC.Policy, common.ArgoCDDefaultRBACPolicy).(string) +} + +// getRBACPolicyMatcherMode will return the RBAC policy matcher mode for the given ArgoCD instance. +func (r *ArgoCDReconciler) getRBACPolicyMatcherMode() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.RBAC.PolicyMatcherMode, nil).(string) +} + +// getRBACDefaultPolicy will return the RBAC default policy for the given ArgoCD instance. +func (r *ArgoCDReconciler) getRBACDefaultPolicy() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.RBAC.DefaultPolicy, common.ArgoCDDefaultRBACPolicy).(string) +} + +// getRBACScopes will return the RBAC scopes for the given ArgoCD instance. +func (r *ArgoCDReconciler) getRBACScopes() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.RBAC.Scopes, common.ArgoCDDefaultRBACScopes).(string) +} + +// getResourceExclusions will return the resource exclusions for the given ArgoCD instance. +func (r *ArgoCDReconciler) getResourceExclusions() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.ResourceExclusions, common.ArgoCDDefaultResourceExclusions).(string) +} + +// getResourceInclusions will return the resource inclusions for the given ArgoCD instance. +func (r *ArgoCDReconciler) getResourceInclusions() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.ResourceInclusions, common.ArgoCDDefaultResourceInclusions).(string) +} + +// getInitialRepositories will return the initial repositories for the given ArgoCD instance. +func (r *ArgoCDReconciler) getInitialRepositories() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.InitialRepositories, common.ArgoCDDefaultRepositories).(string) +} + +// getRepositoryCredentials will return the repository credentials for the given ArgoCD instance. +func (r *ArgoCDReconciler) getRepositoryCredentials() string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.RepositoryCredentials, common.ArgoCDDefaultRepositoryCredentials).(string) +} + +// getInitialTLSCerts will return the TLS certs for the given ArgoCD instance. +func (r *ArgoCDReconciler) getInitialTLSCerts() map[string]string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.TLS.InitialCerts, make(map[string]string)).(map[string]string) +} + +// getSSHKnownHosts will return the SSH Known Hosts data for the given ArgoCD instance. +func (r *ArgoCDReconciler) getInitialSSHKnownHosts() string { + skh := common.ArgoCDDefaultSSHKnownHosts + if r.Instance.Spec.InitialSSHKnownHosts.ExcludeDefaultHosts { + skh = "" + } + if len(r.Instance.Spec.InitialSSHKnownHosts.Keys) > 0 { + skh += r.Instance.Spec.InitialSSHKnownHosts.Keys + } + return skh +} + +func (r *ArgoCDReconciler) getDisableAdmin() string { + return fmt.Sprintf("%t", !r.Instance.Spec.DisableAdmin) +} + +func (r *ArgoCDReconciler) getGAAnonymizeUsers() string { + return fmt.Sprintf("%t", r.Instance.Spec.GAAnonymizeUsers) +} + +func (r *ArgoCDReconciler) getStatusBadgeEnabled() string { + return fmt.Sprintf("%t", r.Instance.Spec.StatusBadgeEnabled) +} + +func (r *ArgoCDReconciler) getUsersAnonymousEnabled() string { + return fmt.Sprintf("%t", r.Instance.Spec.UsersAnonymousEnabled) +} + +// getResourceTrackingMethod will return the resource tracking method for the given ArgoCD instance +func (r *ArgoCDReconciler) getResourceTrackingMethod() string { + rtm := argoproj.ParseResourceTrackingMethod(r.Instance.Spec.ResourceTrackingMethod) + if rtm == argoproj.ResourceTrackingMethodInvalid { + r.Logger.Debug(fmt.Sprintf("found invalid resource tracking method '%s'; defaulting to 'label' method", r.Instance.Spec.ResourceTrackingMethod)) + } else if r.Instance.Spec.ResourceTrackingMethod != "" { + r.Logger.Debug(fmt.Sprintf("found resource tracking method '%s'", r.Instance.Spec.ResourceTrackingMethod)) + } else { + r.Logger.Debug("using default resource tracking method 'label'") + } + return rtm.String() +} + +func (r *ArgoCDReconciler) getKustomizeVersions() map[string]string { + versions := make(map[string]string) + for _, kv := range r.Instance.Spec.KustomizeVersions { + versions[common.ArgoCDKeyKustomizeVersion+kv.Version] = kv.Path + } + return versions +} + +func (r *ArgoCDReconciler) getBanner() map[string]string { + banner := make(map[string]string) + if r.Instance.Spec.Banner != nil { + banner[common.ArgoCDKeyBannerContent] = argocdcommon.GetValueOrDefault(r.Instance.Spec.Banner.Content, "").(string) + banner[common.ArgoCDKeyBannerURL] = argocdcommon.GetValueOrDefault(r.Instance.Spec.Banner.URL, "").(string) + } + return banner +} + +func (r *ArgoCDReconciler) getExtraConfig() map[string]string { + return argocdcommon.GetValueOrDefault(r.Instance.Spec.ExtraConfig, make(map[string]string)).(map[string]string) +} + +// getResourceHealthChecks loads health customizations to `resource.customizations.health` from argocd-cm ConfigMap +func (r *ArgoCDReconciler) getResourceHealthChecks() map[string]string { + healthCheck := make(map[string]string) + + if r.Instance.Spec.ResourceHealthChecks != nil { + rhc := r.Instance.Spec.ResourceHealthChecks + for _, hc := range rhc { + subkey := util.ConstructString(util.DotSep, common.ArgoCDKeyResourceCustomizations, healthKey, util.ConstructString(util.UnderscoreSep, hc.Group, hc.Kind)) + subvalue := hc.Check + healthCheck[subkey] = subvalue + } + } + + return healthCheck +} + +// getResourceActions loads custom actions to `resource.customizations.actions` from argocd-cm ConfigMap +func (r *ArgoCDReconciler) getResourceActions() map[string]string { + actions := make(map[string]string) + + if r.Instance.Spec.ResourceActions != nil { + ra := r.Instance.Spec.ResourceActions + for _, a := range ra { + subkey := util.ConstructString(util.DotSep, common.ArgoCDKeyResourceCustomizations, actionsKey, util.ConstructString(util.UnderscoreSep, a.Group, a.Kind)) + subvalue := a.Action + actions[subkey] = subvalue + } + } + + return actions +} + +// getResourceIgnoreDifferences loads ignore differences customizations to `resource.customizations.ignoreDifferences` from argocd-cm ConfigMap +func (r *ArgoCDReconciler) getResourceIgnoreDifferences() map[string]string { + ignoreDiff := make(map[string]string) + + if r.Instance.Spec.ResourceIgnoreDifferences != nil { + rid := r.Instance.Spec.ResourceIgnoreDifferences + + if !reflect.DeepEqual(rid.All, &argoproj.IgnoreDifferenceCustomization{}) { + subkey := util.ConstructString(util.DotSep, common.ArgoCDKeyResourceCustomizations, ignoreDIffKey, allKey) + bytes, err := yaml.Marshal(rid.All) + if err != nil { + r.Logger.Error(err, "getResourceIgnoreDifferences") + return ignoreDiff + } + subvalue := string(bytes) + ignoreDiff[subkey] = subvalue + } + + for _, id := range rid.ResourceIdentifiers { + subkey := util.ConstructString(util.DotSep, common.ArgoCDKeyResourceCustomizations, ignoreDIffKey, util.ConstructString(util.UnderscoreSep, id.Group, id.Kind)) + bytes, err := yaml.Marshal(id.Customization) + if err != nil { + r.Logger.Error(err, "getResourceIgnoreDifferences") + return ignoreDiff + } + subvalue := string(bytes) + ignoreDiff[subkey] = subvalue + } + } + + return ignoreDiff +} diff --git a/pkg/util/string.go b/pkg/util/string.go index cc50bed6d..bb30d1ab1 100644 --- a/pkg/util/string.go +++ b/pkg/util/string.go @@ -6,6 +6,11 @@ import ( "strings" ) +const ( + DotSep = "." + UnderscoreSep = "_" +) + // SplitList accepts a string input containing a list of comma separated values, and returns a slice containing those values as separate elements func SplitList(s string) []string { if s == "" { @@ -73,3 +78,8 @@ func GenerateRandomString(s int) (string, error) { func StringPtr(val string) *string { return &val } + +// ConstructString concatenates the supplied parts by using the provided separator. Any empty strings are skipped +func ConstructString(separtor string, parts ...string) string { + return strings.Join(RemoveString(parts, ""), separtor) +}