diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index c28eef232e..48147cc8bb 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -686,6 +686,11 @@ func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlch case DBInstanceManager.KeywordPlural(): skusSQ := DBInstanceSkuManager.Query("cloudregion_id").Equals("status", api.DBINSTANCE_SKU_AVAILABLE).IsTrue("enabled").SubQuery() q = q.In("id", skusSQ) + case ElasticcacheManager.KeywordPlural(): + q2 := ElasticcacheSkuManager.Query("cloudregion_id") + statusFilter := sqlchemy.OR(sqlchemy.Equals(q2.Field("prepaid_status"), api.SkuStatusAvailable), sqlchemy.Equals(q2.Field("postpaid_status"), api.SkuStatusAvailable)) + skusSQ := q2.Filter(statusFilter).SubQuery() + q = q.In("id", skusSQ) default: break } diff --git a/pkg/compute/models/skus_tools.go b/pkg/compute/models/skus_tools.go index 106a1f6759..426fc479d3 100644 --- a/pkg/compute/models/skus_tools.go +++ b/pkg/compute/models/skus_tools.go @@ -239,7 +239,13 @@ func (self *SSkuResourcesMeta) _get(url string) ([]jsonutils.JSONObject, error) return nil, fmt.Errorf("SkuResourcesMeta.get invalid url %s.expected has prefix 'http'", url) } - resp, err := http.Get(url) + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + return nil, fmt.Errorf("SkuResourcesMeta.get.NewRequest %s", err) + } + + client := &http.Client{} + resp, err := client.Do(req) if err != nil { return nil, fmt.Errorf("SkuResourcesMeta.get.Get %s", err) } @@ -247,18 +253,18 @@ func (self *SSkuResourcesMeta) _get(url string) ([]jsonutils.JSONObject, error) defer resp.Body.Close() content, err := ioutil.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("SkuResourcesMeta.get.Read %s", err) + return nil, fmt.Errorf("SkuResourcesMeta.get.ReadAll %s", err) } - contentJson, err := jsonutils.Parse(content) + jsonContent, err := jsonutils.Parse(content) if err != nil { return nil, fmt.Errorf("SkuResourcesMeta.get.Parse %s", err) } - ret := []jsonutils.JSONObject{} - err = contentJson.Unmarshal(&ret) + var ret []jsonutils.JSONObject + err = jsonContent.Unmarshal(&ret) if err != nil { - return nil, fmt.Errorf("SkuResourcesMeta.get.Unmarshal(%s) %s", contentJson.String(), err) + return nil, fmt.Errorf("SkuResourcesMeta.get.Unmarshal %s", err) } return ret, nil diff --git a/pkg/multicloud/huawei/disk.go b/pkg/multicloud/huawei/disk.go index 613c0ade06..72b93560aa 100644 --- a/pkg/multicloud/huawei/disk.go +++ b/pkg/multicloud/huawei/disk.go @@ -90,6 +90,7 @@ type VolumeImageMetadata struct { type SDisk struct { storage *SStorage multicloud.SDisk + details *SResourceDetail ID string `json:"id"` Name string `json:"name"` @@ -189,12 +190,27 @@ func (self *SDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SDisk) getResourceDetails() *SResourceDetail { + if self.details != nil { + return self.details + } + + res, err := self.storage.zone.region.GetOrderResourceDetail(self.GetId()) + if err != nil { + log.Debugln(err) + return nil + } + + self.details = &res + return self.details +} + func (self *SDisk) GetBillingType() string { - // https://support.huaweicloud.com/api-evs/zh-cn_topic_0020235170.html - if self.Metadata.Billing == "1" { + details := self.getResourceDetails() + if details == nil { return billing_api.BILLING_TYPE_POSTPAID } else { - return billing_api.BILLING_TYPE_PREPAID // ? + return billing_api.BILLING_TYPE_PREPAID } } @@ -204,13 +220,9 @@ func (self *SDisk) GetCreatedAt() time.Time { func (self *SDisk) GetExpiredAt() time.Time { var expiredTime time.Time - if self.Metadata.Billing == "1" { - res, err := self.storage.zone.region.GetOrderResourceDetail(self.GetId()) - if err != nil { - log.Debugln(err) - } - - expiredTime = res.ExpireTime + details := self.getResourceDetails() + if details != nil { + expiredTime = details.ExpireTime } return expiredTime