@@ -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