Skip to content

Commit 4f0c9c1

Browse files
make oauth part of config and remove annotation check
Signed-off-by: Kevin <[email protected]>
1 parent 91f8bf3 commit 4f0c9c1

File tree

4 files changed

+54
-132
lines changed

4 files changed

+54
-132
lines changed

controllers/raycluster_controller.go

Lines changed: 1 addition & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"crypto/rand"
2222
"crypto/sha1"
2323
"encoding/base64"
24-
"strconv"
2524

2625
rayv1 "github.com/ray-project/kuberay/ray-operator/apis/ray/v1"
2726

@@ -128,52 +127,7 @@ func (r *RayClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request)
128127
return ctrl.Result{}, nil
129128
}
130129

131-
val, ok := cluster.ObjectMeta.Annotations["codeflare.dev/oauth"]
132-
boolVal, err := strconv.ParseBool(val)
133-
if err != nil {
134-
logger.Error(err, "Could not convert codeflare.dev/oauth value to bool", "codeflare.dev/oauth", val)
135-
}
136-
if !ok || err != nil || !boolVal {
137-
logger.Info("Removing all OAuth Objects")
138-
err := r.deleteIfNotExist(
139-
ctx, types.NamespacedName{Namespace: cluster.Namespace, Name: oauthSecretNameFromCluster(&cluster)}, &corev1.Secret{},
140-
)
141-
if err != nil {
142-
logger.Error(err, "Error deleting OAuth Secret, retrying", logRequeueing, strTrue)
143-
return ctrl.Result{RequeueAfter: requeueTime}, nil
144-
}
145-
err = r.deleteIfNotExist(
146-
ctx, types.NamespacedName{Namespace: cluster.Namespace, Name: oauthServiceNameFromCluster(&cluster)}, &corev1.Service{},
147-
)
148-
if err != nil {
149-
logger.Error(err, "Error deleting OAuth Service, retrying", logRequeueing, strTrue)
150-
return ctrl.Result{RequeueAfter: requeueTime}, nil
151-
}
152-
err = r.deleteIfNotExist(
153-
ctx, types.NamespacedName{Namespace: cluster.Namespace, Name: oauthServiceAccountNameFromCluster(&cluster)}, &corev1.ServiceAccount{},
154-
)
155-
if err != nil {
156-
logger.Error(err, "Error deleting OAuth ServiceAccount, retrying", logRequeueing, strTrue)
157-
return ctrl.Result{RequeueAfter: requeueTime}, nil
158-
}
159-
err = r.deleteIfNotExist(
160-
ctx, types.NamespacedName{Namespace: cluster.Namespace, Name: crbNameFromCluster(&cluster)}, &rbacv1.ClusterRoleBinding{},
161-
)
162-
if err != nil {
163-
logger.Error(err, "Error deleting OAuth CRB, retrying", logRequeueing, strTrue)
164-
return ctrl.Result{RequeueAfter: requeueTime}, nil
165-
}
166-
err = r.deleteIfNotExist(
167-
ctx, types.NamespacedName{Namespace: cluster.Namespace, Name: routeNameFromCluster(&cluster)}, &routev1.Route{},
168-
)
169-
if err != nil {
170-
logger.Error(err, "Error deleting OAuth Route, retrying", logRequeueing, strTrue)
171-
return ctrl.Result{RequeueAfter: requeueTime}, nil
172-
}
173-
return ctrl.Result{}, nil
174-
}
175-
176-
_, err = r.routeClient.Routes(cluster.Namespace).Apply(ctx, desiredClusterRoute(&cluster), metav1.ApplyOptions{FieldManager: controllerName, Force: true})
130+
_, err := r.routeClient.Routes(cluster.Namespace).Apply(ctx, desiredClusterRoute(&cluster), metav1.ApplyOptions{FieldManager: controllerName, Force: true})
177131
if err != nil {
178132
logger.Error(err, "Failed to update OAuth Route")
179133
}

controllers/raycluster_controller_test.go

Lines changed: 48 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -125,98 +125,62 @@ var _ = Describe("RayCluster controller", func() {
125125
}, SpecTimeout(time.Second*10)).Should(Equal(true))
126126
})
127127

128-
Context("Cluster has OAuth annotation", func() {
129-
BeforeEach(func() {
130-
By("adding OAuth annotation to RayCluster")
131-
Eventually(func() error {
132-
foundRayCluster := rayv1.RayCluster{}
133-
err := k8sClient.Get(ctx, typeNamespaceName, &foundRayCluster)
134-
Expect(err).To(Not(HaveOccurred()))
135-
if foundRayCluster.Annotations == nil {
136-
foundRayCluster.Annotations = map[string]string{"codeflare.dev/oauth": "true"}
137-
} else {
138-
foundRayCluster.Annotations["codeflare.dev/oauth"] = "'true'"
139-
}
140-
return k8sClient.Update(ctx, &foundRayCluster)
141-
}, SpecTimeout(time.Second*10)).Should(Not(HaveOccurred()))
142-
By("waiting for dependent resources to be created")
143-
Eventually(func() error {
144-
foundRayCluster := rayv1.RayCluster{}
145-
err := k8sClient.Get(ctx, typeNamespaceName, &foundRayCluster)
146-
if err != nil {
147-
return err
148-
}
149-
err = k8sClient.Get(ctx, types.NamespacedName{Name: oauthSecretNameFromCluster(&foundRayCluster), Namespace: foundRayCluster.Namespace}, &corev1.Secret{})
150-
if err != nil {
151-
return err
152-
}
153-
err = k8sClient.Get(ctx, types.NamespacedName{Name: oauthServiceNameFromCluster(&foundRayCluster), Namespace: foundRayCluster.Namespace}, &corev1.Service{})
154-
if err != nil {
155-
return err
156-
}
157-
err = k8sClient.Get(ctx, types.NamespacedName{Name: foundRayCluster.Name, Namespace: foundRayCluster.Namespace}, &corev1.ServiceAccount{})
158-
if err != nil {
159-
return err
160-
}
161-
err = k8sClient.Get(ctx, types.NamespacedName{Name: crbNameFromCluster(&foundRayCluster)}, &rbacv1.ClusterRoleBinding{})
162-
if err != nil {
163-
return err
164-
}
165-
err = k8sClient.Get(ctx, types.NamespacedName{Name: foundRayCluster.Name, Namespace: foundRayCluster.Namespace}, &routev1.Route{})
166-
if err != nil {
167-
return err
168-
}
169-
return nil
170-
}, SpecTimeout(time.Second*10)).Should(Not(HaveOccurred()))
171-
})
172-
173-
It("should set owner references for all resources", func() {
128+
It("should create all oauth resources", func() {
129+
Eventually(func() error {
174130
foundRayCluster := rayv1.RayCluster{}
175131
err := k8sClient.Get(ctx, typeNamespaceName, &foundRayCluster)
176-
Expect(err).ToNot(HaveOccurred())
132+
if err != nil {
133+
return err
134+
}
177135
err = k8sClient.Get(ctx, types.NamespacedName{Name: oauthSecretNameFromCluster(&foundRayCluster), Namespace: foundRayCluster.Namespace}, &corev1.Secret{})
178-
Expect(err).To(Not(HaveOccurred()))
136+
if err != nil {
137+
return err
138+
}
179139
err = k8sClient.Get(ctx, types.NamespacedName{Name: oauthServiceNameFromCluster(&foundRayCluster), Namespace: foundRayCluster.Namespace}, &corev1.Service{})
180-
Expect(err).To(Not(HaveOccurred()))
140+
if err != nil {
141+
return err
142+
}
181143
err = k8sClient.Get(ctx, types.NamespacedName{Name: foundRayCluster.Name, Namespace: foundRayCluster.Namespace}, &corev1.ServiceAccount{})
182-
Expect(err).To(Not(HaveOccurred()))
144+
if err != nil {
145+
return err
146+
}
183147
err = k8sClient.Get(ctx, types.NamespacedName{Name: crbNameFromCluster(&foundRayCluster)}, &rbacv1.ClusterRoleBinding{})
184-
Expect(err).To(Not(HaveOccurred()))
148+
if err != nil {
149+
return err
150+
}
185151
err = k8sClient.Get(ctx, types.NamespacedName{Name: foundRayCluster.Name, Namespace: foundRayCluster.Namespace}, &routev1.Route{})
186-
Expect(err).To(Not(HaveOccurred()))
187-
})
152+
if err != nil {
153+
return err
154+
}
155+
return nil
156+
}, SpecTimeout(time.Second*10)).Should(Not(HaveOccurred()))
157+
})
188158

189-
It("should delete OAuth resources when annotation is removed", func() {
190-
foundRayCluster := rayv1.RayCluster{}
191-
err := k8sClient.Get(ctx, typeNamespaceName, &foundRayCluster)
192-
Expect(err).To(Not(HaveOccurred()))
193-
delete(foundRayCluster.Annotations, "codeflare.dev/oauth")
194-
err = k8sClient.Update(ctx, &foundRayCluster)
195-
Expect(err).To(Not(HaveOccurred()))
196-
Eventually(func() bool {
197-
return errors.IsNotFound(k8sClient.Get(ctx, types.NamespacedName{Name: oauthSecretNameFromCluster(&foundRayCluster), Namespace: foundRayCluster.Namespace}, &corev1.Secret{}))
198-
}, SpecTimeout(time.Second*10)).Should(Equal(true))
199-
Eventually(func() bool {
200-
return errors.IsNotFound(k8sClient.Get(ctx, types.NamespacedName{Name: oauthServiceNameFromCluster(&foundRayCluster), Namespace: foundRayCluster.Namespace}, &corev1.Service{}))
201-
}, SpecTimeout(time.Second*10)).Should(Equal(true))
202-
Eventually(func() bool {
203-
return errors.IsNotFound(k8sClient.Get(ctx, types.NamespacedName{Name: foundRayCluster.Name, Namespace: foundRayCluster.Namespace}, &corev1.ServiceAccount{}))
204-
}, SpecTimeout(time.Second*10)).Should(Equal(true))
205-
Eventually(func() bool {
206-
return errors.IsNotFound(k8sClient.Get(ctx, types.NamespacedName{Name: crbNameFromCluster(&foundRayCluster)}, &rbacv1.ClusterRoleBinding{}))
207-
}, SpecTimeout(time.Second*10)).Should(Equal(true))
208-
})
209-
210-
It("should remove CRB when the RayCluster is deleted", func() {
211-
foundRayCluster := rayv1.RayCluster{}
212-
err := k8sClient.Get(ctx, typeNamespaceName, &foundRayCluster)
213-
Expect(err).To(Not(HaveOccurred()))
214-
err = k8sClient.Delete(ctx, &foundRayCluster)
215-
Expect(err).To(Not(HaveOccurred()))
216-
Eventually(func() bool {
217-
return errors.IsNotFound(k8sClient.Get(ctx, types.NamespacedName{Name: crbNameFromCluster(&foundRayCluster)}, &rbacv1.ClusterRoleBinding{}))
218-
}, SpecTimeout(time.Second*10)).Should(Equal(true))
219-
})
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{})
166+
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{})
172+
Expect(err).To(Not(HaveOccurred()))
173+
})
174+
175+
It("should remove CRB when the RayCluster is deleted", func() {
176+
foundRayCluster := rayv1.RayCluster{}
177+
err := k8sClient.Get(ctx, typeNamespaceName, &foundRayCluster)
178+
Expect(err).To(Not(HaveOccurred()))
179+
err = k8sClient.Delete(ctx, &foundRayCluster)
180+
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))
220184
})
221185
})
222186
})

main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ func main() {
134134
MaxScaleoutAllowed: 5,
135135
},
136136
},
137+
RayClusterOAuth: pointer.Bool(true),
137138
}
138139

139140
kubeConfig, err := ctrl.GetConfig()
@@ -180,7 +181,8 @@ func main() {
180181
exitOnError(instaScaleController.SetupWithManager(context.Background(), mgr), "Error setting up InstaScale controller")
181182
}
182183

183-
if v, err := HasAPIResourceForGVK(kubeClient.DiscoveryClient, rayv1.GroupVersion.WithKind("RayCluster")); v {
184+
v, err := HasAPIResourceForGVK(kubeClient.DiscoveryClient, rayv1.GroupVersion.WithKind("RayCluster"))
185+
if v && *cfg.RayClusterOAuth {
184186
rayClusterController := cfoControllers.RayClusterReconciler{Client: mgr.GetClient(), Scheme: mgr.GetScheme()}
185187
exitOnError(rayClusterController.SetupWithManager(mgr), "Error setting up RayCluster controller")
186188
} else if err != nil {

pkg/config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ type CodeFlareOperatorConfiguration struct {
3636

3737
// The InstaScale controller configuration
3838
InstaScale *InstaScaleConfiguration `json:"instascale,omitempty"`
39+
40+
RayClusterOAuth *bool `json:"rayClusterOAuth,omitempty"`
3941
}
4042

4143
type InstaScaleConfiguration struct {

0 commit comments

Comments
 (0)