Skip to content

Commit 1e09f8f

Browse files
authored
Merge pull request #634 from mbaldessari/small-fixes
A couple of fixes
2 parents 556a721 + 94371c7 commit 1e09f8f

2 files changed

Lines changed: 57 additions & 60 deletions

File tree

internal/controller/argo.go

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ func createOrUpdateArgoCD(client dynamic.Interface, fullClient kubernetes.Interf
469469
newArgo := &unstructured.Unstructured{Object: obj}
470470
_, err = client.Resource(gvr).Namespace(namespace).Create(context.TODO(), newArgo, metav1.CreateOptions{})
471471
} else { // update it
472-
oldArgo, errGet := getArgoCDFunc(client, name, namespace)
472+
oldArgo, oldUnstructured, errGet := getArgoCDFunc(client, name, namespace)
473473
if errGet != nil {
474474
return fmt.Errorf("failed to get existing ArgoCD %s/%s: %v", namespace, name, errGet)
475475
}
@@ -483,14 +483,11 @@ func createOrUpdateArgoCD(client dynamic.Interface, fullClient kubernetes.Interf
483483
// Preserve spec fields not known to this vendored argocd-operator version
484484
// (e.g. networkPolicy added in gitops-operator v1.20.3) to avoid
485485
// stripping them and causing infinite reconciliation loops.
486-
oldUnstructured, errGet2 := client.Resource(gvr).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{})
487-
if errGet2 == nil {
488-
oldSpec, _, _ := unstructured.NestedMap(oldUnstructured.Object, "spec")
489-
newSpec, _, _ := unstructured.NestedMap(newArgo.Object, "spec")
490-
for key, val := range oldSpec {
491-
if _, exists := newSpec[key]; !exists {
492-
_ = unstructured.SetNestedField(newArgo.Object, val, "spec", key)
493-
}
486+
oldSpec, _, _ := unstructured.NestedMap(oldUnstructured.Object, "spec")
487+
newSpec, _, _ := unstructured.NestedMap(newArgo.Object, "spec")
488+
for key, val := range oldSpec {
489+
if _, exists := newSpec[key]; !exists {
490+
_ = unstructured.SetNestedField(newArgo.Object, val, "spec", key)
494491
}
495492
}
496493

@@ -555,15 +552,15 @@ func removeConsoleLink(client dynamic.Interface, argoName string) error {
555552

556553
var getArgoCDFunc = getArgoCD
557554

558-
func getArgoCD(client dynamic.Interface, name, namespace string) (*argooperator.ArgoCD, error) {
555+
func getArgoCD(client dynamic.Interface, name, namespace string) (*argooperator.ArgoCD, *unstructured.Unstructured, error) {
559556
gvr := schema.GroupVersionResource{Group: ArgoCDGroup, Version: ArgoCDVersion, Resource: ArgoCDResource}
560557
argo := &argooperator.ArgoCD{}
561558
unstructuredArgo, err := client.Resource(gvr).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{})
562559
if err != nil {
563-
return nil, err
560+
return nil, nil, err
564561
}
565562
err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredArgo.UnstructuredContent(), argo)
566-
return argo, err
563+
return argo, unstructuredArgo, err
567564
}
568565

569566
func newApplicationParameters(p *api.Pattern) []argoapi.HelmParameter {

internal/controller/argo_test.go

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,52 +1020,52 @@ var _ = Describe("CreateOrUpdateArgoCD", func() {
10201020
})
10211021
})
10221022

1023-
Context("when the ArgoCD instance exists with additional spec fields not managed by patterns-operator", func() {
1024-
BeforeEach(func() {
1025-
argoCD := &unstructured.Unstructured{
1026-
Object: map[string]any{
1027-
"apiVersion": "argoproj.io/v1beta1",
1028-
"kind": "ArgoCD",
1029-
"metadata": map[string]any{
1030-
"name": name,
1031-
"namespace": namespace,
1032-
"resourceVersion": "1",
1033-
},
1034-
"spec": map[string]any{
1035-
"networkPolicy": map[string]any{
1036-
"enabled": true,
1037-
},
1038-
"imageUpdater": map[string]any{
1039-
"enabled": false,
1040-
},
1041-
},
1042-
},
1043-
}
1044-
_, err := dynamicClient.Resource(gvr).Namespace(namespace).Create(context.TODO(), argoCD, metav1.CreateOptions{})
1045-
Expect(err).ToNot(HaveOccurred())
1046-
})
1047-
1048-
It("should preserve spec fields not managed by patterns-operator during update", func() {
1049-
err := createOrUpdateArgoCD(dynamicClient, nil, name, namespace, patternsOperatorConfig)
1050-
Expect(err).ToNot(HaveOccurred())
1051-
1052-
argoCD, err := dynamicClient.Resource(gvr).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{})
1053-
Expect(err).ToNot(HaveOccurred())
1054-
1055-
// networkPolicy should be preserved — it is managed by gitops-operator
1056-
// not by patterns-operator, so the update must not strip it
1057-
networkPolicy, found, err := unstructured.NestedMap(argoCD.Object, "spec", "networkPolicy")
1058-
Expect(err).ToNot(HaveOccurred())
1059-
Expect(found).To(BeTrue(), "networkPolicy should be preserved after update")
1060-
Expect(networkPolicy["enabled"]).To(BeTrue())
1061-
1062-
// imageUpdater should also be preserved
1063-
imageUpdater, found, err := unstructured.NestedMap(argoCD.Object, "spec", "imageUpdater")
1064-
Expect(err).ToNot(HaveOccurred())
1065-
Expect(found).To(BeTrue(), "imageUpdater should be preserved after update")
1066-
Expect(imageUpdater["enabled"]).To(BeFalse())
1067-
})
1068-
})
1023+
Context("when the ArgoCD instance exists with additional spec fields not managed by patterns-operator", func() {
1024+
BeforeEach(func() {
1025+
argoCD := &unstructured.Unstructured{
1026+
Object: map[string]any{
1027+
"apiVersion": "argoproj.io/v1beta1",
1028+
"kind": "ArgoCD",
1029+
"metadata": map[string]any{
1030+
"name": name,
1031+
"namespace": namespace,
1032+
"resourceVersion": "1",
1033+
},
1034+
"spec": map[string]any{
1035+
"networkPolicy": map[string]any{
1036+
"enabled": true,
1037+
},
1038+
"imageUpdater": map[string]any{
1039+
"enabled": false,
1040+
},
1041+
},
1042+
},
1043+
}
1044+
_, err := dynamicClient.Resource(gvr).Namespace(namespace).Create(context.TODO(), argoCD, metav1.CreateOptions{})
1045+
Expect(err).ToNot(HaveOccurred())
1046+
})
1047+
1048+
It("should preserve spec fields not managed by patterns-operator during update", func() {
1049+
err := createOrUpdateArgoCD(dynamicClient, nil, name, namespace, patternsOperatorConfig)
1050+
Expect(err).ToNot(HaveOccurred())
1051+
1052+
argoCD, err := dynamicClient.Resource(gvr).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{})
1053+
Expect(err).ToNot(HaveOccurred())
1054+
1055+
// networkPolicy should be preserved — it is managed by gitops-operator
1056+
// not by patterns-operator, so the update must not strip it
1057+
networkPolicy, found, err := unstructured.NestedMap(argoCD.Object, "spec", "networkPolicy")
1058+
Expect(err).ToNot(HaveOccurred())
1059+
Expect(found).To(BeTrue(), "networkPolicy should be preserved after update")
1060+
Expect(networkPolicy["enabled"]).To(BeTrue())
1061+
1062+
// imageUpdater should also be preserved
1063+
imageUpdater, found, err := unstructured.NestedMap(argoCD.Object, "spec", "imageUpdater")
1064+
Expect(err).ToNot(HaveOccurred())
1065+
Expect(found).To(BeTrue(), "imageUpdater should be preserved after update")
1066+
Expect(imageUpdater["enabled"]).To(BeFalse())
1067+
})
1068+
})
10691069

10701070
Context("when there is an error in the getArgoCD fn but there is an argocd", func() {
10711071

@@ -1083,8 +1083,8 @@ var _ = Describe("CreateOrUpdateArgoCD", func() {
10831083
}
10841084
_, err := dynamicClient.Resource(gvr).Namespace(namespace).Create(context.TODO(), argoCD, metav1.CreateOptions{})
10851085
Expect(err).ToNot(HaveOccurred())
1086-
getArgoCDFunc = func(_ dynamic.Interface, _, _ string) (*argooperator.ArgoCD, error) {
1087-
return nil, fmt.Errorf("forced error")
1086+
getArgoCDFunc = func(_ dynamic.Interface, _, _ string) (*argooperator.ArgoCD, *unstructured.Unstructured, error) {
1087+
return nil, nil, fmt.Errorf("forced error")
10881088
}
10891089
})
10901090

0 commit comments

Comments
 (0)