yunion.io/x/cloudmux@v0.3.10-0-alpha.1/pkg/multicloud/hcso/clouduser.go (about)

     1  // Copyright 2019 Yunion
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package hcso
    16  
    17  import (
    18  	"time"
    19  
    20  	"yunion.io/x/jsonutils"
    21  	"yunion.io/x/pkg/errors"
    22  
    23  	"yunion.io/x/cloudmux/pkg/cloudprovider"
    24  	"yunion.io/x/cloudmux/pkg/multicloud/hcso/client/modules"
    25  )
    26  
    27  type SLink struct {
    28  	Next     string
    29  	Previous string
    30  	Self     string
    31  }
    32  
    33  type SClouduser struct {
    34  	client *SHuaweiClient
    35  
    36  	Description       string
    37  	DomainId          string
    38  	Enabled           bool
    39  	ForceResetPwd     bool
    40  	Id                string
    41  	LastProjectId     string
    42  	Links             SLink
    43  	Name              string
    44  	PasswordExpiresAt string
    45  	PwdStatus         bool
    46  }
    47  
    48  func (user *SClouduser) GetGlobalId() string {
    49  	return user.Id
    50  }
    51  
    52  func (user *SClouduser) GetName() string {
    53  	return user.Name
    54  }
    55  
    56  func (user *SClouduser) GetEmailAddr() string {
    57  	return ""
    58  }
    59  
    60  func (user *SClouduser) GetInviteUrl() string {
    61  	return ""
    62  }
    63  
    64  func (user *SClouduser) GetISystemCloudpolicies() ([]cloudprovider.ICloudpolicy, error) {
    65  	return []cloudprovider.ICloudpolicy{}, nil
    66  }
    67  
    68  func (user *SClouduser) GetICustomCloudpolicies() ([]cloudprovider.ICloudpolicy, error) {
    69  	return []cloudprovider.ICloudpolicy{}, nil
    70  }
    71  
    72  func (user *SClouduser) AttachSystemPolicy(policyType string) error {
    73  	return cloudprovider.ErrNotSupported
    74  }
    75  
    76  func (user *SClouduser) AttachCustomPolicy(policyType string) error {
    77  	return cloudprovider.ErrNotSupported
    78  }
    79  
    80  func (user *SClouduser) DetachSystemPolicy(policyId string) error {
    81  	return cloudprovider.ErrNotSupported
    82  }
    83  
    84  func (user *SClouduser) DetachCustomPolicy(policyId string) error {
    85  	return cloudprovider.ErrNotSupported
    86  }
    87  
    88  func (user *SClouduser) GetICloudgroups() ([]cloudprovider.ICloudgroup, error) {
    89  	groups, err := user.client.ListUserGroups(user.Id)
    90  	if err != nil {
    91  		return nil, errors.Wrap(err, "Users.ListGroups")
    92  	}
    93  	ret := []cloudprovider.ICloudgroup{}
    94  	for i := range groups {
    95  		groups[i].client = user.client
    96  		ret = append(ret, &groups[i])
    97  	}
    98  	return ret, nil
    99  }
   100  
   101  func (user *SClouduser) Delete() error {
   102  	return user.client.DeleteClouduser(user.Id)
   103  }
   104  
   105  func (user *SClouduser) IsConsoleLogin() bool {
   106  	return user.Enabled == true
   107  }
   108  
   109  func (user *SClouduser) ResetPassword(password string) error {
   110  	return user.client.ResetClouduserPassword(user.Id, password)
   111  }
   112  
   113  func (self *SHuaweiClient) DeleteClouduser(id string) error {
   114  	client, err := self.newGeneralAPIClient()
   115  	if err != nil {
   116  		return errors.Wrap(err, "newGeneralAPIClient")
   117  	}
   118  	_, err = client.Users.Delete(id)
   119  	return err
   120  }
   121  
   122  func (self *SHuaweiClient) ListUserGroups(userId string) ([]SCloudgroup, error) {
   123  	client, err := self.newGeneralAPIClient()
   124  	if err != nil {
   125  		return nil, errors.Wrap(err, "newGeneralAPIClient")
   126  	}
   127  	result, err := client.Users.ListGroups(userId)
   128  	if err != nil {
   129  		return nil, errors.Wrap(err, "Users.ListGroups")
   130  	}
   131  	groups := []SCloudgroup{}
   132  	err = jsonutils.Update(&groups, result.Data)
   133  	if err != nil {
   134  		return nil, errors.Wrap(err, "jsonutils.Update")
   135  	}
   136  	return groups, nil
   137  }
   138  
   139  func (self *SHuaweiClient) GetCloudusers(name string) ([]SClouduser, error) {
   140  	params := map[string]string{}
   141  	if len(name) > 0 {
   142  		params["name"] = name
   143  	}
   144  	users := []SClouduser{}
   145  	client, err := self.newGeneralAPIClient()
   146  	if err != nil {
   147  		return nil, errors.Wrap(err, "newGeneralAPIClient")
   148  	}
   149  	err = doListAllWithOffset(client.Users.List, params, &users)
   150  	if err != nil {
   151  		return nil, errors.Wrap(err, "doListAllWithOffset")
   152  	}
   153  	return users, nil
   154  }
   155  
   156  func (self *SHuaweiClient) GetICloudusers() ([]cloudprovider.IClouduser, error) {
   157  	users, err := self.GetCloudusers("")
   158  	if err != nil {
   159  		return nil, errors.Wrap(err, "GetCloudusers")
   160  	}
   161  	iUsers := []cloudprovider.IClouduser{}
   162  	for i := range users {
   163  		if users[i].Name != self.ownerName {
   164  			users[i].client = self
   165  			iUsers = append(iUsers, &users[i])
   166  		}
   167  	}
   168  	return iUsers, nil
   169  }
   170  
   171  func (self *SHuaweiClient) GetIClouduserByName(name string) (cloudprovider.IClouduser, error) {
   172  	users, err := self.GetCloudusers(name)
   173  	if err != nil {
   174  		return nil, errors.Wrapf(err, "GetCloudusers(%s)", name)
   175  	}
   176  	if len(users) == 0 {
   177  		return nil, cloudprovider.ErrNotFound
   178  	}
   179  	if len(users) > 1 {
   180  		return nil, cloudprovider.ErrDuplicateId
   181  	}
   182  	users[0].client = self
   183  	return &users[0], nil
   184  }
   185  
   186  func (self *SHuaweiClient) CreateIClouduser(conf *cloudprovider.SClouduserCreateConfig) (cloudprovider.IClouduser, error) {
   187  	return self.CreateClouduser(conf.Name, conf.Password, conf.Desc)
   188  }
   189  
   190  func (self *SHuaweiClient) CreateClouduser(name, password, desc string) (*SClouduser, error) {
   191  	params := map[string]string{
   192  		"name":      name,
   193  		"domain_id": self.ownerId,
   194  	}
   195  	if len(password) > 0 {
   196  		params["password"] = password
   197  	}
   198  	if len(desc) > 0 {
   199  		params["description"] = desc
   200  	}
   201  	client, err := self.newGeneralAPIClient()
   202  	if err != nil {
   203  		return nil, errors.Wrap(err, "newGeneralAPIClient")
   204  	}
   205  	user := SClouduser{client: self}
   206  	err = DoCreate(client.Users.Create, jsonutils.Marshal(map[string]interface{}{"user": params}), &user)
   207  	if err != nil {
   208  		ce, ok := err.(*modules.HuaweiClientError)
   209  		if ok && len(ce.Errorcode) > 0 && ce.Errorcode[0] == "1101" {
   210  			return nil, errors.Wrap(err, `IAM user name. The length is between 5 and 32. The first digit is not a number. Special characters can only contain the '_' '-' or ' '`) //https://support.huaweicloud.com/api-iam/iam_08_0015.html
   211  		}
   212  		return nil, errors.Wrap(err, "DoCreate")
   213  	}
   214  	return &user, nil
   215  }
   216  
   217  func (self *SHuaweiClient) ResetClouduserPassword(id, password string) error {
   218  	client, err := self.newGeneralAPIClient()
   219  	if err != nil {
   220  		return errors.Wrap(err, "newGeneralAPIClient")
   221  	}
   222  	return client.Users.ResetPassword(id, password)
   223  }
   224  
   225  type SAccessKey struct {
   226  	client *SHuaweiClient
   227  
   228  	AccessKey   string    `json:"access"`
   229  	Secret      string    `json:"secret"`
   230  	Description string    `json:"description"`
   231  	Status      string    `json:"status"`
   232  	CreatedAt   time.Time `json:"create_time"`
   233  }
   234  
   235  func (self *SHuaweiClient) GetAKSK(id string) ([]cloudprovider.SAccessKey, error) {
   236  	obj, err := self.getAKSKList(id)
   237  	if err != nil {
   238  		return nil, errors.Wrap(err, "SHuaweiClient.getAKSKList")
   239  	}
   240  	aks := make([]SAccessKey, 0)
   241  	obj.Unmarshal(&aks, "credentials")
   242  	res := make([]cloudprovider.SAccessKey, len(aks))
   243  	for i := 0; i < len(aks); i++ {
   244  		res[i].Name = aks[i].Description
   245  		res[i].AccessKey = aks[i].AccessKey
   246  		res[i].Secret = aks[i].Secret
   247  		res[i].Status = aks[i].Status
   248  		res[i].CreatedAt = aks[i].CreatedAt
   249  	}
   250  	return res, nil
   251  }
   252  
   253  func (self *SHuaweiClient) CreateAKSK(id, name string) (*cloudprovider.SAccessKey, error) {
   254  	params := map[string]interface{}{
   255  		"credential": map[string]interface{}{
   256  			"user_id":     id,
   257  			"description": name,
   258  		},
   259  	}
   260  	obj, err := self.createAKSK(params)
   261  	if err != nil {
   262  		return nil, errors.Wrap(err, "SHuaweiClient.createAKSK")
   263  	}
   264  	ak := SAccessKey{}
   265  	obj.Unmarshal(&ak, "credential")
   266  	res := cloudprovider.SAccessKey{
   267  		Name:      ak.Description,
   268  		AccessKey: ak.AccessKey,
   269  		Secret:    ak.Secret,
   270  	}
   271  	return &res, nil
   272  }
   273  
   274  func (self *SHuaweiClient) DeleteAKSK(accessKey string) error {
   275  	_, err := self.deleteAKSK(accessKey)
   276  	return err
   277  }
   278  
   279  func (user *SClouduser) DeleteAccessKey(accessKey string) error {
   280  	err := user.client.DeleteAKSK(accessKey)
   281  	if err != nil {
   282  		return errors.Wrap(err, "SHuaweiClient.deleteAKSK")
   283  	}
   284  	return nil
   285  }
   286  
   287  func (user *SClouduser) CreateAccessKey(name string) (*cloudprovider.SAccessKey, error) {
   288  	return user.client.CreateAKSK(user.Id, name)
   289  }
   290  
   291  func (user *SClouduser) GetAccessKeys() ([]cloudprovider.SAccessKey, error) {
   292  	return user.client.GetAKSK(user.Id)
   293  }