Unverified Commit 6a6fa9e6 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #65687 from andyzhangx/automated-cherry-pick-of-#64427-upstream-release-1.10

Automatic merge from submit-queue. Automated cherry pick of #64427: add external resource group support for azure disk Cherry pick of #64427 on release-1.10. #64427: add external resource group support for azure disk
parents 9e5916bc db1417fd
...@@ -17,6 +17,7 @@ limitations under the License. ...@@ -17,6 +17,7 @@ limitations under the License.
package azure package azure
import ( import (
"fmt"
"path" "path"
"strings" "strings"
...@@ -36,7 +37,8 @@ func newManagedDiskController(common *controllerCommon) (*ManagedDiskController, ...@@ -36,7 +37,8 @@ func newManagedDiskController(common *controllerCommon) (*ManagedDiskController,
} }
//CreateManagedDisk : create managed disk //CreateManagedDisk : create managed disk
func (c *ManagedDiskController) CreateManagedDisk(diskName string, storageAccountType storage.SkuName, sizeGB int, tags map[string]string) (string, error) { func (c *ManagedDiskController) CreateManagedDisk(diskName string, storageAccountType storage.SkuName, resourceGroup string,
sizeGB int, tags map[string]string) (string, error) {
glog.V(4).Infof("azureDisk - creating new managed Name:%s StorageAccountType:%s Size:%v", diskName, storageAccountType, sizeGB) glog.V(4).Infof("azureDisk - creating new managed Name:%s StorageAccountType:%s Size:%v", diskName, storageAccountType, sizeGB)
newTags := make(map[string]*string) newTags := make(map[string]*string)
...@@ -62,8 +64,11 @@ func (c *ManagedDiskController) CreateManagedDisk(diskName string, storageAccoun ...@@ -62,8 +64,11 @@ func (c *ManagedDiskController) CreateManagedDisk(diskName string, storageAccoun
DiskSizeGB: &diskSizeGB, DiskSizeGB: &diskSizeGB,
CreationData: &disk.CreationData{CreateOption: disk.Empty}, CreationData: &disk.CreationData{CreateOption: disk.Empty},
}} }}
if resourceGroup == "" {
resourceGroup = c.common.resourceGroup
}
cancel := make(chan struct{}) cancel := make(chan struct{})
respChan, errChan := c.common.cloud.DisksClient.CreateOrUpdate(c.common.resourceGroup, diskName, model, cancel) respChan, errChan := c.common.cloud.DisksClient.CreateOrUpdate(resourceGroup, diskName, model, cancel)
<-respChan <-respChan
err := <-errChan err := <-errChan
if err != nil { if err != nil {
...@@ -73,7 +78,7 @@ func (c *ManagedDiskController) CreateManagedDisk(diskName string, storageAccoun ...@@ -73,7 +78,7 @@ func (c *ManagedDiskController) CreateManagedDisk(diskName string, storageAccoun
diskID := "" diskID := ""
err = kwait.ExponentialBackoff(defaultBackOff, func() (bool, error) { err = kwait.ExponentialBackoff(defaultBackOff, func() (bool, error) {
provisionState, id, err := c.getDisk(diskName) provisionState, id, err := c.getDisk(resourceGroup, diskName)
diskID = id diskID = id
// We are waiting for provisioningState==Succeeded // We are waiting for provisioningState==Succeeded
// We don't want to hand-off managed disks to k8s while they are // We don't want to hand-off managed disks to k8s while they are
...@@ -99,10 +104,14 @@ func (c *ManagedDiskController) CreateManagedDisk(diskName string, storageAccoun ...@@ -99,10 +104,14 @@ func (c *ManagedDiskController) CreateManagedDisk(diskName string, storageAccoun
//DeleteManagedDisk : delete managed disk //DeleteManagedDisk : delete managed disk
func (c *ManagedDiskController) DeleteManagedDisk(diskURI string) error { func (c *ManagedDiskController) DeleteManagedDisk(diskURI string) error {
diskName := path.Base(diskURI) diskName := path.Base(diskURI)
resourceGroup, err := getResourceGroupFromDiskURI(diskURI)
if err != nil {
return err
}
cancel := make(chan struct{}) cancel := make(chan struct{})
respChan, errChan := c.common.cloud.DisksClient.Delete(c.common.resourceGroup, diskName, cancel) respChan, errChan := c.common.cloud.DisksClient.Delete(resourceGroup, diskName, cancel)
<-respChan <-respChan
err := <-errChan err = <-errChan
if err != nil { if err != nil {
return err return err
} }
...@@ -115,8 +124,8 @@ func (c *ManagedDiskController) DeleteManagedDisk(diskURI string) error { ...@@ -115,8 +124,8 @@ func (c *ManagedDiskController) DeleteManagedDisk(diskURI string) error {
} }
// return: disk provisionState, diskID, error // return: disk provisionState, diskID, error
func (c *ManagedDiskController) getDisk(diskName string) (string, string, error) { func (c *ManagedDiskController) getDisk(resourceGroup, diskName string) (string, string, error) {
result, err := c.common.cloud.DisksClient.Get(c.common.resourceGroup, diskName) result, err := c.common.cloud.DisksClient.Get(resourceGroup, diskName)
if err != nil { if err != nil {
return "", "", err return "", "", err
} }
...@@ -127,3 +136,14 @@ func (c *ManagedDiskController) getDisk(diskName string) (string, string, error) ...@@ -127,3 +136,14 @@ func (c *ManagedDiskController) getDisk(diskName string) (string, string, error)
return "", "", err return "", "", err
} }
// get resource group name from a managed disk URI, e.g. return {group-name} according to
// /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id}
// according to https://docs.microsoft.com/en-us/rest/api/compute/disks/get
func getResourceGroupFromDiskURI(diskURI string) (string, error) {
fields := strings.Split(diskURI, "/")
if len(fields) != 9 || fields[3] != "resourceGroups" {
return "", fmt.Errorf("invalid disk URI: %s", diskURI)
}
return fields[4], nil
}
...@@ -2681,3 +2681,39 @@ func TestCanCombineSharedAndPrivateRulesInSameGroup(t *testing.T) { ...@@ -2681,3 +2681,39 @@ func TestCanCombineSharedAndPrivateRulesInSameGroup(t *testing.T) {
// func TestIfServiceIsEditedFromSharedRuleToOwnRuleThenItIsRemovedFromSharedRuleAndOwnRuleIsCreated(t *testing.T) { // func TestIfServiceIsEditedFromSharedRuleToOwnRuleThenItIsRemovedFromSharedRuleAndOwnRuleIsCreated(t *testing.T) {
// t.Error() // t.Error()
// } // }
func TestGetResourceGroupFromDiskURI(t *testing.T) {
tests := []struct {
diskURL string
expectedResult string
expectError bool
}{
{
diskURL: "/subscriptions/4be8920b-2978-43d7-axyz-04d8549c1d05/resourceGroups/azure-k8s1102/providers/Microsoft.Compute/disks/andy-mghyb1102-dynamic-pvc-f7f014c9-49f4-11e8-ab5c-000d3af7b38e",
expectedResult: "azure-k8s1102",
expectError: false,
},
{
diskURL: "/4be8920b-2978-43d7-axyz-04d8549c1d05/resourceGroups/azure-k8s1102/providers/Microsoft.Compute/disks/andy-mghyb1102-dynamic-pvc-f7f014c9-49f4-11e8-ab5c-000d3af7b38e",
expectedResult: "",
expectError: true,
},
{
diskURL: "",
expectedResult: "",
expectError: true,
},
}
for _, test := range tests {
result, err := getResourceGroupFromDiskURI(test.diskURL)
assert.Equal(t, result, test.expectedResult, "Expect result not equal with getResourceGroupFromDiskURI(%s) return: %q, expected: %q",
test.diskURL, result, test.expectedResult)
if test.expectError {
assert.NotNil(t, err, "Expect error during getResourceGroupFromDiskURI(%s)", test.diskURL)
} else {
assert.Nil(t, err, "Expect error is nil during getResourceGroupFromDiskURI(%s)", test.diskURL)
}
}
}
...@@ -31,7 +31,7 @@ type DiskController interface { ...@@ -31,7 +31,7 @@ type DiskController interface {
CreateBlobDisk(dataDiskName string, storageAccountType storage.SkuName, sizeGB int) (string, error) CreateBlobDisk(dataDiskName string, storageAccountType storage.SkuName, sizeGB int) (string, error)
DeleteBlobDisk(diskUri string) error DeleteBlobDisk(diskUri string) error
CreateManagedDisk(diskName string, storageAccountType storage.SkuName, sizeGB int, tags map[string]string) (string, error) CreateManagedDisk(diskName string, storageAccountType storage.SkuName, resourceGroup string, sizeGB int, tags map[string]string) (string, error)
DeleteManagedDisk(diskURI string) error DeleteManagedDisk(diskURI string) error
// Attaches the disk to the host machine. // Attaches the disk to the host machine.
......
...@@ -17,6 +17,7 @@ limitations under the License. ...@@ -17,6 +17,7 @@ limitations under the License.
package azure_dd package azure_dd
import ( import (
"errors"
"fmt" "fmt"
"strings" "strings"
...@@ -92,6 +93,7 @@ func (p *azureDiskProvisioner) Provision() (*v1.PersistentVolume, error) { ...@@ -92,6 +93,7 @@ func (p *azureDiskProvisioner) Provision() (*v1.PersistentVolume, error) {
cachingMode v1.AzureDataDiskCachingMode cachingMode v1.AzureDataDiskCachingMode
strKind string strKind string
err error err error
resourceGroup string
) )
// maxLength = 79 - (4 for ".vhd") = 75 // maxLength = 79 - (4 for ".vhd") = 75
name := util.GenerateVolumeName(p.options.ClusterName, p.options.PVName, 75) name := util.GenerateVolumeName(p.options.ClusterName, p.options.PVName, 75)
...@@ -115,6 +117,8 @@ func (p *azureDiskProvisioner) Provision() (*v1.PersistentVolume, error) { ...@@ -115,6 +117,8 @@ func (p *azureDiskProvisioner) Provision() (*v1.PersistentVolume, error) {
cachingMode = v1.AzureDataDiskCachingMode(v) cachingMode = v1.AzureDataDiskCachingMode(v)
case volume.VolumeParameterFSType: case volume.VolumeParameterFSType:
fsType = strings.ToLower(v) fsType = strings.ToLower(v)
case "resourcegroup":
resourceGroup = v
default: default:
return nil, fmt.Errorf("AzureDisk - invalid option %s in storage class", k) return nil, fmt.Errorf("AzureDisk - invalid option %s in storage class", k)
} }
...@@ -140,10 +144,18 @@ func (p *azureDiskProvisioner) Provision() (*v1.PersistentVolume, error) { ...@@ -140,10 +144,18 @@ func (p *azureDiskProvisioner) Provision() (*v1.PersistentVolume, error) {
return nil, err return nil, err
} }
if resourceGroup != "" && kind != v1.AzureManagedDisk {
return nil, errors.New("StorageClass option 'resourceGroup' can be used only for managed disks")
}
// create disk // create disk
diskURI := "" diskURI := ""
if kind == v1.AzureManagedDisk { if kind == v1.AzureManagedDisk {
diskURI, err = diskController.CreateManagedDisk(name, skuName, requestGB, *(p.options.CloudTags)) tags := make(map[string]string)
if p.options.CloudTags != nil {
tags = *(p.options.CloudTags)
}
diskURI, err = diskController.CreateManagedDisk(name, skuName, resourceGroup, requestGB, tags)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment