fix #38362: create blob vhds container if not exists

Signed-off-by: Huamin Chen <hchen@redhat.com>
This commit is contained in:
Huamin Chen 2017-01-05 20:35:43 +00:00
parent 307de20753
commit 3a2b9721e3
2 changed files with 18 additions and 3 deletions

View File

@ -19,6 +19,7 @@ package azure
import ( import (
"fmt" "fmt"
"regexp" "regexp"
"strings"
azs "github.com/Azure/azure-sdk-for-go/storage" 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. // Blob name in URL must end with '.vhd' extension.
name = name + ".vhd" name = name + ".vhd"
err = blobClient.PutPageBlob(vhdContainerName, name, vhdSize, tags) 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 { if err != nil {
return "", "", fmt.Errorf("failed to put page blob: %v", err) return "", "", fmt.Errorf("failed to put page blob: %v", err)
} }
// add VHD signature to the blob // add VHD signature to the blob
h, err := createVHDHeader(uint64(size)) h, err := createVHDHeader(uint64(size))
if err != nil { if err != nil {

View File

@ -28,7 +28,10 @@ import (
) )
const ( 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 // AttachDisk attaches a vhd to vm
@ -65,7 +68,7 @@ func (az *Cloud) AttachDisk(diskName, diskURI string, nodeName types.NodeName, l
if err != nil { if err != nil {
glog.Errorf("azure attach failed, err: %v", err) glog.Errorf("azure attach failed, err: %v", err)
detail := err.Error() 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 // if lease cannot be acquired, immediately detach the disk and return the original error
glog.Infof("failed to acquire disk lease, try detach") glog.Infof("failed to acquire disk lease, try detach")
az.DetachDiskByName(diskName, diskURI, nodeName) az.DetachDiskByName(diskName, diskURI, nodeName)
@ -237,7 +240,7 @@ func (az *Cloud) DeleteVolume(name, uri string) error {
if err != nil { if err != nil {
glog.Warningf("failed to delete blob %s err: %v", uri, err) glog.Warningf("failed to delete blob %s err: %v", uri, err)
detail := err.Error() detail := err.Error()
if strings.Contains(detail, "LeaseIdMissing") { if strings.Contains(detail, errLeaseIDMissing) {
// disk is still being used // disk is still being used
// see https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.protocol.bloberrorcodestrings.leaseidmissing.aspx // 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)) return volume.NewDeletedVolumeInUseError(fmt.Sprintf("disk %q is still in use while being deleted", name))