github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/group_test.go (about)

     1  //go:build user || functional || ALL
     2  
     3  /*
     4   * Copyright 2020 VMware, Inc.  All rights reserved.  Licensed under the Apache v2 License.
     5   */
     6  
     7  package govcd
     8  
     9  import (
    10  	"fmt"
    11  
    12  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    13  	. "gopkg.in/check.v1"
    14  )
    15  
    16  // test_GroupCRUD tests out CRUD capabilities for Org Groups.
    17  // Note: Because it requires LDAP to be functional - this test is run from main test "Test_LDAP"
    18  // which sets up LDAP configuration.
    19  func (vcd *TestVCD) test_GroupCRUD(check *C) {
    20  	fmt.Printf("Running: %s\n", "test_GroupCRUD")
    21  	adminOrg, err := vcd.client.GetAdminOrgByName(vcd.org.Org.Name)
    22  	check.Assert(err, IsNil)
    23  	check.Assert(adminOrg, NotNil)
    24  
    25  	type groupTestData struct {
    26  		name         string
    27  		secondName   string
    28  		roleName     string
    29  		secondRole   string
    30  		providerType string
    31  	}
    32  	groupData := []groupTestData{
    33  		{
    34  			name:         "ship_crew",
    35  			secondName:   "admin_staff",
    36  			roleName:     OrgUserRoleOrganizationAdministrator,
    37  			secondRole:   OrgUserRoleVappAuthor,
    38  			providerType: OrgUserProviderIntegrated,
    39  		},
    40  		{
    41  			name:         "admin_staff",
    42  			secondName:   "ship_crew",
    43  			roleName:     OrgUserRoleVappAuthor,
    44  			secondRole:   OrgUserRoleVappUser,
    45  			providerType: OrgUserProviderIntegrated,
    46  		},
    47  		// SAML must be configured in vCD Org to make providerType=OrgUserProviderSAML tests work
    48  		// {
    49  		// 	name:         "test_group_vapp_user",
    50  		// 	roleName:     OrgUserRoleVappUser,
    51  		// 	secondRole:   OrgUserRoleConsoleAccessOnly,
    52  		// 	providerType: OrgUserProviderSAML,
    53  		// },
    54  		// {
    55  		// 	name:         "test_group_console_access",
    56  		// 	roleName:     OrgUserRoleConsoleAccessOnly,
    57  		// 	secondRole:   OrgUserRoleCatalogAuthor,
    58  		// 	providerType: OrgUserProviderSAML,
    59  		// },
    60  		// {
    61  		// 	name:         "test_group_catalog_author",
    62  		// 	roleName:     OrgUserRoleCatalogAuthor,
    63  		// 	secondRole:   OrgUserRoleOrganizationAdministrator,
    64  		// 	providerType: OrgUserProviderSAML,
    65  		// },
    66  		// {
    67  		// 	name:         "test_group_defered_to_identity_provider",
    68  		// 	roleName:     OrgUserRoleDeferToIdentityProvider,
    69  		// 	secondRole:   OrgUserRoleOrganizationAdministrator,
    70  		// 	providerType: OrgUserProviderSAML,
    71  		// },
    72  	}
    73  
    74  	for _, gd := range groupData {
    75  
    76  		role, err := adminOrg.GetRoleReference(gd.roleName)
    77  		check.Assert(err, IsNil)
    78  
    79  		groupDefinition := types.Group{
    80  			Name:         gd.name,
    81  			Role:         role,
    82  			ProviderType: gd.providerType,
    83  		}
    84  
    85  		newGroup := NewGroup(adminOrg.client, adminOrg)
    86  		newGroup.Group = &groupDefinition
    87  		if testVerbose {
    88  			fmt.Printf("# creating '%s' group '%s' with role '%s'\n", gd.providerType, gd.name, gd.roleName)
    89  		}
    90  		createdGroup, err := adminOrg.CreateGroup(newGroup.Group)
    91  		check.Assert(err, IsNil)
    92  		AddToCleanupList(gd.name, "group", newGroup.AdminOrg.AdminOrg.Name, "test_GroupCRUD")
    93  
    94  		foundGroup, err := adminOrg.GetGroupByName(gd.name, true)
    95  		check.Assert(err, IsNil)
    96  
    97  		check.Assert(foundGroup.Group.Href, Equals, createdGroup.Group.Href)
    98  		check.Assert(foundGroup.Group.Name, Equals, createdGroup.Group.Name)
    99  
   100  		// Setup for update
   101  		secondRole, err := adminOrg.GetRoleReference(gd.secondRole)
   102  		check.Assert(err, IsNil)
   103  		createdGroup.Group.Role = secondRole
   104  
   105  		if testVerbose {
   106  			fmt.Printf("# updating '%s' group '%s' to role '%s'\n", gd.providerType, gd.name, gd.secondRole)
   107  		}
   108  		err = createdGroup.Update()
   109  		check.Assert(err, IsNil)
   110  
   111  		foundGroup2, err := adminOrg.GetGroupByName(gd.name, true)
   112  		check.Assert(err, IsNil)
   113  		check.Assert(foundGroup2.Group.Href, Equals, createdGroup.Group.Href)
   114  		check.Assert(foundGroup2.Group.Name, Equals, createdGroup.Group.Name)
   115  
   116  		if testVerbose {
   117  			fmt.Printf("# removing '%s' group '%s'\n", gd.providerType, gd.name)
   118  		}
   119  		err = createdGroup.Delete()
   120  		check.Assert(err, IsNil)
   121  	}
   122  }
   123  
   124  // test_GroupFinderGetGenericEntity uses testFinderGetGenericEntity to validate that ByName, ById
   125  // ByNameOrId method work properly.
   126  // Note: Because it requires LDAP to be functional - this test is run from main test "Test_LDAP"
   127  // which sets up LDAP configuration.
   128  func (vcd *TestVCD) test_GroupFinderGetGenericEntity(check *C) {
   129  	fmt.Printf("Running: %s\n", "test_GroupFinderGetGenericEntity")
   130  
   131  	const groupName = "ship_crew"
   132  	adminOrg, err := vcd.client.GetAdminOrgByName(vcd.org.Org.Name)
   133  	check.Assert(err, IsNil)
   134  	check.Assert(adminOrg, NotNil)
   135  
   136  	role, err := adminOrg.GetRoleReference(OrgUserRoleOrganizationAdministrator)
   137  	check.Assert(err, IsNil)
   138  
   139  	group := NewGroup(adminOrg.client, adminOrg)
   140  	group.Group = &types.Group{
   141  		Name:         groupName,
   142  		Role:         role,
   143  		ProviderType: OrgUserProviderIntegrated,
   144  	}
   145  
   146  	_, err = adminOrg.CreateGroup(group.Group)
   147  	check.Assert(err, IsNil)
   148  	AddToCleanupList(groupName, "group", group.AdminOrg.AdminOrg.Name, check.TestName())
   149  
   150  	getByName := func(name string, refresh bool) (genericEntity, error) {
   151  		return adminOrg.GetGroupByName(name, refresh)
   152  	}
   153  	getById := func(id string, refresh bool) (genericEntity, error) { return adminOrg.GetGroupById(id, refresh) }
   154  	getByNameOrId := func(id string, refresh bool) (genericEntity, error) {
   155  		return adminOrg.GetGroupByNameOrId(id, refresh)
   156  	}
   157  
   158  	// Refresh adminOrg so that user data is present
   159  	err = adminOrg.Refresh()
   160  	check.Assert(err, IsNil)
   161  
   162  	var def = getterTestDefinition{
   163  		parentType:    "AdminOrg",
   164  		parentName:    vcd.config.VCD.Org,
   165  		entityType:    "OrgGroup",
   166  		entityName:    groupName,
   167  		getByName:     getByName,
   168  		getById:       getById,
   169  		getByNameOrId: getByNameOrId,
   170  	}
   171  	vcd.testFinderGetGenericEntity(def, check)
   172  
   173  	// Remove group because LDAP cleanup will fail.
   174  	grp, err := adminOrg.GetGroupByName(group.Group.Name, true)
   175  	check.Assert(err, IsNil)
   176  	err = grp.Delete()
   177  	check.Assert(err, IsNil)
   178  }
   179  
   180  // test_GroupUserListIsPopulated checks that when retrieving the existing groups from the testing LDAP,
   181  // the user list reference is populated.
   182  // Note: Because it requires LDAP to be functional - this test is run from main test "Test_LDAP"
   183  // which sets up LDAP configuration.
   184  func (vcd *TestVCD) test_GroupUserListIsPopulated(check *C) {
   185  	fmt.Printf("Running: %s\n", "test_GroupUserListIsPopulated")
   186  	adminOrg, err := vcd.client.GetAdminOrgByName(vcd.org.Org.Name)
   187  	check.Assert(err, IsNil)
   188  	check.Assert(adminOrg, NotNil)
   189  
   190  	roleRef, err := adminOrg.GetRoleReference(OrgUserRoleOrganizationAdministrator)
   191  	check.Assert(err, IsNil)
   192  
   193  	group := NewGroup(adminOrg.client, adminOrg)
   194  	const groupName = "ship_crew"
   195  	group.Group = &types.Group{
   196  		Name:         groupName,
   197  		Role:         roleRef,
   198  		ProviderType: OrgUserProviderIntegrated,
   199  	}
   200  
   201  	_, err = adminOrg.CreateGroup(group.Group)
   202  	check.Assert(err, IsNil)
   203  	AddToCleanupList(groupName, "group", group.AdminOrg.AdminOrg.Name, check.TestName())
   204  
   205  	user := NewUser(adminOrg.client, adminOrg)
   206  	const userName = "fry"
   207  	user.User = &types.User{
   208  		Name:         userName,
   209  		Password:     userName,
   210  		Role:         roleRef,
   211  		IsExternal:   true,
   212  		IsEnabled:    true,
   213  		ProviderType: OrgUserProviderIntegrated,
   214  	}
   215  	_, err = adminOrg.CreateUser(user.User)
   216  	check.Assert(err, IsNil)
   217  	AddToCleanupList(userName, "user", group.AdminOrg.AdminOrg.Name, check.TestName())
   218  
   219  	grp, err := adminOrg.GetGroupByName(group.Group.Name, true)
   220  	check.Assert(err, IsNil)
   221  	check.Assert(grp.Group.UsersList, NotNil)
   222  	check.Assert(grp.Group.UsersList.UserReference[0], NotNil)
   223  
   224  	// We check here that usersList doesn't make VCD fail, they should be sent as nil
   225  	err = grp.Update()
   226  	check.Assert(err, IsNil)
   227  
   228  	user, err = adminOrg.GetUserByHref(grp.Group.UsersList.UserReference[0].HREF)
   229  	check.Assert(err, IsNil)
   230  	check.Assert(user.User.Name, Equals, userName)
   231  	check.Assert(len(user.User.GroupReferences.GroupReference), Equals, 1)
   232  
   233  	// We check here that the user used for update is the same as we had originally, except the user list
   234  	grp.Group.UsersList = nil
   235  	check.Assert(copyWithoutUserList(grp.Group), DeepEquals, grp.Group)
   236  
   237  	// We check here that groupReferences doesn't make VCD fail, they should be sent as nil
   238  	err = user.Update()
   239  	check.Assert(err, IsNil)
   240  
   241  	// Cleanup
   242  	err = user.Delete(false)
   243  	check.Assert(err, IsNil)
   244  	err = grp.Delete()
   245  	check.Assert(err, IsNil)
   246  }