diff --git a/pkg/cloudprovider/providers/azure/azure_file.go b/pkg/cloudprovider/providers/azure/azure_file.go index ab87cf3625..b41de6897c 100644 --- a/pkg/cloudprovider/providers/azure/azure_file.go +++ b/pkg/cloudprovider/providers/azure/azure_file.go @@ -60,9 +60,13 @@ func (f *azureFileClient) createFileShare(accountName, accountKey, name string, } share := fileClient.GetShareReference(name) share.Properties.Quota = sizeGiB - if err = share.Create(nil); err != nil { + newlyCreated, err := share.CreateIfNotExists(nil) + if err != nil { return fmt.Errorf("failed to create file share, err: %v", err) } + if !newlyCreated { + klog.V(2).Infof("file share(%s) under account(%s) already exists", name, accountName) + } return nil } diff --git a/pkg/volume/azure_file/azure_provision.go b/pkg/volume/azure_file/azure_provision.go index dd687c72f9..132de0c9cf 100644 --- a/pkg/volume/azure_file/azure_provision.go +++ b/pkg/volume/azure_file/azure_provision.go @@ -142,11 +142,8 @@ func (a *azureFileProvisioner) Provision(selectedNode *v1.Node, allowedTopologie return nil, fmt.Errorf("%s does not support block volume provisioning", a.plugin.GetPluginName()) } - var sku, resourceGroup, location, account string + var sku, resourceGroup, location, account, shareName string - // File share name has a length limit of 63, and it cannot contain two consecutive '-'s. - name := util.GenerateVolumeName(a.options.ClusterName, a.options.PVName, 63) - name = strings.Replace(name, "--", "-", -1) capacity := a.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] requestGiB := int(volumehelpers.RoundUpToGiB(capacity)) secretNamespace := a.options.PVC.Namespace @@ -164,6 +161,8 @@ func (a *azureFileProvisioner) Provision(selectedNode *v1.Node, allowedTopologie secretNamespace = v case "resourcegroup": resourceGroup = v + case "sharename": + shareName = v default: return nil, fmt.Errorf("invalid option %q for volume plugin %s", k, a.plugin.GetPluginName()) } @@ -173,12 +172,18 @@ func (a *azureFileProvisioner) Provision(selectedNode *v1.Node, allowedTopologie return nil, fmt.Errorf("claim.Spec.Selector is not supported for dynamic provisioning on Azure file") } + if shareName == "" { + // File share name has a length limit of 63, and it cannot contain two consecutive '-'s. + name := util.GenerateVolumeName(a.options.ClusterName, a.options.PVName, 63) + shareName = strings.Replace(name, "--", "-", -1) + } + // when use azure file premium, account kind should be specified as FileStorage accountKind := string(storage.StorageV2) if strings.HasPrefix(strings.ToLower(sku), "premium") { accountKind = string(storage.FileStorage) } - account, key, err := a.azureProvider.CreateFileShare(name, account, sku, accountKind, resourceGroup, location, requestGiB) + account, key, err := a.azureProvider.CreateFileShare(shareName, account, sku, accountKind, resourceGroup, location, requestGiB) if err != nil { return nil, err } @@ -206,7 +211,7 @@ func (a *azureFileProvisioner) Provision(selectedNode *v1.Node, allowedTopologie PersistentVolumeSource: v1.PersistentVolumeSource{ AzureFile: &v1.AzureFilePersistentVolumeSource{ SecretName: secretName, - ShareName: name, + ShareName: shareName, SecretNamespace: &secretNamespace, }, },