Merge pull request #2267 from swordqiu/hotfix/qj-cloud-account-misc-bugfixes-20190813

Hotfix/qj cloud account misc bugfixes 20190813
This commit is contained in:
Yousong Zhou
2019-08-14 10:16:37 +08:00
committed by GitHub
8 changed files with 88 additions and 32 deletions
+14 -4
View File
@@ -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)
+20 -6
View File
@@ -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) {
+20
View File
@@ -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)
}
+7 -3
View File
@@ -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
+8 -6
View File
@@ -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 {
+11 -5
View File
@@ -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
}
+2 -3
View File
@@ -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
}
+6 -5
View File
@@ -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) {