- Introduce new flag to enable feature to prevent unauthorised volume mode conversion

- Changes to snapshot controller to read the volume mode from the PV and add it to SourceVolumeMode field in VolumeSnapshotContent
This commit is contained in:
Raunak Pradip Shah
2022-03-30 10:20:55 +05:30
parent 019a59a10f
commit 5b578e8573
4 changed files with 21 additions and 0 deletions

View File

@@ -70,6 +70,7 @@ var (
retryIntervalStart = flag.Duration("retry-interval-start", time.Second, "Initial retry interval of failed volume snapshot creation or deletion. It doubles with each failure, up to retry-interval-max. Default is 1 second.") retryIntervalStart = flag.Duration("retry-interval-start", time.Second, "Initial retry interval of failed volume snapshot creation or deletion. It doubles with each failure, up to retry-interval-max. Default is 1 second.")
retryIntervalMax = flag.Duration("retry-interval-max", 5*time.Minute, "Maximum retry interval of failed volume snapshot creation or deletion. Default is 5 minutes.") retryIntervalMax = flag.Duration("retry-interval-max", 5*time.Minute, "Maximum retry interval of failed volume snapshot creation or deletion. Default is 5 minutes.")
enableDistributedSnapshotting = flag.Bool("enable-distributed-snapshotting", false, "Enables each node to handle snapshotting for the local volumes created on that node") enableDistributedSnapshotting = flag.Bool("enable-distributed-snapshotting", false, "Enables each node to handle snapshotting for the local volumes created on that node")
preventVolumeModeConversion = flag.Bool("prevent-volume-mode-conversion", false, "Prevents an unauthorised user from modifying the volume mode when creating a PVC from an existing VolumeSnapshot.")
) )
var ( var (
@@ -187,6 +188,7 @@ func main() {
workqueue.NewItemExponentialFailureRateLimiter(*retryIntervalStart, *retryIntervalMax), workqueue.NewItemExponentialFailureRateLimiter(*retryIntervalStart, *retryIntervalMax),
workqueue.NewItemExponentialFailureRateLimiter(*retryIntervalStart, *retryIntervalMax), workqueue.NewItemExponentialFailureRateLimiter(*retryIntervalStart, *retryIntervalMax),
*enableDistributedSnapshotting, *enableDistributedSnapshotting,
*preventVolumeModeConversion,
) )
if err := ensureCustomResourceDefinitionsExist(snapClient); err != nil { if err := ensureCustomResourceDefinitionsExist(snapClient); err != nil {

View File

@@ -844,6 +844,7 @@ func newTestController(kubeClient kubernetes.Interface, clientset clientset.Inte
workqueue.NewItemExponentialFailureRateLimiter(1*time.Millisecond, 1*time.Minute), workqueue.NewItemExponentialFailureRateLimiter(1*time.Millisecond, 1*time.Minute),
workqueue.NewItemExponentialFailureRateLimiter(1*time.Millisecond, 1*time.Minute), workqueue.NewItemExponentialFailureRateLimiter(1*time.Millisecond, 1*time.Minute),
false, false,
false,
) )
ctrl.eventRecorder = record.NewFakeRecorder(1000) ctrl.eventRecorder = record.NewFakeRecorder(1000)

View File

@@ -684,6 +684,20 @@ func (ctrl *csiSnapshotCommonController) createSnapshotContent(snapshot *crdv1.V
} }
} }
if ctrl.preventVolumeModeConversion {
volumeMode := volume.Spec.VolumeMode
if volumeMode != nil {
snapshotContent.Spec.SourceVolumeMode = new(crdv1.SourceVolumeMode)
switch *volumeMode {
case v1.PersistentVolumeBlock:
*snapshotContent.Spec.SourceVolumeMode = crdv1.SourceVolumeModeBlock
case v1.PersistentVolumeFilesystem:
*snapshotContent.Spec.SourceVolumeMode = crdv1.SourceVolumeModeFilesystem
}
}
klog.V(5).Infof("snapcontent %s has volume mode %s", snapshotContent.Name, *snapshotContent.Spec.SourceVolumeMode)
}
// Set AnnDeletionSecretRefName and AnnDeletionSecretRefNamespace // Set AnnDeletionSecretRefName and AnnDeletionSecretRefNamespace
if snapshotterSecretRef != nil { if snapshotterSecretRef != nil {
klog.V(5).Infof("createSnapshotContent: set annotation [%s] on content [%s].", utils.AnnDeletionSecretRefName, snapshotContent.Name) klog.V(5).Infof("createSnapshotContent: set annotation [%s] on content [%s].", utils.AnnDeletionSecretRefName, snapshotContent.Name)

View File

@@ -68,6 +68,7 @@ type csiSnapshotCommonController struct {
resyncPeriod time.Duration resyncPeriod time.Duration
enableDistributedSnapshotting bool enableDistributedSnapshotting bool
preventVolumeModeConversion bool
} }
// NewCSISnapshotController returns a new *csiSnapshotCommonController // NewCSISnapshotController returns a new *csiSnapshotCommonController
@@ -84,6 +85,7 @@ func NewCSISnapshotCommonController(
snapshotRateLimiter workqueue.RateLimiter, snapshotRateLimiter workqueue.RateLimiter,
contentRateLimiter workqueue.RateLimiter, contentRateLimiter workqueue.RateLimiter,
enableDistributedSnapshotting bool, enableDistributedSnapshotting bool,
preventVolumeModeConversion bool,
) *csiSnapshotCommonController { ) *csiSnapshotCommonController {
broadcaster := record.NewBroadcaster() broadcaster := record.NewBroadcaster()
broadcaster.StartLogging(klog.Infof) broadcaster.StartLogging(klog.Infof)
@@ -138,6 +140,8 @@ func NewCSISnapshotCommonController(
ctrl.nodeListerSynced = nodeInformer.Informer().HasSynced ctrl.nodeListerSynced = nodeInformer.Informer().HasSynced
} }
ctrl.preventVolumeModeConversion = preventVolumeModeConversion
return ctrl return ctrl
} }