From c777c752f7a269e866f9cf4bdc3cfc973788c082 Mon Sep 17 00:00:00 2001 From: TangBin Date: Tue, 12 Nov 2019 15:19:48 +0800 Subject: [PATCH] elastic cache sync bugfix --- pkg/compute/models/cloudsync.go | 34 ++++++++++++------- pkg/compute/models/elasticcache_instances.go | 10 ++++++ pkg/compute/models/elasticcache_skus.go | 8 ++++- pkg/compute/models/skus_tools.go | 7 ++-- pkg/multicloud/huawei/elasticcache_account.go | 8 +++-- pkg/multicloud/huawei/elasticcache_backup.go | 17 ++++++++++ .../huawei/elasticcache_instance.go | 17 ++++++++-- 7 files changed, 79 insertions(+), 22 deletions(-) diff --git a/pkg/compute/models/cloudsync.go b/pkg/compute/models/cloudsync.go index 0426961e66..e265047e7b 100644 --- a/pkg/compute/models/cloudsync.go +++ b/pkg/compute/models/cloudsync.go @@ -110,24 +110,32 @@ func syncRegionSkus(ctx context.Context, userCred mcclient.TokenCredential, loca log.Errorf("GetSkuCountByRegion fail %s", err) return } - if cnt > 0 { - return - } - // 提前同步instance type.如果同步失败可能导致vm 内存显示为0 - if err = syncSkusByRegion(localRegion); err != nil { - msg := fmt.Sprintf("Get Skus for region %s failed %s", localRegion.GetName(), err) - log.Errorln(msg) - // 暂时不终止同步 - // logSyncFailed(provider, task, msg) - return + + if cnt == 0 { + // 提前同步instance type.如果同步失败可能导致vm 内存显示为0 + if err = syncSkusByRegion(localRegion); err != nil { + msg := fmt.Sprintf("Get Skus for region %s failed %s", localRegion.GetName(), err) + log.Errorln(msg) + // 暂时不终止同步 + // logSyncFailed(provider, task, msg) + return + } + + _, err = modules.SchedManager.SyncSku(auth.GetAdminSession(ctx, options.Options.Region, ""), false) + if err != nil { + log.Errorf("SchedManager SyncSku %s", err) + } } - _, err = modules.SchedManager.SyncSku(auth.GetAdminSession(ctx, options.Options.Region, ""), false) + cnt, err = ElasticcacheSkuManager.GetSkuCountByRegion(regionId) if err != nil { - log.Errorf("SchedManager SyncSku %s", err) + log.Errorf("ElasticcacheSkuManager.GetSkuCountByRegion fail %s", err) + return } - syncElasticCacheSkusByRegion(ctx, userCred, localRegion) + if cnt == 0 { + syncElasticCacheSkusByRegion(ctx, userCred, localRegion) + } } func syncProjects(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, driver cloudprovider.ICloudProvider, provider *SCloudprovider) { diff --git a/pkg/compute/models/elasticcache_instances.go b/pkg/compute/models/elasticcache_instances.go index f0a4426fb8..a1a1694642 100644 --- a/pkg/compute/models/elasticcache_instances.go +++ b/pkg/compute/models/elasticcache_instances.go @@ -121,6 +121,16 @@ func (self *SElasticcache) GetCustomizeColumns(ctx context.Context, userCred mcc extra := self.SStatusStandaloneResourceBase.GetCustomizeColumns(ctx, userCred, query) info := self.getCloudProviderInfo() extra.Update(jsonutils.Marshal(&info)) + + vpc, err := VpcManager.FetchById(self.VpcId) + if err == nil { + extra.Set("vpc", jsonutils.NewString(vpc.GetName())) + } + + network, err := NetworkManager.FetchById(self.NetworkId) + if err == nil { + extra.Set("network", jsonutils.NewString(network.GetName())) + } return extra } diff --git a/pkg/compute/models/elasticcache_skus.go b/pkg/compute/models/elasticcache_skus.go index 3adefc90c8..0c8cff1663 100644 --- a/pkg/compute/models/elasticcache_skus.go +++ b/pkg/compute/models/elasticcache_skus.go @@ -96,6 +96,12 @@ func (self *SElasticcacheSku) GetCustomizeColumns(ctx context.Context, userCred return self.SStatusStandaloneResourceBase.GetCustomizeColumns(ctx, userCred, query) } +func (manager *SElasticcacheSkuManager) GetSkuCountByRegion(regionId string) (int, error) { + q := manager.Query().Equals("cloudregion_id", regionId) + + return q.CountWithError() +} + func (manager *SElasticcacheSkuManager) FetchCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, objs []db.IModel, fields stringutils2.SSortedStrings) []*jsonutils.JSONDict { regions := map[string]string{} for i := range objs { @@ -189,7 +195,7 @@ func (manager *SElasticcacheSkuManager) FetchSkusByRegion(regionID string) ([]SE return skus, nil } -func (manager *SElasticcacheSkuManager) syncDBInstanceSkus(ctx context.Context, userCred mcclient.TokenCredential, region *SCloudregion, extSkuMeta *SSkuResourcesMeta) compare.SyncResult { +func (manager *SElasticcacheSkuManager) syncElasticcacheSkus(ctx context.Context, userCred mcclient.TokenCredential, region *SCloudregion, extSkuMeta *SSkuResourcesMeta) compare.SyncResult { lockman.LockClass(ctx, manager, db.GetLockClassKey(manager, userCred)) defer lockman.ReleaseClass(ctx, manager, db.GetLockClassKey(manager, userCred)) diff --git a/pkg/compute/models/skus_tools.go b/pkg/compute/models/skus_tools.go index 6f451f4b6c..a399a84fc8 100644 --- a/pkg/compute/models/skus_tools.go +++ b/pkg/compute/models/skus_tools.go @@ -179,9 +179,8 @@ func (self *SSkuResourcesMeta) filterByRegion(items []jsonutils.JSONObject) []js ret := []jsonutils.JSONObject{} for i := range items { item := items[i] - provider, _ := item.GetString("provider") regionId, _ := item.GetString("cloudregion_id") - if self.region.GetExternalId() != fmt.Sprintf("%s/%s", provider, regionId) { + if self.region.GetExternalId() != strings.TrimSpace(regionId) { continue } @@ -305,7 +304,7 @@ func SyncElasticCacheSkus(ctx context.Context, userCred mcclient.TokenCredential for i := range cloudregions { region := &cloudregions[i] meta.SetRegionFilter(region) - result := ElasticcacheSkuManager.syncDBInstanceSkus(ctx, userCred, region, meta) + result := ElasticcacheSkuManager.syncElasticcacheSkus(ctx, userCred, region, meta) notes := fmt.Sprintf("syncElasticCacheSkusByRegion %s result: %s", region.Name, result.Result()) log.Infof(notes) } @@ -320,7 +319,7 @@ func syncElasticCacheSkusByRegion(ctx context.Context, userCred mcclient.TokenCr } meta.SetRegionFilter(region) - result := ElasticcacheSkuManager.syncDBInstanceSkus(ctx, userCred, region, meta) + result := ElasticcacheSkuManager.syncElasticcacheSkus(ctx, userCred, region, meta) notes := fmt.Sprintf("syncElasticCacheSkusByRegion %s result: %s", region.Name, result.Result()) log.Infof(notes) } diff --git a/pkg/multicloud/huawei/elasticcache_account.go b/pkg/multicloud/huawei/elasticcache_account.go index 8c39d40a00..3350294b7b 100644 --- a/pkg/multicloud/huawei/elasticcache_account.go +++ b/pkg/multicloud/huawei/elasticcache_account.go @@ -32,11 +32,15 @@ type SElasticcacheAccount struct { } func (self *SElasticcacheAccount) GetId() string { - return fmt.Sprintf("%s/admin", self.cacheDB.InstanceID) + return fmt.Sprintf("%s/root", self.cacheDB.InstanceID) } func (self *SElasticcacheAccount) GetName() string { - return self.cacheDB.AccessUser + if len(self.cacheDB.AccessUser) > 0 { + return self.cacheDB.AccessUser + } + + return "root" } func (self *SElasticcacheAccount) GetGlobalId() string { diff --git a/pkg/multicloud/huawei/elasticcache_backup.go b/pkg/multicloud/huawei/elasticcache_backup.go index acc59589c3..3fabd35e44 100644 --- a/pkg/multicloud/huawei/elasticcache_backup.go +++ b/pkg/multicloud/huawei/elasticcache_backup.go @@ -17,6 +17,9 @@ package huawei import ( "time" + "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud" @@ -56,6 +59,20 @@ func (self *SElasticcacheBackup) GetGlobalId() string { return self.GetId() } +func (self *SElasticcacheBackup) Refresh() error { + cache, err := self.cacheDB.GetICloudElasticcacheBackup(self.GetId()) + if err != nil { + return errors.Wrap(err, "ElasticcacheBackup.Refresh.GetICloudElasticcacheBackup") + } + + err = jsonutils.Update(self, cache) + if err != nil { + return errors.Wrap(err, "ElasticcacheBackup.Refresh.Update") + } + + return nil +} + func (self *SElasticcacheBackup) GetStatus() string { switch self.Status { case "waiting", "backuping": diff --git a/pkg/multicloud/huawei/elasticcache_instance.go b/pkg/multicloud/huawei/elasticcache_instance.go index 97b380a3bb..b3af98814f 100644 --- a/pkg/multicloud/huawei/elasticcache_instance.go +++ b/pkg/multicloud/huawei/elasticcache_instance.go @@ -19,10 +19,9 @@ import ( "strings" "time" - "github.com/pkg/errors" - "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" billing_api "yunion.io/x/onecloud/pkg/apis/billing" api "yunion.io/x/onecloud/pkg/apis/compute" @@ -98,6 +97,20 @@ func (self *SElasticcache) GetGlobalId() string { return self.GetId() } +func (self *SElasticcache) Refresh() error { + cache, err := self.region.GetElasticCache(self.GetId()) + if err != nil { + return errors.Wrap(err, "Elasticcache.Refresh.GetElasticCache") + } + + err = jsonutils.Update(self, cache) + if err != nil { + return errors.Wrap(err, "Elasticcache.Refresh.Update") + } + + return nil +} + func (self *SElasticcache) GetStatus() string { switch self.Status { case "RUNNING":