fix(region): balance currency

This commit is contained in:
ioito
2023-07-27 14:28:03 +08:00
parent ae62ee4275
commit 00110dd3ee
29 changed files with 201 additions and 83 deletions
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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=
+6
View File
@@ -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 {
+15 -10
View File
@@ -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
+5 -2
View File
@@ -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 {
+4
View File
@@ -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) {
+1 -1
View File
@@ -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
+7 -1
View File
@@ -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
+9 -6
View File
@@ -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) {
+6 -2
View File
@@ -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) {
+10 -2
View File
@@ -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) {
+10 -2
View File
@@ -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) {
@@ -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) {
+6 -2
View File
@@ -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) {
+6 -2
View File
@@ -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) {
+6 -2
View File
@@ -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) {
+6 -2
View File
@@ -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) {
+6 -2
View File
@@ -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) {
+7 -5
View File
@@ -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) {
+14 -8
View File
@@ -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) {
+6 -2
View File
@@ -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) {
@@ -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) {
+6 -2
View File
@@ -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 {
+6 -2
View File
@@ -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) {
+13 -6
View File
@@ -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) {
+13 -9
View File
@@ -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) {
@@ -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 {
+6 -2
View File
@@ -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) {
+6 -2
View File
@@ -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 {