Skip to content

Commit

Permalink
Merge pull request #845 from ioito/hotfix/qx-role-sync
Browse files Browse the repository at this point in the history
fix(huawei): role sync
  • Loading branch information
ioito authored Mar 29, 2024
2 parents 96c9164 + 758c2f4 commit d988f87
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 34 deletions.
47 changes: 17 additions & 30 deletions pkg/multicloud/huawei/cloudgroup.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,6 @@ func (group *SCloudgroup) GetISystemCloudpolicies() ([]cloudprovider.ICloudpolic
}
ret := []cloudprovider.ICloudpolicy{}
for i := range roles {
_, err := group.client.GetRole(roles[i].GetName())
if err != nil {
if errors.Cause(err) == cloudprovider.ErrNotFound {
continue
}
return nil, errors.Wrapf(err, "GetRole(%s)", roles[i].GetName())
}
ret = append(ret, &roles[i])
}
return ret, nil
Expand All @@ -109,13 +102,6 @@ func (group *SCloudgroup) GetICustomCloudpolicies() ([]cloudprovider.ICloudpolic
}
ret := []cloudprovider.ICloudpolicy{}
for i := range roles {
_, err := group.client.GetCustomRole(roles[i].GetName())
if err != nil {
if errors.Cause(err) == cloudprovider.ErrNotFound {
continue
}
return nil, errors.Wrapf(err, "GetRole(%s)", roles[i].GetName())
}
ret = append(ret, &roles[i])
}
return ret, nil
Expand Down Expand Up @@ -291,30 +277,30 @@ func (self *SHuaweiClient) GetCustomRoles() ([]SRole, error) {
return ret, nil
}

func (self *SHuaweiClient) GetCustomRole(name string) (*SRole, error) {
roles, err := self.GetCustomRoles()
func (self *SHuaweiClient) GetCustomRole(id string) (*SRole, error) {
resp, err := self.list(SERVICE_IAM, "", "OS-ROLE/roles/"+id, nil)
if err != nil {
return nil, errors.Wrapf(err, "GetCustomRoles(%s)", name)
return nil, err
}
for i := range roles {
if roles[i].DisplayName == name {
return &roles[i], nil
}
ret := &SRole{}
err = resp.Unmarshal(ret, "role")
if err != nil {
return nil, err
}
return nil, errors.Wrapf(cloudprovider.ErrNotFound, name)
return ret, nil
}

func (self *SHuaweiClient) GetRole(name string) (*SRole, error) {
roles, err := self.GetRoles("", "")
func (self *SHuaweiClient) GetRole(id string) (*SRole, error) {
resp, err := self.list(SERVICE_IAM_V3, "", "roles/"+id, nil)
if err != nil {
return nil, errors.Wrapf(err, "GetRoles(%s)", name)
return nil, err
}
for i := range roles {
if roles[i].DisplayName == name {
return &roles[i], nil
}
ret := &SRole{}
err = resp.Unmarshal(ret, "role")
if err != nil {
return nil, errors.Wrapf(err, "Unmarshal")
}
return nil, errors.Wrapf(cloudprovider.ErrNotFound, name)
return ret, nil
}

func (self *SHuaweiClient) DetachGroupRole(groupId, roleId string) error {
Expand Down Expand Up @@ -382,6 +368,7 @@ func (self *SHuaweiClient) AttachGroupRole(groupId, roleId string) error {
if err != nil {
return errors.Wrapf(err, "GetRole(%s)", roleId)
}

if role.Type == "AX" || role.Type == "AA" {
err := self.KeystoneAssociateGroupWithDomainPermission(self.ownerId, groupId, roleId)
if err != nil {
Expand Down
2 changes: 2 additions & 0 deletions pkg/multicloud/huawei/huawei.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,10 @@ type akClient struct {

func (self *akClient) Do(req *http.Request) (*http.Response, error) {
req.Header.Del("Accept")
length := req.Header.Get("Content-Length")
if req.Method == string(httputils.GET) ||
req.Method == string(httputils.DELETE) ||
(req.Method == string(httputils.PUT) && length == "0") ||
req.Method == string(httputils.PATCH) && !strings.HasPrefix(req.Host, "modelarts") ||
strings.HasSuffix(req.URL.Path, "disassociate-instance") {
req.Header.Del("Content-Length")
Expand Down
9 changes: 5 additions & 4 deletions pkg/multicloud/huawei/roles.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,16 @@ func (self *SHuaweiClient) GetISystemCloudpolicies() ([]cloudprovider.ICloudpoli

// https://console.huaweicloud.com/apiexplorer/#/openapi/IAM/doc?api=KeystoneListPermissions
func (self *SHuaweiClient) GetRoles(domainId, name string) ([]SRole, error) {
params := url.Values{}
query := url.Values{}
if len(domainId) > 0 {
params.Set("domain_id", self.ownerId)
query.Set("domain_id", self.ownerId)
}
if len(name) > 0 {
params.Set("name", name)
query.Set("name", name)
}

query := url.Values{}
query.Set("type", "domain")

query.Set("per_page", "300")
page := 1
query.Set("page", fmt.Sprintf("%d", page))
Expand Down
14 changes: 14 additions & 0 deletions pkg/multicloud/huawei/shell/role.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,18 @@ func init() {
printList(roles, 0, 0, 0, nil)
return nil
})

type RoleIdOptions struct {
ID string
}

shellutils.R(&RoleIdOptions{}, "cloud-policy-show", "Show cloudpolicy", func(cli *huawei.SRegion, args *RoleIdOptions) error {
role, err := cli.GetClient().GetRole(args.ID)
if err != nil {
return err
}
printObject(role)
return nil
})

}

0 comments on commit d988f87

Please sign in to comment.