cloudgroup.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  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. "fmt"
  17. "strings"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/pkg/errors"
  20. api "yunion.io/x/cloudmux/pkg/apis/cloudid"
  21. "yunion.io/x/cloudmux/pkg/cloudprovider"
  22. )
  23. type SCloudgroup struct {
  24. client *SHuaweiClient
  25. Name string
  26. Description string
  27. Id string
  28. CreateTime string
  29. }
  30. func (group *SCloudgroup) GetName() string {
  31. return group.Name
  32. }
  33. func (group *SCloudgroup) GetDescription() string {
  34. return group.Description
  35. }
  36. func (group *SCloudgroup) GetGlobalId() string {
  37. return group.Id
  38. }
  39. func (group *SCloudgroup) Delete() error {
  40. return group.client.DeleteGroup(group.Id)
  41. }
  42. func (group *SCloudgroup) AddUser(name string) error {
  43. user, err := group.client.GetIClouduserByName(name)
  44. if err != nil {
  45. return errors.Wrap(err, "GetIClouduserByName")
  46. }
  47. return group.client.AddUserToGroup(group.Id, user.GetGlobalId())
  48. }
  49. func (group *SCloudgroup) RemoveUser(name string) error {
  50. user, err := group.client.GetIClouduserByName(name)
  51. if err != nil {
  52. if errors.Cause(err) == cloudprovider.ErrNotFound {
  53. return nil
  54. }
  55. return errors.Wrapf(err, "GetIClouduserByName(%s)", name)
  56. }
  57. return group.client.RemoveUserFromGroup(group.Id, user.GetGlobalId())
  58. }
  59. func (group *SCloudgroup) DetachPolicy(roleId string, policyType api.TPolicyType) error {
  60. if policyType == api.PolicyTypeCustom {
  61. return group.client.DetachGroupCustomRole(group.Id, roleId)
  62. }
  63. return group.client.DetachGroupRole(group.Id, roleId)
  64. }
  65. func (group *SCloudgroup) AttachPolicy(roleId string, policyType api.TPolicyType) error {
  66. if policyType == api.PolicyTypeCustom {
  67. return group.client.AttachGroupCustomRole(group.Id, roleId)
  68. }
  69. return group.client.AttachGroupRole(group.Id, roleId)
  70. }
  71. func (group *SCloudgroup) GetICloudpolicies() ([]cloudprovider.ICloudpolicy, error) {
  72. roles, err := group.client.GetGroupRoles(group.Id)
  73. if err != nil {
  74. return nil, errors.Wrap(err, "GetGroupRoles")
  75. }
  76. ret := []cloudprovider.ICloudpolicy{}
  77. for i := range roles {
  78. _, err := group.client.GetRole(roles[i].GetName())
  79. if err != nil {
  80. if errors.Cause(err) == cloudprovider.ErrNotFound {
  81. continue
  82. }
  83. return nil, errors.Wrapf(err, "GetRole(%s)", roles[i].GetName())
  84. }
  85. ret = append(ret, &roles[i])
  86. }
  87. return ret, nil
  88. }
  89. func (group *SCloudgroup) GetICloudusers() ([]cloudprovider.IClouduser, error) {
  90. users, err := group.client.GetGroupUsers(group.Id)
  91. if err != nil {
  92. return nil, err
  93. }
  94. ret := []cloudprovider.IClouduser{}
  95. for i := range users {
  96. users[i].client = group.client
  97. ret = append(ret, &users[i])
  98. }
  99. return ret, nil
  100. }
  101. func (self *SHuaweiClient) GetGroups(domainId, name string) ([]SCloudgroup, error) {
  102. params := map[string]string{}
  103. if len(domainId) > 0 {
  104. params["domain_id"] = self.ownerId
  105. }
  106. if len(name) > 0 {
  107. params["name"] = name
  108. }
  109. client, err := self.newGeneralAPIClient()
  110. if err != nil {
  111. return nil, errors.Wrap(err, "newGeneralAPIClient")
  112. }
  113. groups := []SCloudgroup{}
  114. err = doListAllWithNextLink(client.Groups.List, params, &groups)
  115. if err != nil {
  116. return nil, errors.Wrap(err, "doListAllWithOffset")
  117. }
  118. return groups, nil
  119. }
  120. func (self *SHuaweiClient) GetICloudgroups() ([]cloudprovider.ICloudgroup, error) {
  121. groups, err := self.GetGroups("", "")
  122. if err != nil {
  123. return nil, errors.Wrap(err, "GetGroup")
  124. }
  125. ret := []cloudprovider.ICloudgroup{}
  126. for i := range groups {
  127. if groups[i].Name != "admin" {
  128. groups[i].client = self
  129. ret = append(ret, &groups[i])
  130. }
  131. }
  132. return ret, nil
  133. }
  134. func (self *SHuaweiClient) GetGroupUsers(groupId string) ([]SClouduser, error) {
  135. client, err := self.newGeneralAPIClient()
  136. if err != nil {
  137. return nil, errors.Wrap(err, "newGeneralAPIClient")
  138. }
  139. resp, err := client.Groups.ListInContextWithSpec(nil, fmt.Sprintf("%s/users", groupId), nil, "users")
  140. if err != nil {
  141. return nil, errors.Wrap(err, "")
  142. }
  143. users := []SClouduser{}
  144. err = jsonutils.Update(&users, resp.Data)
  145. if err != nil {
  146. return nil, errors.Wrap(err, "jsonutils.Update")
  147. }
  148. return users, nil
  149. }
  150. func (self *SHuaweiClient) GetGroupRoles(groupId string) ([]SRole, error) {
  151. client, err := self.newGeneralAPIClient()
  152. if err != nil {
  153. return nil, errors.Wrap(err, "newGeneralAPIClient")
  154. }
  155. resp, err := client.Domains.ListRoles(self.ownerId, groupId)
  156. if err != nil {
  157. return nil, errors.Wrap(err, "ListRoles")
  158. }
  159. roles := []SRole{}
  160. err = jsonutils.Update(&roles, resp.Data)
  161. if err != nil {
  162. return nil, errors.Wrap(err, "jsonutils.Update")
  163. }
  164. return roles, nil
  165. }
  166. func (self *SHuaweiClient) CreateGroup(name, desc string) (*SCloudgroup, error) {
  167. params := map[string]string{
  168. "name": name,
  169. }
  170. if len(desc) > 0 {
  171. params["description"] = desc
  172. }
  173. client, err := self.newGeneralAPIClient()
  174. if err != nil {
  175. return nil, errors.Wrap(err, "newGeneralAPIClient")
  176. }
  177. group := SCloudgroup{client: self}
  178. err = DoCreate(client.Groups.Create, jsonutils.Marshal(map[string]interface{}{"group": params}), &group)
  179. if err != nil {
  180. return nil, errors.Wrap(err, "DoCreate")
  181. }
  182. return &group, nil
  183. }
  184. func (self *SHuaweiClient) CreateICloudgroup(name, desc string) (cloudprovider.ICloudgroup, error) {
  185. group, err := self.CreateGroup(name, desc)
  186. if err != nil {
  187. return nil, errors.Wrap(err, "CreateGroup")
  188. }
  189. return group, nil
  190. }
  191. func (self *SHuaweiClient) DeleteGroup(id string) error {
  192. client, err := self.newGeneralAPIClient()
  193. if err != nil {
  194. return errors.Wrap(err, "newGeneralAPIClient")
  195. }
  196. return DoDeleteWithSpec(client.Groups.DeleteInContextWithSpec, nil, id, "", nil, nil)
  197. }
  198. func (self *SHuaweiClient) GetICloudgroupByName(name string) (cloudprovider.ICloudgroup, error) {
  199. groups, err := self.GetGroups(self.ownerId, name)
  200. if err != nil {
  201. return nil, errors.Wrap(err, "GetGroups")
  202. }
  203. if len(groups) == 0 {
  204. return nil, cloudprovider.ErrNotFound
  205. }
  206. if len(groups) > 1 {
  207. return nil, cloudprovider.ErrDuplicateId
  208. }
  209. groups[0].client = self
  210. return &groups[0], nil
  211. }
  212. func (self *SHuaweiClient) AddUserToGroup(groupId, userId string) error {
  213. client, err := self.newGeneralAPIClient()
  214. if err != nil {
  215. return errors.Wrap(err, "newGeneralAPIClient")
  216. }
  217. _, err = client.Groups.UpdateInContextWithSpec(nil, groupId, fmt.Sprintf("users/%s", userId), nil, "")
  218. return err
  219. }
  220. func (self *SHuaweiClient) RemoveUserFromGroup(groupId, userId string) error {
  221. client, err := self.newGeneralAPIClient()
  222. if err != nil {
  223. return errors.Wrap(err, "newGeneralAPIClient")
  224. }
  225. _, err = client.Groups.DeleteInContextWithSpec(nil, groupId, fmt.Sprintf("users/%s", userId), nil, nil, "")
  226. return err
  227. }
  228. func (self *SHuaweiClient) DetachGroupRole(groupId, roleId string) error {
  229. client, err := self.newGeneralAPIClient()
  230. if err != nil {
  231. return errors.Wrap(err, "newGeneralAPIClient")
  232. }
  233. role, err := self.GetRole(roleId)
  234. if err != nil {
  235. return errors.Wrapf(err, "GetRole(%s)", roleId)
  236. }
  237. if role.Type == "AX" || role.Type == "AA" {
  238. err = client.Domains.DeleteRole(self.ownerId, groupId, role.Id)
  239. if err != nil {
  240. return errors.Wrapf(err, "DeleteRole")
  241. }
  242. if strings.Contains(strings.ToLower(role.Policy.String()), "obs") {
  243. err = client.Projects.DeleteProjectRole(self.GetMosProjectId(), groupId, role.Id)
  244. if err != nil {
  245. return errors.Wrapf(err, "DeleteProjectRole")
  246. }
  247. }
  248. }
  249. if role.Type == "XA" || role.Type == "AA" {
  250. projects, err := self.GetProjects()
  251. if err != nil {
  252. return errors.Wrapf(err, "GetProjects")
  253. }
  254. for _, project := range projects {
  255. err = client.Projects.DeleteProjectRole(project.ID, groupId, role.Id)
  256. if err != nil {
  257. return errors.Wrapf(err, "DeleteProjectRole")
  258. }
  259. }
  260. }
  261. return nil
  262. }
  263. func (self *SHuaweiClient) DetachGroupCustomRole(groupId, roleId string) error {
  264. client, err := self.newGeneralAPIClient()
  265. if err != nil {
  266. return errors.Wrap(err, "newGeneralAPIClient")
  267. }
  268. role, err := self.GetCustomRole(roleId)
  269. if err != nil {
  270. return errors.Wrapf(err, "GetCustomRole(%s)", roleId)
  271. }
  272. if role.Type == "AX" || role.Type == "AA" {
  273. err = client.Domains.DeleteRole(self.ownerId, groupId, role.Id)
  274. if err != nil {
  275. return errors.Wrapf(err, "DeleteRole")
  276. }
  277. if strings.Contains(strings.ToLower(role.Policy.String()), "obs") {
  278. err = client.Projects.DeleteProjectRole(self.GetMosProjectId(), groupId, role.Id)
  279. if err != nil {
  280. return errors.Wrapf(err, "DeleteProjectRole")
  281. }
  282. }
  283. }
  284. if role.Type == "XA" || role.Type == "AA" {
  285. projects, err := self.GetProjects()
  286. if err != nil {
  287. return errors.Wrapf(err, "GetProjects")
  288. }
  289. for _, project := range projects {
  290. err = client.Projects.DeleteProjectRole(project.ID, groupId, role.Id)
  291. if err != nil {
  292. return errors.Wrapf(err, "DeleteProjectRole")
  293. }
  294. }
  295. }
  296. return nil
  297. }
  298. func (self *SHuaweiClient) GetCustomRole(name string) (*SRole, error) {
  299. roles, err := self.GetCustomRoles()
  300. if err != nil {
  301. return nil, errors.Wrapf(err, "GetCustomRoles(%s)", name)
  302. }
  303. for i := range roles {
  304. if roles[i].DisplayName == name {
  305. return &roles[i], nil
  306. }
  307. }
  308. return nil, errors.Wrapf(cloudprovider.ErrNotFound, "%s", name)
  309. }
  310. func (self *SHuaweiClient) GetRole(name string) (*SRole, error) {
  311. roles, err := self.GetRoles("", "")
  312. if err != nil {
  313. return nil, errors.Wrapf(err, "GetRoles(%s)", name)
  314. }
  315. for i := range roles {
  316. if roles[i].DisplayName == name {
  317. return &roles[i], nil
  318. }
  319. }
  320. return nil, errors.Wrapf(cloudprovider.ErrNotFound, "%s", name)
  321. }
  322. func (self *SHuaweiClient) AttachGroupRole(groupId, roleId string) error {
  323. client, err := self.newGeneralAPIClient()
  324. if err != nil {
  325. return errors.Wrap(err, "newGeneralAPIClient")
  326. }
  327. role, err := self.GetRole(roleId)
  328. if err != nil {
  329. return errors.Wrapf(err, "GetRole(%s)", roleId)
  330. }
  331. if role.Type == "AX" || role.Type == "AA" {
  332. err = client.Domains.AddRole(self.ownerId, groupId, role.Id)
  333. if err != nil {
  334. return errors.Wrapf(err, "AddRole")
  335. }
  336. if strings.Contains(strings.ToLower(role.Policy.String()), "obs") {
  337. err = client.Projects.AddProjectRole(self.GetMosProjectId(), groupId, role.Id)
  338. if err != nil {
  339. return errors.Wrapf(err, "AddProjectRole")
  340. }
  341. }
  342. }
  343. if role.Type == "XA" || role.Type == "AA" {
  344. projects, err := self.GetProjects()
  345. if err != nil {
  346. return errors.Wrapf(err, "GetProjects")
  347. }
  348. for _, project := range projects {
  349. err = client.Projects.AddProjectRole(project.ID, groupId, role.Id)
  350. if err != nil {
  351. return errors.Wrapf(err, "AddProjectRole")
  352. }
  353. }
  354. }
  355. return nil
  356. }
  357. func (self *SHuaweiClient) AttachGroupCustomRole(groupId, roleId string) error {
  358. client, err := self.newGeneralAPIClient()
  359. if err != nil {
  360. return errors.Wrap(err, "newGeneralAPIClient")
  361. }
  362. role, err := self.GetCustomRole(roleId)
  363. if err != nil {
  364. return errors.Wrapf(err, "GetRole(%s)", roleId)
  365. }
  366. if role.Type == "AX" || role.Type == "AA" {
  367. err = client.Domains.AddRole(self.ownerId, groupId, role.Id)
  368. if err != nil {
  369. return errors.Wrapf(err, "AddRole")
  370. }
  371. if strings.Contains(strings.ToLower(role.Policy.String()), "obs") {
  372. err = client.Projects.AddProjectRole(self.GetMosProjectId(), groupId, role.Id)
  373. if err != nil {
  374. return errors.Wrapf(err, "AddProjectRole")
  375. }
  376. }
  377. }
  378. if role.Type == "XA" || role.Type == "AA" {
  379. projects, err := self.GetProjects()
  380. if err != nil {
  381. return errors.Wrapf(err, "GetProjects")
  382. }
  383. for _, project := range projects {
  384. err = client.Projects.AddProjectRole(project.ID, groupId, role.Id)
  385. if err != nil {
  386. return errors.Wrapf(err, "AddProjectRole")
  387. }
  388. }
  389. }
  390. return nil
  391. }