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
7878if apierrors.IsNotFound(err) {
7979// CR deleted since request queued, child objects getting GC'd, no requeue
8080logger.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+ }
8191return 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 }
8797currentStatus := 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+89109result, recErr = r.deployFeast(ctx, cr)
90110if cr.DeletionTimestamp == nil && !reflect.DeepEqual(currentStatus, cr.Status) {
91111if 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+105141return 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.
205255func (r *FeatureStoreReconciler) mapFeastRefsToFeastRequests(ctx context.Context, object client.Object) []reconcile.Request {
206256logger := log.FromContext(ctx)