diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index b6d9be986b..20eaf62884 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -517,9 +517,11 @@ func (self *SCloudaccount) markStartSync(userCred mcclient.TokenCredential) erro } providers := self.GetCloudproviders() for i := range providers { - err := providers[i].markStartingSync(userCred) - if err != nil { - return errors.Wrap(err, "providers.markStartSync") + if providers[i].Enabled { + err := providers[i].markStartingSync(userCred) + if err != nil { + return errors.Wrap(err, "providers.markStartSync") + } } } return nil @@ -547,8 +549,16 @@ func (self *SCloudaccount) MarkEndSyncWithLock(ctx context.Context, userCred mcc return nil } + providers := self.GetCloudproviders() + for i := range providers { + err := providers[i].cancelStartingSync(userCred) + if err != nil { + return errors.Wrap(err, "providers.cancelStartingSync") + } + } + if self.getSyncStatus2() != api.CLOUD_PROVIDER_SYNC_STATUS_IDLE { - return nil + return errors.Error("some cloud providers not idle") } return self.markEndSync(userCred) diff --git a/pkg/compute/models/cloudproviderregions.go b/pkg/compute/models/cloudproviderregions.go index a08602fb9b..305c57141f 100644 --- a/pkg/compute/models/cloudproviderregions.go +++ b/pkg/compute/models/cloudproviderregions.go @@ -23,11 +23,12 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/compare" "yunion.io/x/pkg/util/timeutils" "yunion.io/x/sqlchemy" - "yunion.io/x/onecloud/pkg/apis/compute" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" @@ -213,7 +214,7 @@ func (manager *SCloudproviderregionManager) FetchByIdsOrCreate(providerId string cpr.CloudproviderId = providerId cpr.CloudregionId = regionId cpr.Enabled = true - cpr.SyncStatus = compute.CLOUD_PROVIDER_SYNC_STATUS_IDLE + cpr.SyncStatus = api.CLOUD_PROVIDER_SYNC_STATUS_IDLE err := manager.TableSpec().Insert(cpr) if err != nil { @@ -228,7 +229,7 @@ func (self *SCloudproviderregion) markStartingSync(userCred mcclient.TokenCreden return fmt.Errorf("Cloudprovider(%s)region(%s) disabled", self.CloudproviderId, self.CloudregionId) } _, err := db.Update(self, func() error { - self.SyncStatus = compute.CLOUD_PROVIDER_SYNC_STATUS_QUEUING + self.SyncStatus = api.CLOUD_PROVIDER_SYNC_STATUS_QUEUING return nil }) if err != nil { @@ -243,7 +244,7 @@ func (self *SCloudproviderregion) markStartSync(userCred mcclient.TokenCredentia return fmt.Errorf("Cloudprovider(%s)region(%s) disabled", self.CloudproviderId, self.CloudregionId) } _, err := db.Update(self, func() error { - self.SyncStatus = compute.CLOUD_PROVIDER_SYNC_STATUS_QUEUED + self.SyncStatus = api.CLOUD_PROVIDER_SYNC_STATUS_QUEUED return nil }) if err != nil { @@ -258,7 +259,7 @@ func (self *SCloudproviderregion) markSyncing(userCred mcclient.TokenCredential) return fmt.Errorf("Cloudprovider(%s)region(%s) disabled", self.CloudproviderId, self.CloudregionId) } _, err := db.Update(self, func() error { - self.SyncStatus = compute.CLOUD_PROVIDER_SYNC_STATUS_SYNCING + self.SyncStatus = api.CLOUD_PROVIDER_SYNC_STATUS_SYNCING self.LastSync = timeutils.UtcNow() self.LastSyncEndAt = time.Time{} return nil @@ -285,7 +286,7 @@ func (self *SCloudproviderregion) markEndSync(ctx context.Context, userCred mccl func (self *SCloudproviderregion) markEndSyncInternal(userCred mcclient.TokenCredential, syncResults SSyncResultSet, deepSync *bool) error { _, err := db.Update(self, func() error { - self.SyncStatus = compute.CLOUD_PROVIDER_SYNC_STATUS_IDLE + self.SyncStatus = api.CLOUD_PROVIDER_SYNC_STATUS_IDLE self.LastSyncEndAt = timeutils.UtcNow() self.SyncResults = jsonutils.Marshal(syncResults) if *deepSync { @@ -300,6 +301,19 @@ func (self *SCloudproviderregion) markEndSyncInternal(userCred mcclient.TokenCre return nil } +func (self *SCloudproviderregion) cancelStartingSync(userCred mcclient.TokenCredential) error { + if self.SyncStatus == api.CLOUD_PROVIDER_SYNC_STATUS_QUEUING { + _, err := db.Update(self, func() error { + self.SyncStatus = api.CLOUD_PROVIDER_SYNC_STATUS_IDLE + return nil + }) + if err != nil { + return errors.Wrap(err, "db.Update") + } + } + return nil +} + type SSyncResultSet map[string]*compare.SyncResult func (set SSyncResultSet) Add(manager db.IModelManager, result compare.SyncResult) { diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 6a91bae2b5..b278f10e92 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -679,6 +679,26 @@ func (self *SCloudprovider) markEndSync(userCred mcclient.TokenCredential) error return nil } +func (self *SCloudprovider) cancelStartingSync(userCred mcclient.TokenCredential) error { + if self.SyncStatus == api.CLOUD_PROVIDER_SYNC_STATUS_QUEUING { + cprs := self.GetCloudproviderRegions() + for i := range cprs { + err := cprs[i].cancelStartingSync(userCred) + if err != nil { + return errors.Wrap(err, "cprs[i].cancelStartingSync") + } + } + _, err := db.Update(self, func() error { + self.SyncStatus = api.CLOUD_PROVIDER_SYNC_STATUS_IDLE + return nil + }) + if err != nil { + return errors.Wrap(err, "db.Update") + } + } + return nil +} + func (self *SCloudprovider) GetProviderFactory() (cloudprovider.ICloudProviderFactory, error) { return cloudprovider.GetProviderFactory(self.Provider) } diff --git a/pkg/multicloud/aws/aws.go b/pkg/multicloud/aws/aws.go index 268d16bf3a..c4b56d86bc 100644 --- a/pkg/multicloud/aws/aws.go +++ b/pkg/multicloud/aws/aws.go @@ -127,6 +127,7 @@ func (self *SAwsClient) UpdateAccount(accessKey, secret string) error { if self.accessKey != accessKey || self.secret != secret { self.accessKey = accessKey self.secret = secret + self.iregions = nil return self.fetchRegions() } else { return nil @@ -135,6 +136,9 @@ func (self *SAwsClient) UpdateAccount(accessKey, secret string) error { // 用于初始化region信息 func (self *SAwsClient) fetchRegions() error { + if self.iregions != nil { + return nil + } s, err := self.getDefaultSession() if err != nil { return err @@ -148,9 +152,9 @@ func (self *SAwsClient) fetchRegions() error { regions := make([]SRegion, 0) // empty iregions - if self.iregions != nil { - self.iregions = self.iregions[:0] - } + // if self.iregions != nil { + // self.iregions = self.iregions[:0] + // } for _, region := range result.Regions { name := *region.RegionName diff --git a/pkg/multicloud/azure/azure.go b/pkg/multicloud/azure/azure.go index 3925582142..cc4ac53960 100644 --- a/pkg/multicloud/azure/azure.go +++ b/pkg/multicloud/azure/azure.go @@ -104,9 +104,11 @@ func NewAzureClient(providerId string, providerName string, envName, tenantId, c if err != nil { return nil, errors.Wrap(err, "fetchRegions") } - err = client.fetchBuckets() - if err != nil { - return nil, errors.Wrap(err, "fetchBuckets") + if len(subscriptionId) > 0 { + err = client.fetchBuckets() + if err != nil { + return nil, errors.Wrap(err, "fetchBuckets") + } } return &client, nil } @@ -903,10 +905,10 @@ func (self *SAzureClient) GetIProjects() ([]cloudprovider.ICloudProject, error) return iprojects, nil } -func (self *SAzureClient) GetStorageClasses(regionId string) ([]string, error) { - iRegion, err := self.GetIRegionById(regionId) +func (self *SAzureClient) GetStorageClasses(regionExtId string) ([]string, error) { + iRegion, err := self.GetIRegionById(regionExtId) if err != nil { - return nil, errors.Wrap(err, "getDefaultRegion") + return nil, errors.Wrap(err, "self.GetIRegionById") } skus, err := iRegion.(*SRegion).GetStorageAccountSkus() if err != nil { diff --git a/pkg/multicloud/huawei/huawei.go b/pkg/multicloud/huawei/huawei.go index 36e90c8ad7..2208d6c448 100644 --- a/pkg/multicloud/huawei/huawei.go +++ b/pkg/multicloud/huawei/huawei.go @@ -164,12 +164,17 @@ func (self *SHuaweiClient) getIBuckets() ([]cloudprovider.ICloudBucket, error) { return self.iBuckets, nil } +func getOBSEndpoint(regionId string) string { + return fmt.Sprintf("obs.%s.myhuaweicloud.com", regionId) +} + +func (client *SHuaweiClient) getOBSClient(regionId string) (*obs.ObsClient, error) { + endpoint := getOBSEndpoint(regionId) + return obs.New(client.accessKey, client.secret, endpoint) +} + func (self *SHuaweiClient) fetchBuckets() error { - if len(self.iregions) == 0 { - return errors.Error("no region???") - } - region := self.iregions[0].(*SRegion) - obscli, err := region.getOBSClient() + obscli, err := self.getOBSClient(HUAWEI_DEFAULT_REGION) if err != nil { return errors.Wrap(err, "getOBSClient") } @@ -266,6 +271,7 @@ func (self *SHuaweiClient) GetIRegions() []cloudprovider.ICloudRegion { func (self *SHuaweiClient) getIRegionByRegionId(id string) (cloudprovider.ICloudRegion, error) { for i := 0; i < len(self.iregions); i += 1 { + log.Debugf("%d ID: %s", i, self.iregions[i].GetId()) if self.iregions[i].GetId() == id { return self.iregions[i], nil } diff --git a/pkg/multicloud/huawei/region.go b/pkg/multicloud/huawei/region.go index c9cd987dfb..565c7904c7 100644 --- a/pkg/multicloud/huawei/region.go +++ b/pkg/multicloud/huawei/region.go @@ -92,13 +92,12 @@ func (self *SRegion) getECSClient() (*client.Client, error) { } func (self *SRegion) getOBSEndpoint() string { - return fmt.Sprintf("obs.%s.myhuaweicloud.com", self.GetId()) + return getOBSEndpoint(self.GetId()) } func (self *SRegion) getOBSClient() (*obs.ObsClient, error) { if self.obsClient == nil { - endpoint := self.getOBSEndpoint() - obsClient, err := obs.New(self.client.accessKey, self.client.secret, endpoint) + obsClient, err := self.client.getOBSClient(self.GetId()) if err != nil { return nil, err } diff --git a/pkg/multicloud/qcloud/qcloud.go b/pkg/multicloud/qcloud/qcloud.go index 76347b5625..d2f4ab19bd 100644 --- a/pkg/multicloud/qcloud/qcloud.go +++ b/pkg/multicloud/qcloud/qcloud.go @@ -525,7 +525,7 @@ func (client *SQcloudClient) verifyAppId() error { return errors.Wrap(err, "getDefaultRegion") } bucket := SBucket{ - region: region.(*SRegion), + region: region, Name: "yuniondocument", } cli, err := client.getCosClient(&bucket) @@ -602,11 +602,12 @@ func (client *SQcloudClient) GetIRegions() []cloudprovider.ICloudRegion { return client.iregions } -func (client *SQcloudClient) getDefaultRegion() (cloudprovider.ICloudRegion, error) { - if len(client.iregions) > 0 { - return client.iregions[0], nil +func (client *SQcloudClient) getDefaultRegion() (*SRegion, error) { + iregion, err := client.getIRegionByRegionId(QCLOUD_DEFAULT_REGION) + if err != nil { + return nil, errors.Wrap(err, "getIRegionByRegionId") } - return nil, cloudprovider.ErrNotFound + return iregion.(*SRegion), nil } func (client *SQcloudClient) getIRegionByRegionId(id string) (cloudprovider.ICloudRegion, error) {