@@ -17,8 +17,6 @@ limitations under the License.
17
17
package controllers
18
18
19
19
import (
20
- "context"
21
- "math/rand"
22
20
"time"
23
21
24
22
. "github.com/onsi/ginkgo/v2"
@@ -29,158 +27,144 @@ import (
29
27
rbacv1 "k8s.io/api/rbac/v1"
30
28
"k8s.io/apimachinery/pkg/api/errors"
31
29
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32
- "k8s.io/apimachinery/pkg/types"
33
30
34
31
routev1 "github.com/openshift/api/route/v1"
35
32
)
36
33
37
- func stringInList (l []string , s string ) bool {
38
- for _ , i := range l {
39
- if i == s {
40
- return true
41
- }
42
- }
43
- return false
44
- }
45
-
46
- var letters = []rune ("abcdefghijklmnopqrstuvwxyz" )
47
- var r = rand .New (rand .NewSource (time .Now ().UnixNano ()))
48
-
49
- func randSeq (n int ) string {
50
- b := make ([]rune , n )
51
- for i := range b {
52
- b [i ] = letters [r .Intn (len (letters ))]
53
- }
54
- return string (b )
55
- }
56
-
57
34
var _ = Describe ("RayCluster controller" , func () {
58
35
Context ("RayCluster controller test" , func () {
59
36
var rayClusterName = "test-raycluster"
60
- var typeNamespaceName types.NamespacedName
61
- ctx := context .Background ()
62
- BeforeEach (func () {
63
- By ("Generate random number so each run is creating unique" )
64
- rString := randSeq (10 )
65
- rayClusterName = rayClusterName + "-" + rString
66
- typeNamespaceName = types.NamespacedName {Name : rayClusterName , Namespace : rayClusterName }
37
+ var namespaceName string
38
+ BeforeEach (func (ctx SpecContext ) {
67
39
By ("Creating a namespace for running the tests." )
68
40
namespace := & corev1.Namespace {
69
41
ObjectMeta : metav1.ObjectMeta {
70
- Name : rayClusterName ,
42
+ GenerateName : "test-" ,
71
43
},
72
44
}
73
- var err error
74
- err = k8sClient .Create (ctx , namespace )
75
- Expect (err ).To (Not (HaveOccurred ()))
45
+ namespace , err := k8sClient .CoreV1 ().Namespaces ().Create (ctx , namespace , metav1.CreateOptions {})
46
+ Expect (err ).NotTo (HaveOccurred ())
47
+ DeferCleanup (func (ctx SpecContext ) {
48
+ err := k8sClient .CoreV1 ().Namespaces ().Delete (ctx , namespace .Name , metav1.DeleteOptions {})
49
+ Expect (err ).To (Not (HaveOccurred ()))
50
+ })
51
+ namespaceName = namespace .Name
76
52
77
53
By ("creating a basic instance of the RayCluster CR" )
78
54
raycluster := & rayv1.RayCluster {
79
55
ObjectMeta : metav1.ObjectMeta {
80
56
Name : rayClusterName ,
81
- Namespace : rayClusterName ,
57
+ Namespace : namespace . Name ,
82
58
},
83
59
Spec : rayv1.RayClusterSpec {
84
60
HeadGroupSpec : rayv1.HeadGroupSpec {
85
61
Template : corev1.PodTemplateSpec {
86
62
Spec : corev1.PodSpec {
87
- Containers : []corev1.Container {
88
- corev1.Container {},
89
- },
63
+ Containers : []corev1.Container {},
90
64
},
91
65
},
92
66
RayStartParams : map [string ]string {},
93
67
},
94
68
},
95
69
}
96
- err = k8sClient .Get (ctx , typeNamespaceName , & rayv1.RayCluster {})
97
- Expect (errors .IsNotFound (err )).To (Equal (true ))
98
- err = k8sClient .Create (ctx , raycluster )
70
+ _ , err = rayClient .RayV1 ().RayClusters (namespace .Name ).Create (ctx , raycluster , metav1.CreateOptions {})
99
71
Expect (err ).To (Not (HaveOccurred ()))
100
72
})
101
73
102
- AfterEach (func () {
103
- By ("removing the instance of the RayCluster used" )
104
- // err := clientSet.CoreV1().Namespaces().Delete(ctx, RayClusterName, metav1.DeleteOptions{})
105
- foundRayCluster := rayv1.RayCluster {}
106
- err := k8sClient .Get (ctx , typeNamespaceName , & foundRayCluster )
107
- if err != nil {
108
- Expect (errors .IsNotFound (err )).To (Equal (true ))
109
- } else {
74
+ AfterEach (func (ctx SpecContext ) {
75
+ By ("removing instances of the RayClusters used" )
76
+ rayClusters , err := rayClient .RayV1 ().RayClusters (namespaceName ).List (ctx , metav1.ListOptions {})
77
+ Expect (err ).To (Not (HaveOccurred ()))
78
+
79
+ for _ , rayCluster := range rayClusters .Items {
80
+ err = rayClient .RayV1 ().RayClusters (namespaceName ).Delete (ctx , rayCluster .Name , metav1.DeleteOptions {})
110
81
Expect (err ).To (Not (HaveOccurred ()))
111
- _ = k8sClient .Delete (ctx , & foundRayCluster )
112
82
}
113
- Eventually (func () bool {
114
- err := k8sClient .Get (ctx , typeNamespaceName , & foundRayCluster )
115
- return errors .IsNotFound (err )
116
- }, SpecTimeout (time .Second * 10 )).Should (Equal (true ))
117
- })
118
83
119
- It ("should have oauth finalizer set" , func () {
120
- foundRayCluster := rayv1.RayCluster {}
121
- Eventually (func () bool {
122
- err := k8sClient .Get (ctx , typeNamespaceName , & foundRayCluster )
123
- Expect (err ).To (Not (HaveOccurred ()))
124
- return stringInList (foundRayCluster .Finalizers , oAuthFinalizer )
125
- }, SpecTimeout (time .Second * 10 )).Should (Equal (true ))
84
+ Eventually (func () ([]rayv1.RayCluster , error ) {
85
+ rayClusters , err := rayClient .RayV1 ().RayClusters (namespaceName ).List (ctx , metav1.ListOptions {})
86
+ return rayClusters .Items , err
87
+ }).WithTimeout (time .Second * 10 ).Should (BeEmpty ())
126
88
})
127
89
128
- It ("should create all oauth resources" , func () {
129
- Eventually (func () error {
130
- foundRayCluster := rayv1.RayCluster {}
131
- err := k8sClient .Get (ctx , typeNamespaceName , & foundRayCluster )
132
- if err != nil {
133
- return err
134
- }
135
- err = k8sClient .Get (ctx , types.NamespacedName {Name : oauthSecretNameFromCluster (& foundRayCluster ), Namespace : foundRayCluster .Namespace }, & corev1.Secret {})
136
- if err != nil {
137
- return err
138
- }
139
- err = k8sClient .Get (ctx , types.NamespacedName {Name : oauthServiceNameFromCluster (& foundRayCluster ), Namespace : foundRayCluster .Namespace }, & corev1.Service {})
140
- if err != nil {
141
- return err
142
- }
143
- err = k8sClient .Get (ctx , types.NamespacedName {Name : foundRayCluster .Name , Namespace : foundRayCluster .Namespace }, & corev1.ServiceAccount {})
144
- if err != nil {
145
- return err
146
- }
147
- err = k8sClient .Get (ctx , types.NamespacedName {Name : crbNameFromCluster (& foundRayCluster )}, & rbacv1.ClusterRoleBinding {})
148
- if err != nil {
149
- return err
150
- }
151
- err = k8sClient .Get (ctx , types.NamespacedName {Name : foundRayCluster .Name , Namespace : foundRayCluster .Namespace }, & routev1.Route {})
152
- if err != nil {
153
- return err
154
- }
155
- return nil
156
- }, SpecTimeout (time .Second * 10 )).Should (Not (HaveOccurred ()))
157
- })
90
+ It ("should have oauth finalizer set" , func (ctx SpecContext ) {
91
+ Eventually (func () ([]string , error ) {
92
+ foundRayCluster , err := rayClient .RayV1 ().RayClusters (namespaceName ).Get (ctx , rayClusterName , metav1.GetOptions {})
93
+ return foundRayCluster .Finalizers , err
94
+ }).WithTimeout (time .Second * 10 ).Should (ContainElement (oAuthFinalizer ))
95
+ }, SpecTimeout (time .Second * 10 ))
158
96
159
- It ("should set owner references for all resources" , func () {
160
- foundRayCluster := rayv1.RayCluster {}
161
- err := k8sClient .Get (ctx , typeNamespaceName , & foundRayCluster )
162
- Expect (err ).ToNot (HaveOccurred ())
163
- err = k8sClient .Get (ctx , types.NamespacedName {Name : oauthSecretNameFromCluster (& foundRayCluster ), Namespace : foundRayCluster .Namespace }, & corev1.Secret {})
164
- Expect (err ).To (Not (HaveOccurred ()))
165
- err = k8sClient .Get (ctx , types.NamespacedName {Name : oauthServiceNameFromCluster (& foundRayCluster ), Namespace : foundRayCluster .Namespace }, & corev1.Service {})
97
+ It ("should create all oauth resources" , func (ctx SpecContext ) {
98
+ foundRayCluster , err := rayClient .RayV1 ().RayClusters (namespaceName ).Get (ctx , rayClusterName , metav1.GetOptions {})
166
99
Expect (err ).To (Not (HaveOccurred ()))
167
- err = k8sClient .Get (ctx , types.NamespacedName {Name : foundRayCluster .Name , Namespace : foundRayCluster .Namespace }, & corev1.ServiceAccount {})
168
- Expect (err ).To (Not (HaveOccurred ()))
169
- err = k8sClient .Get (ctx , types.NamespacedName {Name : crbNameFromCluster (& foundRayCluster )}, & rbacv1.ClusterRoleBinding {})
170
- Expect (err ).To (Not (HaveOccurred ()))
171
- err = k8sClient .Get (ctx , types.NamespacedName {Name : foundRayCluster .Name , Namespace : foundRayCluster .Namespace }, & routev1.Route {})
100
+
101
+ Eventually (func () (* corev1.Secret , error ) {
102
+ return k8sClient .CoreV1 ().Secrets (namespaceName ).Get (ctx , oauthSecretNameFromCluster (foundRayCluster ), metav1.GetOptions {})
103
+ }).WithTimeout (time .Second * 10 ).ShouldNot (BeNil ())
104
+ Eventually (func () (* corev1.Service , error ) {
105
+ return k8sClient .CoreV1 ().Services (namespaceName ).Get (ctx , oauthServiceNameFromCluster (foundRayCluster ), metav1.GetOptions {})
106
+ }).WithTimeout (time .Second * 10 ).ShouldNot (BeNil ())
107
+ Eventually (func () (* corev1.ServiceAccount , error ) {
108
+ return k8sClient .CoreV1 ().ServiceAccounts (namespaceName ).Get (ctx , oauthServiceAccountNameFromCluster (foundRayCluster ), metav1.GetOptions {})
109
+ }).WithTimeout (time .Second * 10 ).ShouldNot (BeNil ())
110
+ Eventually (func () (* rbacv1.ClusterRoleBinding , error ) {
111
+ return k8sClient .RbacV1 ().ClusterRoleBindings ().Get (ctx , crbNameFromCluster (foundRayCluster ), metav1.GetOptions {})
112
+ }).WithTimeout (time .Second * 10 ).ShouldNot (BeNil ())
113
+ Eventually (func () (* routev1.Route , error ) {
114
+ return routeClient .RouteV1 ().Routes (namespaceName ).Get (ctx , dashboardNameFromCluster (foundRayCluster ), metav1.GetOptions {})
115
+ }).WithTimeout (time .Second * 10 ).ShouldNot (BeNil ())
116
+ })
117
+
118
+ It ("should set owner references for all resources" , func (ctx SpecContext ) {
119
+ foundRayCluster , err := rayClient .RayV1 ().RayClusters (namespaceName ).Get (ctx , rayClusterName , metav1.GetOptions {})
172
120
Expect (err ).To (Not (HaveOccurred ()))
121
+
122
+ Eventually (func () (* corev1.Secret , error ) {
123
+ return k8sClient .CoreV1 ().Secrets (namespaceName ).Get (ctx , oauthSecretNameFromCluster (foundRayCluster ), metav1.GetOptions {})
124
+ }).WithTimeout (time .Second * 10 ).Should (WithTransform (OwnerReferenceKind , Equal ("RayCluster" )))
125
+ Eventually (func () (* corev1.Secret , error ) {
126
+ return k8sClient .CoreV1 ().Secrets (namespaceName ).Get (ctx , oauthSecretNameFromCluster (foundRayCluster ), metav1.GetOptions {})
127
+ }).WithTimeout (time .Second * 10 ).Should (WithTransform (OwnerReferenceName , Equal (foundRayCluster .Name )))
128
+ Eventually (func () (* corev1.Service , error ) {
129
+ return k8sClient .CoreV1 ().Services (namespaceName ).Get (ctx , oauthServiceNameFromCluster (foundRayCluster ), metav1.GetOptions {})
130
+ }).WithTimeout (time .Second * 10 ).Should (WithTransform (OwnerReferenceKind , Equal ("RayCluster" )))
131
+ Eventually (func () (* corev1.Service , error ) {
132
+ return k8sClient .CoreV1 ().Services (namespaceName ).Get (ctx , oauthServiceNameFromCluster (foundRayCluster ), metav1.GetOptions {})
133
+ }).WithTimeout (time .Second * 10 ).Should (WithTransform (OwnerReferenceName , Equal (foundRayCluster .Name )))
134
+ Eventually (func () (* corev1.ServiceAccount , error ) {
135
+ return k8sClient .CoreV1 ().ServiceAccounts (namespaceName ).Get (ctx , oauthServiceAccountNameFromCluster (foundRayCluster ), metav1.GetOptions {})
136
+ }).WithTimeout (time .Second * 10 ).Should (WithTransform (OwnerReferenceKind , Equal ("RayCluster" )))
137
+ Eventually (func () (* corev1.ServiceAccount , error ) {
138
+ return k8sClient .CoreV1 ().ServiceAccounts (namespaceName ).Get (ctx , oauthServiceAccountNameFromCluster (foundRayCluster ), metav1.GetOptions {})
139
+ }).WithTimeout (time .Second * 10 ).Should (WithTransform (OwnerReferenceName , Equal (foundRayCluster .Name )))
140
+ Eventually (func () (* routev1.Route , error ) {
141
+ return routeClient .RouteV1 ().Routes (namespaceName ).Get (ctx , dashboardNameFromCluster (foundRayCluster ), metav1.GetOptions {})
142
+ }).WithTimeout (time .Second * 10 ).Should (WithTransform (OwnerReferenceKind , Equal ("RayCluster" )))
143
+ Eventually (func () (* routev1.Route , error ) {
144
+ return routeClient .RouteV1 ().Routes (namespaceName ).Get (ctx , dashboardNameFromCluster (foundRayCluster ), metav1.GetOptions {})
145
+ }).WithTimeout (time .Second * 10 ).Should (WithTransform (OwnerReferenceName , Equal (foundRayCluster .Name )))
173
146
})
174
147
175
- It ("should remove CRB when the RayCluster is deleted" , func () {
176
- foundRayCluster := rayv1.RayCluster {}
177
- err := k8sClient .Get (ctx , typeNamespaceName , & foundRayCluster )
148
+ It ("should remove CRB when the RayCluster is deleted" , func (ctx SpecContext ) {
149
+ foundRayCluster , err := rayClient .RayV1 ().RayClusters (namespaceName ).Get (ctx , rayClusterName , metav1.GetOptions {})
178
150
Expect (err ).To (Not (HaveOccurred ()))
179
- err = k8sClient .Delete (ctx , & foundRayCluster )
151
+
152
+ err = rayClient .RayV1 ().RayClusters (namespaceName ).Delete (ctx , foundRayCluster .Name , metav1.DeleteOptions {})
180
153
Expect (err ).To (Not (HaveOccurred ()))
181
- Eventually (func () bool {
182
- return errors .IsNotFound (k8sClient .Get (ctx , types.NamespacedName {Name : crbNameFromCluster (& foundRayCluster )}, & rbacv1.ClusterRoleBinding {}))
183
- }, SpecTimeout (time .Second * 10 )).Should (Equal (true ))
154
+
155
+ Eventually (func () error {
156
+ _ , err := k8sClient .RbacV1 ().ClusterRoleBindings ().Get (ctx , crbNameFromCluster (foundRayCluster ), metav1.GetOptions {})
157
+ return err
158
+ }).WithTimeout (time .Second * 10 ).Should (Satisfy (errors .IsNotFound ))
184
159
})
160
+
185
161
})
186
162
})
163
+
164
+ func OwnerReferenceKind (meta metav1.Object ) string {
165
+ return meta .GetOwnerReferences ()[0 ].Kind
166
+ }
167
+
168
+ func OwnerReferenceName (meta metav1.Object ) string {
169
+ return meta .GetOwnerReferences ()[0 ].Name
170
+ }
0 commit comments