Skip to content

Commit

Permalink
DFC uninstall flow
Browse files Browse the repository at this point in the history
Signed-off-by: Kaustav Majumder <[email protected]>
Signed-off-by: Kaustav Majumder <[email protected]>
  • Loading branch information
ezio-auditore authored and Kaustav Majumder committed May 8, 2023
1 parent f943b45 commit 09c5614
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 5 deletions.
16 changes: 16 additions & 0 deletions config/rbac/role.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@ rules:
- get
- list
- watch
- apiGroups:
- ""
resources:
- persistentvolumes
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
Expand Down Expand Up @@ -237,6 +245,14 @@ rules:
- patch
- update
- watch
- apiGroups:
- storage.k8s.io
resources:
- storageclass
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
Expand Down
77 changes: 73 additions & 4 deletions controllers/datafoundationclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@ package controllers
import (
"fmt"
"strings"
"time"

opv1a1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
v1alpha1 "github.com/red-hat-storage/managed-fusion-agent/api/v1alpha1"
ocsclient "github.com/red-hat-storage/ocs-client-operator/api/v1alpha1"
corev1 "k8s.io/api/core/v1"
storagev1 "k8s.io/api/storage/v1"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
ctrl "sigs.k8s.io/controller-runtime"
Expand All @@ -31,12 +35,17 @@ type dataFoundationClientReconciler struct {
}

const (
ocsClientOperatorName = "ocs-client-operator"
ocsClientOperatorName = "ocs-client-operator"
defaultBlockStorageClassClaimName = "ocs-storagecluster-ceph-rbd"
defaultFSStorageClassClaimName = "ocs-storagecluster-cephfs"
defaultStorageCLientName = "ocs-storageclient"
)

//+kubebuilder:rbac:groups=ocs.openshift.io,resources=storageclients,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=ocs.openshift.io,resources=storageclassclaims,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=operators.coreos.com,namespace=system,resources=clusterserviceversions,verbs=get;list;watch;delete;update;patch
// +kubebuilder:rbac:groups="",resources=persistentvolumes,verbs=get;list;watch
// +kubebuilder:rbac:groups="storage.k8s.io",resources=storageclass,verbs=get;list;watch

func dfcSetupWatches(controllerBuilder *builder.Builder) {
csvPredicates := builder.WithPredicates(
Expand Down Expand Up @@ -70,12 +79,12 @@ func (r *dataFoundationClientReconciler) initReconciler(reconciler *ManagedFusio
r.ManagedFusionOfferingReconciler = reconciler
r.offering = offering

r.storageClient.Name = "ocs-storageclient"
r.storageClient.Name = defaultStorageCLientName
r.storageClient.Namespace = offering.Namespace

r.defaultBlockStorageClassClaim.Name = "ocs-storagecluster-ceph-rbd"
r.defaultBlockStorageClassClaim.Name = defaultBlockStorageClassClaimName

r.defaultFSStorageClassClaim.Name = "ocs-storagecluster-cephfs"
r.defaultFSStorageClassClaim.Name = defaultFSStorageClassClaimName
}

func (r *dataFoundationClientReconciler) parseSpec(offering *v1alpha1.ManagedFusionOffering) error {
Expand Down Expand Up @@ -115,6 +124,25 @@ func (r *dataFoundationClientReconciler) parseSpec(offering *v1alpha1.ManagedFus

func (r *dataFoundationClientReconciler) reconcilePhases() (ctrl.Result, error) {
if !r.offering.DeletionTimestamp.IsZero() {
found, err := r.hasOCSVolumes()
if err != nil {
return ctrl.Result{}, err
}
if found {
r.Log.Info("Found consumer PVs using default storageclasses, cannot proceed with uninstallation")
return ctrl.Result{Requeue: true, RequeueAfter: 10 * time.Second}, nil
}
r.Log.Info("issuing a delete for Default StorageClassClaims")
if err := r.delete(&r.defaultBlockStorageClassClaim); err != nil {
return ctrl.Result{}, fmt.Errorf("failed to issue a delete for defaultBlockStorageClassClaim: %v", err)
}
if err := r.delete(&r.defaultFSStorageClassClaim); err != nil {
return ctrl.Result{}, fmt.Errorf("failed to issue a delete for defaultFSStorageClassClaim: %v", err)
}
r.Log.Info("issuing a delete for StorageClient")
if err := r.delete(&r.storageClient); err != nil {
return ctrl.Result{}, fmt.Errorf("failed to issue a delete for Storage Client: %v", err)
}
return ctrl.Result{}, nil
} else {
if err := r.reconcileCSV(); err != nil {
Expand Down Expand Up @@ -208,3 +236,44 @@ func (r *dataFoundationClientReconciler) reconcileDefaultFSStorageClassClaim() e

return nil
}

func (r *dataFoundationClientReconciler) hasOCSVolumes() (bool, error) {
storageClassList := &storagev1.StorageClassList{}
if err := r.list(storageClassList); err != nil {
return false, fmt.Errorf("failed to list Storage Classes: %v", err)
}
ocsStorageClass := make(map[string]bool)
for i := range storageClassList.Items {
storageClassName := storageClassList.Items[i].Name
if storageClassName == defaultBlockStorageClassClaimName || storageClassName == defaultFSStorageClassClaimName {
ocsStorageClass[storageClassName] = true
}
}
pvList := &corev1.PersistentVolumeList{}
if err := r.list(pvList); err != nil {
return false, fmt.Errorf("failed to list persistent volumes: %v", err)
}
for i := range pvList.Items {
scName := pvList.Items[i].Spec.StorageClassName
if ocsStorageClass[scName] {
return true, nil
}
}
return false, nil
}

func dfcIsReadyToBeRemoved(r *ManagedFusionOfferingReconciler, offering *v1alpha1.ManagedFusionOffering) (bool, error) {
storageClient := &ocsclient.StorageClient{}
storageClient.Name = defaultStorageCLientName
storageClient.Namespace = offering.Namespace

if err := r.get(storageClient); err != nil {
if errors.IsNotFound(err) {
return true, nil
} else {
return false, err
}
} else {
return false, nil
}
}
8 changes: 7 additions & 1 deletion controllers/managedfusionoffering_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,13 @@ func (r *ManagedFusionOfferingReconciler) getCSVByPrefix(name string) (*opv1a1.C
// All the below functions are placeholder for offering plugin integration

func pluginIsReadyToBeRemoved(reconciler *ManagedFusionOfferingReconciler, offering *v1alpha1.ManagedFusionOffering) (bool, error) {
return dfIsReadyToBeRemoved(reconciler, offering)
switch offering.Spec.Kind {
case v1alpha1.KindDataFoundation:
return dfIsReadyToBeRemoved(reconciler, offering)
case v1alpha1.KindDataFoundationClient:
return dfcIsReadyToBeRemoved(reconciler, offering)
}
return false, nil
}

// This function is a placeholder for offering plugin integration
Expand Down

0 comments on commit 09c5614

Please sign in to comment.