From 7e891276c04c4bb8dc6df760f0c4409e0760e865 Mon Sep 17 00:00:00 2001 From: ioito Date: Fri, 23 Sep 2022 16:27:39 +0800 Subject: [PATCH] fix(cloudid): role obs iam --- .../hcso/client/modules/manager_base.go | 4 +- .../hcso/client/modules/mod_domains.go | 60 +++++++++++++- .../hcso/client/modules/mod_groups.go | 83 ------------------- .../hcso/client/modules/mod_projects.go | 54 +++++++++++- pkg/multicloud/hcso/cloudgroup.go | 44 ++++++---- pkg/multicloud/hcso/project.go | 12 +++ pkg/multicloud/hcso/shell/region.go | 13 +++ pkg/multicloud/hcso/shell/role.go | 9 ++ .../huawei/client/modules/manager_base.go | 4 +- .../huawei/client/modules/mod_domains.go | 60 +++++++++++++- .../huawei/client/modules/mod_groups.go | 83 ------------------- .../huawei/client/modules/mod_projects.go | 54 +++++++++++- pkg/multicloud/huawei/cloudgroup.go | 50 +++++++---- 13 files changed, 327 insertions(+), 203 deletions(-) diff --git a/pkg/multicloud/hcso/client/modules/manager_base.go b/pkg/multicloud/hcso/client/modules/manager_base.go index 4741976b10..b747488864 100644 --- a/pkg/multicloud/hcso/client/modules/manager_base.go +++ b/pkg/multicloud/hcso/client/modules/manager_base.go @@ -235,7 +235,9 @@ func (self *SBaseManager) jsonRequest(request requests.IRequest) (http.Header, j } else if err.Code == 499 && retry > 0 && request.GetMethod() == "GET" { retry -= 1 time.Sleep(3 * time.Second * time.Duration(MAX_RETRY-retry)) - } else if (err.Code == 404 || strings.Contains(err.Details, "could not be found") || strings.Contains(err.Details, "does not exist")) && request.GetMethod() != "POST" { + } else if (err.Code == 404 || strings.Contains(err.Details, "could not be found") || + strings.Contains(err.Error(), "Not Found") || + strings.Contains(err.Details, "does not exist")) && request.GetMethod() != "POST" { return h, b, errors.Wrap(cloudprovider.ErrNotFound, err.Error()) } else if err.Code == 429 && retry > 0 { // 当前请求过多。 diff --git a/pkg/multicloud/hcso/client/modules/mod_domains.go b/pkg/multicloud/hcso/client/modules/mod_domains.go index 8daa63c3b1..688080f367 100644 --- a/pkg/multicloud/hcso/client/modules/mod_domains.go +++ b/pkg/multicloud/hcso/client/modules/mod_domains.go @@ -15,7 +15,13 @@ package modules import ( + "fmt" + + "yunion.io/x/pkg/errors" + + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud/hcso/client/manager" + "yunion.io/x/onecloud/pkg/multicloud/hcso/client/responses" ) type SDomainManager struct { @@ -23,7 +29,7 @@ type SDomainManager struct { } func NewDomainManager(cfg manager.IManagerConfig) *SDomainManager { - return &SDomainManager{SResourceManager: SResourceManager{ + m := &SDomainManager{SResourceManager: SResourceManager{ SBaseManager: NewBaseManager(cfg), ServiceName: ServiceNameIAM, Region: cfg.GetRegionId(), @@ -34,4 +40,56 @@ func NewDomainManager(cfg manager.IManagerConfig) *SDomainManager { ResourceKeyword: "domains", }} + m.SetDomainId(cfg.GetDomainId()) + return m +} + +func (manager *SDomainManager) DeleteRole(domainId string, groupId, roleId string) error { + if len(domainId) == 0 { + return fmt.Errorf("missing domainId") + } + if len(groupId) == 0 { + return fmt.Errorf("missing groupId") + } + if len(roleId) == 0 { + return fmt.Errorf("missing roleId") + } + manager.SetVersion("v3") + defer manager.SetVersion("v3/auth") + res := fmt.Sprintf("groups/%s/roles/%s", groupId, roleId) + _, err := manager.DeleteInContextWithSpec(nil, domainId, res, nil, nil, "") + if err != nil && errors.Cause(err) == cloudprovider.ErrNotFound { + return nil + } + return err +} + +func (manager *SDomainManager) ListRoles(domainId string, groupId string) (*responses.ListResult, error) { + if len(domainId) == 0 { + return nil, fmt.Errorf("missing domainId") + } + if len(groupId) == 0 { + return nil, fmt.Errorf("missing groupId") + } + manager.SetVersion("v3") + defer manager.SetVersion("v3/auth") + res := fmt.Sprintf("%s/groups/%s/roles", domainId, groupId) + return manager.ListInContextWithSpec(nil, res, nil, "roles") +} + +func (manager *SDomainManager) AddRole(domainId string, groupId, roleId string) error { + if len(domainId) == 0 { + return fmt.Errorf("missing domainId") + } + if len(groupId) == 0 { + return fmt.Errorf("missing groupId") + } + if len(roleId) == 0 { + return fmt.Errorf("missing roleId") + } + manager.SetVersion("v3") + defer manager.SetVersion("v3/auth") + res := fmt.Sprintf("groups/%s/roles/%s", groupId, roleId) + _, err := manager.UpdateInContextWithSpec(nil, domainId, res, nil, "") + return err } diff --git a/pkg/multicloud/hcso/client/modules/mod_groups.go b/pkg/multicloud/hcso/client/modules/mod_groups.go index 71923f4380..737e2e595d 100644 --- a/pkg/multicloud/hcso/client/modules/mod_groups.go +++ b/pkg/multicloud/hcso/client/modules/mod_groups.go @@ -15,13 +15,7 @@ package modules import ( - "fmt" - - "yunion.io/x/pkg/errors" - - "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud/hcso/client/manager" - "yunion.io/x/onecloud/pkg/multicloud/hcso/client/responses" ) type SGroupManager struct { @@ -43,80 +37,3 @@ func NewGroupManager(cfg manager.IManagerConfig) *SGroupManager { m.SetDomainId(cfg.GetDomainId()) return m } - -func (manager *SGroupManager) ListRoles(domainId string, groupId string) (*responses.ListResult, error) { - if len(domainId) == 0 { - return nil, fmt.Errorf("missing domainId") - } - if len(groupId) == 0 { - return nil, fmt.Errorf("missing groupId") - } - manager.SetVersion(fmt.Sprintf("v3/domains/%s", domainId)) - return manager.ListInContextWithSpec(nil, fmt.Sprintf("%s/roles", groupId), nil, "roles") -} - -func (manager *SGroupManager) DeleteProjectRole(projectId, groupId, roleId string) error { - if len(projectId) == 0 { - return fmt.Errorf("missing projectId") - } - if len(groupId) == 0 { - return fmt.Errorf("missing groupId") - } - if len(roleId) == 0 { - return fmt.Errorf("missing roleId") - } - manager.SetVersion(fmt.Sprintf("v3/projects/%s", projectId)) - _, err := manager.DeleteInContextWithSpec(nil, groupId, fmt.Sprintf("roles/%s", roleId), nil, nil, "") - if err != nil && errors.Cause(err) == cloudprovider.ErrNotFound { - return nil - } - return err -} - -func (manager *SGroupManager) DeleteRole(domainId string, groupId, roleId string) error { - if len(domainId) == 0 { - return fmt.Errorf("missing domainId") - } - if len(groupId) == 0 { - return fmt.Errorf("missing groupId") - } - if len(roleId) == 0 { - return fmt.Errorf("missing roleId") - } - manager.SetVersion(fmt.Sprintf("v3/domains/%s", domainId)) - _, err := manager.DeleteInContextWithSpec(nil, groupId, fmt.Sprintf("roles/%s", roleId), nil, nil, "") - if err != nil && errors.Cause(err) == cloudprovider.ErrNotFound { - return nil - } - return err -} - -func (manager *SGroupManager) AddProjectRole(projectId string, groupId, roleId string) error { - if len(projectId) == 0 { - return fmt.Errorf("missing projectId") - } - if len(groupId) == 0 { - return fmt.Errorf("missing groupId") - } - if len(roleId) == 0 { - return fmt.Errorf("missing roleId") - } - manager.SetVersion(fmt.Sprintf("v3/projects/%s", projectId)) - _, err := manager.UpdateInContextWithSpec(nil, groupId, fmt.Sprintf("roles/%s", roleId), nil, "") - return err -} - -func (manager *SGroupManager) AddRole(domainId string, groupId, roleId string) error { - if len(domainId) == 0 { - return fmt.Errorf("missing domainId") - } - if len(groupId) == 0 { - return fmt.Errorf("missing groupId") - } - if len(roleId) == 0 { - return fmt.Errorf("missing roleId") - } - manager.SetVersion(fmt.Sprintf("v3/domains/%s", domainId)) - _, err := manager.UpdateInContextWithSpec(nil, groupId, fmt.Sprintf("roles/%s", roleId), nil, "") - return err -} diff --git a/pkg/multicloud/hcso/client/modules/mod_projects.go b/pkg/multicloud/hcso/client/modules/mod_projects.go index 279823e112..334402ef5c 100644 --- a/pkg/multicloud/hcso/client/modules/mod_projects.go +++ b/pkg/multicloud/hcso/client/modules/mod_projects.go @@ -15,7 +15,13 @@ package modules import ( + "fmt" + + "yunion.io/x/pkg/errors" + + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud/hcso/client/manager" + "yunion.io/x/onecloud/pkg/multicloud/hcso/client/responses" ) type SProjectManager struct { @@ -23,7 +29,7 @@ type SProjectManager struct { } func NewProjectManager(cfg manager.IManagerConfig) *SProjectManager { - return &SProjectManager{SResourceManager: SResourceManager{ + m := &SProjectManager{SResourceManager: SResourceManager{ SBaseManager: NewBaseManager(cfg), ServiceName: ServiceNameIAM, Region: cfg.GetRegionId(), @@ -34,4 +40,50 @@ func NewProjectManager(cfg manager.IManagerConfig) *SProjectManager { ResourceKeyword: "projects", }} + m.SetDomainId(cfg.GetDomainId()) + return m +} + +func (manager *SProjectManager) ListRoles(projectId, groupId string) (*responses.ListResult, error) { + if len(projectId) == 0 { + return nil, fmt.Errorf("missing projectId") + } + if len(groupId) == 0 { + return nil, fmt.Errorf("missing groupId") + } + res := fmt.Sprintf("%s/groups/%s/roles", projectId, groupId) + return manager.ListInContextWithSpec(nil, res, nil, "roles") +} + +func (manager *SProjectManager) DeleteProjectRole(projectId, groupId, roleId string) error { + if len(projectId) == 0 { + return fmt.Errorf("missing projectId") + } + if len(groupId) == 0 { + return fmt.Errorf("missing groupId") + } + if len(roleId) == 0 { + return fmt.Errorf("missing roleId") + } + res := fmt.Sprintf("groups/%s/roles/%s", groupId, roleId) + _, err := manager.DeleteInContextWithSpec(nil, projectId, res, nil, nil, "") + if err != nil && errors.Cause(err) == cloudprovider.ErrNotFound { + return nil + } + return err +} + +func (manager *SProjectManager) AddProjectRole(projectId string, groupId, roleId string) error { + if len(projectId) == 0 { + return fmt.Errorf("missing projectId") + } + if len(groupId) == 0 { + return fmt.Errorf("missing groupId") + } + if len(roleId) == 0 { + return fmt.Errorf("missing roleId") + } + res := fmt.Sprintf("groups/%s/roles/%s", groupId, roleId) + _, err := manager.UpdateInContextWithSpec(nil, projectId, res, nil, "") + return err } diff --git a/pkg/multicloud/hcso/cloudgroup.go b/pkg/multicloud/hcso/cloudgroup.go index 5c9257b65d..033e566161 100644 --- a/pkg/multicloud/hcso/cloudgroup.go +++ b/pkg/multicloud/hcso/cloudgroup.go @@ -90,9 +90,14 @@ func (group *SCloudgroup) GetISystemCloudpolicies() ([]cloudprovider.ICloudpolic } ret := []cloudprovider.ICloudpolicy{} for i := range roles { - if roles[i].Catelog != "CUSTOMED" { - ret = append(ret, &roles[i]) + _, 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 } @@ -104,9 +109,14 @@ func (group *SCloudgroup) GetICustomCloudpolicies() ([]cloudprovider.ICloudpolic } ret := []cloudprovider.ICloudpolicy{} for i := range roles { - if roles[i].Catelog == "CUSTOMED" { - ret = append(ret, &roles[i]) + _, 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 } @@ -184,7 +194,7 @@ func (self *SHuaweiClient) GetGroupRoles(groupId string) ([]SRole, error) { if err != nil { return nil, errors.Wrap(err, "newGeneralAPIClient") } - resp, err := client.Groups.ListRoles(self.ownerId, groupId) + resp, err := client.Domains.ListRoles(self.ownerId, groupId) if err != nil { return nil, errors.Wrap(err, "ListRoles") } @@ -275,12 +285,12 @@ func (self *SHuaweiClient) DetachGroupRole(groupId, roleId string) error { return errors.Wrapf(err, "GetRole(%s)", roleId) } if role.Type == "AX" || role.Type == "AA" { - err = client.Groups.DeleteRole(self.ownerId, groupId, role.Id) + err = client.Domains.DeleteRole(self.ownerId, groupId, role.Id) if err != nil { return errors.Wrapf(err, "DeleteRole") } if strings.Contains(strings.ToLower(role.Policy.String()), "obs") { - err = client.Groups.DeleteProjectRole(self.GetMosProjectId(), groupId, role.Id) + err = client.Projects.DeleteProjectRole(self.GetMosProjectId(), groupId, role.Id) if err != nil { return errors.Wrapf(err, "DeleteProjectRole") } @@ -292,7 +302,7 @@ func (self *SHuaweiClient) DetachGroupRole(groupId, roleId string) error { return errors.Wrapf(err, "GetProjects") } for _, project := range projects { - err = client.Groups.DeleteProjectRole(project.ID, groupId, role.Id) + err = client.Projects.DeleteProjectRole(project.ID, groupId, role.Id) if err != nil { return errors.Wrapf(err, "DeleteProjectRole") } @@ -311,12 +321,12 @@ func (self *SHuaweiClient) DetachGroupCustomRole(groupId, roleId string) error { return errors.Wrapf(err, "GetCustomRole(%s)", roleId) } if role.Type == "AX" || role.Type == "AA" { - err = client.Groups.DeleteRole(self.ownerId, groupId, role.Id) + err = client.Domains.DeleteRole(self.ownerId, groupId, role.Id) if err != nil { return errors.Wrapf(err, "DeleteRole") } if strings.Contains(strings.ToLower(role.Policy.String()), "obs") { - err = client.Groups.DeleteProjectRole(self.GetMosProjectId(), groupId, role.Id) + err = client.Projects.DeleteProjectRole(self.GetMosProjectId(), groupId, role.Id) if err != nil { return errors.Wrapf(err, "DeleteProjectRole") } @@ -328,7 +338,7 @@ func (self *SHuaweiClient) DetachGroupCustomRole(groupId, roleId string) error { return errors.Wrapf(err, "GetProjects") } for _, project := range projects { - err = client.Groups.DeleteProjectRole(project.ID, groupId, role.Id) + err = client.Projects.DeleteProjectRole(project.ID, groupId, role.Id) if err != nil { return errors.Wrapf(err, "DeleteProjectRole") } @@ -373,12 +383,12 @@ func (self *SHuaweiClient) AttachGroupRole(groupId, roleId string) error { return errors.Wrapf(err, "GetRole(%s)", roleId) } if role.Type == "AX" || role.Type == "AA" { - err = client.Groups.AddRole(self.ownerId, groupId, role.Id) + err = client.Domains.AddRole(self.ownerId, groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddRole") } if strings.Contains(strings.ToLower(role.Policy.String()), "obs") { - err = client.Groups.AddProjectRole(self.GetMosProjectId(), groupId, role.Id) + err = client.Projects.AddProjectRole(self.GetMosProjectId(), groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddProjectRole") } @@ -390,7 +400,7 @@ func (self *SHuaweiClient) AttachGroupRole(groupId, roleId string) error { return errors.Wrapf(err, "GetProjects") } for _, project := range projects { - err = client.Groups.AddProjectRole(project.ID, groupId, role.Id) + err = client.Projects.AddProjectRole(project.ID, groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddProjectRole") } @@ -409,12 +419,12 @@ func (self *SHuaweiClient) AttachGroupCustomRole(groupId, roleId string) error { return errors.Wrapf(err, "GetRole(%s)", roleId) } if role.Type == "AX" || role.Type == "AA" { - err = client.Groups.AddRole(self.ownerId, groupId, role.Id) + err = client.Domains.AddRole(self.ownerId, groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddRole") } if strings.Contains(strings.ToLower(role.Policy.String()), "obs") { - err = client.Groups.AddProjectRole(self.GetMosProjectId(), groupId, role.Id) + err = client.Projects.AddProjectRole(self.GetMosProjectId(), groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddProjectRole") } @@ -426,7 +436,7 @@ func (self *SHuaweiClient) AttachGroupCustomRole(groupId, roleId string) error { return errors.Wrapf(err, "GetProjects") } for _, project := range projects { - err = client.Groups.AddProjectRole(project.ID, groupId, role.Id) + err = client.Projects.AddProjectRole(project.ID, groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddProjectRole") } diff --git a/pkg/multicloud/hcso/project.go b/pkg/multicloud/hcso/project.go index 6d0db32434..87e94e05a4 100644 --- a/pkg/multicloud/hcso/project.go +++ b/pkg/multicloud/hcso/project.go @@ -18,6 +18,8 @@ import ( "fmt" "strings" + "yunion.io/x/jsonutils" + api "yunion.io/x/onecloud/pkg/apis/compute" ) @@ -75,6 +77,16 @@ func (self *SHuaweiClient) GetMosProjectId() string { return "" } +func (self *SHuaweiClient) GetMosRoles(groupId string) ([]SRole, error) { + client, _ := self.newGeneralAPIClient() + resp, err := client.Projects.ListRoles(self.GetMosProjectId(), groupId) + if err != nil { + return nil, err + } + ret := []SRole{} + return ret, jsonutils.Update(&ret, resp.Data) +} + func (self *SHuaweiClient) GetProjectById(projectId string) (SProject, error) { projects, err := self.fetchProjects() if err != nil { diff --git a/pkg/multicloud/hcso/shell/region.go b/pkg/multicloud/hcso/shell/region.go index 1f51dc31c2..3c4bf386c9 100644 --- a/pkg/multicloud/hcso/shell/region.go +++ b/pkg/multicloud/hcso/shell/region.go @@ -63,4 +63,17 @@ func init() { return nil }) + type SProjectRoleListOptions struct { + GROUPID string + } + + shellutils.R(&SProjectRoleListOptions{}, "mos-role-list", "List account", func(cli *huawei.SRegion, args *SProjectRoleListOptions) error { + ret, err := cli.GetClient().GetMosRoles(args.GROUPID) + if err != nil { + return err + } + printList(ret, 0, 0, 0, nil) + return nil + }) + } diff --git a/pkg/multicloud/hcso/shell/role.go b/pkg/multicloud/hcso/shell/role.go index 9c9d673488..a8d95f5456 100644 --- a/pkg/multicloud/hcso/shell/role.go +++ b/pkg/multicloud/hcso/shell/role.go @@ -41,6 +41,15 @@ func init() { return nil }) + shellutils.R(&RoleListOptions{}, "cloud-custom-policy-list", "List cloudpolicy", func(cli *huawei.SRegion, args *RoleListOptions) error { + roles, err := cli.GetClient().GetCustomRoles() + if err != nil { + return err + } + printList(roles, 0, 0, 0, nil) + return nil + }) + shellutils.R(&RoleListOptions{}, "cloud-policy-export", "Export cloudpolicy", func(cli *huawei.SRegion, args *RoleListOptions) error { roles, err := cli.GetClient().GetRoles(args.DomainId, args.Name) if err != nil { diff --git a/pkg/multicloud/huawei/client/modules/manager_base.go b/pkg/multicloud/huawei/client/modules/manager_base.go index a8763415f2..1acd2d497c 100644 --- a/pkg/multicloud/huawei/client/modules/manager_base.go +++ b/pkg/multicloud/huawei/client/modules/manager_base.go @@ -239,7 +239,9 @@ func (self *SBaseManager) jsonRequest(request requests.IRequest) (http.Header, j } else if err.Code == 499 && retry > 0 && request.GetMethod() == "GET" { retry -= 1 time.Sleep(3 * time.Second * time.Duration(MAX_RETRY-retry)) - } else if (err.Code == 404 || strings.Contains(err.Details, "could not be found") || strings.Contains(err.Details, "does not exist")) && request.GetMethod() != "POST" { + } else if (err.Code == 404 || strings.Contains(err.Details, "could not be found") || + strings.Contains(err.Error(), "Not Found") || + strings.Contains(err.Details, "does not exist")) && request.GetMethod() != "POST" { return h, b, errors.Wrap(cloudprovider.ErrNotFound, err.Error()) } else if err.Code == 429 && retry > 0 { // 当前请求过多。 diff --git a/pkg/multicloud/huawei/client/modules/mod_domains.go b/pkg/multicloud/huawei/client/modules/mod_domains.go index fd5f23bc53..cbfedb04cb 100644 --- a/pkg/multicloud/huawei/client/modules/mod_domains.go +++ b/pkg/multicloud/huawei/client/modules/mod_domains.go @@ -15,7 +15,13 @@ package modules import ( + "fmt" + + "yunion.io/x/pkg/errors" + + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud/huawei/client/manager" + "yunion.io/x/onecloud/pkg/multicloud/huawei/client/responses" ) type SDomainManager struct { @@ -23,7 +29,7 @@ type SDomainManager struct { } func NewDomainManager(cfg manager.IManagerConfig) *SDomainManager { - return &SDomainManager{SResourceManager: SResourceManager{ + m := &SDomainManager{SResourceManager: SResourceManager{ SBaseManager: NewBaseManager(cfg), ServiceName: ServiceNameIAM, Region: "", @@ -34,4 +40,56 @@ func NewDomainManager(cfg manager.IManagerConfig) *SDomainManager { ResourceKeyword: "domains", }} + m.SetDomainId(cfg.GetDomainId()) + return m +} + +func (manager *SDomainManager) DeleteRole(domainId string, groupId, roleId string) error { + if len(domainId) == 0 { + return fmt.Errorf("missing domainId") + } + if len(groupId) == 0 { + return fmt.Errorf("missing groupId") + } + if len(roleId) == 0 { + return fmt.Errorf("missing roleId") + } + manager.SetVersion("v3") + defer manager.SetVersion("v3/auth") + res := fmt.Sprintf("groups/%s/roles/%s", groupId, roleId) + _, err := manager.DeleteInContextWithSpec(nil, domainId, res, nil, nil, "") + if err != nil && errors.Cause(err) == cloudprovider.ErrNotFound { + return nil + } + return err +} + +func (manager *SDomainManager) ListRoles(domainId string, groupId string) (*responses.ListResult, error) { + if len(domainId) == 0 { + return nil, fmt.Errorf("missing domainId") + } + if len(groupId) == 0 { + return nil, fmt.Errorf("missing groupId") + } + manager.SetVersion("v3") + defer manager.SetVersion("v3/auth") + res := fmt.Sprintf("%s/groups/%s/roles", domainId, groupId) + return manager.ListInContextWithSpec(nil, res, nil, "roles") +} + +func (manager *SDomainManager) AddRole(domainId string, groupId, roleId string) error { + if len(domainId) == 0 { + return fmt.Errorf("missing domainId") + } + if len(groupId) == 0 { + return fmt.Errorf("missing groupId") + } + if len(roleId) == 0 { + return fmt.Errorf("missing roleId") + } + manager.SetVersion("v3") + defer manager.SetVersion("v3/auth") + res := fmt.Sprintf("groups/%s/roles/%s", groupId, roleId) + _, err := manager.UpdateInContextWithSpec(nil, domainId, res, nil, "") + return err } diff --git a/pkg/multicloud/huawei/client/modules/mod_groups.go b/pkg/multicloud/huawei/client/modules/mod_groups.go index 1bcab23db3..75693bef5a 100644 --- a/pkg/multicloud/huawei/client/modules/mod_groups.go +++ b/pkg/multicloud/huawei/client/modules/mod_groups.go @@ -15,13 +15,7 @@ package modules import ( - "fmt" - - "yunion.io/x/pkg/errors" - - "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud/huawei/client/manager" - "yunion.io/x/onecloud/pkg/multicloud/huawei/client/responses" ) type SGroupManager struct { @@ -43,80 +37,3 @@ func NewGroupManager(cfg manager.IManagerConfig) *SGroupManager { m.SetDomainId(cfg.GetDomainId()) return m } - -func (manager *SGroupManager) ListRoles(domainId string, groupId string) (*responses.ListResult, error) { - if len(domainId) == 0 { - return nil, fmt.Errorf("missing domainId") - } - if len(groupId) == 0 { - return nil, fmt.Errorf("missing groupId") - } - manager.SetVersion(fmt.Sprintf("v3/domains/%s", domainId)) - return manager.ListInContextWithSpec(nil, fmt.Sprintf("%s/roles", groupId), nil, "roles") -} - -func (manager *SGroupManager) DeleteProjectRole(projectId, groupId, roleId string) error { - if len(projectId) == 0 { - return fmt.Errorf("missing projectId") - } - if len(groupId) == 0 { - return fmt.Errorf("missing groupId") - } - if len(roleId) == 0 { - return fmt.Errorf("missing roleId") - } - manager.SetVersion(fmt.Sprintf("v3/projects/%s", projectId)) - _, err := manager.DeleteInContextWithSpec(nil, groupId, fmt.Sprintf("roles/%s", roleId), nil, nil, "") - if err != nil && errors.Cause(err) == cloudprovider.ErrNotFound { - return nil - } - return err -} - -func (manager *SGroupManager) DeleteRole(domainId string, groupId, roleId string) error { - if len(domainId) == 0 { - return fmt.Errorf("missing domainId") - } - if len(groupId) == 0 { - return fmt.Errorf("missing groupId") - } - if len(roleId) == 0 { - return fmt.Errorf("missing roleId") - } - manager.SetVersion(fmt.Sprintf("v3/domains/%s", domainId)) - _, err := manager.DeleteInContextWithSpec(nil, groupId, fmt.Sprintf("roles/%s", roleId), nil, nil, "") - if err != nil && errors.Cause(err) == cloudprovider.ErrNotFound { - return nil - } - return err -} - -func (manager *SGroupManager) AddProjectRole(projectId string, groupId, roleId string) error { - if len(projectId) == 0 { - return fmt.Errorf("missing projectId") - } - if len(groupId) == 0 { - return fmt.Errorf("missing groupId") - } - if len(roleId) == 0 { - return fmt.Errorf("missing roleId") - } - manager.SetVersion(fmt.Sprintf("v3/projects/%s", projectId)) - _, err := manager.UpdateInContextWithSpec(nil, groupId, fmt.Sprintf("roles/%s", roleId), nil, "") - return err -} - -func (manager *SGroupManager) AddRole(domainId string, groupId, roleId string) error { - if len(domainId) == 0 { - return fmt.Errorf("missing domainId") - } - if len(groupId) == 0 { - return fmt.Errorf("missing groupId") - } - if len(roleId) == 0 { - return fmt.Errorf("missing roleId") - } - manager.SetVersion(fmt.Sprintf("v3/domains/%s", domainId)) - _, err := manager.UpdateInContextWithSpec(nil, groupId, fmt.Sprintf("roles/%s", roleId), nil, "") - return err -} diff --git a/pkg/multicloud/huawei/client/modules/mod_projects.go b/pkg/multicloud/huawei/client/modules/mod_projects.go index df0febf186..8982d04ce3 100644 --- a/pkg/multicloud/huawei/client/modules/mod_projects.go +++ b/pkg/multicloud/huawei/client/modules/mod_projects.go @@ -15,7 +15,13 @@ package modules import ( + "fmt" + + "yunion.io/x/pkg/errors" + + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud/huawei/client/manager" + "yunion.io/x/onecloud/pkg/multicloud/huawei/client/responses" ) type SProjectManager struct { @@ -23,7 +29,7 @@ type SProjectManager struct { } func NewProjectManager(cfg manager.IManagerConfig) *SProjectManager { - return &SProjectManager{SResourceManager: SResourceManager{ + m := &SProjectManager{SResourceManager: SResourceManager{ SBaseManager: NewBaseManager(cfg), ServiceName: ServiceNameIAM, Region: "", @@ -34,4 +40,50 @@ func NewProjectManager(cfg manager.IManagerConfig) *SProjectManager { ResourceKeyword: "projects", }} + m.SetDomainId(cfg.GetDomainId()) + return m +} + +func (manager *SProjectManager) ListRoles(projectId, groupId string) (*responses.ListResult, error) { + if len(projectId) == 0 { + return nil, fmt.Errorf("missing projectId") + } + if len(groupId) == 0 { + return nil, fmt.Errorf("missing groupId") + } + res := fmt.Sprintf("%s/groups/%s/roles", projectId, groupId) + return manager.ListInContextWithSpec(nil, res, nil, "roles") +} + +func (manager *SProjectManager) DeleteProjectRole(projectId, groupId, roleId string) error { + if len(projectId) == 0 { + return fmt.Errorf("missing projectId") + } + if len(groupId) == 0 { + return fmt.Errorf("missing groupId") + } + if len(roleId) == 0 { + return fmt.Errorf("missing roleId") + } + res := fmt.Sprintf("groups/%s/roles/%s", groupId, roleId) + _, err := manager.DeleteInContextWithSpec(nil, projectId, res, nil, nil, "") + if err != nil && errors.Cause(err) == cloudprovider.ErrNotFound { + return nil + } + return err +} + +func (manager *SProjectManager) AddProjectRole(projectId string, groupId, roleId string) error { + if len(projectId) == 0 { + return fmt.Errorf("missing projectId") + } + if len(groupId) == 0 { + return fmt.Errorf("missing groupId") + } + if len(roleId) == 0 { + return fmt.Errorf("missing roleId") + } + res := fmt.Sprintf("groups/%s/roles/%s", groupId, roleId) + _, err := manager.UpdateInContextWithSpec(nil, projectId, res, nil, "") + return err } diff --git a/pkg/multicloud/huawei/cloudgroup.go b/pkg/multicloud/huawei/cloudgroup.go index 957dfd0347..24b7a1112b 100644 --- a/pkg/multicloud/huawei/cloudgroup.go +++ b/pkg/multicloud/huawei/cloudgroup.go @@ -90,13 +90,35 @@ 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 } func (group *SCloudgroup) GetICustomCloudpolicies() ([]cloudprovider.ICloudpolicy, error) { - return []cloudprovider.ICloudpolicy{}, nil + roles, err := group.client.GetGroupRoles(group.Id) + if err != nil { + return nil, errors.Wrap(err, "GetGroupRoles") + } + 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 } func (group *SCloudgroup) GetICloudusers() ([]cloudprovider.IClouduser, error) { @@ -172,7 +194,7 @@ func (self *SHuaweiClient) GetGroupRoles(groupId string) ([]SRole, error) { if err != nil { return nil, errors.Wrap(err, "newGeneralAPIClient") } - resp, err := client.Groups.ListRoles(self.ownerId, groupId) + resp, err := client.Domains.ListRoles(self.ownerId, groupId) if err != nil { return nil, errors.Wrap(err, "ListRoles") } @@ -308,12 +330,12 @@ func (self *SHuaweiClient) DetachGroupRole(groupId, roleId string) error { return errors.Wrapf(err, "GetRole(%s)", roleId) } if role.Type == "AX" || role.Type == "AA" { - err = client.Groups.AddRole(self.ownerId, groupId, role.Id) + err = client.Domains.AddRole(self.ownerId, groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddRole") } if strings.Contains(strings.ToLower(role.Policy.String()), "obs") { - err = client.Groups.AddProjectRole(self.GetMosProjectId(), groupId, role.Id) + err = client.Projects.AddProjectRole(self.GetMosProjectId(), groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddProjectRole") } @@ -325,7 +347,7 @@ func (self *SHuaweiClient) DetachGroupRole(groupId, roleId string) error { return errors.Wrapf(err, "GetProjects") } for _, project := range projects { - err = client.Groups.AddProjectRole(project.ID, groupId, role.Id) + err = client.Projects.AddProjectRole(project.ID, groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddProjectRole") } @@ -344,12 +366,12 @@ func (self *SHuaweiClient) AttachGroupRole(groupId, roleId string) error { return errors.Wrapf(err, "GetRole(%s)", roleId) } if role.Type == "AX" || role.Type == "AA" { - err = client.Groups.AddRole(self.ownerId, groupId, role.Id) + err = client.Domains.AddRole(self.ownerId, groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddRole") } if strings.Contains(strings.ToLower(role.Policy.String()), "obs") { - err = client.Groups.AddProjectRole(self.GetMosProjectId(), groupId, role.Id) + err = client.Projects.AddProjectRole(self.GetMosProjectId(), groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddProjectRole") } @@ -361,7 +383,7 @@ func (self *SHuaweiClient) AttachGroupRole(groupId, roleId string) error { return errors.Wrapf(err, "GetProjects") } for _, project := range projects { - err = client.Groups.AddProjectRole(project.ID, groupId, role.Id) + err = client.Projects.AddProjectRole(project.ID, groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddProjectRole") } @@ -380,12 +402,12 @@ func (self *SHuaweiClient) AttachGroupCustomRole(groupId, roleId string) error { return errors.Wrapf(err, "GetRole(%s)", roleId) } if role.Type == "AX" || role.Type == "AA" { - err = client.Groups.AddRole(self.ownerId, groupId, role.Id) + err = client.Domains.AddRole(self.ownerId, groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddRole") } if strings.Contains(strings.ToLower(role.Policy.String()), "obs") { - err = client.Groups.AddProjectRole(self.GetMosProjectId(), groupId, role.Id) + err = client.Projects.AddProjectRole(self.GetMosProjectId(), groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddProjectRole") } @@ -397,7 +419,7 @@ func (self *SHuaweiClient) AttachGroupCustomRole(groupId, roleId string) error { return errors.Wrapf(err, "GetProjects") } for _, project := range projects { - err = client.Groups.AddProjectRole(project.ID, groupId, role.Id) + err = client.Projects.AddProjectRole(project.ID, groupId, role.Id) if err != nil { return errors.Wrapf(err, "AddProjectRole") } @@ -416,12 +438,12 @@ func (self *SHuaweiClient) DetachGroupCustomRole(groupId, roleId string) error { return errors.Wrapf(err, "GetCustomRole(%s)", roleId) } if role.Type == "AX" || role.Type == "AA" { - err = client.Groups.DeleteRole(self.ownerId, groupId, role.Id) + err = client.Domains.DeleteRole(self.ownerId, groupId, role.Id) if err != nil { return errors.Wrapf(err, "DeleteRole") } if strings.Contains(strings.ToLower(role.Policy.String()), "obs") { - err = client.Groups.DeleteProjectRole(self.GetMosProjectId(), groupId, role.Id) + err = client.Projects.DeleteProjectRole(self.GetMosProjectId(), groupId, role.Id) if err != nil { return errors.Wrapf(err, "DeleteProjectRole") } @@ -433,7 +455,7 @@ func (self *SHuaweiClient) DetachGroupCustomRole(groupId, roleId string) error { return errors.Wrapf(err, "GetProjects") } for _, project := range projects { - err = client.Groups.DeleteProjectRole(project.ID, groupId, role.Id) + err = client.Projects.DeleteProjectRole(project.ID, groupId, role.Id) if err != nil { return errors.Wrapf(err, "DeleteProjectRole") }