Skip to content

Commit fce0d35

Browse files
authored
fix: Changed feast operator to set status of featurestore cr to ready based on deployment.status = available (feast-dev#5020)
Changed featurestore cr ready status to reflect deployment available status Signed-off-by: Theodor Mihalache <[email protected]>
1 parent ea1d02d commit fce0d35

12 files changed

+119
-52
lines changed

infra/feast-operator/api/v1alpha1/featurestore_types.go

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,25 @@ const (
3838
AuthorizationReadyType = "Authorization"
3939

4040
// Feast condition reasons:
41-
ReadyReason = "Ready"
42-
FailedReason = "FeatureStoreFailed"
43-
OfflineStoreFailedReason = "OfflineStoreDeploymentFailed"
44-
OnlineStoreFailedReason = "OnlineStoreDeploymentFailed"
45-
RegistryFailedReason = "RegistryDeploymentFailed"
46-
UIFailedReason = "UIDeploymentFailed"
47-
ClientFailedReason = "ClientDeploymentFailed"
48-
KubernetesAuthzFailedReason = "KubernetesAuthorizationDeploymentFailed"
41+
ReadyReason = "Ready"
42+
FailedReason = "FeatureStoreFailed"
43+
DeploymentNotAvailableReason = "DeploymentNotAvailable"
44+
OfflineStoreFailedReason = "OfflineStoreDeploymentFailed"
45+
OnlineStoreFailedReason = "OnlineStoreDeploymentFailed"
46+
RegistryFailedReason = "RegistryDeploymentFailed"
47+
UIFailedReason = "UIDeploymentFailed"
48+
ClientFailedReason = "ClientDeploymentFailed"
49+
KubernetesAuthzFailedReason = "KubernetesAuthorizationDeploymentFailed"
4950

5051
// Feast condition messages:
51-
ReadyMessage = "FeatureStore installation complete"
52-
OfflineStoreReadyMessage = "Offline Store installation complete"
53-
OnlineStoreReadyMessage = "Online Store installation complete"
54-
RegistryReadyMessage = "Registry installation complete"
55-
UIReadyMessage = "UI installation complete"
56-
ClientReadyMessage = "Client installation complete"
57-
KubernetesAuthzReadyMessage = "Kubernetes authorization installation complete"
52+
ReadyMessage = "FeatureStore installation complete"
53+
OfflineStoreReadyMessage = "Offline Store installation complete"
54+
OnlineStoreReadyMessage = "Online Store installation complete"
55+
RegistryReadyMessage = "Registry installation complete"
56+
UIReadyMessage = "UI installation complete"
57+
ClientReadyMessage = "Client installation complete"
58+
KubernetesAuthzReadyMessage = "Kubernetes authorization installation complete"
59+
DeploymentNotAvailableMessage = "Deployment is not available"
5860

5961
// entity_key_serialization_version
6062
SerializationVersion = 3

infra/feast-operator/internal/controller/featurestore_controller.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,30 @@ func (r *FeatureStoreReconciler) deployFeast(ctx context.Context, cr *feastdevv1
138138
Reason: feastdevv1alpha1.FailedReason,
139139
Message: "Error: " + err.Error(),
140140
}
141+
} else {
142+
deployment, deploymentErr := feast.GetDeployment()
143+
if deploymentErr != nil {
144+
condition = metav1.Condition{
145+
Type: feastdevv1alpha1.ReadyType,
146+
Status: metav1.ConditionUnknown,
147+
Reason: feastdevv1alpha1.DeploymentNotAvailableReason,
148+
Message: feastdevv1alpha1.DeploymentNotAvailableMessage,
149+
}
150+
151+
result = errResult
152+
} else {
153+
isDeployAvailable := services.IsDeploymentAvailable(deployment.Status.Conditions)
154+
if !isDeployAvailable {
155+
condition = metav1.Condition{
156+
Type: feastdevv1alpha1.ReadyType,
157+
Status: metav1.ConditionUnknown,
158+
Reason: feastdevv1alpha1.DeploymentNotAvailableReason,
159+
Message: feastdevv1alpha1.DeploymentNotAvailableMessage,
160+
}
161+
162+
result = errResult
163+
}
164+
}
141165
}
142166

143167
logger.Info(condition.Message)

infra/feast-operator/internal/controller/featurestore_controller_db_store_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -398,10 +398,10 @@ var _ = Describe("FeatureStore Controller - db storage services", func() {
398398
Expect(resource.Status.Conditions).NotTo(BeEmpty())
399399
cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType)
400400
Expect(cond).ToNot(BeNil())
401-
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
402-
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
401+
Expect(cond.Status).To(Equal(metav1.ConditionUnknown))
402+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason))
403403
Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType))
404-
Expect(cond.Message).To(Equal(feastdevv1alpha1.ReadyMessage))
404+
Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage))
405405

406406
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType)
407407
Expect(cond).ToNot(BeNil())
@@ -431,7 +431,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() {
431431
Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType))
432432
Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage))
433433

434-
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.ReadyPhase))
434+
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase))
435435

436436
// check deployment
437437
deploy := &appsv1.Deployment{}

infra/feast-operator/internal/controller/featurestore_controller_ephemeral_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,10 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
164164
Expect(resource.Status.Conditions).NotTo(BeEmpty())
165165
cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType)
166166
Expect(cond).ToNot(BeNil())
167-
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
168-
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
167+
Expect(cond.Status).To(Equal(metav1.ConditionUnknown))
168+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason))
169169
Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType))
170-
Expect(cond.Message).To(Equal(feastdevv1alpha1.ReadyMessage))
170+
Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage))
171171

172172
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)
173173
Expect(cond).To(BeNil())
@@ -200,7 +200,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
200200
Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType))
201201
Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage))
202202

203-
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.ReadyPhase))
203+
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase))
204204

205205
// check deployment
206206
deploy := &appsv1.Deployment{}

infra/feast-operator/internal/controller/featurestore_controller_kubernetes_auth_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,10 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() {
150150
Expect(resource.Status.Conditions).NotTo(BeEmpty())
151151
cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType)
152152
Expect(cond).ToNot(BeNil())
153-
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
154-
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
153+
Expect(cond.Status).To(Equal(metav1.ConditionUnknown))
154+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason))
155155
Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType))
156-
Expect(cond.Message).To(Equal(feastdevv1alpha1.ReadyMessage))
156+
Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage))
157157

158158
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)
159159
Expect(cond).ToNot(BeNil())
@@ -190,7 +190,7 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() {
190190
Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType))
191191
Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage))
192192

193-
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.ReadyPhase))
193+
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase))
194194

195195
// check deployment
196196
deploy := &appsv1.Deployment{}

infra/feast-operator/internal/controller/featurestore_controller_loglevel_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,10 @@ var _ = Describe("FeatureStore Controller - Feast service LogLevel", func() {
129129
Expect(resource.Status.Conditions).NotTo(BeEmpty())
130130
cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType)
131131
Expect(cond).ToNot(BeNil())
132-
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
133-
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
132+
Expect(cond.Status).To(Equal(metav1.ConditionUnknown))
133+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason))
134134
Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType))
135-
Expect(cond.Message).To(Equal(feastdevv1alpha1.ReadyMessage))
135+
Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage))
136136

137137
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType)
138138
Expect(cond).ToNot(BeNil())
@@ -161,7 +161,7 @@ var _ = Describe("FeatureStore Controller - Feast service LogLevel", func() {
161161
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
162162
Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType))
163163
Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage))
164-
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.ReadyPhase))
164+
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase))
165165

166166
// check deployment
167167
deploy := &appsv1.Deployment{}

infra/feast-operator/internal/controller/featurestore_controller_objectstore_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,10 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
148148
Expect(resource.Status.Conditions).NotTo(BeEmpty())
149149
cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType)
150150
Expect(cond).ToNot(BeNil())
151-
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
152-
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
151+
Expect(cond.Status).To(Equal(metav1.ConditionUnknown))
152+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason))
153153
Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType))
154-
Expect(cond.Message).To(Equal(feastdevv1alpha1.ReadyMessage))
154+
Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage))
155155

156156
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)
157157
Expect(cond).To(BeNil())
@@ -176,7 +176,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
176176
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType)
177177
Expect(cond).To(BeNil())
178178

179-
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.ReadyPhase))
179+
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase))
180180

181181
// check deployment
182182
deploy := &appsv1.Deployment{}

infra/feast-operator/internal/controller/featurestore_controller_oidc_auth_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,10 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() {
173173
Expect(resource.Status.Conditions).NotTo(BeEmpty())
174174
cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType)
175175
Expect(cond).ToNot(BeNil())
176-
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
177-
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
176+
Expect(cond.Status).To(Equal(metav1.ConditionUnknown))
177+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason))
178178
Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType))
179-
Expect(cond.Message).To(Equal(feastdevv1alpha1.ReadyMessage))
179+
Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage))
180180

181181
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)
182182
Expect(cond).To(BeNil())
@@ -209,7 +209,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() {
209209
Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType))
210210
Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage))
211211

212-
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.ReadyPhase))
212+
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase))
213213

214214
// check deployment
215215
deploy := &appsv1.Deployment{}

infra/feast-operator/internal/controller/featurestore_controller_pvc_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,10 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
227227
Expect(resource.Status.Conditions).NotTo(BeEmpty())
228228
cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType)
229229
Expect(cond).ToNot(BeNil())
230-
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
231-
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
230+
Expect(cond.Status).To(Equal(metav1.ConditionUnknown))
231+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason))
232232
Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType))
233-
Expect(cond.Message).To(Equal(feastdevv1alpha1.ReadyMessage))
233+
Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage))
234234

235235
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)
236236
Expect(cond).To(BeNil())
@@ -263,7 +263,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
263263
Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType))
264264
Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage))
265265

266-
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.ReadyPhase))
266+
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase))
267267

268268
ephemeralName := "feast-data"
269269
ephemeralVolume := corev1.Volume{

infra/feast-operator/internal/controller/featurestore_controller_test.go

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,31 @@ var _ = Describe("FeatureStore Controller", func() {
127127
FeatureStore: resource,
128128
},
129129
}
130+
131+
deployment, _ := feast.GetDeployment()
132+
deployment.Status = appsv1.DeploymentStatus{
133+
Conditions: []appsv1.DeploymentCondition{
134+
{
135+
Type: appsv1.DeploymentAvailable,
136+
Status: "True", // Mark as available
137+
Reason: "MinimumReplicasAvailable",
138+
},
139+
},
140+
}
141+
142+
// Update the deployment's status
143+
err = controllerReconciler.Status().Update(context.Background(), &deployment)
144+
Expect(err).NotTo(HaveOccurred())
145+
146+
_, err = controllerReconciler.Reconcile(ctx, reconcile.Request{
147+
NamespacedName: typeNamespacedName,
148+
})
149+
Expect(err).NotTo(HaveOccurred())
150+
151+
resource = &feastdevv1alpha1.FeatureStore{}
152+
err = k8sClient.Get(ctx, typeNamespacedName, resource)
153+
Expect(err).NotTo(HaveOccurred())
154+
130155
Expect(resource.Status).NotTo(BeNil())
131156
Expect(resource.Status.FeastVersion).To(Equal(feastversion.FeastVersion))
132157
Expect(resource.Status.ClientConfigMap).To(Equal(feast.GetFeastServiceName(services.ClientFeastType)))
@@ -501,10 +526,10 @@ var _ = Describe("FeatureStore Controller", func() {
501526
Expect(resource.Status.Conditions).NotTo(BeEmpty())
502527
cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType)
503528
Expect(cond).ToNot(BeNil())
504-
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
505-
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
529+
Expect(cond.Status).To(Equal(metav1.ConditionUnknown))
530+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason))
506531
Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType))
507-
Expect(cond.Message).To(Equal(feastdevv1alpha1.ReadyMessage))
532+
Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage))
508533

509534
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)
510535
Expect(cond).To(BeNil())
@@ -544,7 +569,7 @@ var _ = Describe("FeatureStore Controller", func() {
544569
Expect(cond.Type).To(Equal(feastdevv1alpha1.UIReadyType))
545570
Expect(cond.Message).To(Equal(feastdevv1alpha1.UIReadyMessage))
546571

547-
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.ReadyPhase))
572+
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase))
548573

549574
deploy := &appsv1.Deployment{}
550575
objMeta := feast.GetObjectMeta()
@@ -999,7 +1024,6 @@ var _ = Describe("FeatureStore Controller", func() {
9991024

10001025
Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)).To(BeNil())
10011026
Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType)).To(BeNil())
1002-
Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1alpha1.ReadyType)).To(BeTrue())
10031027
Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType)).To(BeTrue())
10041028
Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType)).To(BeTrue())
10051029
Expect(resource.Status.ServiceHostnames.Registry).ToNot(BeEmpty())

0 commit comments

Comments
 (0)