|
|
@@ -286,21 +286,6 @@ func (ctrl *csiSnapshotCommonController) processSnapshotWithDeletionTimestamp(sn
|
|
|
|
content = nil
|
|
|
|
content = nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Block deletion if this snapshot belongs to a group snapshot.
|
|
|
|
|
|
|
|
if snapshot.Status != nil && snapshot.Status.VolumeGroupSnapshotName != nil {
|
|
|
|
|
|
|
|
groupSnapshot, err := ctrl.groupSnapshotLister.VolumeGroupSnapshots(snapshot.Namespace).Get(*snapshot.Status.VolumeGroupSnapshotName)
|
|
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
|
|
msg := fmt.Sprintf("deletion of the individual volume snapshot %s is not allowed as it belongs to group snapshot %s. Deleting the group snapshot will trigger the deletion of all the individual volume snapshots that are part of the group.", utils.SnapshotKey(snapshot), utils.GroupSnapshotKey(groupSnapshot))
|
|
|
|
|
|
|
|
klog.Error(msg)
|
|
|
|
|
|
|
|
ctrl.eventRecorder.Event(snapshot, v1.EventTypeWarning, "SnapshotDeleteError", msg)
|
|
|
|
|
|
|
|
return fmt.Errorf(msg)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if !apierrs.IsNotFound(err) {
|
|
|
|
|
|
|
|
klog.Errorf("failed to delete snapshot %s: %v", utils.SnapshotKey(snapshot), err)
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
klog.V(5).Infof("processSnapshotWithDeletionTimestamp[%s]: delete snapshot content and remove finalizer from snapshot if needed", utils.SnapshotKey(snapshot))
|
|
|
|
klog.V(5).Infof("processSnapshotWithDeletionTimestamp[%s]: delete snapshot content and remove finalizer from snapshot if needed", utils.SnapshotKey(snapshot))
|
|
|
|
|
|
|
|
|
|
|
|
return ctrl.checkandRemoveSnapshotFinalizersAndCheckandDeleteContent(snapshot, content, deleteContent)
|
|
|
|
return ctrl.checkandRemoveSnapshotFinalizersAndCheckandDeleteContent(snapshot, content, deleteContent)
|
|
|
@@ -323,6 +308,23 @@ func (ctrl *csiSnapshotCommonController) checkandRemoveSnapshotFinalizersAndChec
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
removeGroupFinalizer := false
|
|
|
|
|
|
|
|
// Block deletion if this snapshot belongs to a group snapshot.
|
|
|
|
|
|
|
|
if snapshot.Status != nil && snapshot.Status.VolumeGroupSnapshotName != nil {
|
|
|
|
|
|
|
|
removeGroupFinalizer = true
|
|
|
|
|
|
|
|
groupSnapshot, err := ctrl.groupSnapshotLister.VolumeGroupSnapshots(snapshot.Namespace).Get(*snapshot.Status.VolumeGroupSnapshotName)
|
|
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
|
|
msg := fmt.Sprintf("deletion of the individual volume snapshot %s is not allowed as it belongs to group snapshot %s. Deleting the group snapshot will trigger the deletion of all the individual volume snapshots that are part of the group.", utils.SnapshotKey(snapshot), utils.GroupSnapshotKey(groupSnapshot))
|
|
|
|
|
|
|
|
klog.Error(msg)
|
|
|
|
|
|
|
|
ctrl.eventRecorder.Event(snapshot, v1.EventTypeWarning, "SnapshotDeletePending", msg)
|
|
|
|
|
|
|
|
return fmt.Errorf(msg)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if !apierrs.IsNotFound(err) {
|
|
|
|
|
|
|
|
klog.Errorf("failed to delete snapshot %s: %v", utils.SnapshotKey(snapshot), err)
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// regardless of the deletion policy, set the VolumeSnapshotBeingDeleted on
|
|
|
|
// regardless of the deletion policy, set the VolumeSnapshotBeingDeleted on
|
|
|
|
// content object, this is to allow snapshotter sidecar controller to conduct
|
|
|
|
// content object, this is to allow snapshotter sidecar controller to conduct
|
|
|
|
// a delete operation whenever the content has deletion timestamp set.
|
|
|
|
// a delete operation whenever the content has deletion timestamp set.
|
|
|
@@ -360,7 +362,7 @@ func (ctrl *csiSnapshotCommonController) checkandRemoveSnapshotFinalizersAndChec
|
|
|
|
// c. If deletion will not cascade to the content, remove the finalizer on
|
|
|
|
// c. If deletion will not cascade to the content, remove the finalizer on
|
|
|
|
// the snapshot such that it can be removed from API server.
|
|
|
|
// the snapshot such that it can be removed from API server.
|
|
|
|
removeBoundFinalizer := !(content != nil && deleteContent)
|
|
|
|
removeBoundFinalizer := !(content != nil && deleteContent)
|
|
|
|
return ctrl.removeSnapshotFinalizer(snapshot, true, removeBoundFinalizer)
|
|
|
|
return ctrl.removeSnapshotFinalizer(snapshot, true, removeBoundFinalizer, removeGroupFinalizer)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// checkandAddSnapshotFinalizers checks and adds snapshot finailzers when needed
|
|
|
|
// checkandAddSnapshotFinalizers checks and adds snapshot finailzers when needed
|
|
|
@@ -1542,8 +1544,8 @@ func (ctrl *csiSnapshotCommonController) addSnapshotFinalizer(snapshot *crdv1.Vo
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// removeSnapshotFinalizer removes a Finalizer for VolumeSnapshot.
|
|
|
|
// removeSnapshotFinalizer removes a Finalizer for VolumeSnapshot.
|
|
|
|
func (ctrl *csiSnapshotCommonController) removeSnapshotFinalizer(snapshot *crdv1.VolumeSnapshot, removeSourceFinalizer bool, removeBoundFinalizer bool) error {
|
|
|
|
func (ctrl *csiSnapshotCommonController) removeSnapshotFinalizer(snapshot *crdv1.VolumeSnapshot, removeSourceFinalizer bool, removeBoundFinalizer bool, removeGroupFinalizer bool) error {
|
|
|
|
if !removeSourceFinalizer && !removeBoundFinalizer {
|
|
|
|
if !removeSourceFinalizer && !removeBoundFinalizer && !removeGroupFinalizer {
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -1571,6 +1573,9 @@ func (ctrl *csiSnapshotCommonController) removeSnapshotFinalizer(snapshot *crdv1
|
|
|
|
if removeBoundFinalizer {
|
|
|
|
if removeBoundFinalizer {
|
|
|
|
snapshotClone.ObjectMeta.Finalizers = utils.RemoveString(snapshotClone.ObjectMeta.Finalizers, utils.VolumeSnapshotBoundFinalizer)
|
|
|
|
snapshotClone.ObjectMeta.Finalizers = utils.RemoveString(snapshotClone.ObjectMeta.Finalizers, utils.VolumeSnapshotBoundFinalizer)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if removeGroupFinalizer {
|
|
|
|
|
|
|
|
snapshotClone.ObjectMeta.Finalizers = utils.RemoveString(snapshotClone.ObjectMeta.Finalizers, utils.VolumeSnapshotInGroupFinalizer)
|
|
|
|
|
|
|
|
}
|
|
|
|
newSnapshot, err := ctrl.clientset.SnapshotV1().VolumeSnapshots(snapshotClone.Namespace).Update(context.TODO(), snapshotClone, metav1.UpdateOptions{})
|
|
|
|
newSnapshot, err := ctrl.clientset.SnapshotV1().VolumeSnapshots(snapshotClone.Namespace).Update(context.TODO(), snapshotClone, metav1.UpdateOptions{})
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return newControllerUpdateError(snapshot.Name, err.Error())
|
|
|
|
return newControllerUpdateError(snapshot.Name, err.Error())
|
|
|
|