diff --git a/pkg/cloudprovider/cloudprovider.go b/pkg/cloudprovider/cloudprovider.go index 95185ef9a4..b74769c2c6 100644 --- a/pkg/cloudprovider/cloudprovider.go +++ b/pkg/cloudprovider/cloudprovider.go @@ -49,6 +49,8 @@ type ICloudProvider interface { GetBalance() (float64, error) GetSubAccounts() ([]SSubAccount, error) + + SupportPrepaidResources() bool } var providerTable map[string]ICloudProviderFactory diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index dc73cfa4a0..0555318100 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -873,7 +873,7 @@ func (manager *SDiskManager) getDisksByStorage(storage *SStorage) ([]SDisk, erro return disks, nil } -func (manager *SDiskManager) syncCloudDisk(ctx context.Context, userCred mcclient.TokenCredential, vdisk cloudprovider.ICloudDisk, index int, projectId string, projectSync bool) (*SDisk, error) { +func (manager *SDiskManager) syncCloudDisk(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, vdisk cloudprovider.ICloudDisk, index int, projectId string, projectSync bool) (*SDisk, error) { diskObj, err := manager.FetchByExternalId(vdisk.GetGlobalId()) if err != nil { if err == sql.ErrNoRows { @@ -885,13 +885,13 @@ func (manager *SDiskManager) syncCloudDisk(ctx context.Context, userCred mcclien return nil, err } storage := storageObj.(*SStorage) - return manager.newFromCloudDisk(ctx, userCred, vdisk, storage, -1, projectId) + return manager.newFromCloudDisk(ctx, userCred, provider, vdisk, storage, -1, projectId) } else { return nil, err } } else { disk := diskObj.(*SDisk) - err = disk.syncWithCloudDisk(ctx, userCred, vdisk, index, projectId, projectSync) + err = disk.syncWithCloudDisk(ctx, userCred, provider, vdisk, index, projectId, projectSync) if err != nil { return nil, err } @@ -899,7 +899,7 @@ func (manager *SDiskManager) syncCloudDisk(ctx context.Context, userCred mcclien } } -func (manager *SDiskManager) SyncDisks(ctx context.Context, userCred mcclient.TokenCredential, storage *SStorage, disks []cloudprovider.ICloudDisk, projectId string, projectSync bool) ([]SDisk, []cloudprovider.ICloudDisk, compare.SyncResult) { +func (manager *SDiskManager) SyncDisks(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, storage *SStorage, disks []cloudprovider.ICloudDisk, projectId string, projectSync bool) ([]SDisk, []cloudprovider.ICloudDisk, compare.SyncResult) { localDisks := make([]SDisk, 0) remoteDisks := make([]cloudprovider.ICloudDisk, 0) syncResult := compare.SyncResult{} @@ -931,7 +931,7 @@ func (manager *SDiskManager) SyncDisks(ctx context.Context, userCred mcclient.To } for i := 0; i < len(commondb); i += 1 { - err = commondb[i].syncWithCloudDisk(ctx, userCred, commonext[i], -1, projectId, projectSync) + err = commondb[i].syncWithCloudDisk(ctx, userCred, provider, commonext[i], -1, projectId, projectSync) if err != nil { syncResult.UpdateError(err) } else { @@ -942,7 +942,7 @@ func (manager *SDiskManager) SyncDisks(ctx context.Context, userCred mcclient.To } for i := 0; i < len(added); i += 1 { - new, err := manager.newFromCloudDisk(ctx, userCred, added[i], storage, -1, projectId) + new, err := manager.newFromCloudDisk(ctx, userCred, provider, added[i], storage, -1, projectId) if err != nil { syncResult.AddError(err) } else { @@ -955,10 +955,10 @@ func (manager *SDiskManager) SyncDisks(ctx context.Context, userCred mcclient.To return localDisks, remoteDisks, syncResult } -func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.TokenCredential, extDisk cloudprovider.ICloudDisk, index int, projectId string, projectSync bool) error { +func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, extDisk cloudprovider.ICloudDisk, index int, projectId string, projectSync bool) error { recycle := false guests := self.GetGuests() - if len(guests) == 1 && guests[0].IsPrepaidRecycle() { + if provider.SupportPrepaidResources() && len(guests) == 1 && guests[0].IsPrepaidRecycle() { recycle = true } _, err := self.GetModelManager().TableSpec().Update(self, func() error { @@ -981,7 +981,7 @@ func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.Toke self.IsEmulated = extDisk.IsEmulated() - if !recycle { + if provider.SupportPrepaidResources() && !recycle { self.BillingType = extDisk.GetBillingType() self.ExpiredAt = extDisk.GetExpiredAt() } @@ -1013,7 +1013,7 @@ func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.Toke return nil } -func (manager *SDiskManager) newFromCloudDisk(ctx context.Context, userCred mcclient.TokenCredential, extDisk cloudprovider.ICloudDisk, storage *SStorage, index int, projectId string) (*SDisk, error) { +func (manager *SDiskManager) newFromCloudDisk(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, extDisk cloudprovider.ICloudDisk, storage *SStorage, index int, projectId string) (*SDisk, error) { disk := SDisk{} disk.SetModelManager(manager) @@ -1036,8 +1036,10 @@ func (manager *SDiskManager) newFromCloudDisk(ctx context.Context, userCred mccl disk.IsEmulated = extDisk.IsEmulated() - disk.BillingType = extDisk.GetBillingType() - disk.ExpiredAt = extDisk.GetExpiredAt() + if provider.SupportPrepaidResources() { + disk.BillingType = extDisk.GetBillingType() + disk.ExpiredAt = extDisk.GetExpiredAt() + } err := manager.TableSpec().Insert(&disk) if err != nil { diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 36f363fb44..c6c639ff0c 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -1661,10 +1661,13 @@ func (self *SGuest) GetIsolatedDevices() []SIsolatedDevice { return IsolatedDeviceManager.findAttachedDevicesOfGuest(self) } -func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.TokenCredential, host *SHost, extVM cloudprovider.ICloudVM, projectId string, projectSync bool) error { +func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, host *SHost, extVM cloudprovider.ICloudVM, projectId string, projectSync bool) error { + lockman.LockObject(ctx, self) + defer lockman.ReleaseObject(ctx, self) + recycle := false - if self.IsPrepaidRecycle() { + if provider.SupportPrepaidResources() && self.IsPrepaidRecycle() { recycle = true } @@ -1710,7 +1713,7 @@ func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.Token self.IsEmulated = extVM.IsEmulated() - if !recycle { + if provider.SupportPrepaidResources() && !recycle { self.BillingType = extVM.GetBillingType() self.ExpiredAt = extVM.GetExpiredAt() } @@ -1760,7 +1763,7 @@ func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.Token } } - if recycle { + if provider.SupportPrepaidResources() && recycle { vhost := self.GetHost() err = vhost.syncWithCloudPrepaidVM(extVM, host, projectSync) if err != nil { @@ -1771,7 +1774,7 @@ func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.Token return nil } -func (manager *SGuestManager) newCloudVM(ctx context.Context, userCred mcclient.TokenCredential, host *SHost, extVM cloudprovider.ICloudVM, projectId string) (*SGuest, error) { +func (manager *SGuestManager) newCloudVM(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, host *SHost, extVM cloudprovider.ICloudVM, projectId string) (*SGuest, error) { guest := SGuest{} guest.SetModelManager(manager) @@ -1790,8 +1793,10 @@ func (manager *SGuestManager) newCloudVM(ctx context.Context, userCred mcclient. guest.IsEmulated = extVM.IsEmulated() - guest.BillingType = extVM.GetBillingType() - guest.ExpiredAt = extVM.GetExpiredAt() + if provider.SupportPrepaidResources() { + guest.BillingType = extVM.GetBillingType() + guest.ExpiredAt = extVM.GetExpiredAt() + } guest.HostId = host.Id @@ -2144,7 +2149,7 @@ type sSyncDiskPair struct { vdisk cloudprovider.ICloudDisk } -func (self *SGuest) SyncVMDisks(ctx context.Context, userCred mcclient.TokenCredential, host *SHost, vdisks []cloudprovider.ICloudDisk, projectId string, projectSync bool) compare.SyncResult { +func (self *SGuest) SyncVMDisks(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, host *SHost, vdisks []cloudprovider.ICloudDisk, projectId string, projectSync bool) compare.SyncResult { result := compare.SyncResult{} newdisks := make([]sSyncDiskPair, 0) @@ -2152,7 +2157,7 @@ func (self *SGuest) SyncVMDisks(ctx context.Context, userCred mcclient.TokenCred if len(vdisks[i].GetGlobalId()) == 0 { continue } - disk, err := DiskManager.syncCloudDisk(ctx, userCred, vdisks[i], i, projectId, projectSync) + disk, err := DiskManager.syncCloudDisk(ctx, userCred, provider, vdisks[i], i, projectId, projectSync) if err != nil { log.Errorf("syncCloudDisk error: %v", err) result.Error(err) @@ -3427,6 +3432,22 @@ func (manager *SGuestManager) getExpiredPrepaidGuests() []SGuest { return guests } +func (self *SGuest) doExternalSync(ctx context.Context, userCred mcclient.TokenCredential) error { + host := self.GetHost() + if host == nil { + return fmt.Errorf("no host???") + } + ihost, iprovider, err := host.GetIHostAndProvider() + if err != nil { + return err + } + iVM, err := ihost.GetIVMById(self.ExternalId) + if err != nil { + return err + } + return self.syncWithCloudVM(ctx, userCred, iprovider, host, iVM, "", false) +} + func (manager *SGuestManager) DeleteExpiredPrepaidServers(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) { guests := manager.getExpiredPrepaidGuests() if guests == nil { @@ -3434,6 +3455,12 @@ func (manager *SGuestManager) DeleteExpiredPrepaidServers(ctx context.Context, u } for i := 0; i < len(guests); i += 1 { // fake delete expired prepaid servers + if len(guests[i].ExternalId) > 0 { + err := guests[i].doExternalSync(ctx, userCred) + if err == nil && guests[i].IsValidPrePaid() { + continue + } + } guests[i].SetDisableDelete(false) guests[i].StartDeleteGuestTask(ctx, userCred, "", false, false) } diff --git a/pkg/compute/models/host_recycle.go b/pkg/compute/models/host_recycle.go index cdec488667..23f0bb525d 100644 --- a/pkg/compute/models/host_recycle.go +++ b/pkg/compute/models/host_recycle.go @@ -646,7 +646,13 @@ func (host *SHost) RebuildRecycledGuest(ctx context.Context, userCred mcclient.T return err } - err = guest.syncWithCloudVM(ctx, userCred, &oHost, extVM, "", false) + iprovider, err := oHost.GetDriver() + if err != nil { + log.Errorf("oHost.GetDriver fail %s", err) + return err + } + + err = guest.syncWithCloudVM(ctx, userCred, iprovider, &oHost, extVM, "", false) if err != nil { log.Errorf("guest.syncWithCloudVM fail %s", err) return err @@ -666,7 +672,7 @@ func (host *SHost) RebuildRecycledGuest(ctx context.Context, userCred mcclient.T log.Errorf("disk.SetExternalId fail %s", err) return err } - err = disk.syncWithCloudDisk(ctx, userCred, idisks[i], i, "", false) + err = disk.syncWithCloudDisk(ctx, userCred, iprovider, idisks[i], i, "", false) if err != nil { log.Errorf("disk.syncWithCloudDisk fail %s", err) return err diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index dd7b753bdf..6133ff5940 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -1606,7 +1606,7 @@ func (self *SHost) newCloudHostWire(ctx context.Context, userCred mcclient.Token return err } -func (self *SHost) SyncHostVMs(ctx context.Context, userCred mcclient.TokenCredential, vms []cloudprovider.ICloudVM, projectId string, projectSync bool) ([]SGuest, []cloudprovider.ICloudVM, compare.SyncResult) { +func (self *SHost) SyncHostVMs(ctx context.Context, userCred mcclient.TokenCredential, iprovider cloudprovider.ICloudProvider, vms []cloudprovider.ICloudVM, projectId string, projectSync bool) ([]SGuest, []cloudprovider.ICloudVM, compare.SyncResult) { localVMs := make([]SGuest, 0) remoteVMs := make([]cloudprovider.ICloudVM, 0) syncResult := compare.SyncResult{} @@ -1634,7 +1634,7 @@ func (self *SHost) SyncHostVMs(ctx context.Context, userCred mcclient.TokenCrede } for i := 0; i < len(commondb); i += 1 { - err := commondb[i].syncWithCloudVM(ctx, userCred, self, commonext[i], projectId, projectSync) + err := commondb[i].syncWithCloudVM(ctx, userCred, iprovider, self, commonext[i], projectId, projectSync) if err != nil { syncResult.UpdateError(err) } else { @@ -1656,7 +1656,7 @@ func (self *SHost) SyncHostVMs(ctx context.Context, userCred mcclient.TokenCrede continue } } - new, err := GuestManager.newCloudVM(ctx, userCred, self, added[i], projectId) + new, err := GuestManager.newCloudVM(ctx, userCred, iprovider, self, added[i], projectId) if err != nil { syncResult.AddError(err) } else { @@ -1884,9 +1884,14 @@ func (self *SHost) GetIZone() (cloudprovider.ICloudZone, error) { */ func (self *SHost) GetIHost() (cloudprovider.ICloudHost, error) { + host, _, err := self.GetIHostAndProvider() + return host, err +} + +func (self *SHost) GetIHostAndProvider() (cloudprovider.ICloudHost, cloudprovider.ICloudProvider, error) { provider, err := self.GetDriver() if err != nil { - return nil, fmt.Errorf("No cloudprovide for host: %s", err) + return nil, nil, fmt.Errorf("No cloudprovide for host: %s", err) } var iregion cloudprovider.ICloudRegion if provider.IsOnPremiseInfrastructure() { @@ -1896,20 +1901,20 @@ func (self *SHost) GetIHost() (cloudprovider.ICloudHost, error) { if region == nil { msg := "fail to find region of host???" log.Errorf(msg) - return nil, fmt.Errorf(msg) + return nil, nil, fmt.Errorf(msg) } iregion, err = provider.GetIRegionById(region.ExternalId) } if err != nil { log.Errorf("fail to find iregion: %s", err) - return nil, err + return nil, nil, err } ihost, err := iregion.GetIHostById(self.ExternalId) if err != nil { log.Errorf("fail to find ihost by id %s %s", self.ExternalId, err) - return nil, fmt.Errorf("fail to find ihost by id %s", err) + return nil, nil, fmt.Errorf("fail to find ihost by id %s", err) } - return ihost, nil + return ihost, provider, nil } func (self *SHost) GetIRegion() (cloudprovider.ICloudRegion, error) { diff --git a/pkg/compute/tasks/cloud_provider_sync_info_task.go b/pkg/compute/tasks/cloud_provider_sync_info_task.go index 43b837d5f5..7bfc74336c 100644 --- a/pkg/compute/tasks/cloud_provider_sync_info_task.go +++ b/pkg/compute/tasks/cloud_provider_sync_info_task.go @@ -144,8 +144,8 @@ func syncPublicCloudProviderInfo(ctx context.Context, provider *models.SCloudpro if len(syncRange.Zone) > 0 && !utils.IsInStringArray(localZones[j].Id, syncRange.Zone) { continue } - syncZoneStorages(ctx, provider, task, &localZones[j], remoteZones[j], syncRange) - syncZoneHosts(ctx, provider, task, &localZones[j], remoteZones[j], syncRange) + syncZoneStorages(ctx, provider, task, driver, &localZones[j], remoteZones[j], syncRange) + syncZoneHosts(ctx, provider, task, driver, &localZones[j], remoteZones[j], syncRange) } } syncRegionSnapshots(ctx, provider, task, &localRegions[i], remoteRegions[i], syncRange) @@ -468,7 +468,7 @@ func syncWireNetworks(ctx context.Context, provider *models.SCloudprovider, task logclient.AddActionLog(provider, getAction(task.GetParams()), notes, task.GetUserCred(), true) } -func syncZoneStorages(ctx context.Context, provider *models.SCloudprovider, task *CloudProviderSyncInfoTask, localZone *models.SZone, remoteZone cloudprovider.ICloudZone, syncRange *models.SSyncRange) { +func syncZoneStorages(ctx context.Context, provider *models.SCloudprovider, task *CloudProviderSyncInfoTask, driver cloudprovider.ICloudProvider, localZone *models.SZone, remoteZone cloudprovider.ICloudZone, syncRange *models.SSyncRange) { storages, err := remoteZone.GetIStorages() if err != nil { msg := fmt.Sprintf("GetIStorages for zone %s failed %s", remoteZone.GetName(), err) @@ -489,7 +489,7 @@ func syncZoneStorages(ctx context.Context, provider *models.SCloudprovider, task for i := 0; i < len(localStorages); i += 1 { syncStorageCaches(ctx, provider, task, &localStorages[i], remoteStorages[i]) - syncStorageDisks(ctx, provider, task, &localStorages[i], remoteStorages[i], syncRange) + syncStorageDisks(ctx, provider, task, driver, &localStorages[i], remoteStorages[i], syncRange) } } @@ -510,7 +510,7 @@ func syncStorageCaches(ctx context.Context, provider *models.SCloudprovider, tas } } -func syncStorageDisks(ctx context.Context, provider *models.SCloudprovider, task *CloudProviderSyncInfoTask, localStorage *models.SStorage, remoteStorage cloudprovider.ICloudStorage, syncRange *models.SSyncRange) { +func syncStorageDisks(ctx context.Context, provider *models.SCloudprovider, task *CloudProviderSyncInfoTask, driver cloudprovider.ICloudProvider, localStorage *models.SStorage, remoteStorage cloudprovider.ICloudStorage, syncRange *models.SSyncRange) { disks, err := remoteStorage.GetIDisks() if err != nil { msg := fmt.Sprintf("GetIDisks for storage %s failed %s", remoteStorage.GetName(), err) @@ -518,7 +518,7 @@ func syncStorageDisks(ctx context.Context, provider *models.SCloudprovider, task logSyncFailed(provider, task, msg) return } - _, _, result := models.DiskManager.SyncDisks(ctx, task.UserCred, localStorage, disks, provider.ProjectId, syncRange.ProjectSync) + _, _, result := models.DiskManager.SyncDisks(ctx, task.UserCred, driver, localStorage, disks, provider.ProjectId, syncRange.ProjectSync) msg := result.Result() notes := fmt.Sprintf("SyncDisks for storage %s result: %s", localStorage.Name, msg) log.Infof(notes) @@ -530,7 +530,7 @@ func syncStorageDisks(ctx context.Context, provider *models.SCloudprovider, task logclient.AddActionLog(provider, getAction(task.Params), notes, task.UserCred, true) } -func syncZoneHosts(ctx context.Context, provider *models.SCloudprovider, task *CloudProviderSyncInfoTask, localZone *models.SZone, remoteZone cloudprovider.ICloudZone, syncRange *models.SSyncRange) { +func syncZoneHosts(ctx context.Context, provider *models.SCloudprovider, task *CloudProviderSyncInfoTask, driver cloudprovider.ICloudProvider, localZone *models.SZone, remoteZone cloudprovider.ICloudZone, syncRange *models.SSyncRange) { hosts, err := remoteZone.GetIHosts() if err != nil { msg := fmt.Sprintf("GetIHosts for zone %s failed %s", remoteZone.GetName(), err) @@ -554,7 +554,7 @@ func syncZoneHosts(ctx context.Context, provider *models.SCloudprovider, task *C } syncHostStorages(ctx, provider, task, &localHosts[i], remoteHosts[i]) syncHostWires(ctx, provider, task, &localHosts[i], remoteHosts[i]) - syncHostVMs(ctx, provider, task, &localHosts[i], remoteHosts[i], syncRange) + syncHostVMs(ctx, provider, task, driver, &localHosts[i], remoteHosts[i], syncRange) } } @@ -602,7 +602,7 @@ func syncHostWires(ctx context.Context, provider *models.SCloudprovider, task ta logclient.AddActionLog(provider, getAction(task.GetParams()), notes, task.GetUserCred(), true) } -func syncHostVMs(ctx context.Context, provider *models.SCloudprovider, task *CloudProviderSyncInfoTask, localHost *models.SHost, remoteHost cloudprovider.ICloudHost, syncRange *models.SSyncRange) { +func syncHostVMs(ctx context.Context, provider *models.SCloudprovider, task *CloudProviderSyncInfoTask, driver cloudprovider.ICloudProvider, localHost *models.SHost, remoteHost cloudprovider.ICloudHost, syncRange *models.SSyncRange) { vms, err := remoteHost.GetIVMs() if err != nil { msg := fmt.Sprintf("GetIVMs for host %s failed %s", remoteHost.GetName(), err) @@ -610,7 +610,7 @@ func syncHostVMs(ctx context.Context, provider *models.SCloudprovider, task *Clo logSyncFailed(provider, task, msg) return } - localVMs, remoteVMs, result := localHost.SyncHostVMs(ctx, task.UserCred, vms, provider.ProjectId, syncRange.ProjectSync) + localVMs, remoteVMs, result := localHost.SyncHostVMs(ctx, task.UserCred, driver, vms, provider.ProjectId, syncRange.ProjectSync) msg := result.Result() notes := fmt.Sprintf("SyncHostVMs for host %s result: %s", localHost.Name, msg) log.Infof(notes) @@ -622,7 +622,7 @@ func syncHostVMs(ctx context.Context, provider *models.SCloudprovider, task *Clo logclient.AddActionLog(provider, getAction(task.Params), notes, task.UserCred, true) for i := 0; i < len(localVMs); i += 1 { syncVMNics(ctx, provider, task, localHost, &localVMs[i], remoteVMs[i]) - syncVMDisks(ctx, provider, task, localHost, &localVMs[i], remoteVMs[i], syncRange) + syncVMDisks(ctx, provider, task, driver, localHost, &localVMs[i], remoteVMs[i], syncRange) syncVMEip(ctx, provider, task, &localVMs[i], remoteVMs[i]) if localVMs[i].Status == models.VM_RUNNING { @@ -651,7 +651,7 @@ func syncVMNics(ctx context.Context, provider *models.SCloudprovider, task *Clou logclient.AddActionLog(provider, getAction(task.Params), notes, task.UserCred, true) } -func syncVMDisks(ctx context.Context, provider *models.SCloudprovider, task *CloudProviderSyncInfoTask, host *models.SHost, localVM *models.SGuest, remoteVM cloudprovider.ICloudVM, syncRange *models.SSyncRange) { +func syncVMDisks(ctx context.Context, provider *models.SCloudprovider, task *CloudProviderSyncInfoTask, driver cloudprovider.ICloudProvider, host *models.SHost, localVM *models.SGuest, remoteVM cloudprovider.ICloudVM, syncRange *models.SSyncRange) { disks, err := remoteVM.GetIDisks() if err != nil { msg := fmt.Sprintf("GetIDisks for VM %s failed %s", remoteVM.GetName(), err) @@ -659,7 +659,7 @@ func syncVMDisks(ctx context.Context, provider *models.SCloudprovider, task *Clo logSyncFailed(provider, task, msg) return } - result := localVM.SyncVMDisks(ctx, task.UserCred, host, disks, provider.ProjectId, syncRange.ProjectSync) + result := localVM.SyncVMDisks(ctx, task.UserCred, driver, host, disks, provider.ProjectId, syncRange.ProjectSync) msg := result.Result() notes := fmt.Sprintf("syncVMDisks for VM %s result: %s", localVM.Name, msg) log.Infof(notes) diff --git a/pkg/compute/tasks/cloud_provider_sync_onpremise_info_task.go b/pkg/compute/tasks/cloud_provider_sync_onpremise_info_task.go index 6c6761db62..a1ecd372bb 100644 --- a/pkg/compute/tasks/cloud_provider_sync_onpremise_info_task.go +++ b/pkg/compute/tasks/cloud_provider_sync_onpremise_info_task.go @@ -47,7 +47,7 @@ func syncOnPremiseCloudProviderInfo(ctx context.Context, provider *models.SCloud } syncHostStorages(ctx, provider, task, &localHosts[i], remoteHosts[i]) syncHostNics(ctx, provider, task, &localHosts[i], remoteHosts[i]) - syncHostVMs(ctx, provider, task, &localHosts[i], remoteHosts[i], syncRange) + syncHostVMs(ctx, provider, task, driver, &localHosts[i], remoteHosts[i], syncRange) } } diff --git a/pkg/util/aliyun/provider/provider.go b/pkg/util/aliyun/provider/provider.go index e88aaf6088..d64a04a349 100644 --- a/pkg/util/aliyun/provider/provider.go +++ b/pkg/util/aliyun/provider/provider.go @@ -141,3 +141,7 @@ func (self *SAliyunProvider) GetBalance() (float64, error) { func (self *SAliyunProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, error) { return nil, cloudprovider.ErrNotImplemented } + +func (self *SAliyunProvider) SupportPrepaidResources() bool { + return true +} diff --git a/pkg/util/aws/provider/provider.go b/pkg/util/aws/provider/provider.go index dc2b617e53..ceb9eeb620 100644 --- a/pkg/util/aws/provider/provider.go +++ b/pkg/util/aws/provider/provider.go @@ -124,3 +124,7 @@ func (self *SAwsProvider) GetBalance() (float64, error) { func (self *SAwsProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, error) { return nil, cloudprovider.ErrNotImplemented } + +func (self *SAwsProvider) SupportPrepaidResources() bool { + return true +} diff --git a/pkg/util/azure/provider/provider.go b/pkg/util/azure/provider/provider.go index 88fc56849e..277414dc9b 100644 --- a/pkg/util/azure/provider/provider.go +++ b/pkg/util/azure/provider/provider.go @@ -130,3 +130,7 @@ func (self *SAzureProvider) GetBalance() (float64, error) { func (self *SAzureProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, error) { return nil, cloudprovider.ErrNotImplemented } + +func (self *SAzureProvider) SupportPrepaidResources() bool { + return true +} diff --git a/pkg/util/esxi/provider/provider.go b/pkg/util/esxi/provider/provider.go index 9ed8b1b9fa..da1a16d468 100644 --- a/pkg/util/esxi/provider/provider.go +++ b/pkg/util/esxi/provider/provider.go @@ -154,3 +154,7 @@ func (self *SESXiProvider) GetBalance() (float64, error) { func (self *SESXiProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, error) { return self.client, nil } + +func (self *SESXiProvider) SupportPrepaidResources() bool { + return false +} diff --git a/pkg/util/huawei/provider/provider.go b/pkg/util/huawei/provider/provider.go index 1abcb9fd94..42738e14ec 100644 --- a/pkg/util/huawei/provider/provider.go +++ b/pkg/util/huawei/provider/provider.go @@ -125,3 +125,7 @@ func (self *SHuaweiProvider) GetBalance() (float64, error) { func (self *SHuaweiProvider) GetSubAccounts() ([]cloudprovider.SSubAccount, error) { return self.client.GetSubAccounts() } + +func (self *SHuaweiProvider) SupportPrepaidResources() bool { + return true +} diff --git a/pkg/util/openstack/provider/provider.go b/pkg/util/openstack/provider/provider.go index 162ee18304..703a06b17f 100644 --- a/pkg/util/openstack/provider/provider.go +++ b/pkg/util/openstack/provider/provider.go @@ -137,3 +137,7 @@ func (self *SOpenStackProvider) GetBalance() (float64, error) { func (self *SOpenStackProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, error) { return nil, cloudprovider.ErrNotImplemented } + +func (self *SOpenStackProvider) SupportPrepaidResources() bool { + return false +} diff --git a/pkg/util/qcloud/provider/provider.go b/pkg/util/qcloud/provider/provider.go index af1f4215c8..fbde5b066b 100644 --- a/pkg/util/qcloud/provider/provider.go +++ b/pkg/util/qcloud/provider/provider.go @@ -137,3 +137,7 @@ func (self *SQcloudProvider) GetBalance() (float64, error) { func (self *SQcloudProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, error) { return nil, cloudprovider.ErrNotImplemented } + +func (self *SQcloudProvider) SupportPrepaidResources() bool { + return true +}