fixes for qcloud&azure

This commit is contained in:
Qiu Jian
2019-01-22 22:53:43 +08:00
parent c7f632f98b
commit 4e3d9a7cf0
12 changed files with 123 additions and 49 deletions
+16
View File
@@ -29,3 +29,19 @@ func RetryOnError(tryFunc func() error, errs []string, maxTries int) error {
}
return ErrTimeout
}
func RetryUntil(tryFunc func() (bool, error), maxTries int) error {
tried := 0
for tried < maxTries {
stop, err := tryFunc()
if stop {
return nil
}
if err != nil {
return err
}
tried += 1
time.Sleep(10 * time.Duration(tried) * time.Second)
}
return ErrTimeout
}
+6 -5
View File
@@ -353,6 +353,11 @@ func (self *SManagedVirtualizedGuestDriver) RequestDiskSnapshot(ctx context.Cont
func (self *SManagedVirtualizedGuestDriver) OnGuestDeployTaskDataReceived(ctx context.Context, guest *models.SGuest, task taskman.ITask, data jsonutils.JSONObject) error {
uuid, _ := data.GetString("uuid")
if len(uuid) > 0 {
guest.SetExternalId(uuid)
}
recycle := false
if guest.IsPrepaidRecycle() {
recycle = true
@@ -367,7 +372,7 @@ func (self *SManagedVirtualizedGuestDriver) OnGuestDeployTaskDataReceived(ctx co
disks := guest.GetDisks()
if len(disks) != len(diskInfo) {
msg := fmt.Sprintf("inconsistent disk number: have %d want %d", len(disks), len(diskInfo))
msg := fmt.Sprintf("inconsistent disk number: guest have %d disks, data contains %d disks", len(disks), len(diskInfo))
log.Errorf(msg)
return fmt.Errorf(msg)
}
@@ -419,10 +424,6 @@ func (self *SManagedVirtualizedGuestDriver) OnGuestDeployTaskDataReceived(ctx co
}
}
}
uuid, _ := data.GetString("uuid")
if len(uuid) > 0 {
guest.SetExternalId(uuid)
}
if metaData, _ := data.Get("metadata"); metaData != nil {
meta := make(map[string]string, 0)
+18 -1
View File
@@ -200,13 +200,30 @@ func (self *SQcloudGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu
if err != nil {
return nil, err
}
log.Debugf("VMcreated %s, and status is ready", iVM.GetGlobalId())
log.Debugf("VMcreated %s, and status is running", iVM.GetGlobalId())
iVM, err = ihost.GetIVMById(iVM.GetGlobalId())
if err != nil {
log.Errorf("cannot find vm %s", err)
return nil, err
}
err = cloudprovider.RetryUntil(func() (bool, error) {
idisks, err := iVM.GetIDisks()
if err != nil {
log.Errorf("cannot find vm disks %s", err)
return false, err
}
if len(idisks) == len(desc.DataDisks)+1 {
return true, nil
} else {
return false, nil
}
}, 10)
if err != nil {
return nil, err
}
data := fetchIVMinfo(desc, iVM, guest.Id, "root", passwd, action)
return data, nil
})
+1
View File
@@ -10,6 +10,7 @@ func init() {
"OS_Type", "OS_Distribution", "OS_version",
"Hypervisor", "Host_count", "Status",
"Ref_Count", "cached_count", "image_type",
"External_Id",
},
[]string{})
+1 -1
View File
@@ -388,4 +388,4 @@ func (self *SRegion) addTags(resId string, key string, value string) error {
return err
}
return nil
}
}
+20 -13
View File
@@ -26,9 +26,10 @@ type ImageDiskReference struct {
type CreationData struct {
CreateOption string `json:"createOption,omitempty"`
StorageAccountID string
ImageReference *ImageDiskReference `json:"imageReference,omitempty"`
SourceURI string `json:"sourceUri,omitempty"`
SourceResourceID string `json:"sourceResourceId,omitempty"`
// ImageReference *ImageDiskReference `json:"imageReference,omitempty"`
ImageReference *ImageReference `json:"imageReference,omitempty"`
SourceURI string `json:"sourceUri,omitempty"`
SourceResourceID string `json:"sourceResourceId,omitempty"`
}
type DiskProperties struct {
@@ -71,19 +72,25 @@ func (self *SRegion) CreateDisk(storageType string, name string, sizeGb int32, d
Type: "Microsoft.Compute/disks",
}
if len(imageId) > 0 {
// TODO: need to fix scenarios where image is a public image
// XXX Qiu Jian
image, err := self.getPrivateImage(imageId)
image, err := self.GetImageById(imageId)
if err != nil {
return nil, err
}
blobUrl := image.GetBlobUri()
if len(blobUrl) == 0 {
return nil, fmt.Errorf("failed to find blobUri for image %s", image.Name)
}
disk.Properties.CreationData = CreationData{
CreateOption: "Import",
SourceURI: blobUrl,
if isPrivateImageID(image.ID) {
blobUrl := image.GetBlobUri()
if len(blobUrl) == 0 {
return nil, fmt.Errorf("failed to find blobUri for image %s", image.Name)
}
disk.Properties.CreationData = CreationData{
CreateOption: "Import",
SourceURI: blobUrl,
}
} else {
imgRef := image.getImageReference()
disk.Properties.CreationData = CreationData{
CreateOption: "FromImage",
ImageReference: &imgRef,
}
}
disk.Properties.OsType = image.GetOsType()
}
+1 -5
View File
@@ -131,8 +131,6 @@ func (self *SHost) CreateVM2(name string, imgId string, sysDiskSize int, instanc
}
func (self *SHost) _createVM(name string, imgId string, sysDiskSize int32, cpu int, memMB int, instanceType string, nicId string, ipAddr string, desc string, passwd string, storageType string, diskSizes []int, publicKey string, userData string) (string, error) {
// TODO: need to fix scenarios where image is a public image
// XXX Qiu Jian
image, err := self.zone.region.GetImageById(imgId)
if err != nil {
log.Errorf("Get Image %s fail %s", imgId, err)
@@ -169,9 +167,7 @@ func (self *SHost) _createVM(name string, imgId string, sysDiskSize int32, cpu i
},
},
StorageProfile: StorageProfile{
ImageReference: ImageReference{
ID: image.ID,
},
ImageReference: image.getImageReference(),
OsDisk: OSDisk{
Name: fmt.Sprintf("vdisk_%s_%d", name, time.Now().UnixNano()),
Caching: "ReadWrite",
+20 -1
View File
@@ -202,8 +202,12 @@ func (self *SRegion) GetImageStatus(imageId string) (ImageStatusType, error) {
}
}
func isPrivateImageID(imageId string) bool {
return strings.HasPrefix(strings.ToLower(imageId), "/subscriptions/")
}
func (self *SRegion) GetImageById(imageId string) (SImage, error) {
if strings.HasPrefix(strings.ToLower(imageId), "/subscriptions/") {
if isPrivateImageID(imageId) {
return self.getPrivateImage(imageId)
} else {
return self.getOfferedImage(imageId)
@@ -491,3 +495,18 @@ func (region *SRegion) getOfferedImage(offerId string) (SImage, error) {
image.Properties.ProvisioningState = ImageStatusAvailable
return image, nil
}
func (image *SImage) getImageReference() ImageReference {
if isPrivateImageID(image.ID) {
return ImageReference{
ID: image.ID,
}
} else {
return ImageReference{
Sku: image.Sku,
Publisher: image.Publisher,
Version: image.Version,
Offer: image.Offer,
}
}
}
+1 -3
View File
@@ -696,9 +696,7 @@ func (region *SRegion) ReplaceSystemDisk(instanceId, imageId, passwd, publicKey
if err != nil {
return "", err
}
// TODO: need to fix scenarios where image is a public image
// XXX Qiu Jian
image, err := region.getPrivateImage(imageId)
image, err := region.GetImageById(imageId)
if err != nil {
return "", err
}
+1 -1
View File
@@ -106,7 +106,7 @@ func (self *SImage) IsEmulated() bool {
}
func (self *SImage) GetGlobalId() string {
return fmt.Sprintf("%s-%s")
return self.ImageId
}
func (self *SImage) Delete(ctx context.Context) error {
+37 -18
View File
@@ -199,23 +199,8 @@ func (self *SInstance) getVpc() (*SVpc, error) {
}
func (self *SInstance) GetIDisks() ([]cloudprovider.ICloudDisk, error) {
disks, total, err := self.host.zone.region.GetDisks(self.InstanceId, "", "", nil, 0, 50)
if err != nil {
log.Errorf("fetchDisks fail %s", err)
return nil, err
}
if total > len(disks) {
disks, _, err = self.host.zone.region.GetDisks(self.InstanceId, "", "", nil, 0, total)
}
idisks := make([]cloudprovider.ICloudDisk, len(disks))
for i := 0; i < len(disks); i += 1 {
store, err := self.host.zone.getStorageByCategory(disks[i].DiskType)
if err != nil {
return nil, err
}
disks[i].storage = store
idisks[i] = &disks[i]
}
idisks := make([]cloudprovider.ICloudDisk, 0)
if utils.IsInStringArray(self.SystemDisk.DiskType, []string{"LOCAL_BASIC", "LOCAL_SSD"}) {
storage := SLocalStorage{zone: self.host.zone, storageType: self.SystemDisk.DiskType}
disk := SLocalDisk{
@@ -242,6 +227,29 @@ func (self *SInstance) GetIDisks() ([]cloudprovider.ICloudDisk, error) {
}
}
disks := make([]SDisk, 0)
totalDisk := -1
for totalDisk < 0 || len(disks) < totalDisk {
parts, total, err := self.host.zone.region.GetDisks(self.InstanceId, "", "", nil, len(disks), 50)
if err != nil {
log.Errorf("fetchDisks fail %s", err)
return nil, err
}
if len(parts) > 0 {
disks = append(disks, parts...)
}
totalDisk = total
}
for i := 0; i < len(disks); i += 1 {
store, err := self.host.zone.getStorageByCategory(disks[i].DiskType)
if err != nil {
return nil, err
}
disks[i].storage = store
idisks = append(idisks, &disks[i])
}
return idisks, nil
}
@@ -453,6 +461,13 @@ func (self *SRegion) GetInstance(instanceId string) (*SInstance, error) {
if len(instances) == 0 {
return nil, cloudprovider.ErrNotFound
}
if len(instances) > 1 {
return nil, cloudprovider.ErrDuplicateId
}
if instances[0].InstanceState == "LAUNCH_FAILED" {
return nil, cloudprovider.ErrNotFound
}
log.Debugf("%s", instances)
return &instances[0], nil
}
@@ -542,7 +557,11 @@ func (self *SRegion) doStopVM(instanceId string, isForce bool) error {
func (self *SRegion) doDeleteVM(instanceId string) error {
params := make(map[string]string)
return self.instanceOperation(instanceId, "TerminateInstances", params)
err := self.instanceOperation(instanceId, "TerminateInstances", params)
if err != nil && cloudprovider.IsError(err, []string{"InvalidInstanceId.NotFound"}) {
return nil
}
return err
}
func (self *SRegion) StartVM(instanceId string) error {
+1 -1
View File
@@ -119,7 +119,7 @@ func (self *SStoragecache) GetIImageById(extId string) (cloudprovider.ICloudImag
if len(parts) == 0 {
return nil, cloudprovider.ErrNotFound
}
parts[1].storageCache = self
parts[0].storageCache = self
return &parts[0], nil
}