| // Package v2 contains common functions for creating identity-based resources |
| // for use in acceptance tests. See the `*_test.go` files for example usages. |
| package v2 |
| |
| import ( |
| "testing" |
| |
| "github.com/gophercloud/gophercloud" |
| "github.com/gophercloud/gophercloud/acceptance/tools" |
| "github.com/gophercloud/gophercloud/openstack/identity/v2/extensions/admin/roles" |
| "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants" |
| "github.com/gophercloud/gophercloud/openstack/identity/v2/users" |
| ) |
| |
| // AddUserRole will grant a role to a user in a tenant. An error will be |
| // returned if the grant was unsuccessful. |
| func AddUserRole(t *testing.T, client *gophercloud.ServiceClient, tenant *tenants.Tenant, user *users.User, role *roles.Role) error { |
| t.Logf("Attempting to grant user %s role %s in tenant %s", user.ID, role.ID, tenant.ID) |
| |
| err := roles.AddUser(client, tenant.ID, user.ID, role.ID).ExtractErr() |
| if err != nil { |
| return err |
| } |
| |
| t.Logf("Granted user %s role %s in tenant %s", user.ID, role.ID, tenant.ID) |
| |
| return nil |
| } |
| |
| // CreateUser will create a user with a random name and adds them to the given |
| // tenant. An error will be returned if the user was unable to be created. |
| func CreateUser(t *testing.T, client *gophercloud.ServiceClient, tenant *tenants.Tenant) (*users.User, error) { |
| userName := tools.RandomString("user_", 5) |
| userEmail := userName + "@foo.com" |
| t.Logf("Creating user: %s", userName) |
| |
| createOpts := users.CreateOpts{ |
| Name: userName, |
| Enabled: gophercloud.Disabled, |
| TenantID: tenant.ID, |
| Email: userEmail, |
| } |
| |
| user, err := users.Create(client, createOpts).Extract() |
| if err != nil { |
| return user, err |
| } |
| |
| return user, nil |
| } |
| |
| // DeleteUser will delete a user. A fatal error will occur if the delete was |
| // unsuccessful. This works best when used as a deferred function. |
| func DeleteUser(t *testing.T, client *gophercloud.ServiceClient, user *users.User) { |
| t.Logf("Attempting to delete user: %s", user.Name) |
| |
| result := users.Delete(client, user.ID) |
| if result.Err != nil { |
| t.Fatalf("Unable to delete user") |
| } |
| |
| t.Logf("Deleted user: %s", user.Name) |
| } |
| |
| // DeleteUserRole will revoke a role of a user in a tenant. A fatal error will |
| // occur if the revoke was unsuccessful. This works best when used as a |
| // deferred function. |
| func DeleteUserRole(t *testing.T, client *gophercloud.ServiceClient, tenant *tenants.Tenant, user *users.User, role *roles.Role) { |
| t.Logf("Attempting to remove role %s from user %s in tenant %s", role.ID, user.ID, tenant.ID) |
| |
| err := roles.DeleteUser(client, tenant.ID, user.ID, role.ID).ExtractErr() |
| if err != nil { |
| t.Fatalf("Unable to remove role") |
| } |
| |
| t.Logf("Removed role %s from user %s in tenant %s", role.ID, user.ID, tenant.ID) |
| } |
| |
| // FindRole finds all roles that the current authenticated client has access |
| // to and returns the first one found. An error will be returned if the lookup |
| // was unsuccessful. |
| func FindRole(t *testing.T, client *gophercloud.ServiceClient) (*roles.Role, error) { |
| var role *roles.Role |
| |
| allPages, err := roles.List(client).AllPages() |
| if err != nil { |
| return role, err |
| } |
| |
| allRoles, err := roles.ExtractRoles(allPages) |
| if err != nil { |
| return role, err |
| } |
| |
| for _, r := range allRoles { |
| role = &r |
| break |
| } |
| |
| return role, nil |
| } |
| |
| // FindTenant finds all tenants that the current authenticated client has access |
| // to and returns the first one found. An error will be returned if the lookup |
| // was unsuccessful. |
| func FindTenant(t *testing.T, client *gophercloud.ServiceClient) (*tenants.Tenant, error) { |
| var tenant *tenants.Tenant |
| |
| allPages, err := tenants.List(client, nil).AllPages() |
| if err != nil { |
| return tenant, err |
| } |
| |
| allTenants, err := tenants.ExtractTenants(allPages) |
| if err != nil { |
| return tenant, err |
| } |
| |
| for _, t := range allTenants { |
| tenant = &t |
| break |
| } |
| |
| return tenant, nil |
| } |
| |
| // UpdateUser will update an existing user with a new randomly generated name. |
| // An error will be returned if the update was unsuccessful. |
| func UpdateUser(t *testing.T, client *gophercloud.ServiceClient, user *users.User) (*users.User, error) { |
| userName := tools.RandomString("user_", 5) |
| userEmail := userName + "@foo.com" |
| |
| t.Logf("Attempting to update user name from %s to %s", user.Name, userName) |
| |
| updateOpts := users.UpdateOpts{ |
| Name: userName, |
| Email: userEmail, |
| } |
| |
| newUser, err := users.Update(client, user.ID, updateOpts).Extract() |
| if err != nil { |
| return newUser, err |
| } |
| |
| return newUser, nil |
| } |