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

     1  //go:build vdc || functional || ALL
     2  
     3  /*
     4   * Copyright 2021 VMware, Inc.  All rights reserved.  Licensed under the Apache v2 License.
     5   */
     6  
     7  package govcd
     8  
     9  import (
    10  	"fmt"
    11  	"reflect"
    12  	"strings"
    13  
    14  	. "gopkg.in/check.v1"
    15  
    16  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    17  )
    18  
    19  func (vcd *TestVCD) Test_FindVDCNetwork(check *C) {
    20  	if vcd.config.VCD.Network.Net1 == "" {
    21  		check.Skip("Skipping test because no network was given")
    22  	}
    23  	fmt.Printf("Running: %s\n", check.TestName())
    24  
    25  	net, err := vcd.vdc.GetOrgVdcNetworkByName(vcd.config.VCD.Network.Net1, true)
    26  
    27  	check.Assert(err, IsNil)
    28  	check.Assert(net, NotNil)
    29  	check.Assert(net.OrgVDCNetwork.Name, Equals, vcd.config.VCD.Network.Net1)
    30  	check.Assert(net.OrgVDCNetwork.HREF, Not(Equals), "")
    31  
    32  	// find Invalid Network
    33  	net, err = vcd.vdc.GetOrgVdcNetworkByName("INVALID", false)
    34  	check.Assert(err, NotNil)
    35  	check.Assert(net, IsNil)
    36  }
    37  
    38  // Tests Network retrieval by name, by ID, and by a combination of name and ID
    39  func (vcd *TestVCD) Test_GetOrgVDCNetwork(check *C) {
    40  
    41  	if vcd.config.VCD.Org == "" {
    42  		check.Skip("Test_GetOrgVDCNetwork: Org name not given")
    43  		return
    44  	}
    45  	if vcd.config.VCD.Vdc == "" {
    46  		check.Skip("Test_GetOrgVDCNetwork: VDC name not given")
    47  		return
    48  	}
    49  	org, err := vcd.client.GetOrgByName(vcd.config.VCD.Org)
    50  	check.Assert(err, IsNil)
    51  	check.Assert(org, NotNil)
    52  
    53  	vdc, err := org.GetVDCByName(vcd.config.VCD.Vdc, false)
    54  	check.Assert(err, IsNil)
    55  	check.Assert(vdc, NotNil)
    56  
    57  	getByName := func(name string, refresh bool) (genericEntity, error) {
    58  		return vdc.GetOrgVdcNetworkByName(name, refresh)
    59  	}
    60  	getById := func(id string, refresh bool) (genericEntity, error) { return vdc.GetOrgVdcNetworkById(id, refresh) }
    61  	getByNameOrId := func(id string, refresh bool) (genericEntity, error) {
    62  		return vdc.GetOrgVdcNetworkByNameOrId(id, refresh)
    63  	}
    64  
    65  	var def = getterTestDefinition{
    66  		parentType:    "Vdc",
    67  		parentName:    vcd.config.VCD.Vdc,
    68  		entityType:    "OrgVDCNetwork",
    69  		entityName:    vcd.config.VCD.Network.Net1,
    70  		getByName:     getByName,
    71  		getById:       getById,
    72  		getByNameOrId: getByNameOrId,
    73  	}
    74  	vcd.testFinderGetGenericEntity(def, check)
    75  }
    76  
    77  func (vcd *TestVCD) Test_NewVdc(check *C) {
    78  
    79  	fmt.Printf("Running: %s\n", check.TestName())
    80  	err := vcd.vdc.Refresh()
    81  	check.Assert(err, IsNil)
    82  
    83  	check.Assert(vcd.vdc.Vdc.Link[0].Rel, Equals, "up")
    84  	check.Assert(vcd.vdc.Vdc.Link[0].Type, Equals, "application/vnd.vmware.vcloud.org+xml")
    85  
    86  	// fmt.Printf("allocation mem %#v\n\n",vcd.vdc.Vdc.AllocationModel)
    87  	for _, resource := range vcd.vdc.Vdc.ResourceEntities[0].ResourceEntity {
    88  
    89  		// fmt.Printf("res %#v\n",resource)
    90  		check.Assert(resource.Name, Not(Equals), "")
    91  		check.Assert(resource.Type, Not(Equals), "")
    92  		check.Assert(resource.HREF, Not(Equals), "")
    93  	}
    94  
    95  	// TODO: find which values are acceptable for AllocationModel
    96  	// check.Assert(vcd.vdc.Vdc.AllocationModel, Equals, "AllocationPool")
    97  
    98  	/*
    99  		// TODO: Find the conditions that define valid ComputeCapacity
   100  		for _, v := range vcd.vdc.Vdc.ComputeCapacity {
   101  			check.Assert(v.CPU.Units, Equals, "MHz")
   102  			check.Assert(v.CPU.Allocated, Equals, int64(30000))
   103  			check.Assert(v.CPU.Limit, Equals, int64(30000))
   104  			check.Assert(v.CPU.Reserved, Equals, int64(15000))
   105  			check.Assert(v.CPU.Used, Equals, int64(0))
   106  			check.Assert(v.CPU.Overhead, Equals, int64(0))
   107  			check.Assert(v.Memory.Units, Equals, "MB")
   108  			check.Assert(v.Memory.Allocated, Equals, int64(61440))
   109  			check.Assert(v.Memory.Limit, Equals, int64(61440))
   110  			check.Assert(v.Memory.Reserved, Equals, int64(61440))
   111  			check.Assert(v.Memory.Used, Equals, int64(6144))
   112  			check.Assert(v.Memory.Overhead, Equals, int64(95))
   113  		}
   114  	*/
   115  
   116  	// Skipping this check, as we can't define the existence of a given vApp template beforehand
   117  	/*
   118  		check.Assert(vcd.vdc.Vdc.ResourceEntities[0].ResourceEntity[0].Name, Equals, QtVappTemplate)
   119  		check.Assert(vcd.vdc.Vdc.ResourceEntities[0].ResourceEntity[0].Type, Equals, "application/vnd.vmware.vcloud.vAppTemplate+xml")
   120  		check.Assert(vcd.vdc.Vdc.ResourceEntities[0].ResourceEntity[0].HREF, Equals, "http://localhost:4444/api/vAppTemplate/vappTemplate-22222222-2222-2222-2222-222222222222")
   121  	*/
   122  
   123  	for _, availableNetworks := range vcd.vdc.Vdc.AvailableNetworks {
   124  		for _, v2 := range availableNetworks.Network {
   125  			check.Assert(v2.Name, Not(Equals), "")
   126  			check.Assert(v2.Type, Equals, "application/vnd.vmware.vcloud.network+xml")
   127  			check.Assert(v2.HREF, Not(Equals), "")
   128  		}
   129  	}
   130  
   131  	/*
   132  
   133  		// Skipping this check, as we don't have precise terms of comparison for this entity
   134  		check.Assert(vcd.vdc.Vdc.NicQuota, Equals, 0)
   135  		check.Assert(vcd.vdc.Vdc.NetworkQuota, Equals, 20)
   136  		check.Assert(vcd.vdc.Vdc.UsedNetworkCount, Equals, 0)
   137  		check.Assert(vcd.vdc.Vdc.VMQuota, Equals, 0)
   138  		check.Assert(vcd.vdc.Vdc.IsEnabled, Equals, true)
   139  	*/
   140  
   141  	for _, v2 := range vcd.vdc.Vdc.VdcStorageProfiles.VdcStorageProfile {
   142  		check.Assert(v2.Type, Equals, "application/vnd.vmware.vcloud.vdcStorageProfile+xml")
   143  		check.Assert(v2.HREF, Not(Equals), "")
   144  	}
   145  
   146  }
   147  
   148  // Test_GetVDCHardwareVersion tests hardware version fetching functionality
   149  func (vcd *TestVCD) Test_GetVDCHardwareVersion(check *C) {
   150  	err := vcd.vdc.Refresh()
   151  	check.Assert(err, IsNil)
   152  
   153  	// vmx-18 is the latest version supported by 10.3.0, the oldest version we support.
   154  	hwVersion, err := vcd.vdc.GetHardwareVersion("vmx-18")
   155  	check.Assert(err, IsNil)
   156  	check.Assert(hwVersion, NotNil)
   157  
   158  	check.Assert(hwVersion.Name, Equals, "vmx-18")
   159  
   160  	os, err := vcd.vdc.FindOsFromId(hwVersion, "sles10_64Guest")
   161  	check.Assert(err, IsNil)
   162  	check.Assert(os, NotNil)
   163  
   164  	check.Assert(os.InternalName, Equals, "sles10_64Guest")
   165  	check.Assert(os.Name, Equals, "SUSE Linux Enterprise 10 (64-bit)")
   166  }
   167  
   168  // Tests ComposeVApp with given parameters in the config file.
   169  // Throws an error if networks, catalog, catalog item, and
   170  // storage preference are omitted from the config file.
   171  func (vcd *TestVCD) Test_ComposeVApp(check *C) {
   172  	if vcd.config.VCD.Network.Net1 == "" {
   173  		check.Skip("Skipping test because no network was given")
   174  	}
   175  	if vcd.skipVappTests {
   176  		check.Skip("Skipping test because vapp wasn't properly created")
   177  	}
   178  	fmt.Printf("Running: %s\n", check.TestName())
   179  
   180  	// Populate OrgVDCNetwork
   181  	networks := []*types.OrgVDCNetwork{}
   182  	net, err := vcd.vdc.GetOrgVdcNetworkByName(vcd.config.VCD.Network.Net1, false)
   183  	check.Assert(err, IsNil)
   184  	networks = append(networks, net.OrgVDCNetwork)
   185  	check.Assert(err, IsNil)
   186  	// Populate Catalog
   187  	cat, err := vcd.org.GetCatalogByName(vcd.config.VCD.Catalog.Name, false)
   188  	check.Assert(err, IsNil)
   189  	check.Assert(cat, NotNil)
   190  	// Populate Catalog Item
   191  	catitem, err := cat.GetCatalogItemByName(vcd.config.VCD.Catalog.CatalogItem, false)
   192  	check.Assert(err, IsNil)
   193  	check.Assert(catitem, NotNil)
   194  	// Get VAppTemplate
   195  	vapptemplate, err := catitem.GetVAppTemplate()
   196  	check.Assert(err, IsNil)
   197  	// Get StorageProfileReference
   198  	storageprofileref, err := vcd.vdc.FindStorageProfileReference(vcd.config.VCD.StorageProfile.SP1)
   199  	check.Assert(err, IsNil)
   200  	// Compose VApp
   201  	task, err := vcd.vdc.ComposeVApp(networks, vapptemplate, storageprofileref, TestComposeVapp, TestComposeVappDesc, true)
   202  	check.Assert(err, IsNil)
   203  	check.Assert(task.Task.Tasks, NotNil)
   204  	check.Assert(len(task.Task.Tasks.Task) > 0, Equals, true)
   205  	check.Assert(task.Task.Tasks.Task[0].OperationName, Equals, "vdcComposeVapp")
   206  	// Get VApp
   207  	vapp, err := vcd.vdc.GetVAppByName(TestComposeVapp, true)
   208  	check.Assert(err, IsNil)
   209  	// After a successful creation, the entity is added to the cleanup list.
   210  	// If something fails after this point, the entity will be removed
   211  	AddToCleanupList(TestComposeVapp, "vapp", "", "Test_ComposeVApp")
   212  	// Once the operation is successful, we won't trigger a failure
   213  	// until after the vApp deletion
   214  	check.Check(vapp.VApp.Name, Equals, TestComposeVapp)
   215  	check.Check(vapp.VApp.Description, Equals, TestComposeVappDesc)
   216  
   217  	vapp_status, err := vapp.GetStatus()
   218  	check.Check(err, IsNil)
   219  	check.Check(vapp_status, Equals, "UNRESOLVED")
   220  	// Let the VApp creation complete
   221  	err = task.WaitTaskCompletion()
   222  	if err != nil {
   223  		panic(err)
   224  	}
   225  	err = vapp.BlockWhileStatus("UNRESOLVED", vapp.client.MaxRetryTimeout)
   226  	check.Check(err, IsNil)
   227  	vapp_status, err = vapp.GetStatus()
   228  	check.Check(err, IsNil)
   229  	check.Check(vapp_status, Equals, "POWERED_OFF")
   230  	// Deleting VApp
   231  	task, err = vapp.Delete()
   232  	check.Assert(err, IsNil)
   233  	err = task.WaitTaskCompletion()
   234  	if err != nil {
   235  		panic(err)
   236  	}
   237  	check.Assert(err, IsNil)
   238  	noSuchVapp, err := vcd.vdc.GetVAppByName(TestComposeVapp, true)
   239  	check.Assert(err, NotNil)
   240  	check.Assert(noSuchVapp, IsNil)
   241  
   242  }
   243  
   244  func (vcd *TestVCD) Test_FindVApp(check *C) {
   245  
   246  	if vcd.skipVappTests {
   247  		check.Skip("Skipping test because vapp was not successfully created at setup")
   248  	}
   249  
   250  	if vcd.vapp.VApp == nil {
   251  		check.Skip("No vApp provided")
   252  	}
   253  	firstVapp, err := vcd.vdc.GetVAppByName(vcd.vapp.VApp.Name, false)
   254  
   255  	check.Assert(err, IsNil)
   256  
   257  	secondVapp, err := vcd.vdc.GetVAppById(firstVapp.VApp.ID, false)
   258  
   259  	check.Assert(err, IsNil)
   260  
   261  	check.Assert(secondVapp.VApp.Name, Equals, firstVapp.VApp.Name)
   262  	check.Assert(secondVapp.VApp.HREF, Equals, firstVapp.VApp.HREF)
   263  }
   264  
   265  // Tests function QueryVM by searching vm created
   266  // by test suite
   267  func (vcd *TestVCD) Test_QueryVM(check *C) {
   268  
   269  	if vcd.skipVappTests {
   270  		check.Skip("Skipping test because vapp was not successfully created at setup")
   271  	}
   272  
   273  	if vcd.vapp.VApp == nil {
   274  		check.Skip("No Vapp provided")
   275  	}
   276  
   277  	// Find VM
   278  	vapp := vcd.findFirstVapp()
   279  	_, vmName := vcd.findFirstVm(vapp)
   280  	if vmName == "" {
   281  		check.Skip("skipping test because no VM is found")
   282  	}
   283  	vm, err := vcd.vdc.QueryVM(vcd.vapp.VApp.Name, vmName)
   284  	check.Assert(err, IsNil)
   285  
   286  	check.Assert(vm.VM.Name, Equals, vmName)
   287  
   288  	if vcd.client.Client.IsSysAdmin {
   289  		check.Assert(vm.VM.Moref, Not(Equals), "")
   290  		check.Assert(strings.HasPrefix(vm.VM.Moref, "vm-"), Equals, true)
   291  	}
   292  }
   293  
   294  func init() {
   295  	testingTags["vdc"] = "vdc_test.go"
   296  }
   297  
   298  // Tests Edge Gateway retrieval by name, by ID, and by a combination of name and ID
   299  func (vcd *TestVCD) Test_GetEdgeGateway(check *C) {
   300  
   301  	if vcd.config.VCD.Org == "" {
   302  		check.Skip("Test_GetEdgeGateway: Org name not given")
   303  		return
   304  	}
   305  	if vcd.config.VCD.Vdc == "" {
   306  		check.Skip("Test_GetEdgeGateway: VDC name not given")
   307  		return
   308  	}
   309  	org, err := vcd.client.GetOrgByName(vcd.config.VCD.Org)
   310  	check.Assert(err, IsNil)
   311  	check.Assert(org, NotNil)
   312  
   313  	vdc, err := org.GetVDCByName(vcd.config.VCD.Vdc, false)
   314  	check.Assert(err, IsNil)
   315  	check.Assert(vdc, NotNil)
   316  
   317  	getByName := func(name string, refresh bool) (genericEntity, error) {
   318  		return vdc.GetEdgeGatewayByName(name, refresh)
   319  	}
   320  	getById := func(id string, refresh bool) (genericEntity, error) { return vdc.GetEdgeGatewayById(id, refresh) }
   321  	getByNameOrId := func(id string, refresh bool) (genericEntity, error) {
   322  		return vdc.GetEdgeGatewayByNameOrId(id, refresh)
   323  	}
   324  
   325  	var def = getterTestDefinition{
   326  		parentType:    "Vdc",
   327  		parentName:    vcd.config.VCD.Vdc,
   328  		entityType:    "EdgeGateway",
   329  		entityName:    vcd.config.VCD.EdgeGateway,
   330  		getByName:     getByName,
   331  		getById:       getById,
   332  		getByNameOrId: getByNameOrId,
   333  	}
   334  	vcd.testFinderGetGenericEntity(def, check)
   335  }
   336  
   337  // Tests vApp retrieval by name, by ID, and by a combination of name and ID
   338  func (vcd *TestVCD) Test_GetVApp(check *C) {
   339  
   340  	if vcd.skipVappTests {
   341  		check.Skip("Skipping test because vapp wasn't properly created")
   342  	}
   343  	if vcd.config.VCD.Org == "" {
   344  		check.Skip("Test_GetVapp: Org name not given")
   345  		return
   346  	}
   347  	if vcd.config.VCD.Vdc == "" {
   348  		check.Skip("Test_GetVapp: VDC name not given")
   349  		return
   350  	}
   351  	org, err := vcd.client.GetOrgByName(vcd.config.VCD.Org)
   352  	check.Assert(err, IsNil)
   353  	check.Assert(org, NotNil)
   354  
   355  	vdc, err := org.GetVDCByName(vcd.config.VCD.Vdc, false)
   356  	check.Assert(err, IsNil)
   357  	check.Assert(vdc, NotNil)
   358  
   359  	getByName := func(name string, refresh bool) (genericEntity, error) {
   360  		return vdc.GetVAppByName(name, refresh)
   361  	}
   362  	getById := func(id string, refresh bool) (genericEntity, error) { return vdc.GetVAppById(id, refresh) }
   363  	getByNameOrId := func(id string, refresh bool) (genericEntity, error) {
   364  		return vdc.GetVAppByNameOrId(id, refresh)
   365  	}
   366  
   367  	var def = getterTestDefinition{
   368  		parentType:    "Vdc",
   369  		parentName:    vcd.config.VCD.Vdc,
   370  		entityType:    "VApp",
   371  		entityName:    TestSetUpSuite,
   372  		getByName:     getByName,
   373  		getById:       getById,
   374  		getByNameOrId: getByNameOrId,
   375  	}
   376  	vcd.testFinderGetGenericEntity(def, check)
   377  }
   378  
   379  // TestGetVappList tests all methods that retrieve a list of vApps
   380  // vdc.GetVappList
   381  // adminVdc.GetVappList
   382  // client.QueryVappList
   383  // client.SearchByFilter
   384  func (vcd *TestVCD) TestGetVappList(check *C) {
   385  
   386  	if vcd.skipVappTests {
   387  		check.Skip("Skipping test because vapp wasn't properly created")
   388  	}
   389  	if vcd.config.VCD.Org == "" {
   390  		check.Skip("Test_GetVapp: Org name not given")
   391  		return
   392  	}
   393  	if vcd.config.VCD.Vdc == "" {
   394  		check.Skip("Test_GetVapp: VDC name not given")
   395  		return
   396  	}
   397  	vapp := vcd.findFirstVapp()
   398  	if vapp == (VApp{}) {
   399  		check.Skip("no vApp found")
   400  		return
   401  	}
   402  
   403  	org, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org)
   404  	check.Assert(err, IsNil)
   405  	check.Assert(org, NotNil)
   406  
   407  	vdc, err := org.GetVDCByName(vcd.config.VCD.Vdc, false)
   408  	check.Assert(err, IsNil)
   409  	check.Assert(vdc, NotNil)
   410  	adminVdc, err := org.GetAdminVDCByName(vcd.config.VCD.Vdc, false)
   411  	check.Assert(err, IsNil)
   412  	check.Assert(adminVdc, NotNil)
   413  
   414  	// Get the vApp list from VDC
   415  	vappList := vdc.GetVappList()
   416  	check.Assert(vappList, NotNil)
   417  	check.Assert(len(vappList), Not(Equals), 0)
   418  
   419  	// Get the vApp list from admin VDC
   420  	vappAdminList := adminVdc.GetVappList()
   421  	check.Assert(vappAdminList, NotNil)
   422  	check.Assert(len(vappAdminList), Not(Equals), 0)
   423  	check.Assert(len(vappAdminList), Equals, len(vappList))
   424  
   425  	// Check that the known vApp is found in both lists
   426  	foundVappInList := false
   427  	foundVappInAdminList := false
   428  	foundVappInQueryList := false
   429  	for _, ref := range vappList {
   430  		if ref.ID == vapp.VApp.ID {
   431  			foundVappInList = true
   432  		}
   433  	}
   434  	for _, ref := range vappAdminList {
   435  		if ref.ID == vapp.VApp.ID {
   436  			foundVappInAdminList = true
   437  		}
   438  	}
   439  	check.Assert(foundVappInList, Equals, true)
   440  	check.Assert(foundVappInAdminList, Equals, true)
   441  
   442  	// Get the vApp list with a query (returns all vApps visible to user, non only the ones withing the current VDC)
   443  	queryVappList, err := vcd.client.Client.QueryVappList()
   444  	check.Assert(err, IsNil)
   445  	check.Assert(queryVappList, NotNil)
   446  
   447  	for _, qItem := range queryVappList {
   448  		if qItem.HREF == vapp.VApp.HREF {
   449  			foundVappInQueryList = true
   450  		}
   451  	}
   452  	check.Assert(foundVappInQueryList, Equals, true)
   453  
   454  	// Use the search engine to find the known vApp
   455  	criteria := NewFilterDef()
   456  	err = criteria.AddFilter(types.FilterNameRegex, TestSetUpSuite)
   457  	check.Assert(err, IsNil)
   458  	queryType := vcd.client.Client.GetQueryType(types.QtVapp)
   459  	queryItems, _, err := vcd.client.Client.SearchByFilter(queryType, criteria)
   460  	check.Assert(err, IsNil)
   461  	check.Assert(queryItems, NotNil)
   462  	check.Assert(len(queryItems), Not(Equals), 0)
   463  	check.Assert(queryItems[0].GetHref(), Equals, vapp.VApp.HREF)
   464  
   465  	// Use the search engine to also find the known VM
   466  	vm, vmName := vcd.findFirstVm(vapp)
   467  	check.Assert(vmName, Not(Equals), "")
   468  	check.Assert(vm.HREF, Not(Equals), "")
   469  	criteria = NewFilterDef()
   470  	err = criteria.AddFilter(types.FilterNameRegex, vmName)
   471  	check.Assert(err, IsNil)
   472  	err = criteria.AddFilter(types.FilterParent, vapp.VApp.Name)
   473  	check.Assert(err, IsNil)
   474  	queryType = vcd.client.Client.GetQueryType(types.QtVm)
   475  	queryItems, _, err = vcd.client.Client.SearchByFilter(queryType, criteria)
   476  	check.Assert(err, IsNil)
   477  	check.Assert(queryItems, NotNil)
   478  	check.Assert(len(queryItems), Not(Equals), 0)
   479  	check.Assert(vm.HREF, Equals, queryItems[0].GetHref())
   480  }
   481  
   482  // TestGetVdcCapabilities attempts to get a list of VDC capabilities
   483  func (vcd *TestVCD) TestGetVdcCapabilities(check *C) {
   484  	vdcCapabilities, err := vcd.vdc.GetCapabilities()
   485  	check.Assert(err, IsNil)
   486  	check.Assert(vdcCapabilities, NotNil)
   487  	check.Assert(len(vdcCapabilities) > 0, Equals, true)
   488  }
   489  
   490  func (vcd *TestVCD) TestVdcIsNsxt(check *C) {
   491  	skipNoNsxtConfiguration(vcd, check)
   492  	check.Assert(vcd.nsxtVdc.IsNsxt(), Equals, true)
   493  	if vcd.vdc != nil {
   494  		check.Assert(vcd.vdc.IsNsxt(), Equals, false)
   495  	}
   496  }
   497  
   498  func (vcd *TestVCD) TestVdcIsNsxv(check *C) {
   499  	check.Assert(vcd.vdc.IsNsxv(), Equals, true)
   500  	// retrieve the same VDC as AdminVdc, to test the corresponding function
   501  	adminOrg, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org)
   502  	check.Assert(err, IsNil)
   503  	adminVdc, err := adminOrg.GetVDCByName(vcd.vdc.Vdc.Name, false)
   504  	check.Assert(err, IsNil)
   505  	check.Assert(adminVdc.IsNsxv(), Equals, true)
   506  	// if NSX-T is configured, we also check a NSX-T VDC
   507  	if vcd.nsxtVdc != nil {
   508  		check.Assert(vcd.nsxtVdc.IsNsxv(), Equals, false)
   509  		nsxtAdminVdc, err := adminOrg.GetAdminVDCByName(vcd.config.VCD.Nsxt.Vdc, false)
   510  		check.Assert(err, IsNil)
   511  		check.Assert(nsxtAdminVdc.IsNsxv(), Equals, false)
   512  	}
   513  }
   514  
   515  func (vcd *TestVCD) TestCreateRawVapp(check *C) {
   516  	org, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org)
   517  	check.Assert(err, IsNil)
   518  	check.Assert(org, NotNil)
   519  
   520  	vdc, err := org.GetVDCByName(vcd.config.VCD.Vdc, false)
   521  	check.Assert(err, IsNil)
   522  	check.Assert(vdc, NotNil)
   523  
   524  	name := check.TestName()
   525  	description := "test compose raw app"
   526  	vapp, err := vdc.CreateRawVApp(name, description)
   527  	check.Assert(err, IsNil)
   528  	AddToCleanupList(name, "vapp", vdc.Vdc.Name, name)
   529  
   530  	check.Assert(vapp.VApp.Name, Equals, name)
   531  	check.Assert(vapp.VApp.Description, Equals, description)
   532  	task, err := vapp.Delete()
   533  	check.Assert(err, IsNil)
   534  	err = task.WaitTaskCompletion()
   535  	check.Assert(err, IsNil)
   536  }
   537  
   538  func (vcd *TestVCD) TestSetControlAccess(check *C) {
   539  	// Set VDC sharing to everyone
   540  	org, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org)
   541  	check.Assert(err, IsNil)
   542  	check.Assert(org, NotNil)
   543  
   544  	vdc, err := org.GetVDCByName(vcd.config.VCD.Vdc, false)
   545  	check.Assert(err, IsNil)
   546  	check.Assert(vdc, NotNil)
   547  
   548  	readControlAccessParams, err := vdc.SetControlAccess(true, "ReadOnly", nil, true)
   549  	check.Assert(err, IsNil)
   550  	check.Assert(readControlAccessParams, NotNil)
   551  	check.Assert(readControlAccessParams.IsSharedToEveryone, Equals, true)
   552  	check.Assert(*readControlAccessParams.EveryoneAccessLevel, Equals, "ReadOnly")
   553  	check.Assert(readControlAccessParams.AccessSettings, IsNil) // If not shared with users/groups, this will be nil
   554  
   555  	// Set VDC sharing to one user
   556  	orgUserRef := org.AdminOrg.Users.User[0]
   557  	user, err := org.GetUserByName(orgUserRef.Name, false)
   558  	check.Assert(err, IsNil)
   559  	check.Assert(user, NotNil)
   560  
   561  	accessSettings := []*types.AccessSetting{
   562  		{
   563  			AccessLevel: "ReadOnly",
   564  			Subject: &types.LocalSubject{
   565  				HREF: user.User.Href,
   566  				Name: user.User.Name,
   567  				Type: user.User.Type,
   568  			},
   569  		},
   570  	}
   571  
   572  	readControlAccessParams, err = vdc.SetControlAccess(false, "", accessSettings, true)
   573  	check.Assert(err, IsNil)
   574  	check.Assert(readControlAccessParams, NotNil)
   575  	check.Assert(len(readControlAccessParams.AccessSettings.AccessSetting) > 0, Equals, true)
   576  	check.Assert(assertVDCAccessSettings(accessSettings, readControlAccessParams.AccessSettings.AccessSetting), IsNil)
   577  
   578  	// Check that fail if both isSharedToEveryone and accessSettings is passed
   579  	readControlAccessParams, err = vdc.SetControlAccess(true, "ReadOnly", accessSettings, true)
   580  	check.Assert(err, NotNil)
   581  	check.Assert(readControlAccessParams, IsNil)
   582  
   583  	// Check DeleteControlAccess
   584  	readControlAccessParams, err = vdc.DeleteControlAccess(true)
   585  	check.Assert(err, IsNil)
   586  	check.Assert(readControlAccessParams.IsSharedToEveryone, Equals, false)
   587  	check.Assert(readControlAccessParams.AccessSettings, IsNil)
   588  }
   589  
   590  func assertVDCAccessSettings(wanted, received []*types.AccessSetting) error {
   591  	if len(wanted) != len(received) {
   592  		return fmt.Errorf("wanted and received access settings are not the same length")
   593  	}
   594  	for _, receivedAccessSetting := range received {
   595  		for i, wantedAccessSetting := range wanted {
   596  			if reflect.DeepEqual(*wantedAccessSetting.Subject, *receivedAccessSetting.Subject) && (wantedAccessSetting.AccessLevel == receivedAccessSetting.AccessLevel) {
   597  				break
   598  			}
   599  			if i == len(wanted)-1 {
   600  				return fmt.Errorf("access settings for user %s were not found or are not correct", wantedAccessSetting.Subject.Name)
   601  			}
   602  		}
   603  	}
   604  	return nil
   605  }
   606  
   607  // TestVAppTemplateRetrieval tests that VDC receiver objects can search vApp Templates successfully.
   608  func (vcd *TestVCD) TestVAppTemplateRetrieval(check *C) {
   609  	fmt.Printf("Running: %s\n", check.TestName())
   610  
   611  	if vcd.config.VCD.Catalog.NsxtCatalogItem == "" {
   612  		check.Skip(fmt.Sprintf("%s: Catalog Item not given. Test can't proceed", check.TestName()))
   613  	}
   614  
   615  	org, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org)
   616  	check.Assert(err, IsNil)
   617  	check.Assert(org, NotNil)
   618  
   619  	vdc, err := org.GetVDCByName(vcd.config.VCD.Nsxt.Vdc, false)
   620  	check.Assert(err, IsNil)
   621  	check.Assert(vdc, NotNil)
   622  
   623  	// Test cases
   624  	vAppTemplate, err := vdc.GetVAppTemplateByName(vcd.config.VCD.Catalog.NsxtCatalogItem)
   625  	check.Assert(err, IsNil)
   626  	check.Assert(vAppTemplate.VAppTemplate.Name, Equals, vcd.config.VCD.Catalog.NsxtCatalogItem)
   627  	if vcd.config.VCD.Catalog.CatalogItemDescription != "" {
   628  		check.Assert(strings.Contains(vAppTemplate.VAppTemplate.Description, vcd.config.VCD.Catalog.CatalogItemDescription), Equals, true)
   629  	}
   630  
   631  	vAppTemplate, err = vcd.client.GetVAppTemplateById(vAppTemplate.VAppTemplate.ID)
   632  	check.Assert(err, IsNil)
   633  	check.Assert(vAppTemplate.VAppTemplate.Name, Equals, vcd.config.VCD.Catalog.NsxtCatalogItem)
   634  	if vcd.config.VCD.Catalog.CatalogItemDescription != "" {
   635  		check.Assert(strings.Contains(vAppTemplate.VAppTemplate.Description, vcd.config.VCD.Catalog.CatalogItemDescription), Equals, true)
   636  	}
   637  
   638  	vAppTemplate, err = vdc.GetVAppTemplateByNameOrId(vAppTemplate.VAppTemplate.ID, false)
   639  	check.Assert(err, IsNil)
   640  	check.Assert(vAppTemplate.VAppTemplate.Name, Equals, vcd.config.VCD.Catalog.NsxtCatalogItem)
   641  	if vcd.config.VCD.Catalog.CatalogItemDescription != "" {
   642  		check.Assert(strings.Contains(vAppTemplate.VAppTemplate.Description, vcd.config.VCD.Catalog.CatalogItemDescription), Equals, true)
   643  	}
   644  
   645  	vAppTemplate, err = vdc.GetVAppTemplateByNameOrId(vcd.config.VCD.Catalog.NsxtCatalogItem, false)
   646  	check.Assert(err, IsNil)
   647  	check.Assert(vAppTemplate.VAppTemplate.Name, Equals, vcd.config.VCD.Catalog.NsxtCatalogItem)
   648  	if vcd.config.VCD.Catalog.CatalogItemDescription != "" {
   649  		check.Assert(strings.Contains(vAppTemplate.VAppTemplate.Description, vcd.config.VCD.Catalog.CatalogItemDescription), Equals, true)
   650  	}
   651  
   652  	vAppTemplateRecord, err := vcd.client.QuerySynchronizedVAppTemplateById(vAppTemplate.VAppTemplate.ID)
   653  	check.Assert(err, IsNil)
   654  	check.Assert(vAppTemplateRecord.Name, Equals, vAppTemplate.VAppTemplate.Name)
   655  	check.Assert(vAppTemplateRecord.HREF, Equals, vAppTemplate.VAppTemplate.HREF)
   656  
   657  	vmTemplateRecord, err := vcd.client.QuerySynchronizedVmInVAppTemplateByHref(vAppTemplate.VAppTemplate.HREF, "**")
   658  	check.Assert(err, IsNil)
   659  	check.Assert(vmTemplateRecord, NotNil)
   660  
   661  	// Test non-existent vApp Template
   662  	_, err = vdc.GetVAppTemplateByName("INVALID")
   663  	check.Assert(err, NotNil)
   664  
   665  	_, err = vcd.client.QuerySynchronizedVmInVAppTemplateByHref(vAppTemplate.VAppTemplate.HREF, "INVALID")
   666  	check.Assert(err, Equals, ErrorEntityNotFound)
   667  }
   668  
   669  // TestMediaRetrieval tests that VDC receiver objects can search Media items successfully.
   670  func (vcd *TestVCD) TestMediaRetrieval(check *C) {
   671  	fmt.Printf("Running: %s\n", check.TestName())
   672  
   673  	if vcd.config.Media.NsxtMedia == "" {
   674  		check.Skip(fmt.Sprintf("%s: NSX-T Media item not given. Test can't proceed", check.TestName()))
   675  	}
   676  
   677  	org, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org)
   678  	check.Assert(err, IsNil)
   679  	check.Assert(org, NotNil)
   680  
   681  	catalog, err := org.GetCatalogByName(vcd.config.VCD.Catalog.NsxtBackedCatalogName, false)
   682  	check.Assert(err, IsNil)
   683  	check.Assert(catalog, NotNil)
   684  
   685  	vdc, err := org.GetVDCByName(vcd.config.VCD.Nsxt.Vdc, false)
   686  	check.Assert(err, IsNil)
   687  	check.Assert(vdc, NotNil)
   688  
   689  	mediaFromCatalog, err := catalog.GetMediaByName(vcd.config.Media.NsxtMedia, false)
   690  	check.Assert(err, IsNil)
   691  	check.Assert(mediaFromCatalog, NotNil)
   692  
   693  	// Test cases
   694  	mediaFromVdc, err := vcd.client.QueryMediaById(mediaFromCatalog.Media.ID)
   695  	check.Assert(err, IsNil)
   696  	check.Assert(mediaFromCatalog.Media.HREF, Equals, mediaFromVdc.MediaRecord.HREF)
   697  	check.Assert(mediaFromCatalog.Media.Name, Equals, mediaFromVdc.MediaRecord.Name)
   698  
   699  	// Test non-existent Media item
   700  	mediaFromVdc, err = vcd.client.QueryMediaById("INVALID")
   701  	check.Assert(err, NotNil)
   702  	check.Assert(mediaFromVdc, IsNil)
   703  }