From 13f36146fa7656422d3edbe5c66911a30a3987d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Wed, 13 Mar 2019 17:09:27 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=BF=E5=85=8Dopenstack=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=9C=BA=E5=99=A8=E5=A4=B1=E8=B4=A5=E5=90=8E=E9=95=BF=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=AD=89=E5=BE=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cloudprovider/resources.go | 2 ++ pkg/cloudprovider/waitstatus.go | 20 ++++++++++++++++++++ pkg/compute/guestdrivers/managedvirtual.go | 4 +++- pkg/util/aliyun/instance.go | 4 ++++ pkg/util/aws/instance.go | 4 ++++ pkg/util/azure/classic_instance.go | 4 ++++ pkg/util/azure/instance.go | 4 ++++ pkg/util/esxi/virtualmachine.go | 4 ++++ pkg/util/huawei/instance.go | 4 ++++ pkg/util/openstack/instance.go | 15 +++++++++++++++ pkg/util/qcloud/instance.go | 4 ++++ 11 files changed, 68 insertions(+), 1 deletion(-) diff --git a/pkg/cloudprovider/resources.go b/pkg/cloudprovider/resources.go index 9c5a8cff1a..192411cfe5 100644 --- a/pkg/cloudprovider/resources.go +++ b/pkg/cloudprovider/resources.go @@ -247,6 +247,8 @@ type ICloudVM interface { CreateDisk(ctx context.Context, sizeMb int, uuid string, driver string) error Renew(bc billing.SBillingCycle) error + + GetError() error } type ICloudNic interface { diff --git a/pkg/cloudprovider/waitstatus.go b/pkg/cloudprovider/waitstatus.go index cbe4d8841d..69cb0f8664 100644 --- a/pkg/cloudprovider/waitstatus.go +++ b/pkg/cloudprovider/waitstatus.go @@ -22,6 +22,26 @@ func WaitStatus(res ICloudResource, expect string, interval time.Duration, timeo return ErrTimeout } +func WaitStatusWithInstanceErrorCheck(res ICloudResource, expect string, interval time.Duration, timeout time.Duration, errCheck func() error) error { + startTime := time.Now() + for time.Now().Sub(startTime) < timeout { + err := res.Refresh() + if err != nil { + return err + } + log.Debugf("status %s expect %s", res.GetStatus(), expect) + if res.GetStatus() == expect { + return nil + } + err = errCheck() + if err != nil { + return err + } + time.Sleep(interval) + } + return ErrTimeout +} + func WaitDeleted(res ICloudResource, interval time.Duration, timeout time.Duration) error { startTime := time.Now() for time.Now().Sub(startTime) < timeout { diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index a4bfa0c830..192f040b4e 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -227,7 +227,9 @@ func (self *SManagedVirtualizedGuestDriver) RemoteDeployGuestForCreate(ctx conte initialState := guest.GetDriver().GetGuestInitialStateAfterCreate() log.Debugf("VMcreated %s, wait status %s ...", iVM.GetGlobalId(), initialState) - err = cloudprovider.WaitStatus(iVM, initialState, time.Second*5, time.Second*1800) + err = cloudprovider.WaitStatusWithInstanceErrorCheck(iVM, initialState, time.Second*5, time.Second*1800, func() error { + return iVM.GetError() + }) if err != nil { return nil, err } diff --git a/pkg/util/aliyun/instance.go b/pkg/util/aliyun/instance.go index d210fe6e82..51789a2ab2 100644 --- a/pkg/util/aliyun/instance.go +++ b/pkg/util/aliyun/instance.go @@ -942,3 +942,7 @@ func (region *SRegion) RenewInstance(instanceId string, bc billing.SBillingCycle func (self *SInstance) GetProjectId() string { return "" } + +func (self *SInstance) GetError() error { + return nil +} diff --git a/pkg/util/aws/instance.go b/pkg/util/aws/instance.go index e4f3d342c2..fb78c961e3 100644 --- a/pkg/util/aws/instance.go +++ b/pkg/util/aws/instance.go @@ -943,3 +943,7 @@ func (self *SInstance) Renew(bc billing.SBillingCycle) error { func (self *SInstance) GetProjectId() string { return "" } + +func (self *SInstance) GetError() error { + return nil +} diff --git a/pkg/util/azure/classic_instance.go b/pkg/util/azure/classic_instance.go index 2957068bfc..b0b4f8641e 100644 --- a/pkg/util/azure/classic_instance.go +++ b/pkg/util/azure/classic_instance.go @@ -539,3 +539,7 @@ func (self *SClassicInstance) Renew(bc billing.SBillingCycle) error { func (self *SClassicInstance) GetProjectId() string { return getResourceGroup(self.ID) } + +func (self *SClassicInstance) GetError() error { + return nil +} diff --git a/pkg/util/azure/instance.go b/pkg/util/azure/instance.go index 7d1f96dcbf..c5f1055d3e 100644 --- a/pkg/util/azure/instance.go +++ b/pkg/util/azure/instance.go @@ -1047,3 +1047,7 @@ func (self *SInstance) Renew(bc billing.SBillingCycle) error { func (self *SInstance) GetProjectId() string { return getResourceGroup(self.ID) } + +func (self *SInstance) GetError() error { + return nil +} diff --git a/pkg/util/esxi/virtualmachine.go b/pkg/util/esxi/virtualmachine.go index 34f222d6cd..520a678401 100644 --- a/pkg/util/esxi/virtualmachine.go +++ b/pkg/util/esxi/virtualmachine.go @@ -722,3 +722,7 @@ func (self *SVirtualMachine) Renew(bc billing.SBillingCycle) error { func (self *SVirtualMachine) GetProjectId() string { return "" } + +func (self *SVirtualMachine) GetError() error { + return nil +} diff --git a/pkg/util/huawei/instance.go b/pkg/util/huawei/instance.go index b282a8c3a2..0e636ff894 100644 --- a/pkg/util/huawei/instance.go +++ b/pkg/util/huawei/instance.go @@ -1181,3 +1181,7 @@ func (self *SRegion) UnsubscribeInstance(instanceId string, domianId string) (js func (self *SInstance) GetProjectId() string { return "" } + +func (self *SInstance) GetError() error { + return nil +} diff --git a/pkg/util/openstack/instance.go b/pkg/util/openstack/instance.go index 37672e9f51..0ed16f10f2 100644 --- a/pkg/util/openstack/instance.go +++ b/pkg/util/openstack/instance.go @@ -2,6 +2,7 @@ package openstack import ( "context" + "errors" "fmt" "time" @@ -68,6 +69,12 @@ type VolumesAttached struct { DeleteOnTermination bool } +type SFault struct { + Message string + Code int + Details string +} + type SInstance struct { host *SHost @@ -114,6 +121,7 @@ type SInstance struct { TrustedImageCertificates []string Updated time.Time UserID string + Fault SFault } func (region *SRegion) GetSecurityGroupsByInstance(instanceId string) ([]SecurityGroup, error) { @@ -628,3 +636,10 @@ func (region *SRegion) RenewInstances(instanceId []string, bc billing.SBillingCy func (instance *SInstance) GetProjectId() string { return instance.TenantID } + +func (self *SInstance) GetError() error { + if self.Status == INSTANCE_STATUS_ERROR && len(self.Fault.Message) > 0 { + return errors.New(self.Fault.Message) + } + return nil +} diff --git a/pkg/util/qcloud/instance.go b/pkg/util/qcloud/instance.go index 719596d6e3..10853d3c68 100644 --- a/pkg/util/qcloud/instance.go +++ b/pkg/util/qcloud/instance.go @@ -826,3 +826,7 @@ func (region *SRegion) RenewInstances(instanceId []string, bc billing.SBillingCy func (self *SInstance) GetProjectId() string { return strconv.Itoa(self.Placement.ProjectId) } + +func (self *SInstance) GetError() error { + return nil +}