1
0
Fork 0
mirror of https://github.com/external-secrets/external-secrets.git synced 2024-12-14 11:57:59 +00:00

Merge pull request #303 from external-secrets/fix/skip-refresh

fix: zero refreshInterval shouldn't sync
This commit is contained in:
paul-the-alien[bot] 2021-08-04 05:59:48 +00:00 committed by GitHub
commit 47eb839344
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 66 additions and 10 deletions

View file

@ -17,6 +17,7 @@ package main
import (
"flag"
"os"
"time"
"go.uber.org/zap/zapcore"
"k8s.io/apimachinery/pkg/runtime"
@ -88,6 +89,7 @@ func main() {
Log: ctrl.Log.WithName("controllers").WithName("ExternalSecret"),
Scheme: mgr.GetScheme(),
ControllerClass: controllerClass,
RequeueInterval: time.Hour,
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "ExternalSecret")
os.Exit(1)

View file

@ -74,6 +74,7 @@ type Reconciler struct {
Log logr.Logger
Scheme *runtime.Scheme
ControllerClass string
RequeueInterval time.Duration
}
// Reconcile implements the main reconciliation loop
@ -145,7 +146,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
}
}()
refreshInt := time.Hour
refreshInt := r.RequeueInterval
if externalSecret.Spec.RefreshInterval != nil {
refreshInt = externalSecret.Spec.RefreshInterval.Duration
}
@ -306,7 +307,7 @@ func shouldRefresh(es esv1alpha1.ExternalSecret) bool {
return true
}
// skip refresh if refresh interval is 0
if es.Spec.RefreshInterval == nil && es.Status.SyncedResourceVersion != "" {
if es.Spec.RefreshInterval.Duration == 0 && es.Status.SyncedResourceVersion != "" {
return false
}
if es.Status.RefreshTime.IsZero() {

View file

@ -488,6 +488,41 @@ var _ = Describe("ExternalSecret controller", func() {
}
}
refreshintervalZero := func(tc *testCase) {
const targetProp = "targetProperty"
const secretVal = "someValue"
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))
// update provider secret
newValue := "NEW VALUE"
sec := &v1.Secret{}
fakeProvider.WithGetSecret([]byte(newValue), nil)
secretLookupKey := types.NamespacedName{
Name: ExternalSecretTargetSecretName,
Namespace: ExternalSecretNamespace,
}
Consistently(func() bool {
err := k8sClient.Get(context.Background(), secretLookupKey, sec)
if err != nil {
return false
}
v := sec.Data[targetProp]
return string(v) == secretVal
}, time.Second*10, time.Second).Should(BeTrue())
}
}
// with dataFrom all properties from the specified secret
// should be put into the secret
syncWithDataFrom := func(tc *testCase) {
@ -669,6 +704,7 @@ var _ = Describe("ExternalSecret controller", func() {
Entry("should sync template with correct value precedence", syncWithTemplatePrecedence),
Entry("should refresh secret from template", refreshWithTemplate),
Entry("should refresh secret value when provider secret changes", refreshSecretValue),
Entry("should not refresh secret value when provider secret changes but refreshInterval is zero", refreshintervalZero),
Entry("should fetch secret using dataFrom", syncWithDataFrom),
Entry("should set error condition when provider errors", providerErrCondition),
Entry("should set an error condition when store does not exist", storeMissingErrCondition),
@ -695,7 +731,12 @@ var _ = Describe("ExternalSecret refresh logic", func() {
"foo": "bar",
},
},
Status: esv1alpha1.ExternalSecretStatus{},
Spec: esv1alpha1.ExternalSecretSpec{
RefreshInterval: &metav1.Duration{Duration: time.Minute},
},
Status: esv1alpha1.ExternalSecretStatus{
RefreshTime: metav1.Now(),
},
}
es.Status.SyncedResourceVersion = getResourceVersion(es)
// this should not refresh, rv matches object
@ -714,7 +755,12 @@ var _ = Describe("ExternalSecret refresh logic", func() {
"foo": "bar",
},
},
Status: esv1alpha1.ExternalSecretStatus{},
Spec: esv1alpha1.ExternalSecretSpec{
RefreshInterval: &metav1.Duration{Duration: time.Minute},
},
Status: esv1alpha1.ExternalSecretStatus{
RefreshTime: metav1.Now(),
},
}
es.Status.SyncedResourceVersion = getResourceVersion(es)
// this should not refresh, rv matches object
@ -730,7 +776,12 @@ var _ = Describe("ExternalSecret refresh logic", func() {
ObjectMeta: metav1.ObjectMeta{
Generation: 1,
},
Status: esv1alpha1.ExternalSecretStatus{},
Spec: esv1alpha1.ExternalSecretSpec{
RefreshInterval: &metav1.Duration{Duration: 0},
},
Status: esv1alpha1.ExternalSecretStatus{
RefreshTime: metav1.Now(),
},
}
es.Status.SyncedResourceVersion = getResourceVersion(es)
Expect(shouldRefresh(es)).To(BeFalse())
@ -740,13 +791,13 @@ var _ = Describe("ExternalSecret refresh logic", func() {
Expect(shouldRefresh(es)).To(BeTrue())
})
It("should skip refresh when refreshInterval is nil", func() {
It("should skip refresh when refreshInterval is 0", func() {
es := esv1alpha1.ExternalSecret{
ObjectMeta: metav1.ObjectMeta{
Generation: 1,
},
Spec: esv1alpha1.ExternalSecretSpec{
RefreshInterval: nil,
RefreshInterval: &metav1.Duration{Duration: 0},
},
Status: esv1alpha1.ExternalSecretStatus{},
}

View file

@ -17,6 +17,7 @@ package externalsecret
import (
"path/filepath"
"testing"
"time"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
@ -74,9 +75,10 @@ var _ = BeforeSuite(func() {
Expect(err).ToNot(HaveOccurred())
err = (&Reconciler{
Client: k8sClient,
Scheme: k8sManager.GetScheme(),
Log: ctrl.Log.WithName("controllers").WithName("ExternalSecrets"),
Client: k8sClient,
Scheme: k8sManager.GetScheme(),
Log: ctrl.Log.WithName("controllers").WithName("ExternalSecrets"),
RequeueInterval: time.Second,
}).SetupWithManager(k8sManager)
Expect(err).ToNot(HaveOccurred())