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  }