Skip to content

Commit

Permalink
code-refactoring: adding utility and helper functions (#1228)
Browse files Browse the repository at this point in the history
* fix: don't set phase to available during host reconciliation  (#918)

* upgrade golangci-lint

Signed-off-by: Jaideep Rao <[email protected]>

* fix phase reconciliation during host reconciliation

Signed-off-by: Jaideep Rao <[email protected]>

* address review comment

Signed-off-by: Jaideep Rao <[email protected]>

* set phase to pending if ingress not found

Signed-off-by: Jaideep Rao <[email protected]>

---------

Signed-off-by: Jaideep Rao <[email protected]>

* 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 <[email protected]>
Co-authored-by: Salem Elrahal <[email protected]>

* feat: expose operator metrics  (#928)

Track and expose custom operator performance metrics 
---------

Signed-off-by: Jaideep Rao <[email protected]>

* 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 <[email protected]>

Add funcs for ArgoCD alpha to beta conversion

Signed-off-by: Siddhesh Ghadi <[email protected]>

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 <[email protected]>

Resolve local build issues

Signed-off-by: Siddhesh Ghadi <[email protected]>

Tweak webhook configs

Signed-off-by: Siddhesh Ghadi <[email protected]>

Update operator installation docs

Signed-off-by: Siddhesh Ghadi <[email protected]>

Add e2e tests

Signed-off-by: Siddhesh Ghadi <[email protected]>

Minor updates

Signed-off-by: Siddhesh Ghadi <[email protected]>

Fix go-lint ci failure

Signed-off-by: Siddhesh Ghadi <[email protected]>

Update docs

Signed-off-by: Siddhesh Ghadi <[email protected]>

Remove webhook from 0.7.0 bundle

Signed-off-by: Siddhesh Ghadi <[email protected]>

Add spaces in bundle

Signed-off-by: Siddhesh Ghadi <[email protected]>

* update 0.8.0 bundle

Signed-off-by: Siddhesh Ghadi <[email protected]>

---------

Signed-off-by: Siddhesh Ghadi <[email protected]>

* 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](pygments/pygments@2.7.4...2.15.0)

---
updated-dependencies:
- dependency-name: pygments
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
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 <[email protected]>

* fix: failing tests

Signed-off-by: iam-veeramalla <[email protected]>

* fix: failing tests

Signed-off-by: iam-veeramalla <[email protected]>

---------

Signed-off-by: iam-veeramalla <[email protected]>

* refactor: Remove dead code (#979)

* Remove dead code

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Fix import

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Fix imports

Signed-off-by: Siddhesh Ghadi <[email protected]>

---------

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Replace ArgoCD v1alpha1 references with v1beta1 (#975)

Signed-off-by: Siddhesh Ghadi <[email protected]>

* refactor: Remove deprecated .spec.resourceCustomizations (#973)

* Remove .spec.resourceCustomizations code

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Update docs

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Update docs

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Address review comments

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Fix typo

Signed-off-by: Siddhesh Ghadi <[email protected]>

---------

Signed-off-by: Siddhesh Ghadi <[email protected]>

* 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 <[email protected]>

* Update argocd image

Signed-off-by: ishitasequeira <[email protected]>

---------

Signed-off-by: ishitasequeira <[email protected]>

* chore: Update ArgoCD v1alpha1 deprecation message (#988)

* Update ArgoCD v1alpha1 deprecation message

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Run code gen

Signed-off-by: Siddhesh Ghadi <[email protected]>

---------

Signed-off-by: Siddhesh Ghadi <[email protected]>

* 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 <[email protected]>

* add e2e test

Signed-off-by: ishitasequeira <[email protected]>

* add unit tests

Signed-off-by: ishitasequeira <[email protected]>

* renamed field ScmRootCaPath to SCMRootCaPath

Signed-off-by: ishitasequeira <[email protected]>

* Add documentation and address comments

Signed-off-by: ishitasequeira <[email protected]>

* Address comments

Signed-off-by: ishitasequeira <[email protected]>

---------

Signed-off-by: ishitasequeira <[email protected]>

* 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](argoproj/argo-cd@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] <[email protected]>
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 <[email protected]>

* fix: replace deprecated syntax in kustomization.yaml (#1000)

Signed-off-by: minchao <[email protected]>

* 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 <[email protected]>

* Delete docs/assets/extra.css

deleted extra.css

Signed-off-by: Surajyadav <[email protected]>

* Update mkdocs.yml

added markdown_extension  markdown_include with  codehighlight and toggle for screen mode

Signed-off-by: Surajyadav <[email protected]>

* Update mkdocs.yml

Signed-off-by: Surajyadav <[email protected]>

---------

Signed-off-by: Surajyadav <[email protected]>

* fix: keycloak probes failure and intermittent perforamance issues (#1007)

* fix: keycloak probes failure results in pod crash

Signed-off-by: iam-veeramalla <[email protected]>

* fix: use latest keycloak image to handle performance issue

Signed-off-by: iam-veeramalla <[email protected]>

---------

Signed-off-by: iam-veeramalla <[email protected]>

* 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 <[email protected]>

* 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](golang/net@v0.11.0...v0.17.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
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 <[email protected]>

* Changed data-type for labelSelector to parse string

Signed-off-by: Raghavi Shirur <[email protected]>

* Added code to reconcile selected ArgoCD instances based on label selector

Signed-off-by: Raghavi Shirur <[email protected]>

* remove comments

Signed-off-by: Raghavi Shirur <[email protected]>

* Updated argoCD label fetch, renamed env var

Signed-off-by: Raghavi Shirur <[email protected]>

* Updated unit test and yaml

Signed-off-by: Raghavi Shirur <[email protected]>

* Updated unit test

Signed-off-by: Raghavi Shirur <[email protected]>

* Fix yaml env ValueFrom field

Signed-off-by: Raghavi Shirur <[email protected]>

* Added comments and labelSelector check in main.go

Signed-off-by: Raghavi Shirur <[email protected]>

* removed label-selector option from manifest

Signed-off-by: Raghavi Shirur <[email protected]>

* updated label-selector format in manifests

Signed-off-by: Raghavi Shirur <[email protected]>

* added label selector logs

Signed-off-by: Raghavi Shirur <[email protected]>

* go mod tidy

Signed-off-by: Raghavi Shirur <[email protected]>

* added e2e tests for label-selector

Signed-off-by: Raghavi Shirur <[email protected]>

* restructured kuttl files and added operator patch file

Signed-off-by: Raghavi Shirur <[email protected]>

* go mod tidy

Signed-off-by: Raghavi Shirur <[email protected]>

* corrected kuttl tests for cm failure

Signed-off-by: Raghavi Shirur <[email protected]>

* Added documentation for Environment Variable ARGOCD_LABEL_SELECTOR

Signed-off-by: Raghavi Shirur <[email protected]>

* cleanup

Signed-off-by: Raghavi Shirur <[email protected]>

* improved unit tests and some minor changes

Signed-off-by: Raghavi Shirur <[email protected]>

* kuttl rerun

Signed-off-by: Raghavi Shirur <[email protected]>

* removed env var

Signed-off-by: Raghavi Shirur <[email protected]>

* misc modifications

Signed-off-by: Raghavi Shirur <[email protected]>

* argocd-operator csv correction

Signed-off-by: Raghavi Shirur <[email protected]>

* fix bundle error

Signed-off-by: Raghavi Shirur <[email protected]>

* fix bundle error

Signed-off-by: Raghavi Shirur <[email protected]>

* fix manifests build

Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: Ishita Sequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>

* Added more unit test cases

Signed-off-by: Raghavi Shirur <[email protected]>

* rebase

Signed-off-by: Raghavi Shirur <[email protected]>

* removed excess reconcilers

Signed-off-by: Raghavi Shirur <[email protected]>

* minor fix

Signed-off-by: Raghavi Shirur <[email protected]>

* removed extraneous test case and cleaned manager.yaml

Signed-off-by: Raghavi Shirur <[email protected]>

* cleaned manager.yaml

Signed-off-by: Raghavi Shirur <[email protected]>

* fix make bundle issue

Signed-off-by: Raghavi Shirur <[email protected]>

* fix make bundle issue

Signed-off-by: Raghavi Shirur <[email protected]>

---------

Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: Ishita Sequeira <[email protected]>
Co-authored-by: ishitasequeira <[email protected]>

* 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 <[email protected]>

* Add gcp cherry-pick bot config (#1023)

Signed-off-by: Siddhesh Ghadi <[email protected]>

* 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 <[email protected]>

* fix: remove non-default configuration

Signed-off-by: Robert Deusser <[email protected]>

* fix: v1alpha1 is deprecated

Signed-off-by: Robert Deusser <[email protected]>

* fix: convert dex spec between api versions

Signed-off-by: Robert Deusser <[email protected]>

* fix: ensure there is no diff in the bundle

Signed-off-by: Robert Deusser <[email protected]>

---------

Signed-off-by: Robert Deusser <[email protected]>

* fix: replace deprecated AddToScheme with Install, and deprecated SchemeGroupVersion with GroupVersion. (#1066)

Signed-off-by: Cheng Fang <[email protected]>

* allow enabling ArgoCD workloads independently (#1021)

* allow enabling ArgoCD core workloads independently

Signed-off-by: ishitasequeira <[email protected]>

* fix lint

Signed-off-by: ishitasequeira <[email protected]>

* check for dependent component urls if dependent components are disabled

Signed-off-by: ishitasequeira <[email protected]>

* fix build

Signed-off-by: ishitasequeira <[email protected]>

* fix make bundle

Signed-off-by: ishitasequeira <[email protected]>

* fix tests

Signed-off-by: ishitasequeira <[email protected]>

* Update flags for each component

Signed-off-by: ishitasequeira <[email protected]>

* Update configuration using remote flag

Signed-off-by: ishitasequeira <[email protected]>

* fix CI

Signed-off-by: ishitasequeira <[email protected]>

* Address comments

Signed-off-by: ishitasequeira <[email protected]>

* Addressed feedback

Signed-off-by: ishitasequeira <[email protected]>

* update conversion webhook

Signed-off-by: ishitasequeira <[email protected]>

* fix make build

Signed-off-by: ishitasequeira <[email protected]>

---------

Signed-off-by: ishitasequeira <[email protected]>

* 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] <[email protected]>
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 <[email protected]>

* fix: unit test failures

Signed-off-by: iam-veeramalla <[email protected]>

---------

Signed-off-by: iam-veeramalla <[email protected]>

* 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 <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* fix tests

Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* delete repo server when repo.enabled is set to false

Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* Update status.Phase based on component enabled flag

Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* Added kuttl tests

Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* Added namespace creation step

Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* delete services created for resources

Signed-off-by: ishitasequeira <[email protected]>

* delete server deployment when enabled flag set to false

Signed-off-by: ishitasequeira <[email protected]>

* fix e2e test

Signed-off-by: ishitasequeira <[email protected]>

* fix log message

Signed-off-by: ishitasequeira <[email protected]>

* revert kuttl test timeout

Signed-off-by: ishitasequeira <[email protected]>

* Added test for reverse scenario

Signed-off-by: Raghavi Shirur <[email protected]>

* Dir rename

Signed-off-by: Raghavi Shirur <[email protected]>

* Added e2e test for ha mode

Signed-off-by: Raghavi Shirur <[email protected]>

---------

Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Co-authored-by: Raghavi Shirur <[email protected]>

* docs: enabling/disabling individual argocd core components (#1098)

* Add documentation for enabling/disabling argocd core components

Signed-off-by: ishitasequeira <[email protected]>

* rephrase doc

Signed-off-by: ishitasequeira <[email protected]>

* Address comments

Signed-off-by: ishitasequeira <[email protected]>

---------

Signed-off-by: ishitasequeira <[email protected]>

* fix: Proper reference to where to find default admin password (#1094)

Signed-off-by: ikegentz <[email protected]>

* adding applicationsets in server rbac policy rule (#1140)

Signed-off-by: Mangaal <[email protected]>

* remove extra argoutils

Signed-off-by: Jaideep Rao <[email protected]>

* 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 <[email protected]>

* Use correct repo-server address for notification controller (#1125)

Signed-off-by: Siddhesh Ghadi <[email protected]>

* remove notifs files

Signed-off-by: Jaideep Rao <[email protected]>

* separating general code from configmaps

Signed-off-by: Jaideep Rao <[email protected]>

---------

Signed-off-by: Jaideep Rao <[email protected]>
Signed-off-by: Salem Elrahal <[email protected]>
Signed-off-by: Siddhesh Ghadi <[email protected]>
Signed-off-by: dependabot[bot] <[email protected]>
Signed-off-by: iam-veeramalla <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: minchao <[email protected]>
Signed-off-by: Surajyadav <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: Ishita Sequeira <[email protected]>
Signed-off-by: Robert Deusser <[email protected]>
Signed-off-by: Cheng Fang <[email protected]>
Signed-off-by: ikegentz <[email protected]>
Signed-off-by: Mangaal <[email protected]>
Signed-off-by: Anand Kumar Singh <[email protected]>
Co-authored-by: Regina Scott <[email protected]>
Co-authored-by: Salem Elrahal <[email protected]>
Co-authored-by: Salem Elrahal <[email protected]>
Co-authored-by: Siddhesh Ghadi <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Abhishek Veeramalla <[email protected]>
Co-authored-by: Ishita Sequeira <[email protected]>
Co-authored-by: Minchao <[email protected]>
Co-authored-by: Suraj yadav <[email protected]>
Co-authored-by: Raghavi <[email protected]>
Co-authored-by: ishitasequeira <[email protected]>
Co-authored-by: Cheng Fang <[email protected]>
Co-authored-by: Robert Deusser <[email protected]>
Co-authored-by: Isaac Gentz <[email protected]>
Co-authored-by: Mangaal <[email protected]>
Co-authored-by: Anand Kumar Singh <[email protected]>
  • Loading branch information
17 people authored Feb 8, 2024
1 parent 1b81c4b commit 52e4741
Show file tree
Hide file tree
Showing 6 changed files with 311 additions and 7 deletions.
3 changes: 3 additions & 0 deletions common/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 5 additions & 5 deletions common/keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
54 changes: 54 additions & 0 deletions controllers/argocd/argocdcommon/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
}
4 changes: 2 additions & 2 deletions controllers/argocd/configmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
237 changes: 237 additions & 0 deletions controllers/argocd/instance.go
Original file line number Diff line number Diff line change
@@ -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
}
10 changes: 10 additions & 0 deletions pkg/util/string.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 == "" {
Expand Down Expand Up @@ -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)
}

0 comments on commit 52e4741

Please sign in to comment.