clouduser.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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. package hcso
  15. import (
  16. "time"
  17. "yunion.io/x/jsonutils"
  18. "yunion.io/x/pkg/errors"
  19. api "yunion.io/x/cloudmux/pkg/apis/cloudid"
  20. "yunion.io/x/cloudmux/pkg/cloudprovider"
  21. "yunion.io/x/cloudmux/pkg/multicloud"
  22. "yunion.io/x/cloudmux/pkg/multicloud/hcso/client/modules"
  23. )
  24. type SLink struct {
  25. Next string
  26. Previous string
  27. Self string
  28. }
  29. type SClouduser struct {
  30. client *SHuaweiClient
  31. multicloud.SBaseClouduser
  32. Description string
  33. DomainId string
  34. Enabled bool
  35. ForceResetPwd bool
  36. Id string
  37. LastProjectId string
  38. Links SLink
  39. Name string
  40. PasswordExpiresAt string
  41. PwdStatus bool
  42. }
  43. func (user *SClouduser) GetGlobalId() string {
  44. return user.Id
  45. }
  46. func (user *SClouduser) GetName() string {
  47. return user.Name
  48. }
  49. func (user *SClouduser) GetEmailAddr() string {
  50. return ""
  51. }
  52. func (user *SClouduser) GetInviteUrl() string {
  53. return ""
  54. }
  55. func (user *SClouduser) GetICloudpolicies() ([]cloudprovider.ICloudpolicy, error) {
  56. return []cloudprovider.ICloudpolicy{}, nil
  57. }
  58. func (user *SClouduser) AttachPolicy(policyName string, policyType api.TPolicyType) error {
  59. return cloudprovider.ErrNotSupported
  60. }
  61. func (user *SClouduser) DetachPolicy(policyName string, policyType api.TPolicyType) error {
  62. return cloudprovider.ErrNotSupported
  63. }
  64. func (user *SClouduser) GetICloudgroups() ([]cloudprovider.ICloudgroup, error) {
  65. groups, err := user.client.ListUserGroups(user.Id)
  66. if err != nil {
  67. return nil, errors.Wrap(err, "Users.ListGroups")
  68. }
  69. ret := []cloudprovider.ICloudgroup{}
  70. for i := range groups {
  71. groups[i].client = user.client
  72. ret = append(ret, &groups[i])
  73. }
  74. return ret, nil
  75. }
  76. func (user *SClouduser) Delete() error {
  77. return user.client.DeleteClouduser(user.Id)
  78. }
  79. func (user *SClouduser) IsConsoleLogin() bool {
  80. return user.Enabled == true
  81. }
  82. func (user *SClouduser) ResetPassword(password string) error {
  83. return user.client.ResetClouduserPassword(user.Id, password)
  84. }
  85. func (self *SHuaweiClient) DeleteClouduser(id string) error {
  86. client, err := self.newGeneralAPIClient()
  87. if err != nil {
  88. return errors.Wrap(err, "newGeneralAPIClient")
  89. }
  90. _, err = client.Users.Delete(id)
  91. return err
  92. }
  93. func (self *SHuaweiClient) ListUserGroups(userId string) ([]SCloudgroup, error) {
  94. client, err := self.newGeneralAPIClient()
  95. if err != nil {
  96. return nil, errors.Wrap(err, "newGeneralAPIClient")
  97. }
  98. result, err := client.Users.ListGroups(userId)
  99. if err != nil {
  100. return nil, errors.Wrap(err, "Users.ListGroups")
  101. }
  102. groups := []SCloudgroup{}
  103. err = jsonutils.Update(&groups, result.Data)
  104. if err != nil {
  105. return nil, errors.Wrap(err, "jsonutils.Update")
  106. }
  107. return groups, nil
  108. }
  109. func (self *SHuaweiClient) GetCloudusers(name string) ([]SClouduser, error) {
  110. params := map[string]string{}
  111. if len(name) > 0 {
  112. params["name"] = name
  113. }
  114. users := []SClouduser{}
  115. client, err := self.newGeneralAPIClient()
  116. if err != nil {
  117. return nil, errors.Wrap(err, "newGeneralAPIClient")
  118. }
  119. err = doListAllWithOffset(client.Users.List, params, &users)
  120. if err != nil {
  121. return nil, errors.Wrap(err, "doListAllWithOffset")
  122. }
  123. return users, nil
  124. }
  125. func (self *SHuaweiClient) GetICloudusers() ([]cloudprovider.IClouduser, error) {
  126. users, err := self.GetCloudusers("")
  127. if err != nil {
  128. return nil, errors.Wrap(err, "GetCloudusers")
  129. }
  130. iUsers := []cloudprovider.IClouduser{}
  131. for i := range users {
  132. if users[i].Name != self.ownerName {
  133. users[i].client = self
  134. iUsers = append(iUsers, &users[i])
  135. }
  136. }
  137. return iUsers, nil
  138. }
  139. func (self *SHuaweiClient) GetIClouduserByName(name string) (cloudprovider.IClouduser, error) {
  140. users, err := self.GetCloudusers(name)
  141. if err != nil {
  142. return nil, errors.Wrapf(err, "GetCloudusers(%s)", name)
  143. }
  144. if len(users) == 0 {
  145. return nil, cloudprovider.ErrNotFound
  146. }
  147. if len(users) > 1 {
  148. return nil, cloudprovider.ErrDuplicateId
  149. }
  150. users[0].client = self
  151. return &users[0], nil
  152. }
  153. func (self *SHuaweiClient) CreateIClouduser(conf *cloudprovider.SClouduserCreateConfig) (cloudprovider.IClouduser, error) {
  154. return self.CreateClouduser(conf.Name, conf.Password, conf.Desc)
  155. }
  156. func (self *SHuaweiClient) CreateClouduser(name, password, desc string) (*SClouduser, error) {
  157. params := map[string]string{
  158. "name": name,
  159. "domain_id": self.ownerId,
  160. }
  161. if len(password) > 0 {
  162. params["password"] = password
  163. }
  164. if len(desc) > 0 {
  165. params["description"] = desc
  166. }
  167. client, err := self.newGeneralAPIClient()
  168. if err != nil {
  169. return nil, errors.Wrap(err, "newGeneralAPIClient")
  170. }
  171. user := SClouduser{client: self}
  172. err = DoCreate(client.Users.Create, jsonutils.Marshal(map[string]interface{}{"user": params}), &user)
  173. if err != nil {
  174. ce, ok := err.(*modules.HuaweiClientError)
  175. if ok && len(ce.Errorcode) > 0 && ce.Errorcode[0] == "1101" {
  176. 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
  177. }
  178. return nil, errors.Wrap(err, "DoCreate")
  179. }
  180. return &user, nil
  181. }
  182. func (self *SHuaweiClient) ResetClouduserPassword(id, password string) error {
  183. client, err := self.newGeneralAPIClient()
  184. if err != nil {
  185. return errors.Wrap(err, "newGeneralAPIClient")
  186. }
  187. return client.Users.ResetPassword(id, password)
  188. }
  189. type SAccessKey struct {
  190. client *SHuaweiClient
  191. AccessKey string `json:"access"`
  192. Secret string `json:"secret"`
  193. Description string `json:"description"`
  194. Status string `json:"status"`
  195. CreatedAt time.Time `json:"create_time"`
  196. }
  197. func (self *SHuaweiClient) GetAKSK(id string) ([]cloudprovider.SAccessKey, error) {
  198. obj, err := self.getAKSKList(id)
  199. if err != nil {
  200. return nil, errors.Wrap(err, "SHuaweiClient.getAKSKList")
  201. }
  202. aks := make([]SAccessKey, 0)
  203. obj.Unmarshal(&aks, "credentials")
  204. res := make([]cloudprovider.SAccessKey, len(aks))
  205. for i := 0; i < len(aks); i++ {
  206. res[i].Name = aks[i].Description
  207. res[i].AccessKey = aks[i].AccessKey
  208. res[i].Secret = aks[i].Secret
  209. res[i].Status = aks[i].Status
  210. res[i].CreatedAt = aks[i].CreatedAt
  211. }
  212. return res, nil
  213. }
  214. func (self *SHuaweiClient) CreateAKSK(id, name string) (*cloudprovider.SAccessKey, error) {
  215. params := map[string]interface{}{
  216. "credential": map[string]interface{}{
  217. "user_id": id,
  218. "description": name,
  219. },
  220. }
  221. obj, err := self.createAKSK(params)
  222. if err != nil {
  223. return nil, errors.Wrap(err, "SHuaweiClient.createAKSK")
  224. }
  225. ak := SAccessKey{}
  226. obj.Unmarshal(&ak, "credential")
  227. res := cloudprovider.SAccessKey{
  228. Name: ak.Description,
  229. AccessKey: ak.AccessKey,
  230. Secret: ak.Secret,
  231. }
  232. return &res, nil
  233. }
  234. func (self *SHuaweiClient) DeleteAKSK(accessKey string) error {
  235. _, err := self.deleteAKSK(accessKey)
  236. return err
  237. }
  238. func (user *SClouduser) DeleteAccessKey(accessKey string) error {
  239. err := user.client.DeleteAKSK(accessKey)
  240. if err != nil {
  241. return errors.Wrap(err, "SHuaweiClient.deleteAKSK")
  242. }
  243. return nil
  244. }
  245. func (user *SClouduser) CreateAccessKey(name string) (*cloudprovider.SAccessKey, error) {
  246. return user.client.CreateAKSK(user.Id, name)
  247. }
  248. func (user *SClouduser) GetAccessKeys() ([]cloudprovider.SAccessKey, error) {
  249. return user.client.GetAKSK(user.Id)
  250. }