Skip to content

Commit d54f77a

Browse files
Merge pull request #3384 from rewantsoni/uninstall
controller: fix deletion phase
2 parents e2e249c + 1ee2906 commit d54f77a

File tree

2 files changed

+37
-18
lines changed

2 files changed

+37
-18
lines changed

controllers/storagecluster/storageclient.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import (
99
ocsv1a1 "github.com/red-hat-storage/ocs-operator/api/v4/v1alpha1"
1010
"github.com/red-hat-storage/ocs-operator/v4/controllers/defaults"
1111
"github.com/red-hat-storage/ocs-operator/v4/controllers/util"
12-
rookCephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
1312

1413
ocsclientv1a1 "github.com/red-hat-storage/ocs-client-operator/api/v1alpha1"
14+
rookCephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
1515
corev1 "k8s.io/api/core/v1"
16-
kerrors "k8s.io/apimachinery/pkg/api/errors"
16+
ctrl "sigs.k8s.io/controller-runtime"
1717
"sigs.k8s.io/controller-runtime/pkg/client"
1818
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1919
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -97,10 +97,14 @@ func (s *storageClient) ensureDeleted(r *StorageClusterReconciler, storagecluste
9797
}
9898
storageClient := &ocsclientv1a1.StorageClient{}
9999
storageClient.Name = storagecluster.Name
100+
if err := r.Get(r.ctx, client.ObjectKeyFromObject(storageClient), storageClient); client.IgnoreNotFound(err) != nil {
101+
return ctrl.Result{}, fmt.Errorf("failed to get storageclient %s: %v", storageClient.Name, err)
102+
} else if storageClient.UID == "" {
103+
return reconcile.Result{}, nil
104+
}
100105

101-
if err := r.Delete(r.ctx, storageClient); err != nil && !kerrors.IsNotFound(err) {
102-
r.Log.Error(err, "Failed to initiate deletion of local StorageClient CR")
103-
return reconcile.Result{}, err
106+
if err := r.Delete(r.ctx, storageClient); err != nil {
107+
return reconcile.Result{}, fmt.Errorf("failed to delete storageclient %s: %v", storageClient.Name, err)
104108
}
105109

106110
if controllerutil.RemoveFinalizer(storageClient, internalComponentFinalizer) {

controllers/storagecluster/storageconsumer.go

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -190,24 +190,39 @@ func (s *storageConsumer) ensureDeleted(r *StorageClusterReconciler, storageClus
190190
storageConsumer := &ocsv1a1.StorageConsumer{}
191191
storageConsumer.Name = defaults.LocalStorageConsumerName
192192
storageConsumer.Namespace = storageCluster.Namespace
193-
if err := r.Get(r.ctx, client.ObjectKeyFromObject(storageConsumer), storageConsumer); err != nil {
194-
if client.IgnoreNotFound(err) != nil {
195-
return ctrl.Result{}, fmt.Errorf("failed to get storageconsumer %s: %v", storageConsumer.Name, err)
193+
if err := r.Get(r.ctx, client.ObjectKeyFromObject(storageConsumer), storageConsumer); client.IgnoreNotFound(err) != nil {
194+
return ctrl.Result{}, fmt.Errorf("failed to get storageconsumer %s: %v", storageConsumer.Name, err)
195+
} else if storageConsumer.UID != "" {
196+
if storageConsumer.Status.Client != nil {
197+
return ctrl.Result{}, fmt.Errorf("waiting for client to offboard before deleting storageconsumer %s", storageConsumer.Name)
196198
}
197-
return ctrl.Result{}, nil
198-
}
199199

200-
if err := r.Delete(r.ctx, storageConsumer); err != nil {
201-
return ctrl.Result{}, fmt.Errorf("failed to delete storageconsumer %s: %v", storageConsumer.Name, err)
202-
}
200+
if err := r.Delete(r.ctx, storageConsumer); err != nil {
201+
return ctrl.Result{}, fmt.Errorf("failed to delete storageconsumer %s: %v", storageConsumer.Name, err)
202+
}
203203

204-
if controllerutil.RemoveFinalizer(storageConsumer, internalComponentFinalizer) {
205-
r.Log.Info("Removing finalizer from StorageConsumer.", "StorageConsumer:", storageConsumer.Name, " StorageConsumer Namespace:", storageConsumer.Namespace, " Finalizer:", internalComponentFinalizer)
206-
if err := r.Update(r.ctx, storageConsumer); err != nil {
207-
r.Log.Info("Failed to remove finalizer from StorageConsumer.", "StorageConsumer:", storageConsumer.Name, "Finalizer:", internalComponentFinalizer)
208-
return ctrl.Result{}, fmt.Errorf("failed to remove finalizer from StorageConsumer: %v", err)
204+
if controllerutil.RemoveFinalizer(storageConsumer, internalComponentFinalizer) {
205+
r.Log.Info("Removing finalizer from StorageConsumer.", "StorageConsumer:", storageConsumer.Name, " StorageConsumer Namespace:", storageConsumer.Namespace, " Finalizer:", internalComponentFinalizer)
206+
if err := r.Update(r.ctx, storageConsumer); err != nil {
207+
r.Log.Info("Failed to remove finalizer from StorageConsumer.", "StorageConsumer:", storageConsumer.Name, "Finalizer:", internalComponentFinalizer)
208+
return ctrl.Result{}, fmt.Errorf("failed to remove finalizer from StorageConsumer: %v", err)
209+
}
209210
}
210211
}
212+
213+
// The internal consumer configmap is owned by both storagecluster and storage consumer and will not be deleted
214+
// before storage cluster is deleted. The ceph resources created by the consumer are owned by the primary consumer
215+
// and consumer configmap. The storage cluster will wait in deletion phase till cephcluster is deleted, and the
216+
// ceph cluster will wait till all ceph resources are deleted. This creates a cyclic dependency, hence we need the
217+
// internal consumer configmap to be deleted when storagecluster deletion is triggered
218+
consumerConfigMap := &corev1.ConfigMap{}
219+
consumerConfigMap.Name = defaults.LocalStorageConsumerConfigMapName
220+
consumerConfigMap.Namespace = storageCluster.Namespace
221+
222+
if err := r.Delete(r.ctx, consumerConfigMap); client.IgnoreNotFound(err) != nil {
223+
return ctrl.Result{}, fmt.Errorf("failed to delete local consumerConfigMap %s: %v", consumerConfigMap.Name, err)
224+
}
225+
211226
return ctrl.Result{}, nil
212227
}
213228

0 commit comments

Comments
 (0)