mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 14:37:00 +00:00
Merge pull request #97086 from xing-yang/check_datasource
Only CSI plugin can have a DataSource
This commit is contained in:
commit
f6152d1521
@ -443,6 +443,15 @@ func claimWithAnnotation(name, value string, claims []*v1.PersistentVolumeClaim)
|
|||||||
return claims
|
return claims
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func claimWithDataSource(name, kind, apiGroup string, claims []*v1.PersistentVolumeClaim) []*v1.PersistentVolumeClaim {
|
||||||
|
claims[0].Spec.DataSource = &v1.TypedLocalObjectReference{
|
||||||
|
Name: name,
|
||||||
|
Kind: kind,
|
||||||
|
APIGroup: &apiGroup,
|
||||||
|
}
|
||||||
|
return claims
|
||||||
|
}
|
||||||
|
|
||||||
func annotateClaim(claim *v1.PersistentVolumeClaim, ann map[string]string) *v1.PersistentVolumeClaim {
|
func annotateClaim(claim *v1.PersistentVolumeClaim, ann map[string]string) *v1.PersistentVolumeClaim {
|
||||||
if claim.Annotations == nil {
|
if claim.Annotations == nil {
|
||||||
claim.Annotations = map[string]string{}
|
claim.Annotations = map[string]string{}
|
||||||
@ -514,6 +523,7 @@ var (
|
|||||||
classUnsupportedMountOptions string = "unsupported-mountoptions"
|
classUnsupportedMountOptions string = "unsupported-mountoptions"
|
||||||
classLarge string = "large"
|
classLarge string = "large"
|
||||||
classWait string = "wait"
|
classWait string = "wait"
|
||||||
|
classCSI string = "csi"
|
||||||
|
|
||||||
modeWait = storage.VolumeBindingWaitForFirstConsumer
|
modeWait = storage.VolumeBindingWaitForFirstConsumer
|
||||||
)
|
)
|
||||||
|
@ -127,6 +127,20 @@ var storageClasses = []*storage.StorageClass{
|
|||||||
MountOptions: []string{"foo"},
|
MountOptions: []string{"foo"},
|
||||||
VolumeBindingMode: &modeImmediate,
|
VolumeBindingMode: &modeImmediate,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "StorageClass",
|
||||||
|
},
|
||||||
|
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "csi",
|
||||||
|
},
|
||||||
|
|
||||||
|
Provisioner: "mydriver.csi.k8s.io",
|
||||||
|
Parameters: class1Parameters,
|
||||||
|
ReclaimPolicy: &deleteReclaimPolicy,
|
||||||
|
VolumeBindingMode: &modeImmediate,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// call to storageClass 1, returning an error
|
// call to storageClass 1, returning an error
|
||||||
@ -506,6 +520,30 @@ func TestProvisionSync(t *testing.T) {
|
|||||||
[]string{"Normal ExternalProvisioning"},
|
[]string{"Normal ExternalProvisioning"},
|
||||||
noerrors, testSyncClaim,
|
noerrors, testSyncClaim,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// Provision a volume with a data source will fail
|
||||||
|
// for in-tree plugins
|
||||||
|
"11-25 - failed in-tree provision with data source",
|
||||||
|
novolumes,
|
||||||
|
novolumes,
|
||||||
|
claimWithDataSource("test-snap", "VolumeSnapshot", "snapshot.storage.k8s.io", newClaimArray("claim11-25", "uid11-25", "1Gi", "", v1.ClaimPending, &classGold)),
|
||||||
|
claimWithDataSource("test-snap", "VolumeSnapshot", "snapshot.storage.k8s.io", newClaimArray("claim11-25", "uid11-25", "1Gi", "", v1.ClaimPending, &classGold)),
|
||||||
|
[]string{"Warning ProvisioningFailed"}, noerrors,
|
||||||
|
testSyncClaim,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Provision a volume with a data source will proceed
|
||||||
|
// for CSI plugins
|
||||||
|
"11-26 - csi with data source",
|
||||||
|
novolumes,
|
||||||
|
novolumes,
|
||||||
|
claimWithAnnotation(pvutil.AnnStorageProvisioner, "mydriver.csi.k8s.io",
|
||||||
|
claimWithDataSource("test-snap", "VolumeSnapshot", "snapshot.storage.k8s.io", newClaimArray("claim11-26", "uid11-26", "1Gi", "", v1.ClaimPending, &classCSI))),
|
||||||
|
claimWithAnnotation(pvutil.AnnStorageProvisioner, "mydriver.csi.k8s.io",
|
||||||
|
claimWithDataSource("test-snap", "VolumeSnapshot", "snapshot.storage.k8s.io", newClaimArray("claim11-26", "uid11-26", "1Gi", "", v1.ClaimPending, &classCSI))),
|
||||||
|
[]string{"Normal ExternalProvisioning"},
|
||||||
|
noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
runSyncTests(t, tests, storageClasses, []*v1.Pod{})
|
runSyncTests(t, tests, storageClasses, []*v1.Pod{})
|
||||||
}
|
}
|
||||||
|
@ -1474,7 +1474,17 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(
|
|||||||
// called from provisionClaim(), in this case, plugin MUST NOT be nil
|
// called from provisionClaim(), in this case, plugin MUST NOT be nil
|
||||||
// NOTE: checks on plugin/storageClass has been saved
|
// NOTE: checks on plugin/storageClass has been saved
|
||||||
pluginName := plugin.GetPluginName()
|
pluginName := plugin.GetPluginName()
|
||||||
|
if pluginName != "kubernetes.io/csi" && claim.Spec.DataSource != nil {
|
||||||
|
// Only CSI plugin can have a DataSource. Fail the operation
|
||||||
|
// if Datasource in Claim is not nil and it is not a CSI plugin,
|
||||||
|
strerr := fmt.Sprintf("plugin %q is not a CSI plugin. Only CSI plugin can provision a claim with a datasource", pluginName)
|
||||||
|
klog.V(2).Infof(strerr)
|
||||||
|
ctrl.eventRecorder.Event(claim, v1.EventTypeWarning, events.ProvisioningFailed, strerr)
|
||||||
|
return pluginName, fmt.Errorf(strerr)
|
||||||
|
|
||||||
|
}
|
||||||
provisionerName := storageClass.Provisioner
|
provisionerName := storageClass.Provisioner
|
||||||
|
klog.V(4).Infof("provisionClaimOperation [%s]: plugin name: %s, provisioner name: %s", claimToClaimKey(claim), pluginName, provisionerName)
|
||||||
|
|
||||||
// Add provisioner annotation to be consistent with external provisioner workflow
|
// Add provisioner annotation to be consistent with external provisioner workflow
|
||||||
newClaim, err := ctrl.setClaimProvisioner(claim, provisionerName)
|
newClaim, err := ctrl.setClaimProvisioner(claim, provisionerName)
|
||||||
|
Loading…
Reference in New Issue
Block a user