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  }