Skip to content

Commit

Permalink
fix: add ownerrefs to bundle secrets; add e2e test for bundle object gc
Browse files Browse the repository at this point in the history
  • Loading branch information
exdx committed May 12, 2020
1 parent d23b7ab commit 6b3250c
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 8 deletions.
9 changes: 9 additions & 0 deletions pkg/controller/operators/catalog/operator.go
Expand Up @@ -1509,6 +1509,15 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error {
if err != nil {
return errorwrap.Wrapf(err, "error parsing step manifest: %s", step.Resource.Name)
}

// Update UIDs on all CSV OwnerReferences
updated, err := o.getUpdatedOwnerReferences(s.OwnerReferences, plan.Namespace)
if err != nil {
return errorwrap.Wrapf(err, "error generating ownerrefs for secret %s", s.GetName())
}
s.SetOwnerReferences(updated)
s.SetNamespace(namespace)

status, err := ensurer.EnsureBundleSecret(plan.Namespace, &s)
if err != nil {
return err
Expand Down
101 changes: 93 additions & 8 deletions test/e2e/gc_e2e_test.go
Expand Up @@ -3,24 +3,22 @@ package e2e
import (
"context"
"fmt"
"github.com/operator-framework/api/pkg/operators/v1alpha1"

"github.com/blang/semver"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/operator-framework/api/pkg/operators/v1alpha1"
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
"github.com/operator-framework/operator-lifecycle-manager/test/e2e/ctx"
. "github.com/operator-framework/operator-lifecycle-manager/test/e2e/dsl"
corev1 "k8s.io/api/core/v1"
rbacv1 "k8s.io/api/rbac/v1"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
k8serrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/rand"
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"

"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
"github.com/operator-framework/operator-lifecycle-manager/test/e2e/ctx"
. "github.com/operator-framework/operator-lifecycle-manager/test/e2e/dsl"
)

var _ = Describe("Garbage collection for dependent resources", func() {
Expand Down Expand Up @@ -284,4 +282,91 @@ var _ = Describe("Garbage collection for dependent resources", func() {

})

Context("Given a configmap and secret associated with a CSV they should be deleted when the CSV is deleted", func() {
const (
configmapName = "dependentcfg"
secretName = "dependentsecret"
)

var (
owner v1alpha1.ClusterServiceVersion
fetchedOwner *v1alpha1.ClusterServiceVersion
propagation metav1.DeletionPropagation
options metav1.DeleteOptions
configMap *corev1.ConfigMap
secret *corev1.Secret
)

BeforeEach(func() {
var err error
owner = newCSV("owner", testNamespace, "", semver.MustParse("0.0.0"), nil, nil, newNginxInstallStrategy("test", nil, nil))
// create all owners
fetchedOwner, err = operatorClient.OperatorsV1alpha1().ClusterServiceVersions(testNamespace).Create(context.TODO(), &owner, metav1.CreateOptions{})
Expect(err).NotTo(HaveOccurred())

// wait for csv install to complete
Eventually(func() bool {
csv, _ := operatorClient.OperatorsV1alpha1().ClusterServiceVersions(testNamespace).Get(context.TODO(), fetchedOwner.GetName(), metav1.GetOptions{})
return csv.Status.Phase == v1alpha1.CSVPhaseSucceeded
}).Should(BeTrue())

cfg := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: configmapName,
Namespace: testNamespace,
},
Data: map[string]string{"hello": "there"},
}

s := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: secretName,
Namespace: testNamespace,
},
Data: map[string][]byte{"name": []byte("Alice")},
}

// set ownerrefs to objects
ownerutil.AddOwner(cfg, fetchedOwner, true, false)
ownerutil.AddOwner(s, fetchedOwner, true, false)

// Create a configmap
configMap, err = kubeClient.CreateConfigMap(cfg)
Expect(err).NotTo(HaveOccurred())

// Create a secret
secret, err = kubeClient.CreateSecret(s)
Expect(err).NotTo(HaveOccurred())

propagation = metav1.DeletePropagationForeground
options = metav1.DeleteOptions{PropagationPolicy: &propagation}
})

When("CSV is deleted", func() {

BeforeEach(func() {
// Delete CSV
err := operatorClient.OperatorsV1alpha1().ClusterServiceVersions(testNamespace).Delete(context.TODO(), fetchedOwner.GetName(), options)
Expect(err).To(BeNil())

// wait for deletion
Eventually(func() bool {
_, err := operatorClient.OperatorsV1alpha1().ClusterServiceVersions(testNamespace).Get(context.TODO(), fetchedOwner.GetName(), metav1.GetOptions{})
return k8serrors.IsNotFound(err)
}).Should(BeTrue())
})

It("should delete the associated configmap and secret", func() {
_, err := kubeClient.GetConfigMap(testNamespace, configMap.GetName())
Expect(err).To(HaveOccurred())
Expect(k8serrors.IsNotFound(err)).To(BeTrue())
ctx.Ctx().Logf("configmap successfully garbage collected after csv deleted")

_, err = kubeClient.GetSecret(testNamespace, secret.GetName())
Expect(err).To(HaveOccurred())
Expect(k8serrors.IsNotFound(err)).To(BeTrue())
ctx.Ctx().Logf("secret successfully garbage collected after csv deleted")
})
})
})
})

0 comments on commit 6b3250c

Please sign in to comment.