Skip to content

Commit 459d695

Browse files
committed
fix(huawei):panic caused by the region field
1 parent c8a1c3e commit 459d695

8 files changed

Lines changed: 74 additions & 54 deletions

File tree

pkg/providers/huawei/bss/balance.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@ import (
77
"github.com/404tk/cloudtoolkit/utils/logger"
88
"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
99
"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/global"
10-
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/as/v1/region"
1110
bss "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/bss/v2"
1211
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/bss/v2/model"
1312
)
1413

1514
type Driver struct {
16-
Cred basic.Credentials
17-
Region string
15+
Cred basic.Credentials
16+
Intl bool
1817
}
1918

2019
func (d *Driver) QueryAccountBalance(ctx context.Context) {
@@ -27,13 +26,13 @@ func (d *Driver) QueryAccountBalance(ctx context.Context) {
2726
WithAk(d.Cred.AK).
2827
WithSk(d.Cred.SK).
2928
Build()
30-
r := d.Region
31-
if r == "all" {
32-
r = "cn-north-1"
29+
endpoint := "https://bss.myhuaweicloud.com"
30+
if d.Intl {
31+
endpoint = "https://bss-intl.myhuaweicloud.com"
3332
}
3433
client := bss.NewBssClient(
3534
bss.BssClientBuilder().
36-
WithRegion(region.ValueOf(r)).
35+
WithEndpoint(endpoint).
3736
WithCredential(_auth).
3837
Build())
3938

pkg/providers/huawei/huawei.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ import (
2020

2121
// Provider is a data provider for huawei API
2222
type Provider struct {
23-
vendor string
2423
auth basic.Credentials
2524
regions []string
25+
intl bool
2626
}
2727

2828
var default_region = "cn-north-4"
@@ -38,6 +38,11 @@ func New(options schema.Options) (*Provider, error) {
3838
return nil, &schema.ErrNoSuchKey{Name: utils.SecretKey}
3939
}
4040
regionId, _ := options.GetMetadata(utils.Region)
41+
v, _ := options.GetMetadata(utils.Version)
42+
intl := false
43+
if !(v == "" || v == "China") {
44+
intl = true
45+
}
4146

4247
var r = &_iam.DefaultHttpRequest{}
4348
if regionId == "all" {
@@ -91,33 +96,33 @@ func New(options schema.Options) (*Provider, error) {
9196
}
9297

9398
return &Provider{
94-
vendor: "huawei",
9599
auth: auth,
96100
regions: regions,
101+
intl: intl,
97102
}, nil
98103
}
99104

100105
// Name returns the name of the provider
101106
func (p *Provider) Name() string {
102-
return p.vendor
107+
return "huawei"
103108
}
104109

105110
// Resources returns the provider for a resource deployment source.
106111
func (p *Provider) Resources(ctx context.Context) (schema.Resources, error) {
107112
list := schema.NewResources()
108-
list.Provider = p.vendor
113+
list.Provider = p.Name()
109114
var err error
110115
for _, product := range utils.Cloudlist {
111116
switch product {
112117
case "balance":
113-
d := &_bss.Driver{Cred: p.auth, Region: p.regions[0]}
118+
d := &_bss.Driver{Cred: p.auth, Intl: p.intl}
114119
d.QueryAccountBalance(ctx)
115120
case "host":
116121
ecsprovider := &ecs.Driver{Auth: p.auth, Regions: p.regions}
117122
list.Hosts, err = ecsprovider.GetResource(ctx)
118123
case "account":
119-
iamprovider := &_iam.Driver{Auth: p.auth, Regions: p.regions}
120-
list.Users, err = iamprovider.GetIAMUser(ctx)
124+
iamprovider := &_iam.Driver{Auth: p.auth}
125+
list.Users, err = iamprovider.ListUsers(ctx)
121126
case "database":
122127
rdsprovider := &_rds.Driver{Auth: p.auth, Regions: p.regions}
123128
list.Databases, err = rdsprovider.GetDatabases(ctx)
@@ -133,7 +138,7 @@ func (p *Provider) Resources(ctx context.Context) (schema.Resources, error) {
133138

134139
func (p *Provider) UserManagement(action, uname, pwd string) {
135140
r := &_iam.Driver{
136-
Auth: p.auth, Regions: p.regions, Username: uname, Password: pwd}
141+
Auth: p.auth, Username: uname, Password: pwd}
137142
switch action {
138143
case "add":
139144
r.AddUser()

pkg/providers/huawei/iam/useradd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func (d *Driver) AddUser() {
1616
WithSk(d.Auth.SK).
1717
Build()
1818
client := iam.NewIamClient(iam.IamClientBuilder().
19-
WithRegion(region.ValueOf(d.Regions[0])).
19+
WithRegion(region.ValueOf("cn-north-1")).
2020
WithCredential(auth).
2121
Build())
2222
uid, domainid, err := createUser(client, d.Username, d.Password)

pkg/providers/huawei/iam/userdel.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ func (d *Driver) DelUser() {
1717
WithSk(d.Auth.SK).
1818
Build()
1919
client := iam.NewIamClient(iam.IamClientBuilder().
20-
WithRegion(region.ValueOf(d.Regions[0])).
20+
WithRegion(region.ValueOf("cn-north-1")).
2121
WithCredential(auth).
2222
Build())
23-
users, err := d.GetIAMUser(context.Background())
23+
users, err := d.ListUsers(context.Background())
2424
if err != nil {
2525
logger.Error("List users failed:", err.Error())
2626
return

pkg/providers/huawei/iam/users.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@ import (
1414

1515
type Driver struct {
1616
Auth basic.Credentials
17-
Regions []string
1817
Username string
1918
Password string
2019
}
2120

22-
func (d *Driver) GetIAMUser(ctx context.Context) ([]schema.User, error) {
21+
func (d *Driver) ListUsers(ctx context.Context) ([]schema.User, error) {
2322
list := []schema.User{}
2423
select {
2524
case <-ctx.Done():
@@ -32,7 +31,7 @@ func (d *Driver) GetIAMUser(ctx context.Context) ([]schema.User, error) {
3231
WithSk(d.Auth.SK).
3332
Build()
3433
client := iam.NewIamClient(iam.IamClientBuilder().
35-
WithRegion(region.ValueOf(d.Regions[0])).
34+
WithRegion(region.ValueOf("cn-north-1")).
3635
WithCredential(auth).
3736
Build())
3837
keystoneListUsersRequest := &model.KeystoneListUsersRequest{}

pkg/providers/huawei/rds/databases.go

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,41 +27,58 @@ func (d *Driver) GetDatabases(ctx context.Context) ([]schema.Database, error) {
2727
default:
2828
logger.Info("Start enumerating RDS ...")
2929
}
30-
client := rds.NewRdsClient(rds.RdsClientBuilder().
31-
WithRegion(region.ValueOf(d.Regions[0])). // Maybe need traverse region
32-
WithCredential(d.Auth).
33-
Build())
34-
request := &model.ListInstancesRequest{}
35-
response, err := client.ListInstances(request)
36-
if err != nil {
37-
logger.Error("Enumerate RDS failed.")
38-
return list, err
39-
}
40-
for _, instance := range *response.Instances {
41-
i := reflect.ValueOf(instance.Datastore.Type)
42-
engine := i.FieldByName("value").String()
43-
_dbInstance := schema.Database{
44-
InstanceId: instance.Id,
45-
Engine: engine,
46-
EngineVersion: instance.Datastore.Version,
47-
Region: instance.Region,
30+
for _, r := range d.Regions {
31+
client := newClient(r, d.Auth)
32+
if client == nil {
33+
continue
34+
}
35+
request := &model.ListInstancesRequest{}
36+
resp, err := client.ListInstances(request)
37+
if err != nil {
38+
continue
4839
}
49-
if len(instance.PublicIps) > 0 {
50-
addrs := []string{}
51-
for _, ip := range instance.PublicIps {
52-
addrs = append(addrs, fmt.Sprintf("%s:%d", ip, instance.Port))
40+
41+
for _, instance := range *resp.Instances {
42+
i := reflect.ValueOf(instance.Datastore.Type)
43+
engine := i.FieldByName("value").String()
44+
_dbInstance := schema.Database{
45+
InstanceId: instance.Id,
46+
Engine: engine,
47+
EngineVersion: instance.Datastore.Version,
48+
Region: instance.Region,
5349
}
54-
_dbInstance.Address = strings.Join(addrs, "\n")
55-
} else if len(instance.PrivateIps) > 0 {
56-
addrs := []string{}
57-
for _, ip := range instance.PrivateIps {
58-
addrs = append(addrs, fmt.Sprintf("%s:%d", ip, instance.Port))
50+
if len(instance.PublicIps) > 0 {
51+
addrs := []string{}
52+
for _, ip := range instance.PublicIps {
53+
addrs = append(addrs, fmt.Sprintf("%s:%d", ip, instance.Port))
54+
}
55+
_dbInstance.Address = strings.Join(addrs, "\n")
56+
} else if len(instance.PrivateIps) > 0 {
57+
addrs := []string{}
58+
for _, ip := range instance.PrivateIps {
59+
addrs = append(addrs, fmt.Sprintf("%s:%d", ip, instance.Port))
60+
}
61+
_dbInstance.Address = strings.Join(addrs, "\n")
5962
}
60-
_dbInstance.Address = strings.Join(addrs, "\n")
61-
}
6263

63-
list = append(list, _dbInstance)
64+
list = append(list, _dbInstance)
65+
}
66+
break
6467
}
6568

6669
return list, nil
6770
}
71+
72+
func newClient(r string, auth basic.Credentials) *rds.RdsClient {
73+
defer func() {
74+
if err := recover(); err != nil {
75+
return
76+
}
77+
}()
78+
79+
client := rds.NewRdsClient(rds.RdsClientBuilder().
80+
WithRegion(region.ValueOf(r)).
81+
WithCredential(auth).
82+
Build())
83+
return client
84+
}

runner/console/completer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func actionCompleter(d prompt.Document) []prompt.Suggest {
104104
}
105105
if len(args) == 3 && args[1] == utils.Version {
106106
var versions = []prompt.Suggest{
107-
{Text: "Global", Description: "International Edition"},
107+
{Text: "Intl", Description: "International Edition"},
108108
{Text: "China", Description: "Chinese Edition"},
109109
}
110110
return prompt.FilterContains(versions, d.GetWordBeforeCursor(), true)

runner/console/use.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ func loadConfig1() map[string]string {
5252
utils.AccessKey: "",
5353
utils.SecretKey: "",
5454
utils.SecurityToken: "",
55-
utils.Region: "all", // Default enumerate all
56-
utils.Version: "Global", // Default select International Edition
55+
utils.Region: "all", // Default enumerate all
56+
utils.Version: "",
5757
}
5858
}
5959

0 commit comments

Comments
 (0)