Skip to content

Commit 8215c7f

Browse files
authored
Fix Create InstallPlan with Permissions test (#3129)
Fix #3108 The Subscription needs to be deleted before deleting the CSV, otherwise the Subscription will recreate the CSV, and subsequently, the CR/CRBs are not deleted. Update some test logging as well. Signed-off-by: Todd Short <[email protected]>
1 parent a081d35 commit 8215c7f

File tree

4 files changed

+72
-13
lines changed

4 files changed

+72
-13
lines changed

test/e2e/csv_e2e_test.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -4441,6 +4441,7 @@ func fetchCSV(c versioned.Interface, namespace, name string, checker csvConditio
44414441
var lastPhase operatorsv1alpha1.ClusterServiceVersionPhase
44424442
var lastReason operatorsv1alpha1.ConditionReason
44434443
var lastMessage string
4444+
var lastError string
44444445
lastTime := time.Now()
44454446
var csv *operatorsv1alpha1.ClusterServiceVersion
44464447

@@ -4449,7 +4450,10 @@ func fetchCSV(c versioned.Interface, namespace, name string, checker csvConditio
44494450
var err error
44504451
csv, err = c.OperatorsV1alpha1().ClusterServiceVersions(namespace).Get(context.TODO(), name, metav1.GetOptions{})
44514452
if err != nil || csv == nil {
4452-
ctx.Ctx().Logf("error getting csv %s/%s: %v", namespace, name, err)
4453+
if lastError != err.Error() {
4454+
ctx.Ctx().Logf("error getting csv %s/%s: %v", namespace, name, err)
4455+
lastError = err.Error()
4456+
}
44534457
return false, nil
44544458
}
44554459
phase, reason, message := csv.Status.Phase, csv.Status.Reason, csv.Status.Message

test/e2e/installplan_e2e_test.go

+36-12
Original file line numberDiff line numberDiff line change
@@ -2792,10 +2792,13 @@ var _ = Describe("Install Plan", func() {
27922792
_, err := fetchCatalogSourceOnStatus(crc, mainCatalogSourceName, generatedNamespace.GetName(), catalogSourceRegistryPodSynced())
27932793
require.NoError(GinkgoT(), err)
27942794

2795+
By("Creating a Subscription")
27952796
subscriptionName := genName("sub-nginx-")
2796-
subscriptionCleanup := createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, mainCatalogSourceName, packageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic)
2797-
defer subscriptionCleanup()
2797+
// Subscription is explitly deleted as part of the test to avoid CSV being recreated,
2798+
// so ignore cleanup function
2799+
_ = createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subscriptionName, mainCatalogSourceName, packageName, stableChannel, "", operatorsv1alpha1.ApprovalAutomatic)
27982800

2801+
By("Attempt to get Subscription")
27992802
subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subscriptionName, subscriptionHasInstallPlanChecker())
28002803
require.NoError(GinkgoT(), err)
28012804
require.NotNil(GinkgoT(), subscription)
@@ -2867,22 +2870,38 @@ var _ = Describe("Install Plan", func() {
28672870
By("Should have removed every matching step")
28682871
require.Equal(GinkgoT(), 0, len(expectedSteps), "Actual resource steps do not match expected: %#v", expectedSteps)
28692872

2870-
GinkgoT().Logf("deleting csv %s/%s", generatedNamespace.GetName(), stableCSVName)
2871-
By("Explicitly delete the CSV")
2872-
err = crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Delete(context.Background(), stableCSVName, metav1.DeleteOptions{})
2873+
By(fmt.Sprintf("Explicitly deleting subscription %s/%s", generatedNamespace.GetName(), subscriptionName))
2874+
err = crc.OperatorsV1alpha1().Subscriptions(generatedNamespace.GetName()).Delete(context.Background(), subscriptionName, metav1.DeleteOptions{})
28732875
By("Looking for no error OR IsNotFound error")
2874-
if err != nil && apierrors.IsNotFound(err) {
2875-
err = nil
2876-
}
2877-
require.NoError(GinkgoT(), err)
2876+
require.NoError(GinkgoT(), client.IgnoreNotFound(err))
2877+
2878+
By("Waiting for the Subscription to delete")
2879+
err = waitForSubscriptionToDelete(generatedNamespace.GetName(), subscriptionName, crc)
2880+
require.NoError(GinkgoT(), client.IgnoreNotFound(err))
28782881

2882+
By(fmt.Sprintf("Explicitly deleting csv %s/%s", generatedNamespace.GetName(), stableCSVName))
2883+
err = crc.OperatorsV1alpha1().ClusterServiceVersions(generatedNamespace.GetName()).Delete(context.Background(), stableCSVName, metav1.DeleteOptions{})
2884+
By("Looking for no error OR IsNotFound error")
2885+
require.NoError(GinkgoT(), client.IgnoreNotFound(err))
2886+
By("Waiting for the CSV to delete")
2887+
err = waitForCsvToDelete(generatedNamespace.GetName(), stableCSVName, crc)
2888+
require.NoError(GinkgoT(), client.IgnoreNotFound(err))
2889+
2890+
nCrs := 0
2891+
nCrbs := 0
2892+
By("Waiting for CRBs and CRs and SAs to delete")
28792893
Eventually(func() bool {
2894+
28802895
crbs, err := c.KubernetesInterface().RbacV1().ClusterRoleBindings().List(context.Background(), metav1.ListOptions{LabelSelector: fmt.Sprintf("%v=%v", ownerutil.OwnerKey, stableCSVName)})
28812896
if err != nil {
28822897
GinkgoT().Logf("error getting crbs: %v", err)
28832898
return false
28842899
}
2885-
if len(crbs.Items) != 0 {
2900+
if n := len(crbs.Items); n != 0 {
2901+
if n != nCrbs {
2902+
GinkgoT().Logf("CRBs remaining: %v", n)
2903+
nCrbs = n
2904+
}
28862905
return false
28872906
}
28882907

@@ -2891,18 +2910,23 @@ var _ = Describe("Install Plan", func() {
28912910
GinkgoT().Logf("error getting crs: %v", err)
28922911
return false
28932912
}
2894-
if len(crs.Items) != 0 {
2913+
if n := len(crs.Items); n != 0 {
2914+
if n != nCrs {
2915+
GinkgoT().Logf("CRs remaining: %v", n)
2916+
nCrs = n
2917+
}
28952918
return false
28962919
}
28972920

28982921
_, err = c.KubernetesInterface().CoreV1().ServiceAccounts(generatedNamespace.GetName()).Get(context.Background(), serviceAccountName, metav1.GetOptions{})
2899-
if err != nil && !apierrors.IsNotFound(err) {
2922+
if client.IgnoreNotFound(err) != nil {
29002923
GinkgoT().Logf("error getting sa %s/%s: %v", generatedNamespace.GetName(), serviceAccountName, err)
29012924
return false
29022925
}
29032926

29042927
return true
29052928
}, pollDuration*2, pollInterval).Should(BeTrue())
2929+
By("Cleaning up the test")
29062930
})
29072931

29082932
It("CRD validation", func() {

test/e2e/subscription_e2e_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -3365,6 +3365,35 @@ func createSubscriptionForCatalogWithSpec(t GinkgoTInterface, crc versioned.Inte
33653365
return buildSubscriptionCleanupFunc(crc, subscription)
33663366
}
33673367

3368+
func waitForSubscriptionToDelete(namespace, name string, c versioned.Interface) error {
3369+
var lastState operatorsv1alpha1.SubscriptionState
3370+
var lastReason operatorsv1alpha1.ConditionReason
3371+
lastTime := time.Now()
3372+
3373+
ctx.Ctx().Logf("waiting for subscription %s/%s to delete", namespace, name)
3374+
err := wait.Poll(pollInterval, pollDuration, func() (bool, error) {
3375+
sub, err := c.OperatorsV1alpha1().Subscriptions(namespace).Get(context.TODO(), name, metav1.GetOptions{})
3376+
if apierrors.IsNotFound(err) {
3377+
ctx.Ctx().Logf("subscription %s/%s deleted", namespace, name)
3378+
return true, nil
3379+
}
3380+
if err != nil {
3381+
ctx.Ctx().Logf("error getting subscription %s/%s: %v", namespace, name, err)
3382+
}
3383+
if sub != nil {
3384+
state, reason := sub.Status.State, sub.Status.Reason
3385+
if state != lastState || reason != lastReason {
3386+
ctx.Ctx().Logf("waited %s for subscription %s/%s status: %s (%s)", time.Since(lastTime), namespace, name, state, reason)
3387+
lastState, lastReason = state, reason
3388+
lastTime = time.Now()
3389+
}
3390+
}
3391+
return false, nil
3392+
})
3393+
3394+
return err
3395+
}
3396+
33683397
func checkDeploymentHasPodConfigNodeSelector(t GinkgoTInterface, client operatorclient.ClientInterface, csv *operatorsv1alpha1.ClusterServiceVersion, nodeSelector map[string]string) error {
33693398
resolver := install.StrategyResolver{}
33703399

test/e2e/util.go

+2
Original file line numberDiff line numberDiff line change
@@ -677,8 +677,10 @@ func createInternalCatalogSource(
677677
ctx.Ctx().Logf("Catalog source %s created", name)
678678

679679
cleanupInternalCatalogSource := func() {
680+
ctx.Ctx().Logf("Cleaning catalog source %s", name)
680681
configMapCleanup()
681682
buildCatalogSourceCleanupFunc(c, crc, namespace, catalogSource)()
683+
ctx.Ctx().Logf("Done cleaning catalog source %s", name)
682684
}
683685
return catalogSource, cleanupInternalCatalogSource
684686
}

0 commit comments

Comments
 (0)