Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

code-refactoring: add/modify helper functions #1202

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
1caabde
fix: don't set phase to available during host reconciliation (#918)
jaideepr97 Jul 20, 2023
4d09aca
update owners file (#953)
reginapizza Jul 26, 2023
45f3597
Move to only adding two roles for managed namespaces (#954)
selrahal Jul 26, 2023
c7cfa8c
feat: expose operator metrics (#928)
jaideepr97 Aug 1, 2023
89825db
add build.os config for readthedocs (#967)
reginapizza Aug 17, 2023
11299b7
setup 0.8.0 (#966)
reginapizza Aug 21, 2023
b25858d
feat: Add conversion webhook for ArgoCD v1alpha1 to v1beta1 migration…
svghadi Aug 21, 2023
c658019
chore(deps): bump pygments from 2.7.4 to 2.15.0 in /docs (#950)
dependabot[bot] Aug 22, 2023
e49612a
feat: upgrade RH-SSO from 7.5 to 7.6 (#977)
iam-veeramalla Aug 28, 2023
e624a26
refactor: Remove dead code (#979)
svghadi Aug 29, 2023
e928c0e
Replace ArgoCD v1alpha1 references with v1beta1 (#975)
svghadi Aug 29, 2023
380207e
refactor: Remove deprecated .spec.resourceCustomizations (#973)
svghadi Aug 30, 2023
f2f9fb4
upgrade ArgoCD version to 2.8.2 and update the CRDs (#984)
ishitasequeira Aug 30, 2023
8ddbce3
chore: Update ArgoCD v1alpha1 deprecation message (#988)
svghadi Sep 4, 2023
297702f
Add support for tls self signed certs in AppSet Gitlab SCM Provider (…
ishitasequeira Sep 6, 2023
64d5bb2
chore(deps): bump github.com/argoproj/argo-cd/v2 from 2.8.2 to 2.8.3 …
dependabot[bot] Sep 11, 2023
91bf131
feat: pick up argo cd v2.8.3 (#993)
iam-veeramalla Sep 11, 2023
cd7a54b
fix: replace deprecated syntax in kustomization.yaml (#1000)
minchao Sep 25, 2023
aa6ab4e
Missing syntax-highlighting, toggle button for screen mode in argocd-…
surajyadav1108 Sep 25, 2023
75d6cf4
fix: keycloak probes failure and intermittent perforamance issues (#1…
iam-veeramalla Sep 26, 2023
64aa268
bug: fix heathcheck subkey generation for resources with no group (#…
jaideepr97 Oct 3, 2023
6b3fbb6
chore(deps): bump golang.org/x/net from 0.11.0 to 0.17.0 (#1019)
dependabot[bot] Oct 13, 2023
5a2e6c4
Add labelSelector option to filter the ArgoCD instances for reconcili…
raghavi101 Oct 19, 2023
c8e4909
fix: address CVE-2023-39325 (#1022)
jaideepr97 Oct 26, 2023
fb27066
Add gcp cherry-pick bot config (#1023)
svghadi Oct 26, 2023
962f30f
Add .github/dependabot.yml to enable auto dependency version updates …
chengfang Oct 27, 2023
000c4a7
feat(dex): add optional env field (#1005)
rdeusser Oct 30, 2023
17064c9
fix: replace deprecated AddToScheme with Install, and deprecated Sche…
chengfang Nov 16, 2023
9a294a2
allow enabling ArgoCD workloads independently (#1021)
ishitasequeira Nov 16, 2023
18a0a8d
chore(deps): bump argoproj/argocd in /build/util (#1080)
dependabot[bot] Nov 24, 2023
a78a842
feat: upgrade Argo CD for release v.9.0 (#1082)
iam-veeramalla Nov 24, 2023
c238af6
fix the logic for applicationset resources reconcilation when spec.ap…
ishitasequeira Dec 1, 2023
5166a46
docs: enabling/disabling individual argocd core components (#1098)
ishitasequeira Dec 6, 2023
d424ebd
fix: Proper reference to where to find default admin password (#1094)
ikegentz Dec 13, 2023
acee651
adding applicationsets in server rbac policy rule (#1140)
Mangaal Jan 10, 2024
6a6847a
rebase against master
jaideepr97 Jan 14, 2024
d0f5fe3
remove extra argoutils
jaideepr97 Jan 14, 2024
c61d677
Merge branch 'operator-redesign' of github.com:argoproj-labs/argocd-o…
jaideepr97 Jan 15, 2024
816c053
fix logic to allow processor operation to be less than default value …
anandrkskd Jan 17, 2024
3c80cd2
Use correct repo-server address for notification controller (#1125)
svghadi Jan 17, 2024
a0d28f8
Merge branch 'operator-redesign' of github.com:argoproj-labs/argocd-o…
jaideepr97 Jan 18, 2024
7d93a60
Merge branch 'operator-redesign' of github.com:argoproj-labs/argocd-o…
jaideepr97 Jan 18, 2024
0a61db2
pull in changes from master
jaideepr97 Jan 18, 2024
e75bd95
remove notifs files
jaideepr97 Jan 18, 2024
d812697
Merge branch 'operator-redesign' of github.com:argoproj-labs/argocd-o…
jaideepr97 Jan 22, 2024
b623adb
Merge branch 'operator-redesign' of github.com:argoproj-labs/argocd-o…
jaideepr97 Jan 25, 2024
45b5300
update all references to updateifchanged
jaideepr97 Jan 28, 2024
1061a4f
add resource helper & updated trigger rollout
jaideepr97 Jan 28, 2024
0cee249
add helpers
jaideepr97 Jan 28, 2024
3e5b614
remove unnecessary changes
jaideepr97 Jan 28, 2024
32f7d12
undo unneccesary appset changes
jaideepr97 Jan 28, 2024
e122612
add nil check for ss
jaideepr97 Jan 28, 2024
3ba241c
add useTLS helper fn
jaideepr97 Feb 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 16 additions & 20 deletions controllers/argocd/applicationset/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,31 +65,27 @@ func (asr *ApplicationSetReconciler) reconcileDeployment() error {
}
deploymentChanged := false

fieldsToCompare := []struct {
existing, desired interface{}
extraAction func()
}{
{&existingDeployment.Spec.Template.Spec.Containers[0].Image, &desiredDeployment.Spec.Template.Spec.Containers[0].Image,
func() {
fieldsToCompare := []argocdcommon.FieldToCompare{
{Existing: &existingDeployment.Spec.Template.Spec.Containers[0].Image, Desired: &desiredDeployment.Spec.Template.Spec.Containers[0].Image,
ExtraAction: func() {
existingDeployment.Spec.Template.ObjectMeta.Labels[common.ImageUpgradedKey] = time.Now().UTC().Format(common.TimeFormatMST)
},
},
{&existingDeployment.Spec.Template.Spec.Containers[0].Command, &desiredDeployment.Spec.Template.Spec.Containers[0].Command, nil},
{&existingDeployment.Spec.Template.Spec.Containers[0].Env, &desiredDeployment.Spec.Template.Spec.Containers[0].Env, nil},
{&existingDeployment.Spec.Template.Spec.Containers[0].Resources, &desiredDeployment.Spec.Template.Spec.Containers[0].Resources, nil},
{&existingDeployment.Spec.Template.Spec.Volumes, &desiredDeployment.Spec.Template.Spec.Volumes, nil},
{&existingDeployment.Spec.Template.Spec.NodeSelector, &desiredDeployment.Spec.Template.Spec.NodeSelector, nil},
{&existingDeployment.Spec.Template.Spec.Tolerations, &desiredDeployment.Spec.Template.Spec.Tolerations, nil},
{&existingDeployment.Spec.Template.Spec.ServiceAccountName, &desiredDeployment.Spec.Template.Spec.ServiceAccountName, nil},
{&existingDeployment.Spec.Template.Labels, &desiredDeployment.Spec.Template.Labels, nil},
{&existingDeployment.Spec.Replicas, &desiredDeployment.Spec.Replicas, nil},
{&existingDeployment.Spec.Selector, &desiredDeployment.Spec.Selector, nil},
{&existingDeployment.Labels, &desiredDeployment.Labels, nil},
{Existing: &existingDeployment.Spec.Template.Spec.Containers[0].Command, Desired: &desiredDeployment.Spec.Template.Spec.Containers[0].Command, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.Containers[0].Env, Desired: &desiredDeployment.Spec.Template.Spec.Containers[0].Env, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.Containers[0].Resources, Desired: &desiredDeployment.Spec.Template.Spec.Containers[0].Resources, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.Volumes, Desired: &desiredDeployment.Spec.Template.Spec.Volumes, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.NodeSelector, Desired: &desiredDeployment.Spec.Template.Spec.NodeSelector, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.Tolerations, Desired: &desiredDeployment.Spec.Template.Spec.Tolerations, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.ServiceAccountName, Desired: &desiredDeployment.Spec.Template.Spec.ServiceAccountName, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Labels, Desired: &desiredDeployment.Spec.Template.Labels, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Replicas, Desired: &desiredDeployment.Spec.Replicas, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Selector, Desired: &desiredDeployment.Spec.Selector, ExtraAction: nil},
{Existing: &existingDeployment.Labels, Desired: &desiredDeployment.Labels, ExtraAction: nil},
{Existing: &existingDeployment.Annotations, Desired: &desiredDeployment.Annotations, ExtraAction: nil},
}

for _, field := range fieldsToCompare {
argocdcommon.UpdateIfChanged(field.existing, field.desired, field.extraAction, &deploymentChanged)
}
argocdcommon.UpdateIfChanged(fieldsToCompare, &deploymentChanged)

if deploymentChanged {

Expand Down
46 changes: 24 additions & 22 deletions controllers/argocd/applicationset/rolebinding.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package applicationset

import (
"reflect"

"github.com/argoproj-labs/argocd-operator/common"
"github.com/argoproj-labs/argocd-operator/controllers/argocd/argocdcommon"
"github.com/argoproj-labs/argocd-operator/pkg/cluster"
"github.com/argoproj-labs/argocd-operator/pkg/permissions"
"github.com/pkg/errors"

rbacv1 "k8s.io/api/rbac/v1"
"k8s.io/apimachinery/pkg/api/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
Expand Down Expand Up @@ -61,7 +63,7 @@ func (asr *ApplicationSetReconciler) reconcileRoleBinding() error {

existingRoleBinding, err := permissions.GetRoleBinding(desiredRoleBinding.Name, desiredRoleBinding.Namespace, asr.Client)
if err != nil {
if !errors.IsNotFound(err) {
if !apierrors.IsNotFound(err) {
asr.Logger.Error(err, "reconcileRoleBinding: failed to retrieve roleBinding", "name", desiredRoleBinding.Name, "namespace", desiredRoleBinding.Namespace)
return err
}
Expand All @@ -78,32 +80,32 @@ func (asr *ApplicationSetReconciler) reconcileRoleBinding() error {
return nil
}

roleBindingChanged := false
fieldsToCompare := []struct {
existing, desired interface{}
}{
{
&existingRoleBinding.RoleRef,
&desiredRoleBinding.RoleRef,
},
{
&existingRoleBinding.Subjects,
&desiredRoleBinding.Subjects,
},
// if roleRef differs, we must delete the rolebinding as kubernetes does not allow updation of roleRef
if !reflect.DeepEqual(existingRoleBinding.RoleRef, desiredRoleBinding.RoleRef) {
asr.Logger.Info("detected drift in roleRef for rolebinding", "name", existingRoleBinding.Name, "namespace", existingRoleBinding.Namespace)
if err := asr.deleteRoleBinding(resourceName, asr.Instance.Namespace); err != nil {
return errors.Wrapf(err, "reconcileRoleBinding: unable to delete obsolete rolebinding %s", existingRoleBinding.Name)
}
return nil
}
svghadi marked this conversation as resolved.
Show resolved Hide resolved

rbChanged := false

fieldsToCompare := []argocdcommon.FieldToCompare{
{Existing: &existingRoleBinding.Subjects, Desired: &desiredRoleBinding.Subjects, ExtraAction: nil},
}

for _, field := range fieldsToCompare {
argocdcommon.UpdateIfChanged(field.existing, field.desired, nil, &roleBindingChanged)
argocdcommon.UpdateIfChanged(fieldsToCompare, &rbChanged)

if !rbChanged {
return nil
}

if roleBindingChanged {
if err = permissions.UpdateRoleBinding(existingRoleBinding, asr.Client); err != nil {
asr.Logger.Error(err, "reconcileRoleBinding: failed to update roleBinding", "name", existingRoleBinding.Name, "namespace", existingRoleBinding.Namespace)
return err
}
if err = permissions.UpdateRoleBinding(existingRoleBinding, asr.Client); err != nil {
return errors.Wrapf(err, "reconcileRoleBinding: failed to update role %s", existingRoleBinding.Name)
}

asr.Logger.V(0).Info("reconcileRoleBinding: roleBinding updated", "name", existingRoleBinding.Name, "namespace", existingRoleBinding.Namespace)
asr.Logger.Info("rolebinding updated", "name", existingRoleBinding.Name, "namespace", existingRoleBinding.Namespace)

return nil
}
Expand Down
23 changes: 9 additions & 14 deletions controllers/argocd/applicationset/webhookroute.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,22 +62,17 @@ func (asr *ApplicationSetReconciler) reconcileWebhookRoute() error {

webhookRouteChanged := false

fieldsToCompare := []struct {
existing, desired interface{}
extraAction func()
}{
{&existingRoute.Annotations, &desiredWebhookRoute.Annotations, nil},
{&existingRoute.Labels, &desiredWebhookRoute.Labels, nil},
{&existingRoute.Spec.WildcardPolicy, &desiredWebhookRoute.Spec.WildcardPolicy, nil},
{&existingRoute.Spec.Host, &desiredWebhookRoute.Spec.Host, nil},
{&existingRoute.Spec.Port, &desiredWebhookRoute.Spec.Port, nil},
{&existingRoute.Spec.TLS, &desiredWebhookRoute.Spec.TLS, nil},
{&existingRoute.Spec.To, &desiredWebhookRoute.Spec.To, nil},
fieldsToCompare := []argocdcommon.FieldToCompare{
{Existing: &existingRoute.Annotations, Desired: &desiredWebhookRoute.Annotations, ExtraAction: nil},
{Existing: &existingRoute.Labels, Desired: &desiredWebhookRoute.Labels, ExtraAction: nil},
{Existing: &existingRoute.Spec.WildcardPolicy, Desired: &desiredWebhookRoute.Spec.WildcardPolicy, ExtraAction: nil},
{Existing: &existingRoute.Spec.Host, Desired: &desiredWebhookRoute.Spec.Host, ExtraAction: nil},
{Existing: &existingRoute.Spec.Port, Desired: &desiredWebhookRoute.Spec.Port, ExtraAction: nil},
{Existing: &existingRoute.Spec.TLS, Desired: &desiredWebhookRoute.Spec.TLS, ExtraAction: nil},
{Existing: &existingRoute.Spec.To, Desired: &desiredWebhookRoute.Spec.To, ExtraAction: nil},
}

for _, field := range fieldsToCompare {
argocdcommon.UpdateIfChanged(field.existing, field.desired, field.extraAction, &webhookRouteChanged)
}
argocdcommon.UpdateIfChanged(fieldsToCompare, &webhookRouteChanged)

if webhookRouteChanged {
if err = openshift.UpdateRoute(existingRoute, asr.Client); err != nil {
Expand Down
32 changes: 25 additions & 7 deletions controllers/argocd/argocdcommon/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,32 @@ import (
"github.com/argoproj-labs/argocd-operator/pkg/util"
)

func UpdateIfChanged(existingVal, desiredVal interface{}, extraAction func(), changed *bool) {
if util.IsPtr(existingVal) && util.IsPtr(desiredVal) {
if !reflect.DeepEqual(existingVal, desiredVal) {
reflect.ValueOf(existingVal).Elem().Set(reflect.ValueOf(desiredVal).Elem())
if extraAction != nil {
extraAction()
type FieldToCompare struct {
Existing interface{}
Desired interface{}
ExtraAction func()
}

// 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 {
if util.IsPtr(field.Existing) && util.IsPtr(field.Desired) {
if !reflect.DeepEqual(field.Existing, field.Desired) {
reflect.ValueOf(field.Existing).Elem().Set(reflect.ValueOf(field.Desired).Elem())
if field.ExtraAction != nil {
field.ExtraAction()
}
*changed = true
}
*changed = true
}
}
}

// PartialMatch accepts a slice of fields to be compared, along with a bool ptr. It compares all the provided fields and sets the bool to false if a drift is detected
func PartialMatch(ftc []FieldToCompare, match *bool) {
for _, field := range ftc {
if !reflect.DeepEqual(field.Existing, field.Desired) {
*match = false
}
}
}
Expand Down
44 changes: 44 additions & 0 deletions controllers/argocd/argocdcommon/tls.go
svghadi marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package argocdcommon

import (
"reflect"

"github.com/argoproj-labs/argocd-operator/pkg/util"
"github.com/argoproj-labs/argocd-operator/pkg/workloads"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
)

// UseTLS, on being invoked by a component, looks for a specified TLS secret on the cluster. If this secret is found, and is owned (either directly or indirectly) by an Argo CD instance, UseTLS returns true. In all other cases it returns false
func UseTLS(secretName, secretNs string, client client.Client, logger *util.Logger) bool {
tlsSecret, err := workloads.GetSecret(secretName, secretNs, client)
if err != nil {
if apierrors.IsNotFound(err) {
logger.Debug("TLS secret not found; skipping TLS enforcement")
return false
}
logger.Error(err, "UseTLS: failed to retrieve tls secret", "name", secretName, "namespace", secretNs)
return false
}

if tlsSecret.Type != corev1.SecretTypeTLS {
// We only process secrets of type kubernetes.io/tls
logger.Debug("secret is not of type kubernetes.io/tls ; skipping TLS enforcement", "name", tlsSecret.Name, "namespace", tlsSecret.Namespace)
return false
}

secretOwner, err := FindSecretOwnerInstance(types.NamespacedName{Name: tlsSecret.Name, Namespace: tlsSecret.Namespace}, client)
if err != nil {
logger.Error(err, "UseTLS: failed to find tls secret owner", "name", tlsSecret.Name, "namespace", tlsSecret.Namespace)
return false
}

if !reflect.DeepEqual(secretOwner, types.NamespacedName{}) {
return true
}

logger.Debug("no owner instance found for secret ; skipping TLS enforcement", "name", tlsSecret.Name, "namespace", tlsSecret.Namespace)
return false
}
8 changes: 8 additions & 0 deletions controllers/argocd/argocdcommon/workloads.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ func TriggerDeploymentRollout(name, namespace, key string, client cntrlClient.Cl
return err
}

if deployment.Spec.Template.ObjectMeta.Labels == nil {
deployment.Spec.Template.ObjectMeta.Labels = make(map[string]string)
}

deployment.Spec.Template.ObjectMeta.Labels[key] = util.NowNano()
return workloads.UpdateDeployment(deployment, client)
}
Expand All @@ -24,6 +28,10 @@ func TriggerStatefulSetRollout(name, namespace, key string, client cntrlClient.C
return err
}

if statefulset.Spec.Template.ObjectMeta.Labels == nil {
statefulset.Spec.Template.ObjectMeta.Labels = make(map[string]string)
}

statefulset.Spec.Template.ObjectMeta.Labels[key] = util.NowNano()
return workloads.UpdateStatefulSet(statefulset, client)
}
35 changes: 15 additions & 20 deletions controllers/argocd/notifications/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,31 +65,26 @@ func (nr *NotificationsReconciler) reconcileDeployment() error {
}
deploymentChanged := false

fieldsToCompare := []struct {
existing, desired interface{}
extraAction func()
}{
{&existingDeployment.Spec.Template.Spec.Containers[0].Image, &desiredDeployment.Spec.Template.Spec.Containers[0].Image,
func() {
fieldsToCompare := []argocdcommon.FieldToCompare{
{Existing: &existingDeployment.Spec.Template.Spec.Containers[0].Image, Desired: &desiredDeployment.Spec.Template.Spec.Containers[0].Image,
ExtraAction: func() {
existingDeployment.Spec.Template.ObjectMeta.Labels[common.ImageUpgradedKey] = time.Now().UTC().Format(common.TimeFormatMST)
},
},
{&existingDeployment.Spec.Template.Spec.Containers[0].Command, &desiredDeployment.Spec.Template.Spec.Containers[0].Command, nil},
{&existingDeployment.Spec.Template.Spec.Containers[0].Env, &desiredDeployment.Spec.Template.Spec.Containers[0].Env, nil},
{&existingDeployment.Spec.Template.Spec.Containers[0].Resources, &desiredDeployment.Spec.Template.Spec.Containers[0].Resources, nil},
{&existingDeployment.Spec.Template.Spec.Volumes, &desiredDeployment.Spec.Template.Spec.Volumes, nil},
{&existingDeployment.Spec.Template.Spec.NodeSelector, &desiredDeployment.Spec.Template.Spec.NodeSelector, nil},
{&existingDeployment.Spec.Template.Spec.Tolerations, &desiredDeployment.Spec.Template.Spec.Tolerations, nil},
{&existingDeployment.Spec.Template.Spec.ServiceAccountName, &desiredDeployment.Spec.Template.Spec.ServiceAccountName, nil},
{&existingDeployment.Spec.Template.Labels, &desiredDeployment.Spec.Template.Labels, nil},
{&existingDeployment.Spec.Replicas, &desiredDeployment.Spec.Replicas, nil},
{&existingDeployment.Spec.Selector, &desiredDeployment.Spec.Selector, nil},
{&existingDeployment.Labels, &desiredDeployment.Labels, nil},
{Existing: &existingDeployment.Spec.Template.Spec.Containers[0].Command, Desired: &desiredDeployment.Spec.Template.Spec.Containers[0].Command, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.Containers[0].Env, Desired: &desiredDeployment.Spec.Template.Spec.Containers[0].Env, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.Containers[0].Resources, Desired: &desiredDeployment.Spec.Template.Spec.Containers[0].Resources, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.Volumes, Desired: &desiredDeployment.Spec.Template.Spec.Volumes, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.NodeSelector, Desired: &desiredDeployment.Spec.Template.Spec.NodeSelector, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.Tolerations, Desired: &desiredDeployment.Spec.Template.Spec.Tolerations, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Spec.ServiceAccountName, Desired: &desiredDeployment.Spec.Template.Spec.ServiceAccountName, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Template.Labels, Desired: &desiredDeployment.Spec.Template.Labels, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Replicas, Desired: &desiredDeployment.Spec.Replicas, ExtraAction: nil},
{Existing: &existingDeployment.Spec.Selector, Desired: &desiredDeployment.Spec.Selector, ExtraAction: nil},
{Existing: &existingDeployment.Labels, Desired: &desiredDeployment.Labels, ExtraAction: nil},
}

for _, field := range fieldsToCompare {
argocdcommon.UpdateIfChanged(field.existing, field.desired, field.extraAction, &deploymentChanged)
}
argocdcommon.UpdateIfChanged(fieldsToCompare, &deploymentChanged)

if deploymentChanged {

Expand Down
46 changes: 24 additions & 22 deletions controllers/argocd/notifications/rolebinding.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package notifications

import (
"reflect"

"github.com/argoproj-labs/argocd-operator/common"
"github.com/argoproj-labs/argocd-operator/controllers/argocd/argocdcommon"
"github.com/argoproj-labs/argocd-operator/pkg/cluster"
"github.com/argoproj-labs/argocd-operator/pkg/permissions"
"github.com/pkg/errors"

rbacv1 "k8s.io/api/rbac/v1"
"k8s.io/apimachinery/pkg/api/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
Expand Down Expand Up @@ -61,7 +63,7 @@ func (nr *NotificationsReconciler) reconcileRoleBinding() error {

existingRoleBinding, err := permissions.GetRoleBinding(desiredRoleBinding.Name, desiredRoleBinding.Namespace, nr.Client)
if err != nil {
if !errors.IsNotFound(err) {
if !apierrors.IsNotFound(err) {
nr.Logger.Error(err, "reconcileRoleBinding: failed to retrieve roleBinding", "name", desiredRoleBinding.Name, "namespace", desiredRoleBinding.Namespace)
return err
}
Expand All @@ -78,32 +80,32 @@ func (nr *NotificationsReconciler) reconcileRoleBinding() error {
return nil
}

roleBindingChanged := false
fieldsToCompare := []struct {
existing, desired interface{}
}{
{
&existingRoleBinding.RoleRef,
&desiredRoleBinding.RoleRef,
},
{
&existingRoleBinding.Subjects,
&desiredRoleBinding.Subjects,
},
// if roleRef differs, we must delete the rolebinding as kubernetes does not allow updation of roleRef
if !reflect.DeepEqual(existingRoleBinding.RoleRef, desiredRoleBinding.RoleRef) {
nr.Logger.Info("detected drift in roleRef for rolebinding", "name", existingRoleBinding.Name, "namespace", existingRoleBinding.Namespace)
if err := nr.deleteRoleBinding(resourceName, nr.Instance.Namespace); err != nil {
return errors.Wrapf(err, "reconcileRoleBinding: unable to delete obsolete rolebinding %s", existingRoleBinding.Name)
}
return nil
}
svghadi marked this conversation as resolved.
Show resolved Hide resolved

rbChanged := false

fieldsToCompare := []argocdcommon.FieldToCompare{
{Existing: &existingRoleBinding.Subjects, Desired: &desiredRoleBinding.Subjects, ExtraAction: nil},
}

for _, field := range fieldsToCompare {
argocdcommon.UpdateIfChanged(field.existing, field.desired, nil, &roleBindingChanged)
argocdcommon.UpdateIfChanged(fieldsToCompare, &rbChanged)

if !rbChanged {
return nil
}

if roleBindingChanged {
if err = permissions.UpdateRoleBinding(existingRoleBinding, nr.Client); err != nil {
nr.Logger.Error(err, "reconcileRoleBinding: failed to update roleBinding", "name", existingRoleBinding.Name, "namespace", existingRoleBinding.Namespace)
return err
}
if err = permissions.UpdateRoleBinding(existingRoleBinding, nr.Client); err != nil {
return errors.Wrapf(err, "reconcileRoleBinding: failed to update role %s", existingRoleBinding.Name)
}

nr.Logger.V(0).Info("reconcileRoleBinding: roleBinding updated", "name", existingRoleBinding.Name, "namespace", existingRoleBinding.Namespace)
nr.Logger.Info("rolebinding updated", "name", existingRoleBinding.Name, "namespace", existingRoleBinding.Namespace)

return nil
}
Expand Down
Loading
Loading