From 55094be4c27f6ea7842f2fda20d57f7ac1430502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Thu, 20 Dec 2018 20:37:21 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0cloudaccount=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/cloudaccounts.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index b879a96343..44d60cde38 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -527,7 +527,21 @@ func (manager *SCloudaccountManager) FetchCloudaccountByIdOrName(accountId strin } func (self *SCloudaccount) getMoreDetails(extra *jsonutils.JSONDict) *jsonutils.JSONDict { - extra.Add(jsonutils.Marshal(self.GetCloudproviders()), "accounts") + providers := self.GetCloudproviders() + extra.Add(jsonutils.Marshal(providers), "accounts") + projectIds := []string{} + for i := 0; i < len(providers); i++ { + if len(providers[i].ProjectId) > 0 && !utils.IsInStringArray(providers[i].ProjectId, projectIds) { + projectIds = append(projectIds, providers[i].ProjectId) + } + } + projects := jsonutils.NewArray() + for _, projectId := range projectIds { + if proj, _ := db.TenantCacheManager.FetchTenantById(context.Background(), projectId); proj != nil { + projects.Add(jsonutils.Marshal(map[string]string{"tenant_id": projectId, "telnet": proj.Name})) + } + } + extra.Add(projects, "projects") return extra } From d24211c12a98a5746d3dda958f2b50c1c4c8e07c Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 21 Dec 2018 09:03:34 +0800 Subject: [PATCH 2/3] =?UTF-8?q?cloudaccount=E5=A2=9E=E5=8A=A0=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E7=BB=9F=E8=AE=A1=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/cloudaccounts.go | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 0b399096d4..66ca78f13b 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -538,6 +538,36 @@ func (self *SCloudaccount) getHostCount() int { return q.Count() } +func (self *SCloudaccount) getVpcCount() int { + subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", self.Id).SubQuery() + q := VpcManager.Query().In("manager_id", subq) + return q.Count() +} + +func (self *SCloudaccount) getStorageCount() int { + subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", self.Id).SubQuery() + q := StorageManager.Query().In("manager_id", subq) + return q.Count() +} + +func (self *SCloudaccount) getStoragecacheCount() int { + subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", self.Id).SubQuery() + q := StoragecacheManager.Query().In("manager_id", subq) + return q.Count() +} + +func (self *SCloudaccount) getEipCount() int { + subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", self.Id).SubQuery() + q := ElasticipManager.Query().In("manager_id", subq) + return q.Count() +} + +func (self *SCloudaccount) getRoutetableCount() int { + subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", self.Id).SubQuery() + q := RouteTableManager.Query().In("manager_id", subq) + return q.Count() +} + func (self *SCloudaccount) getGuestCount() int { subsubq := CloudproviderManager.Query("id").Equals("cloudaccount_id", self.Id).SubQuery() subq := HostManager.Query("id").In("manager_id", subsubq).SubQuery() @@ -545,6 +575,13 @@ func (self *SCloudaccount) getGuestCount() int { return q.Count() } +func (self *SCloudaccount) getDiskCount() int { + subsubq := CloudproviderManager.Query("id").Equals("cloudaccount_id", self.Id).SubQuery() + subq := StorageManager.Query("id").In("manager_id", subsubq).SubQuery() + q := DiskManager.Query().In("storage_id", subq) + return q.Count() +} + func (self *SCloudaccount) getProjectIds() []string { q := CloudproviderManager.Query("tenant_id").Equals("cloudaccount_id", self.Id).Distinct() rows, err := q.Rows() @@ -585,6 +622,7 @@ func (self *SCloudaccount) getMoreDetails(extra *jsonutils.JSONDict) *jsonutils. extra.Add(jsonutils.NewInt(int64(self.getProviderCount())), "provider_count") extra.Add(jsonutils.NewInt(int64(self.getHostCount())), "host_count") extra.Add(jsonutils.NewInt(int64(self.getGuestCount())), "guest_count") + extra.Add(jsonutils.NewInt(int64(self.getDiskCount())), "disk_count") extra.Add(jsonutils.NewString(self.getVersion()), "version") projects := jsonutils.NewArray() for _, projectId := range self.getProjectIds() { From 8c65ead4b873f4b63ede4840f5bc82d5ae9196f0 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 21 Dec 2018 10:22:53 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=85=BE=E8=AE=AF=E4=BA=91=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BD=99=E9=A2=9D=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/util/qcloud/provider/provider.go | 6 +++++- pkg/util/qcloud/qcloud.go | 27 +++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/pkg/util/qcloud/provider/provider.go b/pkg/util/qcloud/provider/provider.go index a4651a8ac7..6a57047365 100644 --- a/pkg/util/qcloud/provider/provider.go +++ b/pkg/util/qcloud/provider/provider.go @@ -81,7 +81,11 @@ func (self *SQcloudProvider) GetIRegionById(id string) (cloudprovider.ICloudRegi } func (self *SQcloudProvider) GetBalance() (float64, error) { - return 0.0, nil + balance, err := self.client.QueryAccountBalance() + if err != nil { + return 0.0, err + } + return balance.AvailableAmount, nil } func (self *SQcloudProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, error) { diff --git a/pkg/util/qcloud/qcloud.go b/pkg/util/qcloud/qcloud.go index 7a1a5896a6..ea432a49d8 100644 --- a/pkg/util/qcloud/qcloud.go +++ b/pkg/util/qcloud/qcloud.go @@ -22,7 +22,8 @@ const ( QCLOUD_DEFAULT_REGION = "ap-beijing" - QCLOUD_API_VERSION = "2017-03-12" + QCLOUD_API_VERSION = "2017-03-12" + QCLOUD_BILLING_API_VERSION = "2018-07-09" ) type SQcloudClient struct { @@ -71,6 +72,11 @@ func cbsRequest(client *common.Client, apiName string, params map[string]string) return _jsonRequest(client, domain, QCLOUD_API_VERSION, apiName, params) } +func billingRequest(client *common.Client, apiName string, params map[string]string) (jsonutils.JSONObject, error) { + domain := "billing.tencentcloudapi.com" + return _jsonRequest(client, domain, QCLOUD_BILLING_API_VERSION, apiName, params) +} + type QcloudResponse struct { *tchttp.BaseResponse Response *interface{} `json:"Response"` @@ -147,6 +153,14 @@ func (client *SQcloudClient) cbsRequest(apiName string, params map[string]string return cbsRequest(cli, apiName, params) } +func (client *SQcloudClient) billingRequest(apiName string, params map[string]string) (jsonutils.JSONObject, error) { + cli, err := client.getDefaultClient() + if err != nil { + return nil, err + } + return billingRequest(cli, apiName, params) +} + func (client *SQcloudClient) jsonRequest(apiName string, params map[string]string) (jsonutils.JSONObject, error) { cli, err := client.getDefaultClient() if err != nil { @@ -264,5 +278,14 @@ type SAccountBalance struct { } func (client *SQcloudClient) QueryAccountBalance() (*SAccountBalance, error) { - return nil, nil + balance := SAccountBalance{} + body, err := client.billingRequest("DescribeAccountBalance", nil) + if err != nil { + log.Errorf("DescribeAccountBalance fail %s", err) + return nil, err + } + log.Debugf("%s", body) + balanceCent, _ := body.Float("Balance") + balance.AvailableAmount = balanceCent / 100.0 + return &balance, nil }