Merge pull request #679 in YUNIONIO/onecloud from ~TANGBIN/onecloud:bugfix/tb-skus-sync to release/2.4.0

* commit 'ea3df1d1901df9f4869669e894c1894657fb2a33':
  make fmt
  sync skus bugfix
  sku sync add limit & offset
  skus sync with account
This commit is contained in:
唐斌
2018-12-05 17:58:50 +08:00
4 changed files with 71 additions and 24 deletions
+53 -19
View File
@@ -103,32 +103,41 @@ func processSkuData(ndata jsonutils.JSONObject) jsonutils.JSONObject {
func (self *SkusZone) Init() error {
s := auth.GetAdminSession(options.Options.Region, "")
p, r, z := self.getExternalZone()
ret, e := modules.CloudmetaSkus.GetSkus(s, p, r, z)
if e != nil {
log.Debugf("SkusZone %s init failed, %s", z, e.Error())
return e
}
limit := 1024
offset := 0
total := 1024
records := map[string]jsonutils.JSONObject{}
for _, sku := range ret.Data {
name, err := sku.GetString("name")
if err != nil {
log.Debugf("SkusZone sku name empty : %s", sku)
return err
for offset < total {
ret, e := modules.CloudmetaSkus.GetSkus(s, p, r, z, limit, offset)
if e != nil {
log.Debugf("SkusZone %s init failed, %s", z, e.Error())
return e
}
if odata, exists := records[name]; exists {
records[name] = mergeSkuData(odata, sku)
} else {
records[name] = processSkuData(sku)
for _, sku := range ret.Data {
name, err := sku.GetString("name")
if err != nil {
log.Debugf("SkusZone sku name empty : %s", sku)
return err
}
if odata, exists := records[name]; exists {
records[name] = mergeSkuData(odata, sku)
} else {
records[name] = processSkuData(sku)
}
}
offset += limit
total = ret.Total
}
filtedData := []jsonutils.JSONObject{}
for _, item := range records {
filtedData = append(filtedData, item)
}
self.total = len(records)
self.skus = filtedData
return nil
@@ -208,6 +217,9 @@ func (self *SkusZone) getExternalZone() (string, string, string) {
if len(parts) == 3 {
// provider, region, zone
return parts[0], parts[1], parts[2]
} else if len(parts) == 2 && parts[0] == models.CLOUD_PROVIDER_AZURE {
// azure 没有zone的概念
return parts[0], parts[1], parts[1]
}
log.Debugf("SkusZone invalid external zone id %s", self.ExternalZoneId)
@@ -235,9 +247,17 @@ func (self *SkusZoneList) initData(provider string, region models.SCloudregion,
}
}
func (self *SkusZoneList) Refresh() error {
provideIds := cloudprovider.GetRegistedProviderIds()
for _, p := range provideIds {
func (self *SkusZoneList) Refresh(providerIds *[]string) error {
self.Data = []*SkusZone{}
var pIds []string
if providerIds == nil {
pIds = cloudprovider.GetRegistedProviderIds()
} else {
pIds = *providerIds
}
for _, p := range pIds {
regions, e := models.CloudregionManager.GetRegionByProvider(p)
if e != nil {
return e
@@ -288,7 +308,7 @@ func (self *SkusZoneList) SyncToLocalDB() error {
func SyncSkus(ctx context.Context, userCred mcclient.TokenCredential) {
skus := SkusZoneList{}
if e := skus.Refresh(); e != nil {
if e := skus.Refresh(nil); e != nil {
log.Errorf("SyncSkus refresh failed, %s", e.Error())
}
@@ -296,3 +316,17 @@ func SyncSkus(ctx context.Context, userCred mcclient.TokenCredential) {
log.Errorf("SyncSkus sync to local db failed, %s", e.Error())
}
}
func SyncSkusByProviderIds(providerIds []string) error {
skus := SkusZoneList{}
log.Debugf("SyncSkusByProviderIds %s", providerIds)
if e := skus.Refresh(&providerIds); e != nil {
return fmt.Errorf("SyncSkus refresh failed, %s", e.Error())
}
if e := skus.SyncToLocalDB(); e != nil {
return fmt.Errorf("SyncSkus sync to local db failed, %s", e.Error())
}
return nil
}
@@ -7,6 +7,7 @@ import (
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
"yunion.io/x/onecloud/pkg/compute/models"
"yunion.io/x/onecloud/pkg/compute/skus"
)
type CloudAccountSyncInfoTask struct {
@@ -82,6 +83,11 @@ func (self *CloudAccountSyncInfoTask) OnCloudaccountSyncComplete(ctx context.Con
if account != nil {
account.SetStatus(self.UserCred, models.CLOUD_PROVIDER_CONNECTED, "")
}
// sync skus
if err := skus.SyncSkusByProviderIds([]string{cloudprovider.Provider}); err != nil {
self.SetStageFailed(ctx, err.Error())
}
}
self.SetStageComplete(ctx, nil)
}
+2 -2
View File
@@ -37,11 +37,11 @@ func init() {
registerCompute(&ServerSkus)
}
func (self *SkusManager) GetSkus(s *mcclient.ClientSession, providerId, regionId, zoneId string) (*ListResult, error) {
func (self *SkusManager) GetSkus(s *mcclient.ClientSession, providerId, regionId, zoneId string, limit, offset int) (*ListResult, error) {
p := strings.ToLower(providerId)
r := strings.ToLower(regionId)
z := strings.ToLower(zoneId)
url := fmt.Sprintf("/providers/%s/regions/%s/zones/%s/skus", p, r, z)
url := fmt.Sprintf("/providers/%s/regions/%s/zones/%s/skus?limit=%d&offset=%d", p, r, z, limit, offset)
ret, err := self._list(s, url, self.KeywordPlural)
if err != nil {
return &ListResult{}, err
+10 -3
View File
@@ -87,7 +87,6 @@ func (self *SImage) GetStatus() string {
}
func (self *SImage) Refresh() error {
// todo: GetImage
new, err := self.storageCache.region.GetImage(self.ImageId)
if err != nil {
return err
@@ -173,7 +172,11 @@ func (self *SRegion) ExportImage(instanceId string, imageId string) (*ImageExpor
}
func (self *SRegion) GetImage(imageId string) (*SImage, error) {
images, _, err := self.GetImages("", ImageOwnerSelf, []string{imageId}, "", 0, 1)
if len(imageId) == 0 {
return nil, fmt.Errorf("image id should not be empty")
}
images, _, err := self.GetImages("", ImageOwnerType(""), []string{imageId}, "", 0, 1)
if err != nil {
return nil, err
}
@@ -184,7 +187,11 @@ func (self *SRegion) GetImage(imageId string) (*SImage, error) {
}
func (self *SRegion) GetImageByName(name string) (*SImage, error) {
images, _, err := self.GetImages("", ImageOwnerSelf, nil, name, 0, 1)
if len(name) == 0 {
return nil, fmt.Errorf("image name should not be empty")
}
images, _, err := self.GetImages("", ImageOwnerType(""), nil, name, 0, 1)
if err != nil {
return nil, err
}