feat: Feast Namespaces registry for client ConfigMaps availability (#… · feast-dev/feast@728589a

@@ -78,6 +78,16 @@ func (r *FeatureStoreReconciler) Reconcile(ctx context.Context, req ctrl.Request

7878

if apierrors.IsNotFound(err) {

7979

// CR deleted since request queued, child objects getting GC'd, no requeue

8080

logger.V(1).Info("FeatureStore CR not found, has been deleted")

81+

// Clean up namespace registry entry even if the CR is not found

82+

if err := r.cleanupNamespaceRegistry(ctx, &feastdevv1alpha1.FeatureStore{

83+

ObjectMeta: metav1.ObjectMeta{

84+

Name: req.NamespacedName.Name,

85+

Namespace: req.NamespacedName.Namespace,

86+

},

87+

}); err != nil {

88+

logger.Error(err, "Failed to clean up namespace registry entry for deleted FeatureStore")

89+

// Don't return error here as the CR is already deleted

90+

}

8191

return ctrl.Result{}, nil

8292

}

8393

// error fetching FeatureStore instance, requeue and try again

@@ -86,6 +96,16 @@ func (r *FeatureStoreReconciler) Reconcile(ctx context.Context, req ctrl.Request

8696

}

8797

currentStatus := cr.Status.DeepCopy()

889899+

// Handle deletion - clean up namespace registry entry

100+

if cr.DeletionTimestamp != nil {

101+

logger.Info("FeatureStore is being deleted, cleaning up namespace registry entry")

102+

if err := r.cleanupNamespaceRegistry(ctx, cr); err != nil {

103+

logger.Error(err, "Failed to clean up namespace registry entry")

104+

return ctrl.Result{}, err

105+

}

106+

return ctrl.Result{}, nil

107+

}

108+89109

result, recErr = r.deployFeast(ctx, cr)

90110

if cr.DeletionTimestamp == nil && !reflect.DeepEqual(currentStatus, cr.Status) {

91111

if err = r.Client.Status().Update(ctx, cr); err != nil {

@@ -102,6 +122,22 @@ func (r *FeatureStoreReconciler) Reconcile(ctx context.Context, req ctrl.Request

102122

}

103123

}

104124125+

// Add to namespace registry if deployment was successful and not being deleted

126+

if recErr == nil && cr.DeletionTimestamp == nil {

127+

feast := services.FeastServices{

128+

Handler: feasthandler.FeastHandler{

129+

Client: r.Client,

130+

Context: ctx,

131+

FeatureStore: cr,

132+

Scheme: r.Scheme,

133+

},

134+

}

135+

if err := feast.AddToNamespaceRegistry(); err != nil {

136+

logger.Error(err, "Failed to add FeatureStore to namespace registry")

137+

// Don't return error here as the FeatureStore is already deployed successfully

138+

}

139+

}

140+105141

return result, recErr

106142

}

107143

@@ -201,6 +237,20 @@ func (r *FeatureStoreReconciler) SetupWithManager(mgr ctrl.Manager) error {

201237202238

}

203239240+

// cleanupNamespaceRegistry removes the feature store instance from the namespace registry

241+

func (r *FeatureStoreReconciler) cleanupNamespaceRegistry(ctx context.Context, cr *feastdevv1alpha1.FeatureStore) error {

242+

feast := services.FeastServices{

243+

Handler: feasthandler.FeastHandler{

244+

Client: r.Client,

245+

Context: ctx,

246+

FeatureStore: cr,

247+

Scheme: r.Scheme,

248+

},

249+

}

250+251+

return feast.RemoveFromNamespaceRegistry()

252+

}

253+204254

// if a remotely referenced FeatureStore is changed, reconcile any FeatureStores that reference it.

205255

func (r *FeatureStoreReconciler) mapFeastRefsToFeastRequests(ctx context.Context, object client.Object) []reconcile.Request {

206256

logger := log.FromContext(ctx)