github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/identity/v2/identity.go (about) 1 // Package v2 contains common functions for creating identity-based resources 2 // for use in acceptance tests. See the `*_test.go` files for example usages. 3 package v2 4 5 import ( 6 "testing" 7 8 "github.com/gophercloud/gophercloud" 9 "github.com/gophercloud/gophercloud/internal/acceptance/tools" 10 "github.com/gophercloud/gophercloud/openstack/identity/v2/extensions/admin/roles" 11 "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants" 12 "github.com/gophercloud/gophercloud/openstack/identity/v2/users" 13 th "github.com/gophercloud/gophercloud/testhelper" 14 ) 15 16 // AddUserRole will grant a role to a user in a tenant. An error will be 17 // returned if the grant was unsuccessful. 18 func AddUserRole(t *testing.T, client *gophercloud.ServiceClient, tenant *tenants.Tenant, user *users.User, role *roles.Role) error { 19 t.Logf("Attempting to grant user %s role %s in tenant %s", user.ID, role.ID, tenant.ID) 20 21 err := roles.AddUser(client, tenant.ID, user.ID, role.ID).ExtractErr() 22 if err != nil { 23 return err 24 } 25 26 t.Logf("Granted user %s role %s in tenant %s", user.ID, role.ID, tenant.ID) 27 28 return nil 29 } 30 31 // CreateTenant will create a project with a random name. 32 // It takes an optional createOpts parameter since creating a project 33 // has so many options. An error will be returned if the project was 34 // unable to be created. 35 func CreateTenant(t *testing.T, client *gophercloud.ServiceClient, c *tenants.CreateOpts) (*tenants.Tenant, error) { 36 name := tools.RandomString("ACPTTEST", 8) 37 description := tools.RandomString("ACPTTEST-DESC", 8) 38 t.Logf("Attempting to create tenant: %s", name) 39 40 var createOpts tenants.CreateOpts 41 if c != nil { 42 createOpts = *c 43 } else { 44 createOpts = tenants.CreateOpts{} 45 } 46 47 createOpts.Name = name 48 createOpts.Description = description 49 50 tenant, err := tenants.Create(client, createOpts).Extract() 51 if err != nil { 52 return tenant, err 53 } 54 55 t.Logf("Successfully created project %s with ID %s", name, tenant.ID) 56 57 th.AssertEquals(t, name, tenant.Name) 58 th.AssertEquals(t, description, tenant.Description) 59 60 return tenant, nil 61 } 62 63 // CreateUser will create a user with a random name and adds them to the given 64 // tenant. An error will be returned if the user was unable to be created. 65 func CreateUser(t *testing.T, client *gophercloud.ServiceClient, tenant *tenants.Tenant) (*users.User, error) { 66 userName := tools.RandomString("user_", 5) 67 userEmail := userName + "@foo.com" 68 t.Logf("Creating user: %s", userName) 69 70 createOpts := users.CreateOpts{ 71 Name: userName, 72 Enabled: gophercloud.Disabled, 73 TenantID: tenant.ID, 74 Email: userEmail, 75 } 76 77 user, err := users.Create(client, createOpts).Extract() 78 if err != nil { 79 return user, err 80 } 81 82 th.AssertEquals(t, userName, user.Name) 83 84 return user, nil 85 } 86 87 // DeleteTenant will delete a tenant by ID. A fatal error will occur if 88 // the tenant ID failed to be deleted. This works best when using it as 89 // a deferred function. 90 func DeleteTenant(t *testing.T, client *gophercloud.ServiceClient, tenantID string) { 91 err := tenants.Delete(client, tenantID).ExtractErr() 92 if err != nil { 93 t.Fatalf("Unable to delete tenant %s: %v", tenantID, err) 94 } 95 96 t.Logf("Deleted tenant: %s", tenantID) 97 } 98 99 // DeleteUser will delete a user. A fatal error will occur if the delete was 100 // unsuccessful. This works best when used as a deferred function. 101 func DeleteUser(t *testing.T, client *gophercloud.ServiceClient, user *users.User) { 102 t.Logf("Attempting to delete user: %s", user.Name) 103 104 result := users.Delete(client, user.ID) 105 if result.Err != nil { 106 t.Fatalf("Unable to delete user") 107 } 108 109 t.Logf("Deleted user: %s", user.Name) 110 } 111 112 // DeleteUserRole will revoke a role of a user in a tenant. A fatal error will 113 // occur if the revoke was unsuccessful. This works best when used as a 114 // deferred function. 115 func DeleteUserRole(t *testing.T, client *gophercloud.ServiceClient, tenant *tenants.Tenant, user *users.User, role *roles.Role) { 116 t.Logf("Attempting to remove role %s from user %s in tenant %s", role.ID, user.ID, tenant.ID) 117 118 err := roles.DeleteUser(client, tenant.ID, user.ID, role.ID).ExtractErr() 119 if err != nil { 120 t.Fatalf("Unable to remove role") 121 } 122 123 t.Logf("Removed role %s from user %s in tenant %s", role.ID, user.ID, tenant.ID) 124 } 125 126 // FindRole finds all roles that the current authenticated client has access 127 // to and returns the first one found. An error will be returned if the lookup 128 // was unsuccessful. 129 func FindRole(t *testing.T, client *gophercloud.ServiceClient) (*roles.Role, error) { 130 var role *roles.Role 131 132 allPages, err := roles.List(client).AllPages() 133 if err != nil { 134 return role, err 135 } 136 137 allRoles, err := roles.ExtractRoles(allPages) 138 if err != nil { 139 return role, err 140 } 141 142 for _, r := range allRoles { 143 role = &r 144 break 145 } 146 147 return role, nil 148 } 149 150 // FindTenant finds all tenants that the current authenticated client has access 151 // to and returns the first one found. An error will be returned if the lookup 152 // was unsuccessful. 153 func FindTenant(t *testing.T, client *gophercloud.ServiceClient) (*tenants.Tenant, error) { 154 var tenant *tenants.Tenant 155 156 allPages, err := tenants.List(client, nil).AllPages() 157 if err != nil { 158 return tenant, err 159 } 160 161 allTenants, err := tenants.ExtractTenants(allPages) 162 if err != nil { 163 return tenant, err 164 } 165 166 for _, t := range allTenants { 167 tenant = &t 168 break 169 } 170 171 return tenant, nil 172 } 173 174 // UpdateUser will update an existing user with a new randomly generated name. 175 // An error will be returned if the update was unsuccessful. 176 func UpdateUser(t *testing.T, client *gophercloud.ServiceClient, user *users.User) (*users.User, error) { 177 userName := tools.RandomString("user_", 5) 178 userEmail := userName + "@foo.com" 179 180 t.Logf("Attempting to update user name from %s to %s", user.Name, userName) 181 182 updateOpts := users.UpdateOpts{ 183 Name: userName, 184 Email: userEmail, 185 } 186 187 newUser, err := users.Update(client, user.ID, updateOpts).Extract() 188 if err != nil { 189 return newUser, err 190 } 191 192 th.AssertEquals(t, userName, newUser.Name) 193 194 return newUser, nil 195 }