group.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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 volcengine
  15. import (
  16. "fmt"
  17. api "yunion.io/x/cloudmux/pkg/apis/cloudid"
  18. "yunion.io/x/cloudmux/pkg/cloudprovider"
  19. "yunion.io/x/pkg/utils"
  20. )
  21. type SGroup struct {
  22. client *SVolcEngineClient
  23. Description string
  24. CreatedDate string
  25. UserGroupName string
  26. UpdateDate string
  27. AccountId string
  28. UserGroupId string
  29. }
  30. func (self *SGroup) GetName() string {
  31. return self.UserGroupName
  32. }
  33. func (self *SGroup) GetGlobalId() string {
  34. return self.UserGroupName
  35. }
  36. func (self *SGroup) GetDescription() string {
  37. return self.Description
  38. }
  39. func (self *SGroup) GetICloudusers() ([]cloudprovider.IClouduser, error) {
  40. users, err := self.client.ListUsersForGroup(self.UserGroupName)
  41. if err != nil {
  42. return nil, err
  43. }
  44. ret := []cloudprovider.IClouduser{}
  45. for i := range users {
  46. users[i].client = self.client
  47. ret = append(ret, &users[i])
  48. }
  49. return ret, nil
  50. }
  51. func (self *SGroup) GetICloudpolicies() ([]cloudprovider.ICloudpolicy, error) {
  52. policies, err := self.client.ListAttachedUserGroupPolicies(self.UserGroupName)
  53. if err != nil {
  54. return nil, err
  55. }
  56. ret := []cloudprovider.ICloudpolicy{}
  57. for i := range policies {
  58. policies[i].client = self.client
  59. ret = append(ret, &policies[i])
  60. }
  61. return ret, nil
  62. }
  63. func (self *SGroup) AddUser(name string) error {
  64. return self.client.AddUserToGroup(name, self.UserGroupName)
  65. }
  66. func (self *SGroup) RemoveUser(name string) error {
  67. return self.client.RemoveUserFromGroup(name, self.UserGroupName)
  68. }
  69. func (self *SGroup) AttachPolicy(policyName string, policyType api.TPolicyType) error {
  70. return self.client.AttachUserGroupPolicy(self.UserGroupName, policyName, utils.Capitalize(string(policyType)))
  71. }
  72. func (self *SGroup) DetachPolicy(policyName string, policyType api.TPolicyType) error {
  73. return self.client.DetachUserGroupPolicy(self.UserGroupName, policyName, utils.Capitalize(string(policyType)))
  74. }
  75. func (self *SGroup) Delete() error {
  76. return self.client.DeleteGroup(self.UserGroupName)
  77. }
  78. func (self *SVolcEngineClient) CreateICloudgroup(name string, desc string) (cloudprovider.ICloudgroup, error) {
  79. group, err := self.CreateGroup(name, desc)
  80. if err != nil {
  81. return nil, err
  82. }
  83. return group, nil
  84. }
  85. func (self *SVolcEngineClient) GetICloudgroups() ([]cloudprovider.ICloudgroup, error) {
  86. groups, err := self.ListGroups()
  87. if err != nil {
  88. return nil, err
  89. }
  90. ret := []cloudprovider.ICloudgroup{}
  91. for i := range groups {
  92. groups[i].client = self
  93. ret = append(ret, &groups[i])
  94. }
  95. return ret, nil
  96. }
  97. func (client *SVolcEngineClient) ListGroups() ([]SGroup, error) {
  98. params := map[string]string{
  99. "Limit": "50",
  100. }
  101. offset := 0
  102. ret := []SGroup{}
  103. for {
  104. params["Offset"] = fmt.Sprintf("%d", offset)
  105. resp, err := client.iamRequest("", "ListGroups", params)
  106. if err != nil {
  107. return nil, err
  108. }
  109. part := struct {
  110. UserGroups []SGroup
  111. Total int
  112. }{}
  113. err = resp.Unmarshal(&part)
  114. if err != nil {
  115. return nil, err
  116. }
  117. ret = append(ret, part.UserGroups...)
  118. if len(part.UserGroups) == 0 || len(ret) >= part.Total {
  119. break
  120. }
  121. offset = len(ret)
  122. }
  123. return ret, nil
  124. }
  125. func (client *SVolcEngineClient) ListUsersForGroup(name string) ([]SUser, error) {
  126. params := map[string]string{
  127. "Limit": "50",
  128. "UserGroupName": name,
  129. }
  130. offset := 0
  131. ret := []SUser{}
  132. for {
  133. params["Offset"] = fmt.Sprintf("%d", offset)
  134. resp, err := client.iamRequest("", "ListUsersForGroup", params)
  135. if err != nil {
  136. return nil, err
  137. }
  138. part := struct {
  139. Users []SUser
  140. Total int
  141. }{}
  142. err = resp.Unmarshal(&part)
  143. if err != nil {
  144. return nil, err
  145. }
  146. ret = append(ret, part.Users...)
  147. if len(part.Users) == 0 || len(ret) >= part.Total {
  148. break
  149. }
  150. offset = len(ret)
  151. }
  152. return ret, nil
  153. }
  154. func (client *SVolcEngineClient) ListAttachedUserGroupPolicies(name string) ([]SPolicy, error) {
  155. params := map[string]string{
  156. "UserGroupName": name,
  157. }
  158. resp, err := client.iamRequest("", "ListAttachedUserGroupPolicies", params)
  159. if err != nil {
  160. return nil, err
  161. }
  162. ret := []SPolicy{}
  163. err = resp.Unmarshal(&ret, "AttachedPolicyMetadata")
  164. if err != nil {
  165. return nil, err
  166. }
  167. return ret, nil
  168. }
  169. func (client *SVolcEngineClient) AttachUserGroupPolicy(name, policy, policyType string) error {
  170. params := map[string]string{
  171. "UserGroupName": name,
  172. "PolicyName": policy,
  173. "PolicyType": policyType,
  174. }
  175. _, err := client.iamRequest("", "AttachUserGroupPolicy", params)
  176. return err
  177. }
  178. func (client *SVolcEngineClient) DetachUserGroupPolicy(name, policy, policyType string) error {
  179. params := map[string]string{
  180. "UserGroupName": name,
  181. "PolicyName": policy,
  182. "PolicyType": policyType,
  183. }
  184. _, err := client.iamRequest("", "DetachUserGroupPolicy", params)
  185. return err
  186. }
  187. func (client *SVolcEngineClient) DeleteGroup(name string) error {
  188. params := map[string]string{
  189. "UserGroupName": name,
  190. }
  191. _, err := client.iamRequest("", "DeleteGroup", params)
  192. return err
  193. }
  194. func (client *SVolcEngineClient) AddUserToGroup(user, group string) error {
  195. params := map[string]string{
  196. "UserGroupName": group,
  197. "UserName": user,
  198. }
  199. _, err := client.iamRequest("", "AddUserToGroup", params)
  200. return err
  201. }
  202. func (client *SVolcEngineClient) RemoveUserFromGroup(user, group string) error {
  203. params := map[string]string{
  204. "UserGroupName": group,
  205. "UserName": user,
  206. }
  207. _, err := client.iamRequest("", "RemoveUserFromGroup", params)
  208. return err
  209. }
  210. func (client *SVolcEngineClient) CreateGroup(name, desc string) (*SGroup, error) {
  211. params := map[string]string{
  212. "UserGroupName": name,
  213. "Description": desc,
  214. }
  215. resp, err := client.iamRequest("", "CreateGroup", params)
  216. if err != nil {
  217. return nil, err
  218. }
  219. ret := &SGroup{client: client}
  220. err = resp.Unmarshal(ret, "UserGroup")
  221. if err != nil {
  222. return nil, err
  223. }
  224. return ret, nil
  225. }
  226. func (client *SVolcEngineClient) GetICloudgroupByName(name string) (cloudprovider.ICloudgroup, error) {
  227. group, err := client.GetGroup(name)
  228. if err != nil {
  229. return nil, err
  230. }
  231. return group, nil
  232. }
  233. func (client *SVolcEngineClient) GetGroup(name string) (*SGroup, error) {
  234. params := map[string]string{
  235. "UserGroupName": name,
  236. }
  237. resp, err := client.iamRequest("", "GetGroup", params)
  238. if err != nil {
  239. return nil, err
  240. }
  241. ret := &SGroup{client: client}
  242. err = resp.Unmarshal(ret, "UserGroup")
  243. if err != nil {
  244. return nil, err
  245. }
  246. return ret, nil
  247. }