zone添加GetIVMById,GetIDiskById方法

This commit is contained in:
ioito
2019-06-27 15:48:41 +08:00
parent 439d3fe0d2
commit ae8ee7cc1d
12 changed files with 163 additions and 5 deletions
+3
View File
@@ -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)
+36 -4
View File
@@ -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 {
+24 -1
View File
@@ -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
}
+8
View File
@@ -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()
+8
View File
@@ -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 {
+8
View File
@@ -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)
+28
View File
@@ -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)
}
+12
View File
@@ -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
+8
View File
@@ -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 {
+8
View File
@@ -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
+12
View File
@@ -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
+8
View File
@@ -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)
}