| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 |
- // Copyright 2019 Yunion
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package hcso
- import (
- "fmt"
- "strings"
- "yunion.io/x/jsonutils"
- "yunion.io/x/pkg/errors"
- api "yunion.io/x/cloudmux/pkg/apis/cloudid"
- "yunion.io/x/cloudmux/pkg/cloudprovider"
- )
- type SCloudgroup struct {
- client *SHuaweiClient
- Name string
- Description string
- Id string
- CreateTime string
- }
- func (group *SCloudgroup) GetName() string {
- return group.Name
- }
- func (group *SCloudgroup) GetDescription() string {
- return group.Description
- }
- func (group *SCloudgroup) GetGlobalId() string {
- return group.Id
- }
- func (group *SCloudgroup) Delete() error {
- return group.client.DeleteGroup(group.Id)
- }
- func (group *SCloudgroup) AddUser(name string) error {
- user, err := group.client.GetIClouduserByName(name)
- if err != nil {
- return errors.Wrap(err, "GetIClouduserByName")
- }
- return group.client.AddUserToGroup(group.Id, user.GetGlobalId())
- }
- func (group *SCloudgroup) RemoveUser(name string) error {
- user, err := group.client.GetIClouduserByName(name)
- if err != nil {
- if errors.Cause(err) == cloudprovider.ErrNotFound {
- return nil
- }
- return errors.Wrapf(err, "GetIClouduserByName(%s)", name)
- }
- return group.client.RemoveUserFromGroup(group.Id, user.GetGlobalId())
- }
- func (group *SCloudgroup) DetachPolicy(roleId string, policyType api.TPolicyType) error {
- if policyType == api.PolicyTypeCustom {
- return group.client.DetachGroupCustomRole(group.Id, roleId)
- }
- return group.client.DetachGroupRole(group.Id, roleId)
- }
- func (group *SCloudgroup) AttachPolicy(roleId string, policyType api.TPolicyType) error {
- if policyType == api.PolicyTypeCustom {
- return group.client.AttachGroupCustomRole(group.Id, roleId)
- }
- return group.client.AttachGroupRole(group.Id, roleId)
- }
- func (group *SCloudgroup) GetICloudpolicies() ([]cloudprovider.ICloudpolicy, error) {
- 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.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) GetICloudusers() ([]cloudprovider.IClouduser, error) {
- users, err := group.client.GetGroupUsers(group.Id)
- if err != nil {
- return nil, err
- }
- ret := []cloudprovider.IClouduser{}
- for i := range users {
- users[i].client = group.client
- ret = append(ret, &users[i])
- }
- return ret, nil
- }
- func (self *SHuaweiClient) GetGroups(domainId, name string) ([]SCloudgroup, error) {
- params := map[string]string{}
- if len(domainId) > 0 {
- params["domain_id"] = self.ownerId
- }
- if len(name) > 0 {
- params["name"] = name
- }
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return nil, errors.Wrap(err, "newGeneralAPIClient")
- }
- groups := []SCloudgroup{}
- err = doListAllWithNextLink(client.Groups.List, params, &groups)
- if err != nil {
- return nil, errors.Wrap(err, "doListAllWithOffset")
- }
- return groups, nil
- }
- func (self *SHuaweiClient) GetICloudgroups() ([]cloudprovider.ICloudgroup, error) {
- groups, err := self.GetGroups("", "")
- if err != nil {
- return nil, errors.Wrap(err, "GetGroup")
- }
- ret := []cloudprovider.ICloudgroup{}
- for i := range groups {
- if groups[i].Name != "admin" {
- groups[i].client = self
- ret = append(ret, &groups[i])
- }
- }
- return ret, nil
- }
- func (self *SHuaweiClient) GetGroupUsers(groupId string) ([]SClouduser, error) {
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return nil, errors.Wrap(err, "newGeneralAPIClient")
- }
- resp, err := client.Groups.ListInContextWithSpec(nil, fmt.Sprintf("%s/users", groupId), nil, "users")
- if err != nil {
- return nil, errors.Wrap(err, "")
- }
- users := []SClouduser{}
- err = jsonutils.Update(&users, resp.Data)
- if err != nil {
- return nil, errors.Wrap(err, "jsonutils.Update")
- }
- return users, nil
- }
- func (self *SHuaweiClient) GetGroupRoles(groupId string) ([]SRole, error) {
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return nil, errors.Wrap(err, "newGeneralAPIClient")
- }
- resp, err := client.Domains.ListRoles(self.ownerId, groupId)
- if err != nil {
- return nil, errors.Wrap(err, "ListRoles")
- }
- roles := []SRole{}
- err = jsonutils.Update(&roles, resp.Data)
- if err != nil {
- return nil, errors.Wrap(err, "jsonutils.Update")
- }
- return roles, nil
- }
- func (self *SHuaweiClient) CreateGroup(name, desc string) (*SCloudgroup, error) {
- params := map[string]string{
- "name": name,
- }
- if len(desc) > 0 {
- params["description"] = desc
- }
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return nil, errors.Wrap(err, "newGeneralAPIClient")
- }
- group := SCloudgroup{client: self}
- err = DoCreate(client.Groups.Create, jsonutils.Marshal(map[string]interface{}{"group": params}), &group)
- if err != nil {
- return nil, errors.Wrap(err, "DoCreate")
- }
- return &group, nil
- }
- func (self *SHuaweiClient) CreateICloudgroup(name, desc string) (cloudprovider.ICloudgroup, error) {
- group, err := self.CreateGroup(name, desc)
- if err != nil {
- return nil, errors.Wrap(err, "CreateGroup")
- }
- return group, nil
- }
- func (self *SHuaweiClient) DeleteGroup(id string) error {
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return errors.Wrap(err, "newGeneralAPIClient")
- }
- return DoDeleteWithSpec(client.Groups.DeleteInContextWithSpec, nil, id, "", nil, nil)
- }
- func (self *SHuaweiClient) GetICloudgroupByName(name string) (cloudprovider.ICloudgroup, error) {
- groups, err := self.GetGroups(self.ownerId, name)
- if err != nil {
- return nil, errors.Wrap(err, "GetGroups")
- }
- if len(groups) == 0 {
- return nil, cloudprovider.ErrNotFound
- }
- if len(groups) > 1 {
- return nil, cloudprovider.ErrDuplicateId
- }
- groups[0].client = self
- return &groups[0], nil
- }
- func (self *SHuaweiClient) AddUserToGroup(groupId, userId string) error {
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return errors.Wrap(err, "newGeneralAPIClient")
- }
- _, err = client.Groups.UpdateInContextWithSpec(nil, groupId, fmt.Sprintf("users/%s", userId), nil, "")
- return err
- }
- func (self *SHuaweiClient) RemoveUserFromGroup(groupId, userId string) error {
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return errors.Wrap(err, "newGeneralAPIClient")
- }
- _, err = client.Groups.DeleteInContextWithSpec(nil, groupId, fmt.Sprintf("users/%s", userId), nil, nil, "")
- return err
- }
- func (self *SHuaweiClient) DetachGroupRole(groupId, roleId string) error {
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return errors.Wrap(err, "newGeneralAPIClient")
- }
- role, err := self.GetRole(roleId)
- if err != nil {
- return errors.Wrapf(err, "GetRole(%s)", roleId)
- }
- if role.Type == "AX" || role.Type == "AA" {
- 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.Projects.DeleteProjectRole(self.GetMosProjectId(), groupId, role.Id)
- if err != nil {
- return errors.Wrapf(err, "DeleteProjectRole")
- }
- }
- }
- if role.Type == "XA" || role.Type == "AA" {
- projects, err := self.GetProjects()
- if err != nil {
- return errors.Wrapf(err, "GetProjects")
- }
- for _, project := range projects {
- err = client.Projects.DeleteProjectRole(project.ID, groupId, role.Id)
- if err != nil {
- return errors.Wrapf(err, "DeleteProjectRole")
- }
- }
- }
- return nil
- }
- func (self *SHuaweiClient) DetachGroupCustomRole(groupId, roleId string) error {
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return errors.Wrap(err, "newGeneralAPIClient")
- }
- role, err := self.GetCustomRole(roleId)
- if err != nil {
- return errors.Wrapf(err, "GetCustomRole(%s)", roleId)
- }
- if role.Type == "AX" || role.Type == "AA" {
- 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.Projects.DeleteProjectRole(self.GetMosProjectId(), groupId, role.Id)
- if err != nil {
- return errors.Wrapf(err, "DeleteProjectRole")
- }
- }
- }
- if role.Type == "XA" || role.Type == "AA" {
- projects, err := self.GetProjects()
- if err != nil {
- return errors.Wrapf(err, "GetProjects")
- }
- for _, project := range projects {
- err = client.Projects.DeleteProjectRole(project.ID, groupId, role.Id)
- if err != nil {
- return errors.Wrapf(err, "DeleteProjectRole")
- }
- }
- }
- return nil
- }
- func (self *SHuaweiClient) GetCustomRole(name string) (*SRole, error) {
- roles, err := self.GetCustomRoles()
- if err != nil {
- return nil, errors.Wrapf(err, "GetCustomRoles(%s)", name)
- }
- for i := range roles {
- if roles[i].DisplayName == name {
- return &roles[i], nil
- }
- }
- return nil, errors.Wrapf(cloudprovider.ErrNotFound, "%s", name)
- }
- func (self *SHuaweiClient) GetRole(name string) (*SRole, error) {
- roles, err := self.GetRoles("", "")
- if err != nil {
- return nil, errors.Wrapf(err, "GetRoles(%s)", name)
- }
- for i := range roles {
- if roles[i].DisplayName == name {
- return &roles[i], nil
- }
- }
- return nil, errors.Wrapf(cloudprovider.ErrNotFound, "%s", name)
- }
- func (self *SHuaweiClient) AttachGroupRole(groupId, roleId string) error {
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return errors.Wrap(err, "newGeneralAPIClient")
- }
- role, err := self.GetRole(roleId)
- if err != nil {
- return errors.Wrapf(err, "GetRole(%s)", roleId)
- }
- if role.Type == "AX" || role.Type == "AA" {
- 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.Projects.AddProjectRole(self.GetMosProjectId(), groupId, role.Id)
- if err != nil {
- return errors.Wrapf(err, "AddProjectRole")
- }
- }
- }
- if role.Type == "XA" || role.Type == "AA" {
- projects, err := self.GetProjects()
- if err != nil {
- return errors.Wrapf(err, "GetProjects")
- }
- for _, project := range projects {
- err = client.Projects.AddProjectRole(project.ID, groupId, role.Id)
- if err != nil {
- return errors.Wrapf(err, "AddProjectRole")
- }
- }
- }
- return nil
- }
- func (self *SHuaweiClient) AttachGroupCustomRole(groupId, roleId string) error {
- client, err := self.newGeneralAPIClient()
- if err != nil {
- return errors.Wrap(err, "newGeneralAPIClient")
- }
- role, err := self.GetCustomRole(roleId)
- if err != nil {
- return errors.Wrapf(err, "GetRole(%s)", roleId)
- }
- if role.Type == "AX" || role.Type == "AA" {
- 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.Projects.AddProjectRole(self.GetMosProjectId(), groupId, role.Id)
- if err != nil {
- return errors.Wrapf(err, "AddProjectRole")
- }
- }
- }
- if role.Type == "XA" || role.Type == "AA" {
- projects, err := self.GetProjects()
- if err != nil {
- return errors.Wrapf(err, "GetProjects")
- }
- for _, project := range projects {
- err = client.Projects.AddProjectRole(project.ID, groupId, role.Id)
- if err != nil {
- return errors.Wrapf(err, "AddProjectRole")
- }
- }
- }
- return nil
- }
|