7
7
"strings"
8
8
"time"
9
9
10
+ . "github.com/onsi/ginkgo"
11
+ . "github.com/onsi/gomega"
10
12
"github.com/stretchr/testify/require"
11
13
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
12
14
appsv1 "k8s.io/api/apps/v1"
@@ -23,13 +25,13 @@ import (
23
25
"k8s.io/apimachinery/pkg/watch"
24
26
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
25
27
26
- . "github.com/onsi/ginkgo"
27
28
v1 "github.com/operator-framework/api/pkg/operators/v1"
28
29
"github.com/operator-framework/api/pkg/operators/v1alpha1"
29
30
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
30
31
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
31
32
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
32
33
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
34
+ "github.com/operator-framework/operator-lifecycle-manager/test/e2e/ctx"
33
35
)
34
36
35
37
var _ = Describe ("CSV" , func () {
@@ -2691,59 +2693,14 @@ var _ = Describe("CSV", func() {
2691
2693
err = waitForDeploymentToDelete (GinkgoT (), c , strategy .DeploymentSpecs [0 ].Name )
2692
2694
require .NoError (GinkgoT (), err )
2693
2695
})
2694
- It ("create requirements events" , func () {
2695
- GinkgoT ().Skip ()
2696
- defer cleaner .NotifyTestComplete (GinkgoT (), true )
2697
-
2698
- c := newKubeClient (GinkgoT ())
2699
- crc := newCRClient (GinkgoT ())
2700
2696
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 )
2706
2699
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 ()
2724
2702
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 {
2747
2704
Spec : v1alpha1.ClusterServiceVersionSpec {
2748
2705
MinKubeVersion : "0.0.0" ,
2749
2706
InstallModes : []v1alpha1.InstallMode {
@@ -2764,150 +2721,65 @@ var _ = Describe("CSV", func() {
2764
2721
Supported : true ,
2765
2722
},
2766
2723
},
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 ),
2769
2725
APIServiceDefinitions : v1alpha1.APIServiceDefinitions {
2726
+ // Require an API that we know won't exist under our domain
2770
2727
Required : []v1alpha1.APIServiceDescription {
2771
2728
{
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" ,
2777
2732
},
2778
2733
},
2779
2734
},
2780
2735
},
2781
2736
}
2737
+ csv .SetNamespace (testNamespace )
2738
+ csv .SetName (genName ("csv-" ))
2782
2739
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" ,
2831
2743
}
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 ())
2835
2746
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 ()
2854
2752
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 () )
2857
2755
defer cleanupCSV ()
2858
2756
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 ())
2865
2759
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
+ }
2871
2766
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
2881
2768
}
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" ))
2890
2770
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 ())
2904
2778
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" ))
2910
2781
})
2782
+
2911
2783
// TODO: test behavior when replaces field doesn't point to existing CSV
2912
2784
It ("status invalid CSV" , func () {
2913
2785
@@ -3179,7 +3051,7 @@ var _ = Describe("CSV", func() {
3179
3051
csv .SetName ("csv-hat-1" )
3180
3052
csv .SetNamespace (testNamespace )
3181
3053
3182
- createLegacyAPIResources ( nil , owned [0 ])
3054
+ createLegacyAPIResources (nil , owned [0 ])
3183
3055
3184
3056
// Create the APIService CSV
3185
3057
cleanupCSV , err := createCSV (GinkgoT (), c , crc , csv , testNamespace , false , false )
@@ -3403,8 +3275,6 @@ var _ = Describe("CSV", func() {
3403
3275
namespace , nsCleanupFunc := newNamespace (GinkgoT (), c , genName ("csc-test-" ))
3404
3276
defer nsCleanupFunc ()
3405
3277
3406
-
3407
-
3408
3278
og := newOperatorGroup (namespace .Name , genName ("test-og-" ), nil , nil , []string {"test-go-" }, false )
3409
3279
og , err := crc .OperatorsV1 ().OperatorGroups (namespace .Name ).Create (context .TODO (), og , metav1.CreateOptions {})
3410
3280
require .NoError (GinkgoT (), err )
@@ -4610,4 +4480,3 @@ func checkLegacyAPIResources(desc v1alpha1.APIServiceDescription, expectedIsNotF
4610
4480
_ , err = c .GetRoleBinding ("kube-system" , apiServiceName + "-auth-reader" )
4611
4481
require .Equal (GinkgoT (), expectedIsNotFound , errors .IsNotFound (err ))
4612
4482
}
4613
-
0 commit comments