From ae8ee7cc1db13379d623c838b73cf4a679948b57 Mon Sep 17 00:00:00 2001 From: ioito Date: Mon, 27 May 2019 11:00:28 +0800 Subject: [PATCH] =?UTF-8?q?zone=E6=B7=BB=E5=8A=A0GetIVMById,GetIDiskById?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cloudprovider/resources.go | 3 +++ pkg/compute/models/disks.go | 40 ++++++++++++++++++++++++++++++---- pkg/compute/models/guests.go | 25 ++++++++++++++++++++- pkg/util/aliyun/region.go | 8 +++++++ pkg/util/aws/region.go | 8 +++++++ pkg/util/azure/region.go | 8 +++++++ pkg/util/esxi/fakeregion.go | 28 ++++++++++++++++++++++++ pkg/util/huawei/region.go | 12 ++++++++++ pkg/util/openstack/region.go | 8 +++++++ pkg/util/qcloud/region.go | 8 +++++++ pkg/util/ucloud/region.go | 12 ++++++++++ pkg/util/zstack/region.go | 8 +++++++ 12 files changed, 163 insertions(+), 5 deletions(-) diff --git a/pkg/cloudprovider/resources.go b/pkg/cloudprovider/resources.go index 3d2968d997..8f59fab65b 100644 --- a/pkg/cloudprovider/resources.go +++ b/pkg/cloudprovider/resources.go @@ -63,6 +63,9 @@ type ICloudRegion interface { GetIVpcById(id string) (ICloudVpc, error) GetIZoneById(id string) (ICloudZone, error) GetIEipById(id string) (ICloudEIP, error) + // Esxi没有zone,需要通过region确认vm是否被删除 + GetIVMById(id string) (ICloudVM, error) + GetIDiskById(id string) (ICloudDisk, error) DeleteSecurityGroup(vpcId, secgroupId string) error SyncSecurityGroup(secgroupId string, vpcId string, name string, desc string, rules []secrules.SecurityRule) (string, error) diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index b41ea87722..f85f9fe75a 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -1156,16 +1156,48 @@ func (self *SDisk) syncDiskStorage(ctx context.Context, userCred mcclient.TokenC return nil } +func (self *SDisk) GetIRegion() (cloudprovider.ICloudRegion, error) { + storage := self.GetStorage() + if storage == nil { + return nil, fmt.Errorf("failed to get storage for disk %s(%s)", self.Name, self.Id) + } + + provider, err := storage.GetDriver() + if err != nil { + return nil, fmt.Errorf("No cloudprovider for storage %s(%s) error: %v", storage.Name, storage.Id, err) + } + + if provider.GetFactory().IsOnPremise() { + return provider.GetOnPremiseIRegion() + } + region := storage.GetRegion() + if region == nil { + msg := "fail to find region of storage???" + log.Errorf(msg) + return nil, fmt.Errorf(msg) + } + return provider.GetIRegionById(region.ExternalId) +} + func (self *SDisk) syncRemoveCloudDisk(ctx context.Context, userCred mcclient.TokenCredential) error { lockman.LockObject(ctx, self) defer lockman.ReleaseObject(ctx, self) - err := self.ValidatePurgeCondition(ctx) + iregion, err := self.GetIRegion() if err != nil { - return self.SetStatus(userCred, api.DISK_UNKNOWN, "missing original disk after sync") - } else { - return self.RealDelete(ctx, userCred) + return err } + _, err = iregion.GetIDiskById(self.ExternalId) + if err != cloudprovider.ErrNotFound { + return err + } + + err = self.ValidatePurgeCondition(ctx) + if err != nil { + self.SetStatus(userCred, api.DISK_UNKNOWN, "missing original disk after sync") + return err + } + return self.RealDelete(ctx, userCred) } func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, extDisk cloudprovider.ICloudDisk, index int, syncOwnerId mcclient.IIdentityProvider) error { diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 7494d2cbb5..14ae0077d7 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -1889,6 +1889,21 @@ var ( lostNamePattern = regexp.MustCompile(`-lost@\d{8}$`) ) +func (self *SGuest) GetIRegion() (cloudprovider.ICloudRegion, error) { + host := self.GetHost() + if host == nil { + return nil, fmt.Errorf("failed to get host by guest %s(%s)", self.Name, self.Id) + } + provider, err := host.GetDriver() + if err != nil { + return nil, fmt.Errorf("No cloudprovider for host: %s", err) + } + if provider.GetFactory().IsOnPremise() { + return provider.GetOnPremiseIRegion() + } + return host.GetIRegion() +} + func (self *SGuest) syncRemoveCloudVM(ctx context.Context, userCred mcclient.TokenCredential) error { lockman.LockObject(ctx, self) defer lockman.ReleaseObject(ctx, self) @@ -1909,6 +1924,15 @@ func (self *SGuest) syncRemoveCloudVM(ctx context.Context, userCred mcclient.Tok return nil } + iregion, err := self.GetIRegion() + if err != nil { + return err + } + _, err = iregion.GetIVMById(self.ExternalId) + if err != cloudprovider.ErrNotFound { + return err + } + if options.SyncPurgeRemovedResources.Contains(self.Keyword()) { log.Debugf("purge removed resource %s", self.Name) return self.purge(ctx, userCred) @@ -1924,7 +1948,6 @@ func (self *SGuest) syncRemoveCloudVM(ctx context.Context, userCred mcclient.Tok if self.Status != api.VM_UNKNOWN { self.SetStatus(userCred, api.VM_UNKNOWN, "Sync lost") } - return nil } diff --git a/pkg/util/aliyun/region.go b/pkg/util/aliyun/region.go index 81aa682399..e904a8e3ac 100644 --- a/pkg/util/aliyun/region.go +++ b/pkg/util/aliyun/region.go @@ -280,6 +280,14 @@ func (self *SRegion) getZoneById(id string) (*SZone, error) { return nil, fmt.Errorf("no such zone %s", id) } +func (self *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) { + return self.GetInstance(id) +} + +func (self *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { + return self.getDisk(id) +} + func (self *SRegion) GetIVpcs() ([]cloudprovider.ICloudVpc, error) { if self.ivpcs == nil { err := self.fetchInfrastructure() diff --git a/pkg/util/aws/region.go b/pkg/util/aws/region.go index 9353ec8edd..dbeccb5d85 100644 --- a/pkg/util/aws/region.go +++ b/pkg/util/aws/region.go @@ -257,6 +257,14 @@ func (self *SRegion) GetIVpcs() ([]cloudprovider.ICloudVpc, error) { return self.ivpcs, nil } +func (self *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) { + return self.GetInstance(id) +} + +func (self *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { + return self.GetDisk(id) +} + func (self *SRegion) GetIEips() ([]cloudprovider.ICloudEIP, error) { _, err := self.getEc2Client() if err != nil { diff --git a/pkg/util/azure/region.go b/pkg/util/azure/region.go index b36dcce03a..110db0c025 100644 --- a/pkg/util/azure/region.go +++ b/pkg/util/azure/region.go @@ -218,6 +218,14 @@ func (self *SRegion) GetIStorageById(id string) (cloudprovider.ICloudStorage, er return nil, cloudprovider.ErrNotFound } +func (self *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) { + return self.GetInstance(id) +} + +func (self *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { + return self.GetDisk(id) +} + func (self *SRegion) GetIHosts() ([]cloudprovider.ICloudHost, error) { iHosts := make([]cloudprovider.ICloudHost, 0) diff --git a/pkg/util/esxi/fakeregion.go b/pkg/util/esxi/fakeregion.go index d2dd595621..e99188ed47 100644 --- a/pkg/util/esxi/fakeregion.go +++ b/pkg/util/esxi/fakeregion.go @@ -46,6 +46,34 @@ func (cli *SESXiClient) GetIHosts() ([]cloudprovider.ICloudHost, error) { return ihosts, nil } +func (cli *SESXiClient) GetIVMById(id string) (cloudprovider.ICloudVM, error) { + hosts, err := cli.GetIHosts() + if err != nil { + return nil, err + } + for _, host := range hosts { + vm, err := host.GetIVMById(id) + if err != cloudprovider.ErrNotFound { + return vm, err + } + } + return nil, cloudprovider.ErrNotFound +} + +func (self *SESXiClient) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { + storages, err := self.GetIStorages() + if err != nil { + return nil, err + } + for _, storage := range storages { + disk, err := storage.GetIDiskById(id) + if err != cloudprovider.ErrNotFound { + return disk, err + } + } + return nil, cloudprovider.ErrNotFound +} + func (cli *SESXiClient) GetIHostById(id string) (cloudprovider.ICloudHost, error) { return cli.FindHostByIp(id) } diff --git a/pkg/util/huawei/region.go b/pkg/util/huawei/region.go index 30d1d96e67..41d0e9220c 100644 --- a/pkg/util/huawei/region.go +++ b/pkg/util/huawei/region.go @@ -136,6 +136,18 @@ func (self *SRegion) fetchIVpcs() error { return nil } +func (self *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) { + instance, err := self.GetInstanceByID(id) + if err != nil { + return nil, err + } + return &instance, err +} + +func (self *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { + return self.GetDisk(id) +} + func (self *SRegion) GetGeographicInfo() cloudprovider.SGeographicInfo { if info, ok := LatitudeAndLongitude[self.ID]; ok { return info diff --git a/pkg/util/openstack/region.go b/pkg/util/openstack/region.go index e5f83143c7..8cbb370346 100644 --- a/pkg/util/openstack/region.go +++ b/pkg/util/openstack/region.go @@ -188,6 +188,14 @@ func (region *SRegion) GetIStoragecaches() ([]cloudprovider.ICloudStoragecache, return []cloudprovider.ICloudStoragecache{storageCache}, nil } +func (region *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) { + return region.GetInstance(id) +} + +func (region *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { + return region.GetDisk(id) +} + func (region *SRegion) GetIVpcById(id string) (cloudprovider.ICloudVpc, error) { ivpcs, err := region.GetIVpcs() if err != nil { diff --git a/pkg/util/qcloud/region.go b/pkg/util/qcloud/region.go index 639bdd5b84..762690ec81 100644 --- a/pkg/util/qcloud/region.go +++ b/pkg/util/qcloud/region.go @@ -285,6 +285,14 @@ func (self *SRegion) GetClient() *SQcloudClient { return self.client } +func (self *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) { + return self.GetInstance(id) +} + +func (self *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { + return self.GetDisk(id) +} + func (self *SRegion) GetIEipById(eipId string) (cloudprovider.ICloudEIP, error) { if len(eipId) == 0 { return nil, cloudprovider.ErrNotFound diff --git a/pkg/util/ucloud/region.go b/pkg/util/ucloud/region.go index bbb664c7b8..79cc695a08 100644 --- a/pkg/util/ucloud/region.go +++ b/pkg/util/ucloud/region.go @@ -83,6 +83,18 @@ func (self *SRegion) GetGeographicInfo() cloudprovider.SGeographicInfo { return cloudprovider.SGeographicInfo{} } +func (self *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) { + instance, err := self.GetInstanceByID(id) + if err != nil { + return nil, err + } + return &instance, nil +} + +func (self *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { + return self.GetDisk(id) +} + func (self *SRegion) GetIZones() ([]cloudprovider.ICloudZone, error) { if self.izones == nil { var err error diff --git a/pkg/util/zstack/region.go b/pkg/util/zstack/region.go index 1b9f8bb302..d2dee9a088 100644 --- a/pkg/util/zstack/region.go +++ b/pkg/util/zstack/region.go @@ -78,6 +78,14 @@ func (region *SRegion) Refresh() error { return nil } +func (self *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) { + return self.GetInstance(id) +} + +func (self *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { + return self.GetDisk(id) +} + func (region *SRegion) GetIHostById(id string) (cloudprovider.ICloudHost, error) { return region.GetHost(id) }