From 328d2611633136d985dd36aab29bbb06260411c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Tue, 2 Apr 2019 12:43:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=BD=E7=95=A5=E5=9B=A0=E9=95=9C=E5=83=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=AF=BC=E8=87=B4=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/util/azure/azure.go | 21 ++++++++++++++++++--- pkg/util/azure/classic_instance.go | 8 +++++--- pkg/util/azure/instance.go | 14 +++++++++----- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/pkg/util/azure/azure.go b/pkg/util/azure/azure.go index e328ef38d0..45170f13f6 100644 --- a/pkg/util/azure/azure.go +++ b/pkg/util/azure/azure.go @@ -359,6 +359,10 @@ type AzureError struct { Message string `json:"message,omitempty"` } +func (e *AzureError) Error() string { + return jsonutils.Marshal(e).String() +} + func (self *SAzureClient) getUniqName(cli *autorest.Client, resourceType, name string, body jsonutils.JSONObject) (string, string, error) { url := fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/%s/%s", self.subscriptionId, self.ressourceGroups[0].Name, resourceType, name) if _, err := jsonRequest(cli, "GET", self.domain, url, self.subscriptionId, ""); err != nil { @@ -586,9 +590,20 @@ func waitForComplatetion(client *autorest.Client, req *http.Request, resp *http. return nil, nil case "Failed": if asyncData.Contains("error") { - msg, _ := asyncData.Get("error") - log.Errorf("process %s %s error: %s", req.Method, req.URL.String(), msg.String()) - return nil, fmt.Errorf(msg.String()) + azureError := AzureError{} + if err := asyncData.Unmarshal(&azureError, "error"); err != nil { + log.Errorf("process %s %s error: %s", req.Method, req.URL.String(), asyncData.String()) + return nil, fmt.Errorf("%s", asyncData.String()) + } + switch azureError.Code { + // 忽略创建机器时初始化超时问题 + case "OSProvisioningTimedOut", "OSProvisioningClientError": + log.Debugf("ignore OSProvisioning error: %s", azureError) + return nil, nil + default: + log.Errorf("process %s %s error: %s", req.Method, req.URL.String(), azureError) + return nil, &azureError + } } default: log.Errorf("Unknow status %s when process %s %s", status, req.Method, req.URL.String()) diff --git a/pkg/util/azure/classic_instance.go b/pkg/util/azure/classic_instance.go index d302732723..09c3abe5fb 100644 --- a/pkg/util/azure/classic_instance.go +++ b/pkg/util/azure/classic_instance.go @@ -78,7 +78,7 @@ type ClassicDisk struct { type ClassicStorageProfile struct { OperatingSystemDisk ClassicDisk `json:"operatingSystemDisk,omitempty"` - DataDisks *[]ClassicDisk `json:"aataDisks,omitempty"` + DataDisks *[]ClassicDisk `json:"dataDisks,allowempty"` } type ClassicHardwareProfile struct { @@ -296,17 +296,19 @@ func (self *SClassicInstance) GetIHost() cloudprovider.ICloudHost { } func (self *SClassicInstance) AttachDisk(ctx context.Context, diskId string) error { + status := self.GetStatus() if err := self.host.zone.region.AttachDisk(self.ID, diskId); err != nil { return err } - return cloudprovider.WaitStatus(self, self.GetStatus(), 10*time.Second, 300*time.Second) + return cloudprovider.WaitStatus(self, status, 10*time.Second, 300*time.Second) } func (self *SClassicInstance) DetachDisk(ctx context.Context, diskId string) error { + status := self.GetStatus() if err := self.host.zone.region.DetachDisk(self.ID, diskId); err != nil { return err } - return cloudprovider.WaitStatus(self, self.GetStatus(), 10*time.Second, 300*time.Second) + return cloudprovider.WaitStatus(self, status, 10*time.Second, 300*time.Second) } func (self *SClassicInstance) ChangeConfig(ctx context.Context, ncpu int, vmem int) error { diff --git a/pkg/util/azure/instance.go b/pkg/util/azure/instance.go index 4af2f9fa4b..a870c8ee0d 100644 --- a/pkg/util/azure/instance.go +++ b/pkg/util/azure/instance.go @@ -81,7 +81,7 @@ type DataDisk struct { type StorageProfile struct { ImageReference ImageReference `json:"imageReference,omitempty"` OsDisk OSDisk `json:"osDisk,omitempty"` - DataDisks []DataDisk `json:"dataDisks,omitempty"` + DataDisks []DataDisk `json:"dataDisks"` } type SSHPublicKey struct { @@ -481,10 +481,11 @@ func (self *SInstance) GetIHost() cloudprovider.ICloudHost { } func (self *SInstance) AttachDisk(ctx context.Context, diskId string) error { + status := self.GetStatus() if err := self.host.zone.region.AttachDisk(self.ID, diskId); err != nil { return err } - return cloudprovider.WaitStatus(self, self.GetStatus(), 10*time.Second, 300*time.Second) + return cloudprovider.WaitStatus(self, status, 10*time.Second, 300*time.Second) } func (region *SRegion) AttachDisk(instanceId, diskId string) error { @@ -523,10 +524,11 @@ func (region *SRegion) AttachDisk(instanceId, diskId string) error { } func (self *SInstance) DetachDisk(ctx context.Context, diskId string) error { + status := self.GetStatus() if err := self.host.zone.region.DetachDisk(self.ID, diskId); err != nil { return err } - return cloudprovider.WaitStatus(self, self.GetStatus(), 10*time.Second, 300*time.Second) + return cloudprovider.WaitStatus(self, status, 10*time.Second, 300*time.Second) } func (region *SRegion) DetachDisk(instanceId, diskId string) error { @@ -551,6 +553,7 @@ func (region *SRegion) DetachDisk(instanceId, diskId string) error { } func (self *SInstance) ChangeConfig(ctx context.Context, ncpu int, vmem int) error { + status := self.GetStatus() for _, vmSize := range self.host.zone.region.getHardwareProfile(ncpu, vmem) { self.Properties.HardwareProfile.VMSize = vmSize self.Properties.ProvisioningState = "" @@ -558,7 +561,7 @@ func (self *SInstance) ChangeConfig(ctx context.Context, ncpu int, vmem int) err log.Debugf("Try HardwareProfile : %s", vmSize) err := self.host.zone.region.client.Update(jsonutils.Marshal(self), nil) if err == nil { - return cloudprovider.WaitStatus(self, self.GetStatus(), 10*time.Second, 300*time.Second) + return cloudprovider.WaitStatus(self, status, 10*time.Second, 300*time.Second) } else { log.Debugf("ChangeConfig %s", err) } @@ -567,13 +570,14 @@ func (self *SInstance) ChangeConfig(ctx context.Context, ncpu int, vmem int) err } func (self *SInstance) ChangeConfig2(ctx context.Context, instanceType string) error { + status := self.GetStatus() self.Properties.HardwareProfile.VMSize = instanceType self.Properties.ProvisioningState = "" self.Properties.InstanceView = nil log.Debugf("Try HardwareProfile : %s", instanceType) err := self.host.zone.region.client.Update(jsonutils.Marshal(self), nil) if err == nil { - return cloudprovider.WaitStatus(self, self.GetStatus(), 10*time.Second, 300*time.Second) + return cloudprovider.WaitStatus(self, status, 10*time.Second, 300*time.Second) } else { log.Errorf("ChangeConfig2 %s", err) }