Merge pull request #15041 from ioito/hotfix/qx-cloud-group-role

fix(cloudid): role obs iam
This commit is contained in:
Zexi Li
2022-09-23 17:05:55 +08:00
committed by GitHub
13 changed files with 327 additions and 203 deletions
@@ -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 {
// 当前请求过多。
@@ -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
}
@@ -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
}
@@ -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
}
+27 -17
View File
@@ -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")
}
+12
View File
@@ -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 {
+13
View File
@@ -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
})
}
+9
View File
@@ -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 {
@@ -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 {
// 当前请求过多。
@@ -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
}
@@ -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
}
@@ -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
}
+36 -14
View File
@@ -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")
}