From 3a2b9721e387042d13ff49af2e32a801f249cb4a Mon Sep 17 00:00:00 2001 From: Huamin Chen Date: Thu, 5 Jan 2017 20:35:43 +0000 Subject: [PATCH] fix #38362: create blob vhds container if not exists Signed-off-by: Huamin Chen --- pkg/cloudprovider/providers/azure/azure_blob.go | 12 ++++++++++++ pkg/cloudprovider/providers/azure/azure_storage.go | 9 ++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/pkg/cloudprovider/providers/azure/azure_blob.go b/pkg/cloudprovider/providers/azure/azure_blob.go index 4804877c171..5cca3bd7761 100644 --- a/pkg/cloudprovider/providers/azure/azure_blob.go +++ b/pkg/cloudprovider/providers/azure/azure_blob.go @@ -19,6 +19,7 @@ package azure import ( "fmt" "regexp" + "strings" azs "github.com/Azure/azure-sdk-for-go/storage" ) @@ -40,9 +41,20 @@ func (az *Cloud) createVhdBlob(accountName, accountKey, name string, sizeGB int6 // Blob name in URL must end with '.vhd' extension. name = name + ".vhd" err = blobClient.PutPageBlob(vhdContainerName, name, vhdSize, tags) + if err != nil { + // if container doesn't exist, create one and retry PutPageBlob + detail := err.Error() + if strings.Contains(detail, errContainerNotFound) { + err = blobClient.CreateContainer(vhdContainerName, azs.ContainerAccessTypeContainer) + if err == nil { + err = blobClient.PutPageBlob(vhdContainerName, name, vhdSize, tags) + } + } + } if err != nil { return "", "", fmt.Errorf("failed to put page blob: %v", err) } + // add VHD signature to the blob h, err := createVHDHeader(uint64(size)) if err != nil { diff --git a/pkg/cloudprovider/providers/azure/azure_storage.go b/pkg/cloudprovider/providers/azure/azure_storage.go index 8bb94d113be..bf7b11eec2c 100644 --- a/pkg/cloudprovider/providers/azure/azure_storage.go +++ b/pkg/cloudprovider/providers/azure/azure_storage.go @@ -28,7 +28,10 @@ import ( ) const ( - maxLUN = 64 // max number of LUNs per VM + maxLUN = 64 // max number of LUNs per VM + errLeaseFailed = "AcquireDiskLeaseFailed" + errLeaseIDMissing = "LeaseIdMissing" + errContainerNotFound = "ContainerNotFound" ) // AttachDisk attaches a vhd to vm @@ -65,7 +68,7 @@ func (az *Cloud) AttachDisk(diskName, diskURI string, nodeName types.NodeName, l if err != nil { glog.Errorf("azure attach failed, err: %v", err) detail := err.Error() - if strings.Contains(detail, "Code=\"AcquireDiskLeaseFailed\"") { + if strings.Contains(detail, errLeaseFailed) { // if lease cannot be acquired, immediately detach the disk and return the original error glog.Infof("failed to acquire disk lease, try detach") az.DetachDiskByName(diskName, diskURI, nodeName) @@ -237,7 +240,7 @@ func (az *Cloud) DeleteVolume(name, uri string) error { if err != nil { glog.Warningf("failed to delete blob %s err: %v", uri, err) detail := err.Error() - if strings.Contains(detail, "LeaseIdMissing") { + if strings.Contains(detail, errLeaseIDMissing) { // disk is still being used // see https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.protocol.bloberrorcodestrings.leaseidmissing.aspx return volume.NewDeletedVolumeInUseError(fmt.Sprintf("disk %q is still in use while being deleted", name))