mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
fix(cloudid): role obs iam
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user