/acceptance/openstack/identity/v3/identity.go

https://github.com/gophercloud/gophercloud · Go · 397 lines · 251 code · 83 blank · 63 comment · 65 complexity · ae211b0b8db74ca4b6ca861a6b8938a4 MD5 · raw file

  1. package v3
  2. import (
  3. "testing"
  4. "github.com/gophercloud/gophercloud"
  5. "github.com/gophercloud/gophercloud/acceptance/tools"
  6. "github.com/gophercloud/gophercloud/openstack/identity/v3/domains"
  7. "github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts"
  8. "github.com/gophercloud/gophercloud/openstack/identity/v3/groups"
  9. "github.com/gophercloud/gophercloud/openstack/identity/v3/projects"
  10. "github.com/gophercloud/gophercloud/openstack/identity/v3/regions"
  11. "github.com/gophercloud/gophercloud/openstack/identity/v3/roles"
  12. "github.com/gophercloud/gophercloud/openstack/identity/v3/services"
  13. "github.com/gophercloud/gophercloud/openstack/identity/v3/users"
  14. th "github.com/gophercloud/gophercloud/testhelper"
  15. )
  16. // CreateProject will create a project with a random name.
  17. // It takes an optional createOpts parameter since creating a project
  18. // has so many options. An error will be returned if the project was
  19. // unable to be created.
  20. func CreateProject(t *testing.T, client *gophercloud.ServiceClient, c *projects.CreateOpts) (*projects.Project, error) {
  21. name := tools.RandomString("ACPTTEST", 8)
  22. description := tools.RandomString("ACPTTEST-DESC", 8)
  23. t.Logf("Attempting to create project: %s", name)
  24. var createOpts projects.CreateOpts
  25. if c != nil {
  26. createOpts = *c
  27. } else {
  28. createOpts = projects.CreateOpts{}
  29. }
  30. createOpts.Name = name
  31. createOpts.Description = description
  32. project, err := projects.Create(client, createOpts).Extract()
  33. if err != nil {
  34. return project, err
  35. }
  36. t.Logf("Successfully created project %s with ID %s", name, project.ID)
  37. th.AssertEquals(t, project.Name, name)
  38. th.AssertEquals(t, project.Description, description)
  39. return project, nil
  40. }
  41. // CreateUser will create a user with a random name.
  42. // It takes an optional createOpts parameter since creating a user
  43. // has so many options. An error will be returned if the user was
  44. // unable to be created.
  45. func CreateUser(t *testing.T, client *gophercloud.ServiceClient, c *users.CreateOpts) (*users.User, error) {
  46. name := tools.RandomString("ACPTTEST", 8)
  47. t.Logf("Attempting to create user: %s", name)
  48. var createOpts users.CreateOpts
  49. if c != nil {
  50. createOpts = *c
  51. } else {
  52. createOpts = users.CreateOpts{}
  53. }
  54. createOpts.Name = name
  55. user, err := users.Create(client, createOpts).Extract()
  56. if err != nil {
  57. return user, err
  58. }
  59. t.Logf("Successfully created user %s with ID %s", name, user.ID)
  60. th.AssertEquals(t, user.Name, name)
  61. return user, nil
  62. }
  63. // CreateGroup will create a group with a random name.
  64. // It takes an optional createOpts parameter since creating a group
  65. // has so many options. An error will be returned if the group was
  66. // unable to be created.
  67. func CreateGroup(t *testing.T, client *gophercloud.ServiceClient, c *groups.CreateOpts) (*groups.Group, error) {
  68. name := tools.RandomString("ACPTTEST", 8)
  69. t.Logf("Attempting to create group: %s", name)
  70. var createOpts groups.CreateOpts
  71. if c != nil {
  72. createOpts = *c
  73. } else {
  74. createOpts = groups.CreateOpts{}
  75. }
  76. createOpts.Name = name
  77. group, err := groups.Create(client, createOpts).Extract()
  78. if err != nil {
  79. return group, err
  80. }
  81. t.Logf("Successfully created group %s with ID %s", name, group.ID)
  82. th.AssertEquals(t, group.Name, name)
  83. return group, nil
  84. }
  85. // CreateDomain will create a domain with a random name.
  86. // It takes an optional createOpts parameter since creating a domain
  87. // has many options. An error will be returned if the domain was
  88. // unable to be created.
  89. func CreateDomain(t *testing.T, client *gophercloud.ServiceClient, c *domains.CreateOpts) (*domains.Domain, error) {
  90. name := tools.RandomString("ACPTTEST", 8)
  91. t.Logf("Attempting to create domain: %s", name)
  92. var createOpts domains.CreateOpts
  93. if c != nil {
  94. createOpts = *c
  95. } else {
  96. createOpts = domains.CreateOpts{}
  97. }
  98. createOpts.Name = name
  99. domain, err := domains.Create(client, createOpts).Extract()
  100. if err != nil {
  101. return domain, err
  102. }
  103. t.Logf("Successfully created domain %s with ID %s", name, domain.ID)
  104. th.AssertEquals(t, domain.Name, name)
  105. return domain, nil
  106. }
  107. // CreateRole will create a role with a random name.
  108. // It takes an optional createOpts parameter since creating a role
  109. // has so many options. An error will be returned if the role was
  110. // unable to be created.
  111. func CreateRole(t *testing.T, client *gophercloud.ServiceClient, c *roles.CreateOpts) (*roles.Role, error) {
  112. name := tools.RandomString("ACPTTEST", 8)
  113. t.Logf("Attempting to create role: %s", name)
  114. var createOpts roles.CreateOpts
  115. if c != nil {
  116. createOpts = *c
  117. } else {
  118. createOpts = roles.CreateOpts{}
  119. }
  120. createOpts.Name = name
  121. role, err := roles.Create(client, createOpts).Extract()
  122. if err != nil {
  123. return role, err
  124. }
  125. t.Logf("Successfully created role %s with ID %s", name, role.ID)
  126. th.AssertEquals(t, role.Name, name)
  127. return role, nil
  128. }
  129. // CreateRegion will create a region with a random name.
  130. // It takes an optional createOpts parameter since creating a region
  131. // has so many options. An error will be returned if the region was
  132. // unable to be created.
  133. func CreateRegion(t *testing.T, client *gophercloud.ServiceClient, c *regions.CreateOpts) (*regions.Region, error) {
  134. id := tools.RandomString("ACPTTEST", 8)
  135. t.Logf("Attempting to create region: %s", id)
  136. var createOpts regions.CreateOpts
  137. if c != nil {
  138. createOpts = *c
  139. } else {
  140. createOpts = regions.CreateOpts{}
  141. }
  142. createOpts.ID = id
  143. region, err := regions.Create(client, createOpts).Extract()
  144. if err != nil {
  145. return region, err
  146. }
  147. t.Logf("Successfully created region %s", id)
  148. th.AssertEquals(t, region.ID, id)
  149. return region, nil
  150. }
  151. // CreateService will create a service with a random name.
  152. // It takes an optional createOpts parameter since creating a service
  153. // has so many options. An error will be returned if the service was
  154. // unable to be created.
  155. func CreateService(t *testing.T, client *gophercloud.ServiceClient, c *services.CreateOpts) (*services.Service, error) {
  156. name := tools.RandomString("ACPTTEST", 8)
  157. t.Logf("Attempting to create service: %s", name)
  158. var createOpts services.CreateOpts
  159. if c != nil {
  160. createOpts = *c
  161. } else {
  162. createOpts = services.CreateOpts{}
  163. }
  164. createOpts.Extra["name"] = name
  165. service, err := services.Create(client, createOpts).Extract()
  166. if err != nil {
  167. return service, err
  168. }
  169. t.Logf("Successfully created service %s", service.ID)
  170. th.AssertEquals(t, service.Extra["name"], name)
  171. return service, nil
  172. }
  173. // DeleteProject will delete a project by ID. A fatal error will occur if
  174. // the project ID failed to be deleted. This works best when using it as
  175. // a deferred function.
  176. func DeleteProject(t *testing.T, client *gophercloud.ServiceClient, projectID string) {
  177. err := projects.Delete(client, projectID).ExtractErr()
  178. if err != nil {
  179. t.Fatalf("Unable to delete project %s: %v", projectID, err)
  180. }
  181. t.Logf("Deleted project: %s", projectID)
  182. }
  183. // DeleteUser will delete a user by ID. A fatal error will occur if
  184. // the user failed to be deleted. This works best when using it as
  185. // a deferred function.
  186. func DeleteUser(t *testing.T, client *gophercloud.ServiceClient, userID string) {
  187. err := users.Delete(client, userID).ExtractErr()
  188. if err != nil {
  189. t.Fatalf("Unable to delete user with ID %s: %v", userID, err)
  190. }
  191. t.Logf("Deleted user with ID: %s", userID)
  192. }
  193. // DeleteGroup will delete a group by ID. A fatal error will occur if
  194. // the group failed to be deleted. This works best when using it as
  195. // a deferred function.
  196. func DeleteGroup(t *testing.T, client *gophercloud.ServiceClient, groupID string) {
  197. err := groups.Delete(client, groupID).ExtractErr()
  198. if err != nil {
  199. t.Fatalf("Unable to delete group %s: %v", groupID, err)
  200. }
  201. t.Logf("Deleted group: %s", groupID)
  202. }
  203. // DeleteDomain will delete a domain by ID. A fatal error will occur if
  204. // the project ID failed to be deleted. This works best when using it as
  205. // a deferred function.
  206. func DeleteDomain(t *testing.T, client *gophercloud.ServiceClient, domainID string) {
  207. err := domains.Delete(client, domainID).ExtractErr()
  208. if err != nil {
  209. t.Fatalf("Unable to delete domain %s: %v", domainID, err)
  210. }
  211. t.Logf("Deleted domain: %s", domainID)
  212. }
  213. // DeleteRole will delete a role by ID. A fatal error will occur if
  214. // the role failed to be deleted. This works best when using it as
  215. // a deferred function.
  216. func DeleteRole(t *testing.T, client *gophercloud.ServiceClient, roleID string) {
  217. err := roles.Delete(client, roleID).ExtractErr()
  218. if err != nil {
  219. t.Fatalf("Unable to delete role %s: %v", roleID, err)
  220. }
  221. t.Logf("Deleted role: %s", roleID)
  222. }
  223. // DeleteRegion will delete a reg by ID. A fatal error will occur if
  224. // the region failed to be deleted. This works best when using it as
  225. // a deferred function.
  226. func DeleteRegion(t *testing.T, client *gophercloud.ServiceClient, regionID string) {
  227. err := regions.Delete(client, regionID).ExtractErr()
  228. if err != nil {
  229. t.Fatalf("Unable to delete region %s: %v", regionID, err)
  230. }
  231. t.Logf("Deleted region: %s", regionID)
  232. }
  233. // DeleteService will delete a reg by ID. A fatal error will occur if
  234. // the service failed to be deleted. This works best when using it as
  235. // a deferred function.
  236. func DeleteService(t *testing.T, client *gophercloud.ServiceClient, serviceID string) {
  237. err := services.Delete(client, serviceID).ExtractErr()
  238. if err != nil {
  239. t.Fatalf("Unable to delete service %s: %v", serviceID, err)
  240. }
  241. t.Logf("Deleted service: %s", serviceID)
  242. }
  243. // UnassignRole will delete a role assigned to a user/group on a project/domain
  244. // A fatal error will occur if it fails to delete the assignment.
  245. // This works best when using it as a deferred function.
  246. func UnassignRole(t *testing.T, client *gophercloud.ServiceClient, roleID string, opts *roles.UnassignOpts) {
  247. err := roles.Unassign(client, roleID, *opts).ExtractErr()
  248. if err != nil {
  249. t.Fatalf("Unable to unassign a role %v on context %+v: %v", roleID, *opts, err)
  250. }
  251. t.Logf("Unassigned the role %v on context %+v", roleID, *opts)
  252. }
  253. // FindRole finds all roles that the current authenticated client has access
  254. // to and returns the first one found. An error will be returned if the lookup
  255. // was unsuccessful.
  256. func FindRole(t *testing.T, client *gophercloud.ServiceClient) (*roles.Role, error) {
  257. t.Log("Attempting to find a role")
  258. var role *roles.Role
  259. allPages, err := roles.List(client, nil).AllPages()
  260. if err != nil {
  261. return nil, err
  262. }
  263. allRoles, err := roles.ExtractRoles(allPages)
  264. if err != nil {
  265. return nil, err
  266. }
  267. for _, r := range allRoles {
  268. role = &r
  269. break
  270. }
  271. t.Logf("Successfully found a role %s with ID %s", role.Name, role.ID)
  272. return role, nil
  273. }
  274. // CreateTrust will create a trust with the provided options.
  275. // An error will be returned if the trust was unable to be created.
  276. func CreateTrust(t *testing.T, client *gophercloud.ServiceClient, createOpts trusts.CreateOpts) (*trusts.Trust, error) {
  277. trust, err := trusts.Create(client, createOpts).Extract()
  278. if err != nil {
  279. return nil, err
  280. }
  281. t.Logf("Successfully created trust %s", trust.ID)
  282. return trust, nil
  283. }
  284. // DeleteTrust will delete a trust by ID. A fatal error will occur if
  285. // the trust failed to be deleted. This works best when using it as
  286. // a deferred function.
  287. func DeleteTrust(t *testing.T, client *gophercloud.ServiceClient, trustID string) {
  288. err := trusts.Delete(client, trustID).ExtractErr()
  289. if err != nil {
  290. t.Fatalf("Unable to delete trust %s: %v", trustID, err)
  291. }
  292. t.Logf("Deleted trust: %s", trustID)
  293. }
  294. // FindTrust finds all trusts that the current authenticated client has access
  295. // to and returns the first one found. An error will be returned if the lookup
  296. // was unsuccessful.
  297. func FindTrust(t *testing.T, client *gophercloud.ServiceClient) (*trusts.Trust, error) {
  298. t.Log("Attempting to find a trust")
  299. var trust *trusts.Trust
  300. allPages, err := trusts.List(client, nil).AllPages()
  301. if err != nil {
  302. return nil, err
  303. }
  304. allTrusts, err := trusts.ExtractTrusts(allPages)
  305. if err != nil {
  306. return nil, err
  307. }
  308. for _, t := range allTrusts {
  309. trust = &t
  310. break
  311. }
  312. t.Logf("Successfully found a trust %s ", trust.ID)
  313. return trust, nil
  314. }