github.com/jmclong/azuredisk-csi-driver@v0.7.0/test/e2e/driver/azuredisk_driver.go (about) 1 /* 2 Copyright 2019 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package driver 18 19 import ( 20 "fmt" 21 "os" 22 "strings" 23 24 "sigs.k8s.io/azuredisk-csi-driver/pkg/azuredisk" 25 26 "github.com/kubernetes-csi/external-snapshotter/pkg/apis/volumesnapshot/v1beta1" 27 v1 "k8s.io/api/core/v1" 28 storagev1 "k8s.io/api/storage/v1" 29 "k8s.io/apimachinery/pkg/api/resource" 30 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 31 "k8s.io/klog" 32 ) 33 34 const ( 35 AzureDriverNameVar = "AZURE_STORAGE_DRIVER" 36 TopologyKey = "topology.disk.csi.azure.com/zone" 37 ) 38 39 // Implement DynamicPVTestDriver interface 40 type azureDiskDriver struct { 41 driverName string 42 } 43 44 // normalizeProvisioner extracts any '/' character in the provisioner name to '-'. 45 // StorageClass name cannot container '/' character. 46 func normalizeProvisioner(provisioner string) string { 47 return strings.ReplaceAll(provisioner, "/", "-") 48 } 49 50 // InitAzureDiskDriver returns azureDiskDriver that implements DynamicPVTestDriver interface 51 func InitAzureDiskDriver() PVTestDriver { 52 driverName := os.Getenv(AzureDriverNameVar) 53 if driverName == "" { 54 driverName = azuredisk.DriverName 55 } 56 57 klog.Infof("Using azure disk driver: %s", driverName) 58 return &azureDiskDriver{ 59 driverName: driverName, 60 } 61 } 62 63 func (d *azureDiskDriver) GetDynamicProvisionStorageClass(parameters map[string]string, mountOptions []string, reclaimPolicy *v1.PersistentVolumeReclaimPolicy, bindingMode *storagev1.VolumeBindingMode, allowedTopologyValues []string, namespace string) *storagev1.StorageClass { 64 provisioner := d.driverName 65 generateName := fmt.Sprintf("%s-%s-dynamic-sc-", namespace, normalizeProvisioner(provisioner)) 66 var allowedTopologies []v1.TopologySelectorTerm 67 if len(allowedTopologyValues) > 0 { 68 allowedTopologies = []v1.TopologySelectorTerm{ 69 { 70 MatchLabelExpressions: []v1.TopologySelectorLabelRequirement{ 71 { 72 Key: TopologyKey, 73 Values: allowedTopologyValues, 74 }, 75 }, 76 }, 77 } 78 } 79 80 return getStorageClass(generateName, provisioner, parameters, mountOptions, reclaimPolicy, bindingMode, allowedTopologies) 81 } 82 83 func (d *azureDiskDriver) GetVolumeSnapshotClass(namespace string) *v1beta1.VolumeSnapshotClass { 84 provisioner := d.driverName 85 generateName := fmt.Sprintf("%s-%s-dynamic-sc-", namespace, normalizeProvisioner(provisioner)) 86 return getVolumeSnapshotClass(generateName, provisioner) 87 } 88 89 func (d *azureDiskDriver) GetPersistentVolume(volumeID string, fsType string, size string, reclaimPolicy *v1.PersistentVolumeReclaimPolicy, namespace string) *v1.PersistentVolume { 90 provisioner := d.driverName 91 generateName := fmt.Sprintf("%s-%s-preprovsioned-pv-", namespace, normalizeProvisioner(provisioner)) 92 // Default to Retain ReclaimPolicy for pre-provisioned volumes 93 pvReclaimPolicy := v1.PersistentVolumeReclaimRetain 94 if reclaimPolicy != nil { 95 pvReclaimPolicy = *reclaimPolicy 96 } 97 return &v1.PersistentVolume{ 98 ObjectMeta: metav1.ObjectMeta{ 99 GenerateName: generateName, 100 Namespace: namespace, 101 // TODO remove if https://github.com/kubernetes-csi/external-provisioner/issues/202 is fixed 102 Annotations: map[string]string{ 103 "pv.kubernetes.io/provisioned-by": provisioner, 104 }, 105 }, 106 Spec: v1.PersistentVolumeSpec{ 107 AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, 108 Capacity: v1.ResourceList{ 109 v1.ResourceName(v1.ResourceStorage): resource.MustParse(size), 110 }, 111 PersistentVolumeReclaimPolicy: pvReclaimPolicy, 112 PersistentVolumeSource: v1.PersistentVolumeSource{ 113 CSI: &v1.CSIPersistentVolumeSource{ 114 Driver: provisioner, 115 VolumeHandle: volumeID, 116 FSType: fsType, 117 }, 118 }, 119 }, 120 } 121 } 122 123 func GetParameters() map[string]string { 124 return map[string]string{ 125 "skuName": "Standard_LRS", 126 } 127 }