|
|
@@ -16,6 +16,8 @@ package externalsecret
|
|
|
import (
|
|
|
"context"
|
|
|
"fmt"
|
|
|
+ "os"
|
|
|
+ "strconv"
|
|
|
"time"
|
|
|
|
|
|
. "github.com/onsi/ginkgo"
|
|
|
@@ -59,6 +61,74 @@ type testCase struct {
|
|
|
|
|
|
type testTweaks func(*testCase)
|
|
|
|
|
|
+var _ = Describe("Kind=secret existence logic", func() {
|
|
|
+ type testCase struct {
|
|
|
+ Name string
|
|
|
+ Input v1.Secret
|
|
|
+ ExpectedOutput bool
|
|
|
+ }
|
|
|
+ tests := []testCase{
|
|
|
+ {
|
|
|
+ Name: "Should not be valid in case of missing uid",
|
|
|
+ Input: v1.Secret{},
|
|
|
+ ExpectedOutput: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "A nil annotation should not be valid",
|
|
|
+ Input: v1.Secret{
|
|
|
+ ObjectMeta: metav1.ObjectMeta{
|
|
|
+ UID: "xxx",
|
|
|
+ Annotations: map[string]string{},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ExpectedOutput: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "A nil annotation should not be valid",
|
|
|
+ Input: v1.Secret{
|
|
|
+ ObjectMeta: metav1.ObjectMeta{
|
|
|
+ UID: "xxx",
|
|
|
+ Annotations: map[string]string{},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ExpectedOutput: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "An invalid annotation hash should not be valid",
|
|
|
+ Input: v1.Secret{
|
|
|
+ ObjectMeta: metav1.ObjectMeta{
|
|
|
+ UID: "xxx",
|
|
|
+ Annotations: map[string]string{
|
|
|
+ esv1alpha1.AnnotationDataHash: "xxxxxx",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ExpectedOutput: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "A valid config map should return true",
|
|
|
+ Input: v1.Secret{
|
|
|
+ ObjectMeta: metav1.ObjectMeta{
|
|
|
+ UID: "xxx",
|
|
|
+ Annotations: map[string]string{
|
|
|
+ esv1alpha1.AnnotationDataHash: "caa0155759a6a9b3b6ada5a6883ee2bb",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ Data: map[string][]byte{
|
|
|
+ "foo": []byte("value1"),
|
|
|
+ "bar": []byte("value2"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ExpectedOutput: true,
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, tt := range tests {
|
|
|
+ It(tt.Name, func() {
|
|
|
+ Expect(isSecretValid(tt.Input)).To(BeEquivalentTo(tt.ExpectedOutput))
|
|
|
+ })
|
|
|
+ }
|
|
|
+})
|
|
|
var _ = Describe("ExternalSecret controller", func() {
|
|
|
const (
|
|
|
ExternalSecretName = "test-es"
|
|
|
@@ -68,6 +138,13 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
|
|
|
var ExternalSecretNamespace string
|
|
|
|
|
|
+ // if we are in debug and need to increase the timeout for testing, we can do so by using an env var
|
|
|
+ if customTimeout := os.Getenv("TEST_CUSTOM_TIMEOUT_SEC"); customTimeout != "" {
|
|
|
+ if t, err := strconv.Atoi(customTimeout); err == nil {
|
|
|
+ timeout = time.Second * time.Duration(t)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
BeforeEach(func() {
|
|
|
var err error
|
|
|
ExternalSecretNamespace, err = CreateNamespace("test-ns", k8sClient)
|
|
|
@@ -158,24 +235,32 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
}
|
|
|
fakeProvider.WithGetSecret([]byte(secretVal), nil)
|
|
|
tc.checkSecret = func(es *esv1alpha1.ExternalSecret, secret *v1.Secret) {
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionFalse, 0.0)).To(BeTrue())
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionTrue, 1.0)).To(BeTrue())
|
|
|
- Eventually(func() bool {
|
|
|
- Expect(syncCallsTotal.WithLabelValues(ExternalSecretName, ExternalSecretNamespace).Write(&metric)).To(Succeed())
|
|
|
- return metric.GetCounter().GetValue() == 1.0
|
|
|
- }, timeout, interval).Should(BeTrue())
|
|
|
-
|
|
|
// check value
|
|
|
Expect(string(secret.Data[targetProp])).To(Equal(secretVal))
|
|
|
|
|
|
// check labels & annotations
|
|
|
Expect(secret.ObjectMeta.Labels).To(BeEquivalentTo(es.ObjectMeta.Labels))
|
|
|
- Expect(secret.ObjectMeta.Annotations).To(BeEquivalentTo(es.ObjectMeta.Annotations))
|
|
|
+ for k, v := range es.ObjectMeta.Annotations {
|
|
|
+ Expect(secret.ObjectMeta.Annotations).To(HaveKeyWithValue(k, v))
|
|
|
+ }
|
|
|
// ownerRef must not not be set!
|
|
|
Expect(hasOwnerRef(secret.ObjectMeta, "ExternalSecret", ExternalSecretName)).To(BeTrue())
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ checkPrometheusCounters := func(tc *testCase) {
|
|
|
+ const secretVal = "someValue"
|
|
|
+ fakeProvider.WithGetSecret([]byte(secretVal), nil)
|
|
|
+ tc.checkSecret = func(es *esv1alpha1.ExternalSecret, secret *v1.Secret) {
|
|
|
+ Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionFalse, 0.0)).To(BeTrue())
|
|
|
+ Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionTrue, 1.0)).To(BeTrue())
|
|
|
+ Eventually(func() bool {
|
|
|
+ Expect(syncCallsTotal.WithLabelValues(ExternalSecretName, ExternalSecretNamespace).Write(&metric)).To(Succeed())
|
|
|
+ return metric.GetCounter().GetValue() == 1.0
|
|
|
+ }, timeout, interval).Should(BeTrue())
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// merge with existing secret using creationPolicy=Merge
|
|
|
// it should NOT have a ownerReference
|
|
|
// metadata.managedFields with the correct owner should be added to the secret
|
|
|
@@ -198,23 +283,22 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
|
|
|
fakeProvider.WithGetSecret([]byte(secretVal), nil)
|
|
|
tc.checkSecret = func(es *esv1alpha1.ExternalSecret, secret *v1.Secret) {
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionFalse, 0.0)).To(BeTrue())
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionTrue, 1.0)).To(BeTrue())
|
|
|
- Eventually(func() bool {
|
|
|
- Expect(syncCallsTotal.WithLabelValues(ExternalSecretName, ExternalSecretNamespace).Write(&metric)).To(Succeed())
|
|
|
- return metric.GetCounter().GetValue() == 1.0
|
|
|
- }, timeout, interval).Should(BeTrue())
|
|
|
-
|
|
|
// check value
|
|
|
Expect(string(secret.Data[existingKey])).To(Equal(existingVal))
|
|
|
Expect(string(secret.Data[targetProp])).To(Equal(secretVal))
|
|
|
|
|
|
// check labels & annotations
|
|
|
Expect(secret.ObjectMeta.Labels).To(BeEquivalentTo(es.ObjectMeta.Labels))
|
|
|
- Expect(secret.ObjectMeta.Annotations).To(BeEquivalentTo(es.ObjectMeta.Annotations))
|
|
|
+ for k, v := range es.ObjectMeta.Annotations {
|
|
|
+ Expect(secret.ObjectMeta.Annotations).To(HaveKeyWithValue(k, v))
|
|
|
+ }
|
|
|
Expect(hasOwnerRef(secret.ObjectMeta, "ExternalSecret", ExternalSecretName)).To(BeFalse())
|
|
|
Expect(secret.ObjectMeta.ManagedFields).To(HaveLen(2))
|
|
|
- Expect(hasFieldOwnership(secret.ObjectMeta, "external-secrets", "{\"f:data\":{\"f:targetProperty\":{}}}")).To(BeTrue())
|
|
|
+ Expect(hasFieldOwnership(
|
|
|
+ secret.ObjectMeta,
|
|
|
+ "external-secrets",
|
|
|
+ fmt.Sprintf("{\"f:data\":{\"f:targetProperty\":{}},\"f:metadata\":{\"f:annotations\":{\"f:%s\":{}}}}", esv1alpha1.AnnotationDataHash)),
|
|
|
+ ).To(BeTrue())
|
|
|
Expect(hasFieldOwnership(secret.ObjectMeta, "fake.manager", "{\"f:data\":{\".\":{},\"f:pre-existing-key\":{}},\"f:type\":{}}")).To(BeTrue())
|
|
|
}
|
|
|
}
|
|
|
@@ -313,20 +397,15 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
}
|
|
|
fakeProvider.WithGetSecret([]byte(secretVal), nil)
|
|
|
tc.checkSecret = func(es *esv1alpha1.ExternalSecret, secret *v1.Secret) {
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionFalse, 0.0)).To(BeTrue())
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionTrue, 1.0)).To(BeTrue())
|
|
|
- Eventually(func() bool {
|
|
|
- Expect(syncCallsTotal.WithLabelValues(ExternalSecretName, ExternalSecretNamespace).Write(&metric)).To(Succeed())
|
|
|
- return metric.GetCounter().GetValue() == 1.0
|
|
|
- }, timeout, interval).Should(BeTrue())
|
|
|
-
|
|
|
// check values
|
|
|
Expect(string(secret.Data[targetProp])).To(Equal(expectedSecretVal))
|
|
|
Expect(string(secret.Data[tplStaticKey])).To(Equal(tplStaticVal))
|
|
|
|
|
|
// labels/annotations should be taken from the template
|
|
|
Expect(secret.ObjectMeta.Labels).To(BeEquivalentTo(es.Spec.Target.Template.Metadata.Labels))
|
|
|
- Expect(secret.ObjectMeta.Annotations).To(BeEquivalentTo(es.Spec.Target.Template.Metadata.Annotations))
|
|
|
+ for k, v := range es.Spec.Target.Template.Metadata.Annotations {
|
|
|
+ Expect(secret.ObjectMeta.Annotations).To(HaveKeyWithValue(k, v))
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -443,7 +522,12 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
|
|
|
// labels/annotations should be taken from the template
|
|
|
Expect(secret.ObjectMeta.Labels).To(BeEquivalentTo(es.Spec.Target.Template.Metadata.Labels))
|
|
|
- Expect(secret.ObjectMeta.Annotations).To(BeEquivalentTo(es.Spec.Target.Template.Metadata.Annotations))
|
|
|
+
|
|
|
+ // a secret will always have some extra annotations (i.e. hashmap check), so we only check for specific
|
|
|
+ // source annotations
|
|
|
+ for k, v := range es.Spec.Target.Template.Metadata.Annotations {
|
|
|
+ Expect(secret.ObjectMeta.Annotations).To(HaveKeyWithValue(k, v))
|
|
|
+ }
|
|
|
|
|
|
cleanEs := tc.externalSecret.DeepCopy()
|
|
|
|
|
|
@@ -470,7 +554,9 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
|
|
|
// also check labels/annotations have been updated
|
|
|
Expect(secret.ObjectMeta.Labels).To(BeEquivalentTo(es.Spec.Target.Template.Metadata.Labels))
|
|
|
- Expect(secret.ObjectMeta.Annotations).To(BeEquivalentTo(es.Spec.Target.Template.Metadata.Annotations))
|
|
|
+ for k, v := range es.Spec.Target.Template.Metadata.Annotations {
|
|
|
+ Expect(secret.ObjectMeta.Annotations).To(HaveKeyWithValue(k, v))
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -490,7 +576,9 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
|
|
|
// labels/annotations should be taken from the template
|
|
|
Expect(secret.ObjectMeta.Labels).To(BeEquivalentTo(es.Spec.Target.Template.Metadata.Labels))
|
|
|
- Expect(secret.ObjectMeta.Annotations).To(BeEquivalentTo(es.Spec.Target.Template.Metadata.Annotations))
|
|
|
+ for k, v := range es.Spec.Target.Template.Metadata.Annotations {
|
|
|
+ Expect(secret.ObjectMeta.Annotations).To(HaveKeyWithValue(k, v))
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -502,13 +590,6 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
fakeProvider.WithGetSecret([]byte(secretVal), nil)
|
|
|
tc.externalSecret.Spec.RefreshInterval = &metav1.Duration{Duration: time.Second}
|
|
|
tc.checkSecret = func(es *esv1alpha1.ExternalSecret, secret *v1.Secret) {
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionFalse, 0.0)).To(BeTrue())
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionTrue, 1.0)).To(BeTrue())
|
|
|
- Eventually(func() bool {
|
|
|
- Expect(syncCallsTotal.WithLabelValues(ExternalSecretName, ExternalSecretNamespace).Write(&metric)).To(Succeed())
|
|
|
- return metric.GetCounter().GetValue() == 1.0
|
|
|
- }, timeout, interval).Should(BeTrue())
|
|
|
-
|
|
|
// check values
|
|
|
Expect(string(secret.Data[targetProp])).To(Equal(secretVal))
|
|
|
|
|
|
@@ -537,13 +618,6 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
fakeProvider.WithGetSecret([]byte(secretVal), nil)
|
|
|
tc.externalSecret.Spec.RefreshInterval = &metav1.Duration{Duration: 0}
|
|
|
tc.checkSecret = func(es *esv1alpha1.ExternalSecret, secret *v1.Secret) {
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionFalse, 0.0)).To(BeTrue())
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionTrue, 1.0)).To(BeTrue())
|
|
|
- Eventually(func() bool {
|
|
|
- Expect(syncCallsTotal.WithLabelValues(ExternalSecretName, ExternalSecretNamespace).Write(&metric)).To(Succeed())
|
|
|
- return metric.GetCounter().GetValue() == 1.0
|
|
|
- }, timeout, interval).Should(BeTrue())
|
|
|
-
|
|
|
// check values
|
|
|
Expect(string(secret.Data[targetProp])).To(Equal(secretVal))
|
|
|
|
|
|
@@ -580,13 +654,6 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
"bar": []byte("map-bar-value"),
|
|
|
}, nil)
|
|
|
tc.checkSecret = func(es *esv1alpha1.ExternalSecret, secret *v1.Secret) {
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionFalse, 0.0)).To(BeTrue())
|
|
|
- Expect(externalSecretConditionShouldBe(ExternalSecretName, ExternalSecretNamespace, esv1alpha1.ExternalSecretReady, v1.ConditionTrue, 1.0)).To(BeTrue())
|
|
|
- Eventually(func() bool {
|
|
|
- Expect(syncCallsTotal.WithLabelValues(ExternalSecretName, ExternalSecretNamespace).Write(&metric)).To(Succeed())
|
|
|
- return metric.GetCounter().GetValue() == 1.0
|
|
|
- }, timeout, interval).Should(BeTrue())
|
|
|
-
|
|
|
// check values
|
|
|
Expect(string(secret.Data["foo"])).To(Equal("map-foo-value"))
|
|
|
Expect(string(secret.Data["bar"])).To(Equal("map-bar-value"))
|
|
|
@@ -703,6 +770,80 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // When the ownership is set to owner, and we delete a dependent child kind=secret
|
|
|
+ // it should be recreated without waiting for refresh interval
|
|
|
+ checkDeletion := func(tc *testCase) {
|
|
|
+ const secretVal = "someValue"
|
|
|
+ fakeProvider.WithGetSecret([]byte(secretVal), nil)
|
|
|
+ tc.externalSecret.Spec.RefreshInterval = &metav1.Duration{Duration: time.Minute * 10}
|
|
|
+ tc.checkSecret = func(es *esv1alpha1.ExternalSecret, secret *v1.Secret) {
|
|
|
+
|
|
|
+ // check values
|
|
|
+ oldUID := secret.UID
|
|
|
+ Expect(oldUID).NotTo(BeEmpty())
|
|
|
+
|
|
|
+ // delete the related config
|
|
|
+ Expect(k8sClient.Delete(context.TODO(), secret))
|
|
|
+
|
|
|
+ var newSecret v1.Secret
|
|
|
+ secretLookupKey := types.NamespacedName{
|
|
|
+ Name: ExternalSecretTargetSecretName,
|
|
|
+ Namespace: ExternalSecretNamespace,
|
|
|
+ }
|
|
|
+ Eventually(func() bool {
|
|
|
+ err := k8sClient.Get(context.Background(), secretLookupKey, &newSecret)
|
|
|
+ if err != nil {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ // new secret should be a new, recreated object with a different UID
|
|
|
+ return newSecret.UID != oldUID
|
|
|
+ }, timeout, interval).Should(BeTrue())
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Checks that secret annotation has been written based on the data
|
|
|
+ checkSecretDataHashAnnotation := func(tc *testCase) {
|
|
|
+ const secretVal = "someValue"
|
|
|
+ fakeProvider.WithGetSecret([]byte(secretVal), nil)
|
|
|
+ tc.checkSecret = func(es *esv1alpha1.ExternalSecret, secret *v1.Secret) {
|
|
|
+ Expect(secret.Annotations[esv1alpha1.AnnotationDataHash]).To(Equal("9d30b95ca81e156f9454b5ef3bfcc6ee"))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // When we amend the created kind=secret, refresh operation should be run again regardless of refresh interval
|
|
|
+ checkSecretDataHashAnnotationChange := func(tc *testCase) {
|
|
|
+ fakeData := map[string][]byte{
|
|
|
+ "targetProperty": []byte("map-foo-value"),
|
|
|
+ }
|
|
|
+ fakeProvider.WithGetSecretMap(fakeData, nil)
|
|
|
+ tc.externalSecret.Spec.RefreshInterval = &metav1.Duration{Duration: time.Minute * 10}
|
|
|
+ tc.checkSecret = func(es *esv1alpha1.ExternalSecret, secret *v1.Secret) {
|
|
|
+ oldHash := secret.Annotations[esv1alpha1.AnnotationDataHash]
|
|
|
+ oldResourceVersion := secret.ResourceVersion
|
|
|
+ Expect(oldHash).NotTo(BeEmpty())
|
|
|
+
|
|
|
+ cleanSecret := secret.DeepCopy()
|
|
|
+ secret.Data["new"] = []byte("value")
|
|
|
+ secret.ObjectMeta.Annotations[esv1alpha1.AnnotationDataHash] = "thisiswronghash"
|
|
|
+ Expect(k8sClient.Patch(context.Background(), secret, client.MergeFrom(cleanSecret))).To(Succeed())
|
|
|
+
|
|
|
+ var refreshedSecret v1.Secret
|
|
|
+ secretLookupKey := types.NamespacedName{
|
|
|
+ Name: ExternalSecretTargetSecretName,
|
|
|
+ Namespace: ExternalSecretNamespace,
|
|
|
+ }
|
|
|
+ Eventually(func() bool {
|
|
|
+ err := k8sClient.Get(context.Background(), secretLookupKey, &refreshedSecret)
|
|
|
+ if err != nil {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ // refreshed secret should have a different generation (sign that it was updated), but since
|
|
|
+ // the secret source is the same (not changed), the hash should be reverted to an old value
|
|
|
+ return refreshedSecret.ResourceVersion != oldResourceVersion && refreshedSecret.Annotations[esv1alpha1.AnnotationDataHash] == oldHash
|
|
|
+ }, timeout, interval).Should(BeTrue())
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
DescribeTable("When reconciling an ExternalSecret",
|
|
|
func(tweaks ...testTweaks) {
|
|
|
tc := makeDefaultTestcase()
|
|
|
@@ -739,9 +880,13 @@ var _ = Describe("ExternalSecret controller", func() {
|
|
|
tc.checkSecret(createdES, syncedSecret)
|
|
|
}
|
|
|
},
|
|
|
+ Entry("should recreate deleted secret", checkDeletion),
|
|
|
+ Entry("should create proper hash annotation for the external secret", checkSecretDataHashAnnotation),
|
|
|
+ Entry("should refresh when the hash annotation doesn't correspond to secret data", checkSecretDataHashAnnotationChange),
|
|
|
Entry("should set the condition eventually", syncLabelsAnnotations),
|
|
|
+ Entry("should set prometheus counters", checkPrometheusCounters),
|
|
|
Entry("should merge with existing secret using creationPolicy=Merge", mergeWithSecret),
|
|
|
- Entry("should error if sceret doesn't exist when using creationPolicy=Merge", mergeWithSecretErr),
|
|
|
+ Entry("should error if secret doesn't exist when using creationPolicy=Merge", mergeWithSecretErr),
|
|
|
Entry("should not resolve conflicts with creationPolicy=Merge", mergeWithConflict),
|
|
|
Entry("should sync with template", syncWithTemplate),
|
|
|
Entry("should sync template with correct value precedence", syncWithTemplatePrecedence),
|
|
|
@@ -766,7 +911,6 @@ var _ = Describe("ExternalSecret refresh logic", func() {
|
|
|
},
|
|
|
})).To(BeTrue())
|
|
|
})
|
|
|
-
|
|
|
It("should refresh when labels change", func() {
|
|
|
es := esv1alpha1.ExternalSecret{
|
|
|
ObjectMeta: metav1.ObjectMeta{
|