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
3537var _ = 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