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