Skip to content

Commit 6c62c04

Browse files
committed
test(e2e): simplify csv requirement event spec
1 parent 29736bf commit 6c62c04

File tree

1 file changed

+48
-179
lines changed

1 file changed

+48
-179
lines changed

test/e2e/csv_e2e_test.go

Lines changed: 48 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"strings"
88
"time"
99

10+
. "github.com/onsi/ginkgo"
11+
. "github.com/onsi/gomega"
1012
"github.com/stretchr/testify/require"
1113
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
1214
appsv1 "k8s.io/api/apps/v1"
@@ -23,13 +25,13 @@ import (
2325
"k8s.io/apimachinery/pkg/watch"
2426
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
2527

26-
. "github.com/onsi/ginkgo"
2728
v1 "github.com/operator-framework/api/pkg/operators/v1"
2829
"github.com/operator-framework/api/pkg/operators/v1alpha1"
2930
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
3031
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
3132
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
3233
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
34+
"github.com/operator-framework/operator-lifecycle-manager/test/e2e/ctx"
3335
)
3436

3537
var _ = Describe("CSV", func() {
@@ -2691,59 +2693,14 @@ var _ = Describe("CSV", func() {
26912693
err = waitForDeploymentToDelete(GinkgoT(), c, strategy.DeploymentSpecs[0].Name)
26922694
require.NoError(GinkgoT(), err)
26932695
})
2694-
It("create requirements events", func() {
2695-
GinkgoT().Skip()
2696-
defer cleaner.NotifyTestComplete(GinkgoT(), true)
2697-
2698-
c := newKubeClient(GinkgoT())
2699-
crc := newCRClient(GinkgoT())
27002696

2701-
sa := corev1.ServiceAccount{}
2702-
sa.SetName(genName("sa-"))
2703-
sa.SetNamespace(testNamespace)
2704-
_, err := c.CreateServiceAccount(&sa)
2705-
require.NoError(GinkgoT(), err, "could not create ServiceAccount")
2697+
It("emits CSV requirement events", func() {
2698+
defer cleaner.NotifyTestComplete(GinkgoT(), true)
27062699

2707-
permissions := []v1alpha1.StrategyDeploymentPermissions{
2708-
{
2709-
ServiceAccountName: sa.GetName(),
2710-
Rules: []rbacv1.PolicyRule{
2711-
{
2712-
Verbs: []string{"create"},
2713-
APIGroups: []string{""},
2714-
Resources: []string{"deployment"},
2715-
},
2716-
{
2717-
Verbs: []string{"delete"},
2718-
APIGroups: []string{""},
2719-
Resources: []string{"deployment"},
2720-
},
2721-
},
2722-
},
2723-
}
2700+
c := ctx.Ctx().KubeClient()
2701+
crc := ctx.Ctx().OperatorClient()
27242702

2725-
clusterPermissions := []v1alpha1.StrategyDeploymentPermissions{
2726-
{
2727-
ServiceAccountName: sa.GetName(),
2728-
Rules: []rbacv1.PolicyRule{
2729-
{
2730-
Verbs: []string{"get"},
2731-
APIGroups: []string{""},
2732-
Resources: []string{"deployment"},
2733-
},
2734-
},
2735-
},
2736-
}
2737-
2738-
depName := genName("dep-")
2739-
csv := v1alpha1.ClusterServiceVersion{
2740-
TypeMeta: metav1.TypeMeta{
2741-
Kind: v1alpha1.ClusterServiceVersionKind,
2742-
APIVersion: v1alpha1.ClusterServiceVersionAPIVersion,
2743-
},
2744-
ObjectMeta: metav1.ObjectMeta{
2745-
Name: genName("csv"),
2746-
},
2703+
csv := &v1alpha1.ClusterServiceVersion{
27472704
Spec: v1alpha1.ClusterServiceVersionSpec{
27482705
MinKubeVersion: "0.0.0",
27492706
InstallModes: []v1alpha1.InstallMode{
@@ -2764,150 +2721,65 @@ var _ = Describe("CSV", func() {
27642721
Supported: true,
27652722
},
27662723
},
2767-
InstallStrategy: newNginxInstallStrategy(depName, permissions, clusterPermissions),
2768-
// Cheating a little; this is an APIservice that will exist for the e2e tests
2724+
InstallStrategy: newNginxInstallStrategy(genName("dep-"), nil, nil),
27692725
APIServiceDefinitions: v1alpha1.APIServiceDefinitions{
2726+
// Require an API that we know won't exist under our domain
27702727
Required: []v1alpha1.APIServiceDescription{
27712728
{
2772-
Group: "packages.operators.coreos.com",
2773-
Version: "v1",
2774-
Kind: "PackageManifest",
2775-
DisplayName: "Package Manifest",
2776-
Description: "An apiservice that exists",
2729+
Group: "bad.packages.operators.coreos.com",
2730+
Version: "v1",
2731+
Kind: "PackageManifest",
27772732
},
27782733
},
27792734
},
27802735
},
27812736
}
2737+
csv.SetNamespace(testNamespace)
2738+
csv.SetName(genName("csv-"))
27822739

2783-
// Create Role/Cluster Roles and RoleBindings
2784-
role := rbacv1.Role{
2785-
Rules: []rbacv1.PolicyRule{
2786-
{
2787-
Verbs: []string{"create"},
2788-
APIGroups: []string{""},
2789-
Resources: []string{"deployment"},
2790-
},
2791-
{
2792-
Verbs: []string{"delete"},
2793-
APIGroups: []string{""},
2794-
Resources: []string{"deployment"},
2795-
},
2796-
},
2797-
}
2798-
role.SetName("test-role")
2799-
role.SetNamespace(testNamespace)
2800-
_, err = c.CreateRole(&role)
2801-
require.NoError(GinkgoT(), err, "could not create Role")
2802-
2803-
roleBinding := rbacv1.RoleBinding{
2804-
Subjects: []rbacv1.Subject{
2805-
{
2806-
Kind: "ServiceAccount",
2807-
APIGroup: "",
2808-
Name: sa.GetName(),
2809-
Namespace: sa.GetNamespace(),
2810-
},
2811-
},
2812-
RoleRef: rbacv1.RoleRef{
2813-
APIGroup: "rbac.authorization.k8s.io",
2814-
Kind: "Role",
2815-
Name: role.GetName(),
2816-
},
2817-
}
2818-
roleBinding.SetName(genName("dep-"))
2819-
roleBinding.SetNamespace(testNamespace)
2820-
_, err = c.CreateRoleBinding(&roleBinding)
2821-
require.NoError(GinkgoT(), err, "could not create RoleBinding")
2822-
2823-
clusterRole := rbacv1.ClusterRole{
2824-
Rules: []rbacv1.PolicyRule{
2825-
{
2826-
Verbs: []string{"get"},
2827-
APIGroups: []string{""},
2828-
Resources: []string{"deployment"},
2829-
},
2830-
},
2740+
clientCtx := context.Background()
2741+
listOpts := metav1.ListOptions{
2742+
FieldSelector: "involvedObject.kind=ClusterServiceVersion",
28312743
}
2832-
clusterRole.SetName(genName("dep-"))
2833-
_, err = c.CreateClusterRole(&clusterRole)
2834-
require.NoError(GinkgoT(), err, "could not create ClusterRole")
2744+
events, err := c.KubernetesInterface().CoreV1().Events(csv.GetNamespace()).List(clientCtx, listOpts)
2745+
Expect(err).ToNot(HaveOccurred())
28352746

2836-
clusterRoleBinding := rbacv1.ClusterRoleBinding{
2837-
Subjects: []rbacv1.Subject{
2838-
{
2839-
Kind: "ServiceAccount",
2840-
APIGroup: "",
2841-
Name: sa.GetName(),
2842-
Namespace: sa.GetNamespace(),
2843-
},
2844-
},
2845-
RoleRef: rbacv1.RoleRef{
2846-
APIGroup: "rbac.authorization.k8s.io",
2847-
Kind: "ClusterRole",
2848-
Name: clusterRole.GetName(),
2849-
},
2850-
}
2851-
clusterRoleBinding.SetName(genName("dep-"))
2852-
_, err = c.CreateClusterRoleBinding(&clusterRoleBinding)
2853-
require.NoError(GinkgoT(), err, "could not create ClusterRoleBinding")
2747+
// Watch latest events from test namespace for CSV
2748+
listOpts.ResourceVersion = events.ResourceVersion
2749+
w, err := c.KubernetesInterface().CoreV1().Events(testNamespace).Watch(context.Background(), listOpts)
2750+
Expect(err).ToNot(HaveOccurred())
2751+
defer w.Stop()
28542752

2855-
cleanupCSV, err := createCSV(GinkgoT(), c, crc, csv, testNamespace, false, false)
2856-
require.NoError(GinkgoT(), err)
2753+
cleanupCSV, err := createCSV(GinkgoT(), c, crc, *csv, csv.GetNamespace(), false, false)
2754+
Expect(err).ToNot(HaveOccurred())
28572755
defer cleanupCSV()
28582756

2859-
_, err = fetchCSV(GinkgoT(), crc, csv.Name, testNamespace, csvSucceededChecker)
2860-
require.NoError(GinkgoT(), err)
2861-
2862-
listOptions := metav1.ListOptions{
2863-
FieldSelector: "involvedObject.kind=ClusterServiceVersion",
2864-
}
2757+
csv, err = fetchCSV(GinkgoT(), crc, csv.GetName(), csv.GetNamespace(), csvPendingChecker)
2758+
Expect(err).ToNot(HaveOccurred())
28652759

2866-
// Get events from test namespace for CSV
2867-
eventsList, err := c.KubernetesInterface().CoreV1().Events(testNamespace).List(context.TODO(), listOptions)
2868-
require.NoError(GinkgoT(), err)
2869-
latestEvent := findLastEvent(eventsList)
2870-
require.Equal(GinkgoT(), string(latestEvent.Reason), "InstallSucceeded")
2760+
By("emitting when requirements are not met")
2761+
nextReason := func() string {
2762+
e := <-w.ResultChan()
2763+
if e.Object == nil {
2764+
return ""
2765+
}
28712766

2872-
// Edit role
2873-
updatedRole := rbacv1.Role{
2874-
Rules: []rbacv1.PolicyRule{
2875-
{
2876-
Verbs: []string{"create"},
2877-
APIGroups: []string{""},
2878-
Resources: []string{"deployment"},
2879-
},
2880-
},
2767+
return e.Object.(*corev1.Event).Reason
28812768
}
2882-
updatedRole.SetName("test-role")
2883-
updatedRole.SetNamespace(testNamespace)
2884-
_, err = c.UpdateRole(&updatedRole)
2885-
require.NoError(GinkgoT(), err)
2886-
2887-
// Check CSV status
2888-
_, err = fetchCSV(GinkgoT(), crc, csv.Name, testNamespace, csvPendingChecker)
2889-
require.NoError(GinkgoT(), err)
2769+
Eventually(nextReason).Should(Equal("RequirementsNotMet"))
28902770

2891-
// Check event
2892-
eventsList, err = c.KubernetesInterface().CoreV1().Events(testNamespace).List(context.TODO(), listOptions)
2893-
require.NoError(GinkgoT(), err)
2894-
latestEvent = findLastEvent(eventsList)
2895-
require.Equal(GinkgoT(), string(latestEvent.Reason), "RequirementsNotMet")
2896-
2897-
// Reverse the updated role
2898-
_, err = c.UpdateRole(&role)
2899-
require.NoError(GinkgoT(), err)
2900-
2901-
// Check CSV status
2902-
_, err = fetchCSV(GinkgoT(), crc, csv.Name, testNamespace, csvSucceededChecker)
2903-
require.NoError(GinkgoT(), err)
2771+
// Update the CSV to require an API that we know exists
2772+
csv.Spec.APIServiceDefinitions.Required[0].Group = "packages.operators.coreos.com"
2773+
updateOpts := metav1.UpdateOptions{}
2774+
Eventually(func() error {
2775+
_, err := crc.OperatorsV1alpha1().ClusterServiceVersions(csv.GetNamespace()).Update(clientCtx, csv, updateOpts)
2776+
return err
2777+
}).Should(Succeed())
29042778

2905-
// Check event
2906-
eventsList, err = c.KubernetesInterface().CoreV1().Events(testNamespace).List(context.TODO(), listOptions)
2907-
require.NoError(GinkgoT(), err)
2908-
latestEvent = findLastEvent(eventsList)
2909-
require.Equal(GinkgoT(), string(latestEvent.Reason), "InstallSucceeded")
2779+
By("emitting when requirements are met")
2780+
Eventually(nextReason).Should(Equal("AllRequirementsMet"))
29102781
})
2782+
29112783
// TODO: test behavior when replaces field doesn't point to existing CSV
29122784
It("status invalid CSV", func() {
29132785

@@ -3179,7 +3051,7 @@ var _ = Describe("CSV", func() {
31793051
csv.SetName("csv-hat-1")
31803052
csv.SetNamespace(testNamespace)
31813053

3182-
createLegacyAPIResources( nil, owned[0])
3054+
createLegacyAPIResources(nil, owned[0])
31833055

31843056
// Create the APIService CSV
31853057
cleanupCSV, err := createCSV(GinkgoT(), c, crc, csv, testNamespace, false, false)
@@ -3403,8 +3275,6 @@ var _ = Describe("CSV", func() {
34033275
namespace, nsCleanupFunc := newNamespace(GinkgoT(), c, genName("csc-test-"))
34043276
defer nsCleanupFunc()
34053277

3406-
3407-
34083278
og := newOperatorGroup(namespace.Name, genName("test-og-"), nil, nil, []string{"test-go-"}, false)
34093279
og, err := crc.OperatorsV1().OperatorGroups(namespace.Name).Create(context.TODO(), og, metav1.CreateOptions{})
34103280
require.NoError(GinkgoT(), err)
@@ -4610,4 +4480,3 @@ func checkLegacyAPIResources(desc v1alpha1.APIServiceDescription, expectedIsNotF
46104480
_, err = c.GetRoleBinding("kube-system", apiServiceName+"-auth-reader")
46114481
require.Equal(GinkgoT(), expectedIsNotFound, errors.IsNotFound(err))
46124482
}
4613-

0 commit comments

Comments
 (0)