Merge pull request #10362 from travisn/pool-deletion
pool: Delete ceph pool when blockpool cr is deleted
This commit is contained in:
5 files changed
+33
-39
No files matched your search
@@ -53,7 +53,7 @@ func (p *ReplicatedSpec) IsTargetRatioEnabled() bool {
|
||||
func (p *CephBlockPool) ValidateCreate() error {
|
||||
logger.Infof("validate create cephblockpool %v", p)
|
||||
|
||||
err := ValidateCephBlockPool(&p.Spec)
|
||||
err := ValidateCephBlockPool(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -61,14 +61,14 @@ func (p *CephBlockPool) ValidateCreate() error {
|
||||
}
|
||||
|
||||
// ValidateCephBlockPool validates specifically a CephBlockPool's spec (not just any NamedPoolSpec)
|
||||
func ValidateCephBlockPool(s *NamedBlockPoolSpec) error {
|
||||
if s.Name == "device_health_metrics" || s.Name == ".mgr" || s.Name == ".nfs" {
|
||||
if s.IsErasureCoded() {
|
||||
return errors.Errorf("invalid CephBlockPool spec: ceph built-in pool %q cannot be erasure coded", s.Name)
|
||||
func ValidateCephBlockPool(p *CephBlockPool) error {
|
||||
if p.Spec.Name == "device_health_metrics" || p.Spec.Name == ".mgr" || p.Spec.Name == ".nfs" {
|
||||
if p.Spec.IsErasureCoded() {
|
||||
return errors.Errorf("invalid CephBlockPool spec: ceph built-in pool %q cannot be erasure coded", p.Name)
|
||||
}
|
||||
}
|
||||
|
||||
return validatePoolSpec(s.ToNamedPoolSpec())
|
||||
return validatePoolSpec(p.ToNamedPoolSpec())
|
||||
}
|
||||
|
||||
// validate any NamedPoolSpec
|
||||
@@ -98,17 +98,23 @@ func validatePoolSpec(ps NamedPoolSpec) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *NamedBlockPoolSpec) ToNamedPoolSpec() NamedPoolSpec {
|
||||
func (p *CephBlockPool) ToNamedPoolSpec() NamedPoolSpec {
|
||||
// If the name is not overridden in the pool spec.name, set it to the name of the pool CR
|
||||
name := p.Spec.Name
|
||||
if name == "" {
|
||||
// Set the name of the pool CR since a name override wasn't specified in the spec
|
||||
name = p.Name
|
||||
}
|
||||
return NamedPoolSpec{
|
||||
Name: p.Name,
|
||||
PoolSpec: p.PoolSpec,
|
||||
Name: name,
|
||||
PoolSpec: p.Spec.PoolSpec,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *CephBlockPool) ValidateUpdate(old runtime.Object) error {
|
||||
logger.Info("validate update cephblockpool")
|
||||
ocbp := old.(*CephBlockPool)
|
||||
err := ValidateCephBlockPool(&p.Spec)
|
||||
err := ValidateCephBlockPool(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -37,11 +37,11 @@ func TestValidatePoolSpec(t *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
err := validatePoolSpec(p.Spec.ToNamedPoolSpec())
|
||||
err := validatePoolSpec(p.ToNamedPoolSpec())
|
||||
assert.NoError(t, err)
|
||||
|
||||
p.Spec.ErasureCoded.DataChunks = 1
|
||||
err = validatePoolSpec(p.Spec.ToNamedPoolSpec())
|
||||
err = validatePoolSpec(p.ToNamedPoolSpec())
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
|
||||
@@ -221,10 +221,6 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile
|
||||
}
|
||||
}
|
||||
|
||||
// Set the name of the Ceph pool to be reconciled internally, which
|
||||
// may be different from the pool CR name.
|
||||
cephBlockPool.Spec.Name = getCephName(*cephBlockPool)
|
||||
|
||||
// DELETE: the CR was deleted
|
||||
if !cephBlockPool.GetDeletionTimestamp().IsZero() {
|
||||
deps, err := cephBlockPoolDependents(r.context, r.clusterInfo, cephBlockPool)
|
||||
@@ -242,8 +238,8 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile
|
||||
|
||||
r.recorder.Event(cephBlockPool, corev1.EventTypeNormal, string(cephv1.ReconcileStarted), "starting blockpool deletion")
|
||||
|
||||
logger.Infof("deleting pool %q", cephBlockPool.Name)
|
||||
poolSpec := cephBlockPool.Spec.ToNamedPoolSpec()
|
||||
poolSpec := cephBlockPool.ToNamedPoolSpec()
|
||||
logger.Infof("deleting pool %q", poolSpec.Name)
|
||||
err = deletePool(r.context, clusterInfo, &poolSpec)
|
||||
if err != nil {
|
||||
return opcontroller.ImmediateRetryResult, *cephBlockPool, errors.Wrapf(err, "failed to delete pool %q. ", cephBlockPool.Name)
|
||||
@@ -299,7 +295,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile
|
||||
return reconcile.Result{}, *cephBlockPool, errors.Wrap(err, "failed to enable/disable stats collection for pool(s)")
|
||||
}
|
||||
|
||||
poolSpec := cephBlockPool.Spec.ToNamedPoolSpec()
|
||||
poolSpec := cephBlockPool.ToNamedPoolSpec()
|
||||
checker := newMirrorChecker(r.context, r.client, r.clusterInfo, request.NamespacedName, &poolSpec)
|
||||
// ADD PEERS
|
||||
logger.Debug("reconciling create rbd mirror peer configuration")
|
||||
@@ -361,7 +357,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile
|
||||
}
|
||||
|
||||
func (r *ReconcileCephBlockPool) reconcileCreatePool(clusterInfo *cephclient.ClusterInfo, cephCluster *cephv1.ClusterSpec, cephBlockPool *cephv1.CephBlockPool) (reconcile.Result, error) {
|
||||
poolSpec := cephBlockPool.Spec.ToNamedPoolSpec()
|
||||
poolSpec := cephBlockPool.ToNamedPoolSpec()
|
||||
err := createPool(r.context, clusterInfo, cephCluster, &poolSpec)
|
||||
if err != nil {
|
||||
return opcontroller.ImmediateRetryResult, errors.Wrapf(err, "failed to create pool %q.", cephBlockPool.GetName())
|
||||
@@ -371,19 +367,6 @@ func (r *ReconcileCephBlockPool) reconcileCreatePool(clusterInfo *cephclient.Clu
|
||||
return reconcile.Result{}, nil
|
||||
}
|
||||
|
||||
func getCephName(pool cephv1.CephBlockPool) string {
|
||||
// If the name is not overridden in the pool spec.name, set it to the name of the pool CR
|
||||
if pool.Spec.Name == "" {
|
||||
return pool.Name
|
||||
}
|
||||
if pool.Spec.Name == pool.Name {
|
||||
// The same pool name is set, nothing is being overridden
|
||||
return pool.Name
|
||||
}
|
||||
// The pool names that can be allowed to be overridden are enforced in the crd schema
|
||||
return pool.Spec.Name
|
||||
}
|
||||
|
||||
// Create the pool
|
||||
func createPool(context *clusterd.Context, clusterInfo *cephclient.ClusterInfo, clusterSpec *cephv1.ClusterSpec, p *cephv1.NamedPoolSpec) error {
|
||||
// Set the application name to rbd by default, but override for special pools
|
||||
@@ -445,7 +428,7 @@ func configureRBDStats(clusterContext *clusterd.Context, clusterInfo *cephclient
|
||||
for _, cephBlockPool := range cephBlockPoolList.Items {
|
||||
if cephBlockPool.GetDeletionTimestamp() == nil && cephBlockPool.Spec.EnableRBDStats {
|
||||
// add to list of CephBlockPool with enableRBDStats set to true and not marked for deletion
|
||||
enableStatsForPools = append(enableStatsForPools, getCephName(cephBlockPool))
|
||||
enableStatsForPools = append(enableStatsForPools, cephBlockPool.ToNamedPoolSpec().Name)
|
||||
}
|
||||
}
|
||||
logger.Debugf("RBD per-image IO statistics will be collected for pools: %v", enableStatsForPools)
|
||||
|
||||
@@ -123,22 +123,27 @@ func TestCreatePool(t *testing.T) {
|
||||
func TestCephPoolName(t *testing.T) {
|
||||
t.Run("spec not set", func(t *testing.T) {
|
||||
p := cephv1.CephBlockPool{ObjectMeta: metav1.ObjectMeta{Name: "metapool"}}
|
||||
name := getCephName(p)
|
||||
name := p.ToNamedPoolSpec().Name
|
||||
assert.Equal(t, "metapool", name)
|
||||
})
|
||||
t.Run("same name already set", func(t *testing.T) {
|
||||
p := cephv1.CephBlockPool{ObjectMeta: metav1.ObjectMeta{Name: "metapool"}, Spec: cephv1.NamedBlockPoolSpec{Name: "metapool"}}
|
||||
name := getCephName(p)
|
||||
name := p.ToNamedPoolSpec().Name
|
||||
assert.Equal(t, "metapool", name)
|
||||
})
|
||||
t.Run("override device metrics", func(t *testing.T) {
|
||||
p := cephv1.CephBlockPool{ObjectMeta: metav1.ObjectMeta{Name: "device-metrics"}, Spec: cephv1.NamedBlockPoolSpec{Name: "device_health_metrics"}}
|
||||
name := getCephName(p)
|
||||
name := p.ToNamedPoolSpec().Name
|
||||
assert.Equal(t, "device_health_metrics", name)
|
||||
})
|
||||
t.Run("override mgr", func(t *testing.T) {
|
||||
p := cephv1.CephBlockPool{ObjectMeta: metav1.ObjectMeta{Name: "default-mgr"}, Spec: cephv1.NamedBlockPoolSpec{Name: ".mgr"}}
|
||||
name := p.ToNamedPoolSpec().Name
|
||||
assert.Equal(t, ".mgr", name)
|
||||
})
|
||||
t.Run("override nfs", func(t *testing.T) {
|
||||
p := cephv1.CephBlockPool{ObjectMeta: metav1.ObjectMeta{Name: "default-nfs"}, Spec: cephv1.NamedBlockPoolSpec{Name: ".nfs"}}
|
||||
name := getCephName(p)
|
||||
name := p.ToNamedPoolSpec().Name
|
||||
assert.Equal(t, ".nfs", name)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ func validatePool(context *clusterd.Context, clusterInfo *cephclient.ClusterInfo
|
||||
return errors.New("missing namespace")
|
||||
}
|
||||
|
||||
if err := cephv1.ValidateCephBlockPool(&p.Spec); err != nil {
|
||||
if err := cephv1.ValidateCephBlockPool(p); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user