@@ -32,6 +32,22 @@ type cleanupFunc func()
32
32
33
33
var immediateDeleteGracePeriod int64 = 0
34
34
35
+ func findLastEvent (events * corev1.EventList ) (event corev1.Event ) {
36
+ var latestTime metav1.Time
37
+ var latestInd int
38
+ for i , item := range events .Items {
39
+ if i != 0 {
40
+ if latestTime .Before (& item .LastTimestamp ) {
41
+ latestTime = item .LastTimestamp
42
+ latestInd = i
43
+ }
44
+ } else {
45
+ latestTime = item .LastTimestamp
46
+ }
47
+ }
48
+ return events .Items [latestInd ]
49
+ }
50
+
35
51
func buildCSVCleanupFunc (t * testing.T , c operatorclient.ClientInterface , crc versioned.Interface , csv v1alpha1.ClusterServiceVersion , namespace string , deleteCRDs , deleteAPIServices bool ) cleanupFunc {
36
52
return func () {
37
53
require .NoError (t , crc .OperatorsV1alpha1 ().ClusterServiceVersions (namespace ).Delete (csv .GetName (), & metav1.DeleteOptions {}))
@@ -2720,4 +2736,221 @@ func TestUpdateCSVModifyDeploymentName(t *testing.T) {
2720
2736
require .NoError (t , err )
2721
2737
}
2722
2738
2739
+ func TestCreateCSVRequirementsEvents (t * testing.T ) {
2740
+ defer cleaner .NotifyTestComplete (t , true )
2741
+
2742
+ c := newKubeClient (t )
2743
+ crc := newCRClient (t )
2744
+
2745
+ sa := corev1.ServiceAccount {}
2746
+ sa .SetName (genName ("sa-" ))
2747
+ sa .SetNamespace (testNamespace )
2748
+ _ , err := c .CreateServiceAccount (& sa )
2749
+ require .NoError (t , err , "could not create ServiceAccount" )
2750
+
2751
+ permissions := []install.StrategyDeploymentPermissions {
2752
+ {
2753
+ ServiceAccountName : sa .GetName (),
2754
+ Rules : []rbacv1.PolicyRule {
2755
+ {
2756
+ Verbs : []string {"create" },
2757
+ APIGroups : []string {"" },
2758
+ Resources : []string {"deployment" },
2759
+ },
2760
+ {
2761
+ Verbs : []string {"delete" },
2762
+ APIGroups : []string {"" },
2763
+ Resources : []string {"deployment" },
2764
+ },
2765
+ },
2766
+ },
2767
+ }
2768
+
2769
+ clusterPermissions := []install.StrategyDeploymentPermissions {
2770
+ {
2771
+ ServiceAccountName : sa .GetName (),
2772
+ Rules : []rbacv1.PolicyRule {
2773
+ {
2774
+ Verbs : []string {"get" },
2775
+ APIGroups : []string {"" },
2776
+ Resources : []string {"deployment" },
2777
+ },
2778
+ },
2779
+ },
2780
+ }
2781
+
2782
+ depName := genName ("dep-" )
2783
+ csv := v1alpha1.ClusterServiceVersion {
2784
+ TypeMeta : metav1.TypeMeta {
2785
+ Kind : v1alpha1 .ClusterServiceVersionKind ,
2786
+ APIVersion : v1alpha1 .ClusterServiceVersionAPIVersion ,
2787
+ },
2788
+ ObjectMeta : metav1.ObjectMeta {
2789
+ Name : genName ("csv" ),
2790
+ },
2791
+ Spec : v1alpha1.ClusterServiceVersionSpec {
2792
+ MinKubeVersion : "0.0.0" ,
2793
+ InstallModes : []v1alpha1.InstallMode {
2794
+ {
2795
+ Type : v1alpha1 .InstallModeTypeOwnNamespace ,
2796
+ Supported : true ,
2797
+ },
2798
+ {
2799
+ Type : v1alpha1 .InstallModeTypeSingleNamespace ,
2800
+ Supported : true ,
2801
+ },
2802
+ {
2803
+ Type : v1alpha1 .InstallModeTypeMultiNamespace ,
2804
+ Supported : true ,
2805
+ },
2806
+ {
2807
+ Type : v1alpha1 .InstallModeTypeAllNamespaces ,
2808
+ Supported : true ,
2809
+ },
2810
+ },
2811
+ InstallStrategy : newNginxInstallStrategy (depName , permissions , clusterPermissions ),
2812
+ // Cheating a little; this is an APIservice that will exist for the e2e tests
2813
+ APIServiceDefinitions : v1alpha1.APIServiceDefinitions {
2814
+ Required : []v1alpha1.APIServiceDescription {
2815
+ {
2816
+ Group : "packages.operators.coreos.com" ,
2817
+ Version : "v1" ,
2818
+ Kind : "PackageManifest" ,
2819
+ DisplayName : "Package Manifest" ,
2820
+ Description : "An apiservice that exists" ,
2821
+ },
2822
+ },
2823
+ },
2824
+ },
2825
+ }
2826
+
2827
+ // Create Role/Cluster Roles and RoleBindings
2828
+ role := rbacv1.Role {
2829
+ Rules : []rbacv1.PolicyRule {
2830
+ {
2831
+ Verbs : []string {"create" },
2832
+ APIGroups : []string {"" },
2833
+ Resources : []string {"deployment" },
2834
+ },
2835
+ {
2836
+ Verbs : []string {"delete" },
2837
+ APIGroups : []string {"" },
2838
+ Resources : []string {"deployment" },
2839
+ },
2840
+ },
2841
+ }
2842
+ role .SetName ("test-role" )
2843
+ role .SetNamespace (testNamespace )
2844
+ _ , err = c .CreateRole (& role )
2845
+ require .NoError (t , err , "could not create Role" )
2846
+
2847
+ roleBinding := rbacv1.RoleBinding {
2848
+ Subjects : []rbacv1.Subject {
2849
+ {
2850
+ Kind : "ServiceAccount" ,
2851
+ APIGroup : "" ,
2852
+ Name : sa .GetName (),
2853
+ Namespace : sa .GetNamespace (),
2854
+ },
2855
+ },
2856
+ RoleRef : rbacv1.RoleRef {
2857
+ APIGroup : "rbac.authorization.k8s.io" ,
2858
+ Kind : "Role" ,
2859
+ Name : role .GetName (),
2860
+ },
2861
+ }
2862
+ roleBinding .SetName (genName ("dep-" ))
2863
+ roleBinding .SetNamespace (testNamespace )
2864
+ _ , err = c .CreateRoleBinding (& roleBinding )
2865
+ require .NoError (t , err , "could not create RoleBinding" )
2866
+
2867
+ clusterRole := rbacv1.ClusterRole {
2868
+ Rules : []rbacv1.PolicyRule {
2869
+ {
2870
+ Verbs : []string {"get" },
2871
+ APIGroups : []string {"" },
2872
+ Resources : []string {"deployment" },
2873
+ },
2874
+ },
2875
+ }
2876
+ clusterRole .SetName (genName ("dep-" ))
2877
+ _ , err = c .CreateClusterRole (& clusterRole )
2878
+ require .NoError (t , err , "could not create ClusterRole" )
2879
+
2880
+ clusterRoleBinding := rbacv1.ClusterRoleBinding {
2881
+ Subjects : []rbacv1.Subject {
2882
+ {
2883
+ Kind : "ServiceAccount" ,
2884
+ APIGroup : "" ,
2885
+ Name : sa .GetName (),
2886
+ Namespace : sa .GetNamespace (),
2887
+ },
2888
+ },
2889
+ RoleRef : rbacv1.RoleRef {
2890
+ APIGroup : "rbac.authorization.k8s.io" ,
2891
+ Kind : "ClusterRole" ,
2892
+ Name : clusterRole .GetName (),
2893
+ },
2894
+ }
2895
+ clusterRoleBinding .SetName (genName ("dep-" ))
2896
+ _ , err = c .CreateClusterRoleBinding (& clusterRoleBinding )
2897
+ require .NoError (t , err , "could not create ClusterRoleBinding" )
2898
+
2899
+ cleanupCSV , err := createCSV (t , c , crc , csv , testNamespace , false , false )
2900
+ require .NoError (t , err )
2901
+ defer cleanupCSV ()
2902
+
2903
+ _ , err = fetchCSV (t , crc , csv .Name , testNamespace , csvSucceededChecker )
2904
+ require .NoError (t , err )
2905
+
2906
+ listOptions := metav1.ListOptions {
2907
+ FieldSelector : "involvedObject.kind=ClusterServiceVersion" ,
2908
+ }
2909
+
2910
+ // Get events from test namespace for CSV
2911
+ eventsList , err := c .KubernetesInterface ().CoreV1 ().Events (testNamespace ).List (listOptions )
2912
+ require .NoError (t , err )
2913
+ latestEvent := findLastEvent (eventsList )
2914
+ require .Equal (t , string (latestEvent .Reason ), "InstallSucceeded" )
2915
+
2916
+ // Edit role
2917
+ updatedRole := rbacv1.Role {
2918
+ Rules : []rbacv1.PolicyRule {
2919
+ {
2920
+ Verbs : []string {"create" },
2921
+ APIGroups : []string {"" },
2922
+ Resources : []string {"deployment" },
2923
+ },
2924
+ },
2925
+ }
2926
+ updatedRole .SetName ("test-role" )
2927
+ updatedRole .SetNamespace (testNamespace )
2928
+ _ , err = c .UpdateRole (& updatedRole )
2929
+ require .NoError (t , err )
2930
+
2931
+ // Check CSV status
2932
+ _ , err = fetchCSV (t , crc , csv .Name , testNamespace , csvPendingChecker )
2933
+ require .NoError (t , err )
2934
+
2935
+ // Check event
2936
+ eventsList , err = c .KubernetesInterface ().CoreV1 ().Events (testNamespace ).List (listOptions )
2937
+ require .NoError (t , err )
2938
+ latestEvent = findLastEvent (eventsList )
2939
+ require .Equal (t , string (latestEvent .Reason ), "RequirementsNotMet" )
2940
+
2941
+ // Reverse the updated role
2942
+ _ , err = c .UpdateRole (& role )
2943
+ require .NoError (t , err )
2944
+
2945
+ // Check CSV status
2946
+ _ , err = fetchCSV (t , crc , csv .Name , testNamespace , csvSucceededChecker )
2947
+ require .NoError (t , err )
2948
+
2949
+ // Check event
2950
+ eventsList , err = c .KubernetesInterface ().CoreV1 ().Events (testNamespace ).List (listOptions )
2951
+ require .NoError (t , err )
2952
+ latestEvent = findLastEvent (eventsList )
2953
+ require .Equal (t , string (latestEvent .Reason ), "InstallSucceeded" )
2954
+ }
2955
+
2723
2956
// TODO: test behavior when replaces field doesn't point to existing CSV
0 commit comments