diff --git a/go.mod b/go.mod index 722116f424..1bf78af69b 100644 --- a/go.mod +++ b/go.mod @@ -84,7 +84,7 @@ require ( k8s.io/client-go v0.19.3 k8s.io/cluster-bootstrap v0.19.3 moul.io/http2curl/v2 v2.3.0 - yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230726030452-d5f9e212ee4b + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230727061525-c536b9142e2a yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 yunion.io/x/jsonutils v1.0.1-0.20230613121553-0f3b41e2ef19 yunion.io/x/log v1.0.1-0.20230411060016-feb3f46ab361 diff --git a/go.sum b/go.sum index febef98fbc..e8afbba4a1 100644 --- a/go.sum +++ b/go.sum @@ -1174,8 +1174,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230726030452-d5f9e212ee4b h1:vwsiN/JVzhuXNXh7+cg/RvLdVO02uaYDtjB0DNDQrGc= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230726030452-d5f9e212ee4b/go.mod h1:2sgCN7nRPQL3woLfdgqLDd92vwAHqtlz3KKiHxC5BAw= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230727061525-c536b9142e2a h1:wqetb7eCo6AjW82dM4i28JerwlkagM4n8jSl7UiEIHs= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230727061525-c536b9142e2a/go.mod h1:2sgCN7nRPQL3woLfdgqLDd92vwAHqtlz3KKiHxC5BAw= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 h1:v7POYkQwo1XzOxBoIoRVr/k0V9Y5JyjpshlIFa9raug= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= diff --git a/pkg/apis/compute/cloudaccount.go b/pkg/apis/compute/cloudaccount.go index 11d2c10938..41a4084970 100644 --- a/pkg/apis/compute/cloudaccount.go +++ b/pkg/apis/compute/cloudaccount.go @@ -214,6 +214,10 @@ type CloudaccountCreateInput struct { // 跳过指定资源同步 SkipSyncResources SkipSyncResources `json:"skip_sync_resources"` + + // 货币类型 + // enmu: CNY, USD + Currency string `json:"currency"` } type SProjectMappingResourceInput struct { @@ -384,6 +388,8 @@ type CloudaccountUpdateInput struct { RemoveSkipSyncResources []string `json:"remove_skip_sync_resources"` ReadOnly bool `json:"read_only"` + + Currency string `json:"currency"` } type CloudaccountPerformPublicInput struct { diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index fe82ce89be..17fe8bd00c 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -115,6 +115,10 @@ type SCloudaccount struct { // example: 124.2 Balance float64 `list:"domain" width:"20" precision:"6"` + // 账户余额货币类型 + // enmu: CNY, USD + Currency string `width:"5" charset:"utf8" nullable:"false" list:"domain" create:"domain_optional" update:"domain"` + // 上次账号探测时间 ProbeAt time.Time `list:"domain"` @@ -2047,16 +2051,16 @@ func (account *SCloudaccount) probeAccountStatus(ctx context.Context, userCred m if err != nil { return nil, errors.Wrap(err, "account.getProviderInternal") } - balance, status, err := manager.GetBalance() + balance, err := manager.GetBalance() if err != nil { switch err { case cloudprovider.ErrNotSupported: - status = api.CLOUD_PROVIDER_HEALTH_NORMAL + balance.Status = api.CLOUD_PROVIDER_HEALTH_NORMAL case cloudprovider.ErrNoBalancePermission: - status = api.CLOUD_PROVIDER_HEALTH_NO_PERMISSION + balance.Status = api.CLOUD_PROVIDER_HEALTH_NO_PERMISSION default: - status = api.CLOUD_PROVIDER_HEALTH_UNKNOWN - if account.Status != status { + balance.Status = api.CLOUD_PROVIDER_HEALTH_UNKNOWN + if account.Status != balance.Status { logclient.AddSimpleActionLog(account, logclient.ACT_PROBE, errors.Wrapf(err, "GetBalance"), userCred, false) } } @@ -2073,14 +2077,15 @@ func (account *SCloudaccount) probeAccountStatus(ctx context.Context, userCred m isPublic := factory.IsPublicCloud() account.IsPublicCloud = tristate.NewFromBool(isPublic) account.IsOnPremise = factory.IsOnPremise() - account.Balance = balance + account.Balance = balance.Amount if !options.Options.CloudaccountHealthStatusCheck { - status = api.CLOUD_PROVIDER_HEALTH_NORMAL + balance.Status = api.CLOUD_PROVIDER_HEALTH_NORMAL + } + if len(account.Currency) == 0 && len(balance.Currency) > 0 { + account.Currency = balance.Currency } - // if len(account.AccountId) == 0 || account.AccountId != manager.GetAccountId() { account.AccountId = manager.GetAccountId() - // } - account.HealthStatus = status + account.HealthStatus = balance.Status account.ProbeAt = timeutils.UtcNow() account.Version = version account.Sysinfo = sysInfo diff --git a/pkg/mcclient/cloudpods/provider/provider.go b/pkg/mcclient/cloudpods/provider/provider.go index cbd7be727b..d9866915f9 100644 --- a/pkg/mcclient/cloudpods/provider/provider.go +++ b/pkg/mcclient/cloudpods/provider/provider.go @@ -111,8 +111,11 @@ func (self *SCloudpodsProvider) GetAccountId() string { return self.client.GetAccountId() } -func (self *SCloudpodsProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SCloudpodsProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SCloudpodsProvider) GetBucketCannedAcls(regionId string) []string { diff --git a/pkg/mcclient/options/cloudaccounts.go b/pkg/mcclient/options/cloudaccounts.go index 47a78884ac..b2fc9858e4 100644 --- a/pkg/mcclient/options/cloudaccounts.go +++ b/pkg/mcclient/options/cloudaccounts.go @@ -143,6 +143,8 @@ type SCloudAccountCreateBaseOptions struct { EnableResourceSync bool SkipSyncResources []string `help:"Skip sync resource, etc snapshot"` + + Currency string `choices:"CNY|USD"` } type SVMwareCloudAccountCreateOptions struct { @@ -639,6 +641,8 @@ type SCloudAccountUpdateBaseOptions struct { RemoveSkipSyncResources []string Desc string `help:"Description" json:"description" token:"desc"` + + Currency string `choices:"CNY|USD"` } func (opts *SCloudAccountUpdateBaseOptions) Params() (jsonutils.JSONObject, error) { diff --git a/vendor/modules.txt b/vendor/modules.txt index 752b1f0dfd..0378942b4d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1439,7 +1439,7 @@ sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.2.0 ## explicit; go 1.12 sigs.k8s.io/yaml -# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230726030452-d5f9e212ee4b +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230727061525-c536b9142e2a ## explicit; go 1.18 yunion.io/x/cloudmux/pkg/apis yunion.io/x/cloudmux/pkg/apis/billing diff --git a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/cloudprovider.go b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/cloudprovider.go index 3b2737d5ad..70958a8554 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/cloudprovider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/cloudprovider.go @@ -247,6 +247,12 @@ type ICloudProviderFactory interface { GetAccountIdEqualizer() func(origin, now string) bool } +type SBalanceInfo struct { + Currency string + Amount float64 + Status string +} + type ICloudProvider interface { GetFactory() ICloudProviderFactory @@ -261,7 +267,7 @@ type ICloudProvider interface { GetOnPremiseIRegion() (ICloudRegion, error) - GetBalance() (float64, string, error) + GetBalance() (*SBalanceInfo, error) GetSubAccounts() ([]SSubAccount, error) GetAccountId() string diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/provider/provider.go index 17eb44996c..fea86fa172 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/provider/provider.go @@ -274,20 +274,23 @@ func (self *SAliyunProvider) GetIRegionById(extId string) (cloudprovider.ICloudR return self.client.GetIRegionById(extId) } -func (self *SAliyunProvider) GetBalance() (float64, string, error) { +func (self *SAliyunProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + ret := &cloudprovider.SBalanceInfo{Currency: "CNY", Status: api.CLOUD_PROVIDER_HEALTH_UNKNOWN} balance, err := self.client.QueryAccountBalance() if err != nil { - return 0.0, api.CLOUD_PROVIDER_HEALTH_UNKNOWN, err + return ret, err } - status := api.CLOUD_PROVIDER_HEALTH_NORMAL + ret.Status = api.CLOUD_PROVIDER_HEALTH_NORMAL + ret.Currency = balance.Currency if balance.CreditAmount+balance.MybankCreditAmount <= 0 { if balance.AvailableAmount < 0 { - status = api.CLOUD_PROVIDER_HEALTH_ARREARS + ret.Status = api.CLOUD_PROVIDER_HEALTH_ARREARS } else if balance.AvailableAmount < 100 { - status = api.CLOUD_PROVIDER_HEALTH_INSUFFICIENT + ret.Status = api.CLOUD_PROVIDER_HEALTH_INSUFFICIENT } } - return balance.AvailableAmount, status, nil + ret.Amount = balance.AvailableAmount + return ret, nil } func (self *SAliyunProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/provider/provider.go index bb8f216e71..4ab304d77b 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/provider/provider.go @@ -161,8 +161,12 @@ func (self *SApsaraProvider) GetIRegionById(extId string) (cloudprovider.ICloudR return self.client.GetIRegionById(extId) } -func (self *SApsaraProvider) GetBalance() (float64, string, error) { - return 0, api.CLOUD_PROVIDER_HEALTH_NORMAL, nil +func (self *SApsaraProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SApsaraProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/provider/provider.go index 41b3867794..4f0c746250 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/provider/provider.go @@ -271,8 +271,16 @@ func (self *SAwsProvider) GetIRegionById(id string) (cloudprovider.ICloudRegion, return self.client.GetIRegionById(id) } -func (self *SAwsProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SAwsProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + ret := &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + } + if self.client.GetAccessEnv() == api.CLOUD_ACCESS_ENV_AWS_GLOBAL { + ret.Currency = "USD" + } + return ret, cloudprovider.ErrNotSupported } func (self *SAwsProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/provider/provider.go index 084360140f..5712d6add4 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/provider/provider.go @@ -191,8 +191,16 @@ func (self *SAzureProvider) GetIRegionById(id string) (cloudprovider.ICloudRegio return self.client.GetIRegionById(id) } -func (self *SAzureProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SAzureProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + ret := &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_UNKNOWN, + } + if self.client.GetAccessEnv() == api.CLOUD_ACCESS_ENV_AZURE_GLOBAL { + ret.Currency = "USD" + } + return ret, cloudprovider.ErrNotSupported } func (self *SAzureProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/bingocloud/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/bingocloud/provider/provider.go index daa3fb7aea..037ad247b0 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/bingocloud/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/bingocloud/provider/provider.go @@ -140,8 +140,12 @@ func (self *SBingoCloudProvider) GetIRegionById(id string) (cloudprovider.ICloud return self.client.GetIRegionById(id) } -func (self *SBingoCloudProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SBingoCloudProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SBingoCloudProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ctyun/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ctyun/provider/provider.go index b38b75fb81..28f39a2b19 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ctyun/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ctyun/provider/provider.go @@ -166,8 +166,12 @@ func (self *SCtyunProvider) GetIRegionById(id string) (cloudprovider.ICloudRegio return self.client.GetIRegionById(id) } -func (self *SCtyunProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SCtyunProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_UNKNOWN, + }, cloudprovider.ErrNotSupported } func (self *SCtyunProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ecloud/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ecloud/provider/provider.go index 8b1f8b5d0d..1262a37a43 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ecloud/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ecloud/provider/provider.go @@ -149,8 +149,12 @@ func (p *SEcloudProvider) GetIRegionById(id string) (cloudprovider.ICloudRegion, return iregion, nil } -func (p *SEcloudProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (p *SEcloudProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (p *SEcloudProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/provider/provider.go index 5e731e0013..82c055c385 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/provider/provider.go @@ -206,8 +206,12 @@ func (self *SESXiProvider) GetIRegionById(id string) (cloudprovider.ICloudRegion return nil, cloudprovider.ErrNotSupported } -func (self *SESXiProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SESXiProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SESXiProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/provider/provider.go index 8c99d7957b..26df18ddd6 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/provider/provider.go @@ -224,8 +224,12 @@ func (self *SGoogleProvider) GetIRegionById(extId string) (cloudprovider.ICloudR return self.client.GetIRegionById(extId) } -func (self *SGoogleProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SGoogleProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "USD", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SGoogleProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/provider/provider.go index b8b0316ffc..f3a6166695 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/provider/provider.go @@ -217,8 +217,12 @@ func (self *SHCSOProvider) GetIRegionById(extId string) (cloudprovider.ICloudReg return self.client.GetIRegionById(extId) } -func (self *SHCSOProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, nil +func (self *SHCSOProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SHCSOProvider) GetSubAccounts() ([]cloudprovider.SSubAccount, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/provider/provider.go index 7637ab58fd..a0a25c1fd8 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/provider/provider.go @@ -190,16 +190,18 @@ func (self *SHuaweiProvider) GetIRegionById(extId string) (cloudprovider.ICloudR return self.client.GetIRegionById(extId) } -func (self *SHuaweiProvider) GetBalance() (float64, string, error) { +func (self *SHuaweiProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + ret := &cloudprovider.SBalanceInfo{Currency: "CNY", Status: api.CLOUD_PROVIDER_HEALTH_UNKNOWN} balance, err := self.client.QueryAccountBalance() if err != nil { - return 0.0, api.CLOUD_PROVIDER_HEALTH_UNKNOWN, err + return ret, err } - status := api.CLOUD_PROVIDER_HEALTH_NORMAL + ret.Amount = balance.AvailableAmount + ret.Status = api.CLOUD_PROVIDER_HEALTH_NORMAL if balance.AvailableAmount < 0.0 && balance.CreditAmount < 0.0 { - status = api.CLOUD_PROVIDER_HEALTH_ARREARS + ret.Status = api.CLOUD_PROVIDER_HEALTH_ARREARS } - return balance.AvailableAmount, status, nil + return ret, nil } func (self *SHuaweiProvider) GetSubAccounts() ([]cloudprovider.SSubAccount, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/jdcloud/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/jdcloud/provider/provider.go index 9cf0be18cf..d7a617d83c 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/jdcloud/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/jdcloud/provider/provider.go @@ -144,18 +144,24 @@ func (p *SJdcloudProvider) GetIRegionById(id string) (cloudprovider.ICloudRegion return nil, cloudprovider.ErrNotFound } -func (p *SJdcloudProvider) GetBalance() (float64, string, error) { +func (p *SJdcloudProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + ret := &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + } balance, err := p.client.DescribeAccountAmount() if err != nil { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NO_PERMISSION, errors.Wrap(err, "DescribeAccountAmount") + ret.Status = api.CLOUD_PROVIDER_HEALTH_NO_PERMISSION + return ret, errors.Wrap(err, "DescribeAccountAmount") } - amount, _ := jsonutils.Marshal(balance).Float("totalAmount") - if amount < 0 { - return amount, api.CLOUD_PROVIDER_HEALTH_ARREARS, nil - } else if amount < 50 { - return amount, api.CLOUD_PROVIDER_HEALTH_INSUFFICIENT, nil + ret.Amount, _ = jsonutils.Marshal(balance).Float("totalAmount") + if ret.Amount < 0 { + ret.Status = api.CLOUD_PROVIDER_HEALTH_ARREARS + } else if ret.Amount < 50 { + ret.Status = api.CLOUD_PROVIDER_HEALTH_INSUFFICIENT } - return amount, api.CLOUD_PROVIDER_HEALTH_NORMAL, nil + return ret, nil } func (p *SJdcloudProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/nutanix/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/nutanix/provider/provider.go index a1c59bf62f..fce51e6134 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/nutanix/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/nutanix/provider/provider.go @@ -173,8 +173,12 @@ func (self *SNutanixProvider) GetIRegionById(id string) (cloudprovider.ICloudReg return nil, cloudprovider.ErrNotFound } -func (self *SNutanixProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SNutanixProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SNutanixProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/objectstore/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/objectstore/provider/provider.go index 9a820272e4..9e2d99d947 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/objectstore/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/objectstore/provider/provider.go @@ -119,8 +119,12 @@ func (self *SObjectStoreProvider) GetIRegionById(id string) (cloudprovider.IClou return nil, cloudprovider.ErrNotSupported } -func (self *SObjectStoreProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SObjectStoreProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SObjectStoreProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/provider/provider.go index cc2b3e88ae..2258e788d8 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/provider/provider.go @@ -190,8 +190,12 @@ func (self *SOpenStackProvider) GetIRegionById(extId string) (cloudprovider.IClo return self.client.GetIRegionById(extId) } -func (self *SOpenStackProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_UNKNOWN, cloudprovider.ErrNotSupported +func (self *SOpenStackProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SOpenStackProvider) GetCloudRegionExternalIdPrefix() string { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/proxmox/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/proxmox/provider/provider.go index 851ff61de0..adf805725e 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/proxmox/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/proxmox/provider/provider.go @@ -173,8 +173,12 @@ func (self *SProxmoxProvider) GetIRegionById(id string) (cloudprovider.ICloudReg return nil, cloudprovider.ErrNotFound } -func (self *SProxmoxProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SProxmoxProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SProxmoxProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/provider/provider.go index 095ad818d8..fe9c7553f4 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/provider/provider.go @@ -286,16 +286,23 @@ func (self *SQcloudProvider) GetIRegionById(id string) (cloudprovider.ICloudRegi return self.client.GetIRegionById(id) } -func (self *SQcloudProvider) GetBalance() (float64, string, error) { +func (self *SQcloudProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + ret := &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + } balance, err := self.client.QueryAccountBalance() if err != nil { - return 0.0, api.CLOUD_PROVIDER_HEALTH_UNKNOWN, err + ret.Status = api.CLOUD_PROVIDER_HEALTH_UNKNOWN + return ret, nil } - status := api.CLOUD_PROVIDER_HEALTH_NORMAL - if balance.AvailableAmount < 0.0 { - status = api.CLOUD_PROVIDER_HEALTH_ARREARS + ret.Amount = balance.Balance + ret.Currency = balance.Currency + ret.Status = api.CLOUD_PROVIDER_HEALTH_NORMAL + if ret.Amount < 0.0 { + ret.Status = api.CLOUD_PROVIDER_HEALTH_ARREARS } - return balance.AvailableAmount, status, nil + return ret, nil } func (self *SQcloudProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/qcloud.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/qcloud.go index ff94d5f95c..664bccd52d 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/qcloud.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/qcloud.go @@ -929,15 +929,12 @@ func (client *SQcloudClient) GetIStorageById(id string) (cloudprovider.ICloudSto } type SAccountBalance struct { - AvailableAmount float64 - AvailableCashAmount float64 - CreditAmount float64 - MybankCreditAmount float64 - Currency string + Balance float64 + Uin int64 + Currency string } func (client *SQcloudClient) QueryAccountBalance() (*SAccountBalance, error) { - balance := SAccountBalance{} body, err := client.billingRequest("DescribeAccountBalance", nil) if err != nil { if isError(err, []string{"UnauthorizedOperation.NotFinanceAuth"}) { @@ -945,9 +942,16 @@ func (client *SQcloudClient) QueryAccountBalance() (*SAccountBalance, error) { } return nil, errors.Wrapf(err, "DescribeAccountBalance") } - balanceCent, _ := body.Float("Balance") - balance.AvailableAmount = balanceCent / 100.0 - return &balance, nil + balance := &SAccountBalance{Currency: "CNY"} + err = body.Unmarshal(balance) + if err != nil { + return nil, err + } + balance.Balance = balance.Balance / 100.0 + if balance.Uin >= 200000000000 { + balance.Currency = "USD" + } + return balance, nil } func (client *SQcloudClient) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/provider/provider.go index 74cf184380..ae688b3207 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/provider/provider.go @@ -116,8 +116,12 @@ func (self *SRemoteFileProvider) GetIRegionById(id string) (cloudprovider.ICloud return self.client.GetIRegionById(id) } -func (self *SRemoteFileProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_UNKNOWN, cloudprovider.ErrNotSupported +func (self *SRemoteFileProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SRemoteFileProvider) GetCloudRegionExternalIdPrefix() string { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ucloud/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ucloud/provider/provider.go index be67e51adc..f35f126eea 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ucloud/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ucloud/provider/provider.go @@ -158,8 +158,12 @@ func (self *SUcloudProvider) GetIRegionById(extId string) (cloudprovider.ICloudR return self.client.GetIRegionById(extId) } -func (self *SUcloudProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, cloudprovider.ErrNotSupported +func (self *SUcloudProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SUcloudProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, error) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/zstack/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/zstack/provider/provider.go index f4edd8c6b7..5f3c08f225 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/zstack/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/zstack/provider/provider.go @@ -132,8 +132,12 @@ func (self *SZStackProvider) GetIRegionById(extId string) (cloudprovider.ICloudR return self.client.GetIRegionById(extId) } -func (self *SZStackProvider) GetBalance() (float64, string, error) { - return 0.0, api.CLOUD_PROVIDER_HEALTH_UNKNOWN, cloudprovider.ErrNotSupported +func (self *SZStackProvider) GetBalance() (*cloudprovider.SBalanceInfo, error) { + return &cloudprovider.SBalanceInfo{ + Amount: 0.0, + Currency: "CNY", + Status: api.CLOUD_PROVIDER_HEALTH_NORMAL, + }, cloudprovider.ErrNotSupported } func (self *SZStackProvider) GetCloudRegionExternalIdPrefix() string {