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

     1  //go:build vapp || 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  	"github.com/kr/pretty"
    12  	"regexp"
    13  	"time"
    14  
    15  	. "gopkg.in/check.v1"
    16  
    17  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    18  )
    19  
    20  func init() {
    21  	testingTags["vapp"] = "vapp_test.go"
    22  }
    23  
    24  // Tests the helper function getParentVDC with the vapp
    25  // created at the start of testing
    26  func (vcd *TestVCD) TestGetParentVDC(check *C) {
    27  	if vcd.skipVappTests {
    28  		check.Skip("Skipping test because vApp was not successfully created at setup")
    29  	}
    30  	vapp, err := vcd.vdc.GetVAppByName(vcd.vapp.VApp.Name, false)
    31  	check.Assert(err, IsNil)
    32  
    33  	vdc, err := vapp.GetParentVDC()
    34  
    35  	check.Assert(err, IsNil)
    36  	check.Assert(vdc.Vdc.Name, Equals, vcd.vdc.Vdc.Name)
    37  }
    38  
    39  func (vcd *TestVCD) TestGetVappByHref(check *C) {
    40  	if vcd.skipVappTests {
    41  		check.Skip("Skipping test because vApp was not successfully created at setup")
    42  	}
    43  	vapp, err := vcd.vdc.GetVAppByName(vcd.vapp.VApp.Name, false)
    44  	check.Assert(err, IsNil)
    45  
    46  	vdc, err := vapp.GetParentVDC()
    47  	check.Assert(err, IsNil)
    48  
    49  	orgVappByHref, err := vcd.org.GetVAppByHref(vapp.VApp.HREF)
    50  	check.Assert(err, IsNil)
    51  	check.Assert(orgVappByHref.VApp, DeepEquals, vapp.VApp)
    52  
    53  	vdcVappByHref, err := vdc.GetVAppByHref(vapp.VApp.HREF)
    54  	check.Assert(err, IsNil)
    55  	check.Assert(vdcVappByHref.VApp, DeepEquals, vapp.VApp)
    56  }
    57  
    58  // Tests Powering On and Powering Off a VApp. Also tests Deletion
    59  // of a VApp
    60  func (vcd *TestVCD) Test_PowerOn(check *C) {
    61  	if vcd.skipVappTests {
    62  		check.Skip("Skipping test because vApp was not successfully created at setup")
    63  	}
    64  	task, err := vcd.vapp.PowerOn()
    65  	check.Assert(err, IsNil)
    66  	err = task.WaitTaskCompletion()
    67  	check.Assert(err, IsNil)
    68  	check.Assert(task.Task.Status, Equals, "success")
    69  }
    70  
    71  // TODO: Find out if there is a way to check if the vapp is on without
    72  // powering it on.
    73  func (vcd *TestVCD) Test_Reboot(check *C) {
    74  	if vcd.skipVappTests {
    75  		check.Skip("Skipping test because vApp was not successfully created at setup")
    76  	}
    77  	task, err := vcd.vapp.PowerOn()
    78  	check.Assert(err, IsNil)
    79  	err = task.WaitTaskCompletion()
    80  	check.Assert(err, IsNil)
    81  	task, err = vcd.vapp.Reboot()
    82  	check.Assert(err, IsNil)
    83  	err = task.WaitTaskCompletion()
    84  	check.Assert(err, IsNil)
    85  	check.Assert(task.Task.Status, Equals, "success")
    86  
    87  }
    88  
    89  func (vcd *TestVCD) Test_BlockWhileStatus(check *C) {
    90  	if vcd.skipVappTests {
    91  		check.Skip("Skipping test because vApp was not successfully created at setup")
    92  	}
    93  
    94  	initialVappStatus, err := vcd.vapp.GetStatus()
    95  	check.Assert(err, IsNil)
    96  
    97  	// This must timeout as the timeout is zero and we are not changing vApp
    98  	errMustTimeout := vcd.vapp.BlockWhileStatus(initialVappStatus, 0)
    99  	check.Assert(errMustTimeout, ErrorMatches, "timed out waiting for vApp to exit state .* after .* seconds")
   100  
   101  	task, err := vcd.vapp.PowerOn()
   102  	check.Assert(err, IsNil)
   103  	// This must wait until vApp changes status from initialVappStatus
   104  	err = vcd.vapp.BlockWhileStatus(initialVappStatus, vcd.vapp.client.MaxRetryTimeout)
   105  	check.Assert(err, IsNil)
   106  
   107  	// Ensure the powerOn operation succeeded
   108  	err = task.WaitTaskCompletion()
   109  	check.Assert(err, IsNil)
   110  	check.Assert(task.Task.Status, Equals, "success")
   111  
   112  	// Clean up and leave it down
   113  	task, err = vcd.vapp.PowerOff()
   114  	check.Assert(err, IsNil)
   115  	err = task.WaitTaskCompletion()
   116  	check.Assert(err, IsNil)
   117  	check.Assert(task.Task.Status, Equals, "success")
   118  }
   119  
   120  // TODO: Add a check checking if the ovf was set properly
   121  func (vcd *TestVCD) Test_SetOvf(check *C) {
   122  	if vcd.skipVappTests {
   123  		check.Skip("Skipping test because vApp was not successfully created at setup")
   124  	}
   125  	var test = make(map[string]string)
   126  	test["guestinfo.hostname"] = "testhostname"
   127  	task, err := vcd.vapp.SetOvf(test)
   128  
   129  	check.Assert(err, IsNil)
   130  	err = task.WaitTaskCompletion()
   131  	check.Assert(err, IsNil)
   132  	check.Assert(task.Task.Status, Equals, "success")
   133  
   134  }
   135  
   136  // TODO: Add a check checking if the customization script ran
   137  func (vcd *TestVCD) Test_RunCustomizationScript(check *C) {
   138  	if vcd.skipVappTests {
   139  		check.Skip("Skipping test because vApp was not successfully created at setup")
   140  	}
   141  	// Run Script on Test Vapp
   142  	task, err := vcd.vapp.RunCustomizationScript("computername", "this is my script")
   143  	check.Assert(err, IsNil)
   144  	err = task.WaitTaskCompletion()
   145  	check.Assert(err, IsNil)
   146  	check.Assert(task.Task.Status, Equals, "success")
   147  }
   148  
   149  // TODO: Add a check checking if the cpu count did change
   150  func (vcd *TestVCD) Test_ChangeCPUcount(check *C) {
   151  	if vcd.skipVappTests {
   152  		check.Skip("Skipping test because vApp was not successfully created at setup")
   153  	}
   154  	task, err := vcd.vapp.ChangeCPUCount(1)
   155  	check.Assert(err, IsNil)
   156  	err = task.WaitTaskCompletion()
   157  	check.Assert(err, IsNil)
   158  	check.Assert(task.Task.Status, Equals, "success")
   159  }
   160  
   161  // TODO: Add a check checking if the cpu count and cores did change
   162  func (vcd *TestVCD) Test_ChangeCPUCountWithCore(check *C) {
   163  	if vcd.skipVappTests {
   164  		check.Skip("Skipping test because vApp was not successfully created at setup")
   165  	}
   166  
   167  	currentCpus := int64(0)
   168  	currentCores := 0
   169  
   170  	// save current values
   171  	if nil != vcd.vapp.VApp.Children.VM[0] && nil != vcd.vapp.VApp.Children.VM[0].VirtualHardwareSection && nil != vcd.vapp.VApp.Children.VM[0].VirtualHardwareSection.Item {
   172  		for _, item := range vcd.vapp.VApp.Children.VM[0].VirtualHardwareSection.Item {
   173  			if item.ResourceType == types.ResourceTypeProcessor {
   174  				currentCpus = item.VirtualQuantity
   175  				currentCores = item.CoresPerSocket
   176  				break
   177  			}
   178  		}
   179  	}
   180  
   181  	cores := 2
   182  	cpuCount := int64(4)
   183  	task, err := vcd.vapp.ChangeCPUCountWithCore(int(cpuCount), &cores)
   184  	check.Assert(err, IsNil)
   185  	err = task.WaitTaskCompletion()
   186  	check.Assert(err, IsNil)
   187  	check.Assert(task.Task.Status, Equals, "success")
   188  
   189  	err = vcd.vapp.Refresh()
   190  	check.Assert(err, IsNil)
   191  	foundItem := false
   192  	if nil != vcd.vapp.VApp.Children.VM[0] && nil != vcd.vapp.VApp.Children.VM[0].VirtualHardwareSection && nil != vcd.vapp.VApp.Children.VM[0].VirtualHardwareSection.Item {
   193  		for _, item := range vcd.vapp.VApp.Children.VM[0].VirtualHardwareSection.Item {
   194  			if item.ResourceType == types.ResourceTypeProcessor {
   195  				check.Assert(item.CoresPerSocket, Equals, cores)
   196  				check.Assert(item.VirtualQuantity, Equals, cpuCount)
   197  				foundItem = true
   198  				break
   199  			}
   200  		}
   201  		check.Assert(foundItem, Equals, true)
   202  	}
   203  
   204  	// return tu previous value
   205  	task, err = vcd.vapp.ChangeCPUCountWithCore(int(currentCpus), &currentCores)
   206  	check.Assert(err, IsNil)
   207  	err = task.WaitTaskCompletion()
   208  	check.Assert(err, IsNil)
   209  	check.Assert(task.Task.Status, Equals, "success")
   210  }
   211  
   212  // TODO: Add a check checking if the vapp uses the new memory size
   213  func (vcd *TestVCD) Test_ChangeMemorySize(check *C) {
   214  	if vcd.skipVappTests {
   215  		check.Skip("Skipping test because vapp was not successfully created at setup")
   216  	}
   217  	task, err := vcd.vapp.ChangeMemorySize(512)
   218  
   219  	check.Assert(err, IsNil)
   220  	err = task.WaitTaskCompletion()
   221  	check.Assert(err, IsNil)
   222  	check.Assert(task.Task.Status, Equals, "success")
   223  }
   224  
   225  // TODO: Add a check checking the if the vapp uses the new storage profile
   226  func (vcd *TestVCD) Test_ChangeStorageProfile(check *C) {
   227  	if vcd.skipVappTests {
   228  		check.Skip("Skipping test because vapp was not successfully created at setup")
   229  	}
   230  	if vcd.config.VCD.StorageProfile.SP2 == "" {
   231  		check.Skip("Skipping test because second storage profile not given")
   232  	}
   233  	task, err := vcd.vapp.ChangeStorageProfile(vcd.config.VCD.StorageProfile.SP2)
   234  	errStr := fmt.Sprintf("%s", err)
   235  
   236  	re := regexp.MustCompile(`error retrieving storage profile`)
   237  	if re.MatchString(errStr) {
   238  		check.Skip("Skipping test because second storage profile not found")
   239  	}
   240  	check.Assert(err, IsNil)
   241  	err = task.WaitTaskCompletion()
   242  	check.Assert(err, IsNil)
   243  }
   244  
   245  // TODO: Add a check checking the vm name
   246  func (vcd *TestVCD) Test_ChangeVMName(check *C) {
   247  	if vcd.skipVappTests {
   248  		check.Skip("Skipping test because vapp was not successfully created at setup")
   249  	}
   250  	task, err := vcd.vapp.ChangeVMName("My-vm")
   251  	check.Assert(err, IsNil)
   252  	err = task.WaitTaskCompletion()
   253  	check.Assert(err, IsNil)
   254  	check.Assert(task.Task.Status, Equals, "success")
   255  }
   256  
   257  // TODO: Find out if there is a way to check if the vapp is on without
   258  // powering it on.
   259  func (vcd *TestVCD) Test_Reset(check *C) {
   260  	if vcd.skipVappTests {
   261  		check.Skip("Skipping test because vapp was not successfully created at setup")
   262  	}
   263  	task, err := vcd.vapp.PowerOn()
   264  	check.Assert(err, IsNil)
   265  	err = task.WaitTaskCompletion()
   266  	check.Assert(err, IsNil)
   267  	task, err = vcd.vapp.Reset()
   268  	check.Assert(err, IsNil)
   269  	err = task.WaitTaskCompletion()
   270  	check.Assert(err, IsNil)
   271  	check.Assert(task.Task.Status, Equals, "success")
   272  }
   273  
   274  // TODO: Find out if there is a way to check if the vapp is on without
   275  // powering it on.
   276  func (vcd *TestVCD) Test_Suspend(check *C) {
   277  	if vcd.skipVappTests {
   278  		check.Skip("Skipping test because vapp was not successfully created at setup")
   279  	}
   280  	task, err := vcd.vapp.PowerOn()
   281  	check.Assert(err, IsNil)
   282  	err = task.WaitTaskCompletion()
   283  	check.Assert(err, IsNil)
   284  	task, err = vcd.vapp.Suspend()
   285  	check.Assert(err, IsNil)
   286  	err = task.WaitTaskCompletion()
   287  	check.Assert(err, IsNil)
   288  	check.Assert(task.Task.Status, Equals, "success")
   289  
   290  }
   291  
   292  // TODO: Find out if there is a way to check if the vapp is on without
   293  // powering it on.
   294  func (vcd *TestVCD) Test_Shutdown(check *C) {
   295  	if vcd.skipVappTests {
   296  		check.Skip("Skipping test because vapp was not successfully created at setup")
   297  	}
   298  	task, err := vcd.vapp.PowerOn()
   299  	check.Assert(err, IsNil)
   300  	err = task.WaitTaskCompletion()
   301  	check.Assert(err, IsNil)
   302  	task, err = vcd.vapp.Shutdown()
   303  	check.Assert(err, IsNil)
   304  	err = task.WaitTaskCompletion()
   305  	check.Assert(err, IsNil)
   306  	check.Assert(task.Task.Status, Equals, "success")
   307  
   308  }
   309  
   310  func (vcd *TestVCD) Test_Deploy(check *C) {
   311  	if vcd.skipVappTests {
   312  		check.Skip("Skipping test because vapp was not successfully created at setup")
   313  	}
   314  	// Deploy
   315  	task, err := vcd.vapp.Deploy()
   316  	check.Assert(err, IsNil)
   317  	err = task.WaitTaskCompletion()
   318  	check.Assert(err, IsNil)
   319  	check.Assert(task.Task.Status, Equals, "success")
   320  }
   321  
   322  // TODO: Find out if there is a way to check if the vapp is on without
   323  // powering it on.
   324  func (vcd *TestVCD) Test_PowerOff(check *C) {
   325  	if vcd.skipVappTests {
   326  		check.Skip("Skipping test because vapp was not successfully created at setup")
   327  	}
   328  	task, err := vcd.vapp.PowerOn()
   329  	check.Assert(err, IsNil)
   330  	err = task.WaitTaskCompletion()
   331  	check.Assert(err, IsNil)
   332  	task, err = vcd.vapp.PowerOff()
   333  	check.Assert(err, IsNil)
   334  	err = task.WaitTaskCompletion()
   335  	check.Assert(err, IsNil)
   336  	check.Assert(task.Task.Status, Equals, "success")
   337  }
   338  
   339  // TODO: EVENTUALLY REMOVE THIS REDEPLOY
   340  func (vcd *TestVCD) Test_Undeploy(check *C) {
   341  	if vcd.skipVappTests {
   342  		check.Skip("Skipping test because vapp was not successfully created at setup")
   343  	}
   344  	// Check if the vapp has been deployed yet
   345  	err := vcd.vapp.Refresh()
   346  	check.Assert(err, IsNil)
   347  	if !vcd.vapp.VApp.Deployed {
   348  		task, err := vcd.vapp.Deploy()
   349  		check.Assert(err, IsNil)
   350  		err = task.WaitTaskCompletion()
   351  		check.Assert(err, IsNil)
   352  	}
   353  	// Undeploy
   354  	task, err := vcd.vapp.Undeploy()
   355  	check.Assert(err, IsNil)
   356  	err = task.WaitTaskCompletion()
   357  	check.Assert(err, IsNil)
   358  	check.Assert(task.Task.Status, Equals, "success")
   359  	// Deploy
   360  	// For some reason it will not work without redeploying
   361  	// TODO: EVENTUALLY REMOVE THIS REDEPLOY
   362  	task, err = vcd.vapp.Deploy()
   363  	check.Assert(err, IsNil)
   364  	err = task.WaitTaskCompletion()
   365  	check.Assert(err, IsNil)
   366  	check.Assert(task.Task.Status, Equals, "success")
   367  }
   368  
   369  func (vcd *TestVCD) Test_AddAndRemoveIsolatedNetwork(check *C) {
   370  	if vcd.skipVappTests {
   371  		check.Skip("Skipping test because vapp was not successfully created at setup")
   372  	}
   373  	// Add Metadata
   374  	networkName := "AddAndRemoveIsolatedNetworkTest"
   375  	const gateway = "192.168.0.1"
   376  	const netmask = "255.255.255.0"
   377  	const dns1 = "8.8.8.8"
   378  	const dns2 = "1.1.1.1"
   379  	const dnsSuffix = "biz.biz"
   380  	const startAddress = "192.168.0.10"
   381  	const endAddress = "192.168.0.20"
   382  	const dhcpStartAddress = "192.168.0.30"
   383  	const dhcpEndAddress = "192.168.0.40"
   384  	const maxLeaseTime = 3500
   385  	const defaultLeaseTime = 2400
   386  	var guestVlanAllowed = true
   387  
   388  	vappNetworkSettings := &VappNetworkSettings{
   389  		Name:             networkName,
   390  		Gateway:          gateway,
   391  		NetMask:          netmask,
   392  		DNS1:             dns1,
   393  		DNS2:             dns2,
   394  		DNSSuffix:        dnsSuffix,
   395  		GuestVLANAllowed: &guestVlanAllowed,
   396  		StaticIPRanges:   []*types.IPRange{{StartAddress: startAddress, EndAddress: endAddress}},
   397  		DhcpSettings:     &DhcpSettings{IsEnabled: true, MaxLeaseTime: maxLeaseTime, DefaultLeaseTime: defaultLeaseTime, IPRange: &types.IPRange{StartAddress: dhcpStartAddress, EndAddress: dhcpEndAddress}},
   398  	}
   399  
   400  	task, err := vcd.vapp.AddIsolatedNetwork(vappNetworkSettings)
   401  	check.Assert(err, IsNil)
   402  	err = task.WaitTaskCompletion()
   403  	check.Assert(err, IsNil)
   404  	check.Assert(task.Task.Status, Equals, "success")
   405  
   406  	err = vcd.vapp.Refresh()
   407  	check.Assert(err, IsNil)
   408  	networkConfig, err := vcd.vapp.GetNetworkConfig()
   409  	check.Assert(err, IsNil)
   410  
   411  	networkFound := types.VAppNetworkConfiguration{}
   412  	for _, networkConfig := range networkConfig.NetworkConfig {
   413  		if networkConfig.NetworkName == networkName {
   414  			networkFound = networkConfig
   415  		}
   416  	}
   417  
   418  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, gateway)
   419  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Netmask, Equals, netmask)
   420  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, dns1)
   421  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS2, Equals, dns2)
   422  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNSSuffix, Equals, dnsSuffix)
   423  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress, Equals, startAddress)
   424  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress, Equals, endAddress)
   425  
   426  	check.Assert(networkFound.Configuration.Features.DhcpService.IsEnabled, Equals, true)
   427  	check.Assert(networkFound.Configuration.Features.DhcpService.MaxLeaseTime, Equals, maxLeaseTime)
   428  	check.Assert(networkFound.Configuration.Features.DhcpService.DefaultLeaseTime, Equals, defaultLeaseTime)
   429  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.StartAddress, Equals, dhcpStartAddress)
   430  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.EndAddress, Equals, dhcpEndAddress)
   431  
   432  	task, err = vcd.vapp.RemoveIsolatedNetwork(networkName)
   433  	check.Assert(err, IsNil)
   434  	err = task.WaitTaskCompletion()
   435  	check.Assert(err, IsNil)
   436  	check.Assert(task.Task.Status, Equals, "success")
   437  
   438  	err = vcd.vapp.Refresh()
   439  	check.Assert(err, IsNil)
   440  	networkConfig, err = vcd.vapp.GetNetworkConfig()
   441  	check.Assert(err, IsNil)
   442  
   443  	isExist := false
   444  	for _, networkConfig := range networkConfig.NetworkConfig {
   445  		if networkConfig.NetworkName == networkName {
   446  			isExist = true
   447  		}
   448  	}
   449  	check.Assert(isExist, Equals, false)
   450  }
   451  
   452  // Test_AddNewVMNilNIC creates VM with nil network configuration
   453  func (vcd *TestVCD) Test_AddNewVMNilNIC(check *C) {
   454  
   455  	if vcd.skipVappTests {
   456  		check.Skip("Skipping test because vapp was not successfully created at setup")
   457  	}
   458  
   459  	// Find VApp
   460  	if vcd.vapp.VApp == nil {
   461  		check.Skip("skipping test because no vApp is found")
   462  	}
   463  
   464  	// Populate Catalog
   465  	cat, err := vcd.org.GetCatalogByName(vcd.config.VCD.Catalog.Name, false)
   466  	check.Assert(err, IsNil)
   467  	check.Assert(cat, NotNil)
   468  
   469  	// Populate Catalog Item
   470  	catitem, err := cat.GetCatalogItemByName(vcd.config.VCD.Catalog.CatalogItem, false)
   471  	check.Assert(err, IsNil)
   472  	check.Assert(catitem, NotNil)
   473  
   474  	// Get VAppTemplate
   475  	vapptemplate, err := catitem.GetVAppTemplate()
   476  	check.Assert(err, IsNil)
   477  
   478  	vapp, err := deployVappForTest(vcd, "Test_AddNewVMNilNIC")
   479  	check.Assert(err, IsNil)
   480  	check.Assert(vapp, NotNil)
   481  	task, err := vapp.AddNewVM(check.TestName(), vapptemplate, nil, true)
   482  
   483  	check.Assert(err, IsNil)
   484  
   485  	err = task.WaitTaskCompletion()
   486  	check.Assert(err, IsNil)
   487  	check.Assert(task.Task.Status, Equals, "success")
   488  
   489  	vm, err := vapp.GetVMByName(check.TestName(), true)
   490  	check.Assert(err, IsNil)
   491  
   492  	// Cleanup the created VM
   493  	err = vapp.RemoveVM(*vm)
   494  	check.Assert(err, IsNil)
   495  	task, err = vapp.Delete()
   496  	check.Assert(err, IsNil)
   497  	err = task.WaitTaskCompletion()
   498  	check.Assert(err, IsNil)
   499  	check.Assert(task.Task.Status, Equals, "success")
   500  }
   501  
   502  // Test_AddNewVMMultiNIC creates a new VM in vApp with multiple network cards
   503  func (vcd *TestVCD) Test_AddNewVMMultiNIC(check *C) {
   504  
   505  	if vcd.skipVappTests {
   506  		check.Skip("Skipping test because vapp was not successfully created at setup")
   507  	}
   508  
   509  	config := vcd.config
   510  	if config.VCD.Network.Net1 == "" {
   511  		check.Skip("Skipping test because no network was given")
   512  	}
   513  
   514  	// Find VApp
   515  	if vcd.vapp.VApp == nil {
   516  		check.Skip("skipping test because no vApp is found")
   517  	}
   518  
   519  	// Populate Catalog
   520  	cat, err := vcd.org.GetCatalogByName(vcd.config.VCD.Catalog.Name, true)
   521  	check.Assert(err, IsNil)
   522  	check.Assert(cat, NotNil)
   523  
   524  	// Populate Catalog Item
   525  	catitem, err := cat.GetCatalogItemByName(vcd.config.VCD.Catalog.CatalogItem, false)
   526  	check.Assert(err, IsNil)
   527  	check.Assert(catitem, NotNil)
   528  
   529  	// Get VAppTemplate
   530  	vapptemplate, err := catitem.GetVAppTemplate()
   531  	check.Assert(err, IsNil)
   532  
   533  	vapp, err := deployVappForTest(vcd, "Test_AddNewVMMultiNIC")
   534  	check.Assert(err, IsNil)
   535  	check.Assert(vapp, NotNil)
   536  
   537  	desiredNetConfig := &types.NetworkConnectionSection{}
   538  	desiredNetConfig.PrimaryNetworkConnectionIndex = 0
   539  	desiredNetConfig.NetworkConnection = append(desiredNetConfig.NetworkConnection,
   540  		&types.NetworkConnection{
   541  			IsConnected:             true,
   542  			IPAddressAllocationMode: types.IPAllocationModePool,
   543  			Network:                 config.VCD.Network.Net1,
   544  			NetworkConnectionIndex:  0,
   545  		},
   546  		&types.NetworkConnection{
   547  			IsConnected:             true,
   548  			IPAddressAllocationMode: types.IPAllocationModeNone,
   549  			Network:                 types.NoneNetwork,
   550  			NetworkConnectionIndex:  1,
   551  		})
   552  
   553  	// Test with two different networks if we have them
   554  	if config.VCD.Network.Net2 != "" {
   555  		// Attach second vdc network to vApp
   556  		vdcNetwork2, err := vcd.vdc.GetOrgVdcNetworkByName(vcd.config.VCD.Network.Net2, false)
   557  		check.Assert(err, IsNil)
   558  		_, err = vapp.AddOrgNetwork(&VappNetworkSettings{}, vdcNetwork2.OrgVDCNetwork, false)
   559  		check.Assert(err, IsNil)
   560  
   561  		desiredNetConfig.NetworkConnection = append(desiredNetConfig.NetworkConnection,
   562  			&types.NetworkConnection{
   563  				IsConnected:             true,
   564  				IPAddressAllocationMode: types.IPAllocationModePool,
   565  				Network:                 config.VCD.Network.Net2,
   566  				NetworkConnectionIndex:  2,
   567  			},
   568  		)
   569  	} else {
   570  		fmt.Println("Skipping adding another vdc network as network2 was not specified")
   571  	}
   572  
   573  	var task Task
   574  	var sp types.Reference
   575  	var customSP = false
   576  
   577  	if vcd.config.VCD.StorageProfile.SP1 != "" {
   578  		sp, _ = vcd.vdc.FindStorageProfileReference(vcd.config.VCD.StorageProfile.SP1)
   579  	}
   580  
   581  	// TODO: explore the feasibility of adding a test for either case (with or without storage profile).
   582  	if sp.HREF != "" {
   583  		if testVerbose {
   584  			fmt.Printf("Custom storage profile found. Using AddNewVMWithStorage \n")
   585  		}
   586  		customSP = true
   587  		task, err = vapp.AddNewVMWithStorageProfile(check.TestName(), vapptemplate, desiredNetConfig, &sp, true)
   588  	} else {
   589  		if testVerbose {
   590  			fmt.Printf("Custom storage profile not found. Using AddNewVM\n")
   591  		}
   592  		task, err = vapp.AddNewVM(check.TestName(), vapptemplate, desiredNetConfig, true)
   593  	}
   594  
   595  	check.Assert(err, IsNil)
   596  
   597  	err = task.WaitTaskCompletion()
   598  	check.Assert(err, IsNil)
   599  	check.Assert(task.Task.Status, Equals, "success")
   600  
   601  	vm, err := vapp.GetVMByName(check.TestName(), true)
   602  	check.Assert(err, IsNil)
   603  
   604  	// Ensure network config was valid
   605  	actualNetConfig, err := vm.GetNetworkConnectionSection()
   606  	check.Assert(err, IsNil)
   607  
   608  	if customSP {
   609  		check.Assert(vm.VM.StorageProfile.HREF, Equals, sp.HREF)
   610  	}
   611  
   612  	verifyNetworkConnectionSection(check, actualNetConfig, desiredNetConfig)
   613  
   614  	allVappNetworks, err := vapp.QueryAllVappNetworks(nil)
   615  	check.Assert(err, IsNil)
   616  	printVerbose("%# v\n", pretty.Formatter(allVappNetworks))
   617  	check.Assert(len(allVappNetworks), Equals, 2)
   618  
   619  	vappNetworks, err := vapp.QueryVappNetworks(nil)
   620  	check.Assert(err, IsNil)
   621  	printVerbose("%# v\n", pretty.Formatter(vappNetworks))
   622  	check.Assert(len(vappNetworks), Equals, 0)
   623  	vappOrgNetworks, err := vapp.QueryVappOrgNetworks(nil)
   624  	check.Assert(err, IsNil)
   625  	printVerbose("%# v\n", pretty.Formatter(vappOrgNetworks))
   626  	check.Assert(len(vappOrgNetworks), Equals, 2)
   627  
   628  	// Cleanup
   629  	err = vapp.RemoveVM(*vm)
   630  	check.Assert(err, IsNil)
   631  
   632  	// Ensure network is detached from vApp to avoid conflicts in other tests
   633  	task, err = vapp.RemoveAllNetworks()
   634  	check.Assert(err, IsNil)
   635  	err = task.WaitTaskCompletion()
   636  	check.Assert(err, IsNil)
   637  	task, err = vapp.Delete()
   638  	check.Assert(err, IsNil)
   639  	err = task.WaitTaskCompletion()
   640  	check.Assert(err, IsNil)
   641  	check.Assert(task.Task.Status, Equals, "success")
   642  }
   643  
   644  func (vcd *TestVCD) Test_RemoveAllNetworks(check *C) {
   645  	if vcd.skipVappTests {
   646  		check.Skip("Skipping test because vapp was not successfully created at setup")
   647  	}
   648  
   649  	networkName := "Test_RemoveAllNetworks"
   650  	networkName2 := "Test_RemoveAllNetworks2"
   651  	const gateway = "192.168.0.1"
   652  	const netmask = "255.255.255.0"
   653  	const dns1 = "8.8.8.8"
   654  	const dns2 = "1.1.1.1"
   655  	const dnsSuffix = "biz.biz"
   656  	const startAddress = "192.168.0.10"
   657  	const endAddress = "192.168.0.20"
   658  	const dhcpStartAddress = "192.168.0.30"
   659  	const dhcpEndAddress = "192.168.0.40"
   660  	const maxLeaseTime = 3500
   661  	const defaultLeaseTime = 2400
   662  	var guestVlanAllowed = true
   663  
   664  	vappNetworkSettings := &VappNetworkSettings{
   665  		Name:           networkName,
   666  		Gateway:        gateway,
   667  		NetMask:        netmask,
   668  		DNS1:           dns1,
   669  		DNS2:           dns2,
   670  		DNSSuffix:      dnsSuffix,
   671  		StaticIPRanges: []*types.IPRange{{StartAddress: startAddress, EndAddress: endAddress}},
   672  		DhcpSettings:   &DhcpSettings{IsEnabled: true, MaxLeaseTime: maxLeaseTime, DefaultLeaseTime: defaultLeaseTime, IPRange: &types.IPRange{StartAddress: dhcpStartAddress, EndAddress: dhcpEndAddress}},
   673  	}
   674  
   675  	vappNetworkSettings2 := &VappNetworkSettings{
   676  		Name:             networkName2,
   677  		Gateway:          gateway,
   678  		NetMask:          netmask,
   679  		DNS1:             dns1,
   680  		DNS2:             dns2,
   681  		DNSSuffix:        dnsSuffix,
   682  		StaticIPRanges:   []*types.IPRange{{StartAddress: startAddress, EndAddress: endAddress}},
   683  		DhcpSettings:     &DhcpSettings{IsEnabled: true, MaxLeaseTime: maxLeaseTime, DefaultLeaseTime: defaultLeaseTime, IPRange: &types.IPRange{StartAddress: dhcpStartAddress, EndAddress: dhcpEndAddress}},
   684  		GuestVLANAllowed: &guestVlanAllowed,
   685  	}
   686  
   687  	_, err := vcd.vapp.CreateVappNetwork(vappNetworkSettings, nil)
   688  	check.Assert(err, IsNil)
   689  
   690  	_, err = vcd.vapp.CreateVappNetwork(vappNetworkSettings2, nil)
   691  	check.Assert(err, IsNil)
   692  
   693  	err = vcd.vapp.Refresh()
   694  	check.Assert(err, IsNil)
   695  	networkConfig, err := vcd.vapp.GetNetworkConfig()
   696  	check.Assert(err, IsNil)
   697  
   698  	check.Assert(len(networkConfig.NetworkConfig), Equals, 2)
   699  
   700  	// Network removal requires for the vApp to be down therefore attempt to power off vApp before
   701  	// network removal, but ignore error as it might already be powered off
   702  	vappStatus, err := vcd.vapp.GetStatus()
   703  	check.Assert(err, IsNil)
   704  
   705  	allVappNetworks, err := vcd.vapp.QueryAllVappNetworks(nil)
   706  	check.Assert(err, IsNil)
   707  	printVerbose("%# v\n", pretty.Formatter(allVappNetworks))
   708  	check.Assert(len(allVappNetworks), Equals, 2)
   709  
   710  	vappNetworks, err := vcd.vapp.QueryVappNetworks(nil)
   711  	check.Assert(err, IsNil)
   712  	printVerbose("%# v\n", pretty.Formatter(vappNetworks))
   713  	check.Assert(len(vappNetworks), Equals, 1)
   714  	vappOrgNetworks, err := vcd.vapp.QueryVappOrgNetworks(nil)
   715  	check.Assert(err, IsNil)
   716  	printVerbose("%# v\n", pretty.Formatter(vappOrgNetworks))
   717  	check.Assert(len(vappOrgNetworks), Equals, 1)
   718  
   719  	if vappStatus != "POWERED_OFF" {
   720  		task, err := vcd.vapp.Undeploy()
   721  		check.Assert(err, IsNil)
   722  		err = task.WaitTaskCompletion()
   723  		check.Assert(err, IsNil)
   724  	}
   725  
   726  	vappStatus, err = vcd.vapp.GetStatus()
   727  	check.Assert(err, IsNil)
   728  	printVerbose("vApp status before network removal: %s\n", vappStatus)
   729  
   730  	task, err := vcd.vapp.RemoveAllNetworks()
   731  	check.Assert(err, IsNil)
   732  	err = task.WaitTaskCompletion()
   733  	check.Assert(err, IsNil)
   734  	check.Assert(task.Task.Status, Equals, "success")
   735  
   736  	err = vcd.vapp.Refresh()
   737  	check.Assert(err, IsNil)
   738  	networkConfig, err = vcd.vapp.GetNetworkConfig()
   739  	check.Assert(err, IsNil)
   740  
   741  	hasNetworks := false
   742  	for _, networkConfig := range networkConfig.NetworkConfig {
   743  		if networkConfig.NetworkName == networkName || networkConfig.NetworkName == networkName2 {
   744  			hasNetworks = true
   745  		}
   746  
   747  	}
   748  	check.Assert(hasNetworks, Equals, false)
   749  
   750  	// Power on shared vApp for other tests
   751  	task, err = vcd.vapp.PowerOn()
   752  	check.Assert(err, IsNil)
   753  	err = task.WaitTaskCompletion()
   754  	check.Assert(err, IsNil)
   755  }
   756  
   757  // Test_VappSetProductSectionList sets vApp product section, retrieves it and deeply matches if
   758  // properties were properly set using a propertyTester helper.
   759  func (vcd *TestVCD) Test_VappSetProductSectionList(check *C) {
   760  	if vcd.skipVappTests {
   761  		check.Skip("Skipping test because vapp was not successfully created at setup")
   762  	}
   763  	vapp := vcd.findFirstVapp()
   764  	propertyTester(vcd, check, &vapp)
   765  }
   766  
   767  // Tests VM retrieval by name, by ID, and by a combination of name and ID
   768  func (vcd *TestVCD) Test_GetVM(check *C) {
   769  
   770  	if vcd.skipVappTests {
   771  		check.Skip("Skipping test because vapp wasn't properly created")
   772  	}
   773  	if vcd.config.VCD.Org == "" {
   774  		check.Skip("Test_GetVapp: Org name not given.")
   775  		return
   776  	}
   777  	if vcd.config.VCD.Vdc == "" {
   778  		check.Skip("Test_GetVapp: VDC name not given.")
   779  		return
   780  	}
   781  	org, err := vcd.client.GetOrgByName(vcd.config.VCD.Org)
   782  	check.Assert(err, IsNil)
   783  	check.Assert(org, NotNil)
   784  
   785  	vdc, err := org.GetVDCByName(vcd.config.VCD.Vdc, false)
   786  	check.Assert(err, IsNil)
   787  	check.Assert(vdc, NotNil)
   788  
   789  	vapp := vcd.findFirstVapp()
   790  
   791  	if vapp.VApp == nil || vapp.VApp.HREF == "" || vapp.client == nil {
   792  		check.Skip("no suitable vApp found")
   793  	}
   794  	_, vmName := vcd.findFirstVm(vapp)
   795  
   796  	if vmName == "" {
   797  		check.Skip("no suitable VM found")
   798  	}
   799  
   800  	getByName := func(name string, refresh bool) (genericEntity, error) {
   801  		return vapp.GetVMByName(name, refresh)
   802  	}
   803  	getById := func(id string, refresh bool) (genericEntity, error) { return vapp.GetVMById(id, refresh) }
   804  	getByNameOrId := func(id string, refresh bool) (genericEntity, error) {
   805  		return vapp.GetVMByNameOrId(id, refresh)
   806  	}
   807  
   808  	var def = getterTestDefinition{
   809  		parentType:    "VApp",
   810  		parentName:    vapp.VApp.Name,
   811  		entityType:    "Vm",
   812  		entityName:    vmName,
   813  		getByName:     getByName,
   814  		getById:       getById,
   815  		getByNameOrId: getByNameOrId,
   816  	}
   817  	vcd.testFinderGetGenericEntity(def, check)
   818  }
   819  
   820  func (vcd *TestVCD) Test_AddAndRemoveIsolatedVappNetwork(check *C) {
   821  	fmt.Printf("Running: %s\n", check.TestName())
   822  
   823  	vapp, err := deployVappForTest(vcd, "Test_AddAndRemoveIsolatedVappNetwork")
   824  	check.Assert(err, IsNil)
   825  	check.Assert(vapp, NotNil)
   826  
   827  	// Add Metadata
   828  	networkName := "Test_AddAndRemoveIsolatedVappNetwork"
   829  	description := "Created in test"
   830  	const gateway = "192.168.0.1"
   831  	const netmask = "255.255.255.0"
   832  	const dns1 = "8.8.8.8"
   833  	const dns2 = "1.1.1.1"
   834  	const dnsSuffix = "biz.biz"
   835  	const startAddress = "192.168.0.10"
   836  	const endAddress = "192.168.0.20"
   837  	const dhcpStartAddress = "192.168.0.30"
   838  	const dhcpEndAddress = "192.168.0.40"
   839  	const maxLeaseTime = 3500
   840  	const defaultLeaseTime = 2400
   841  	var guestVlanAllowed = true
   842  
   843  	vappNetworkSettings := &VappNetworkSettings{
   844  		Name:             networkName,
   845  		Gateway:          gateway,
   846  		NetMask:          netmask,
   847  		DNS1:             dns1,
   848  		DNS2:             dns2,
   849  		DNSSuffix:        dnsSuffix,
   850  		StaticIPRanges:   []*types.IPRange{{StartAddress: startAddress, EndAddress: endAddress}},
   851  		DhcpSettings:     &DhcpSettings{IsEnabled: true, MaxLeaseTime: maxLeaseTime, DefaultLeaseTime: defaultLeaseTime, IPRange: &types.IPRange{StartAddress: dhcpStartAddress, EndAddress: dhcpEndAddress}},
   852  		GuestVLANAllowed: &guestVlanAllowed,
   853  		Description:      description,
   854  	}
   855  
   856  	vappNetworkConfig, err := vapp.CreateVappNetwork(vappNetworkSettings, nil)
   857  	check.Assert(err, IsNil)
   858  	check.Assert(vappNetworkConfig, NotNil)
   859  
   860  	networkFound := types.VAppNetworkConfiguration{}
   861  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
   862  		if networkConfig.NetworkName == networkName {
   863  			networkFound = networkConfig
   864  		}
   865  	}
   866  
   867  	check.Assert(networkFound.Description, Equals, description)
   868  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, gateway)
   869  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Netmask, Equals, netmask)
   870  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, dns1)
   871  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS2, Equals, dns2)
   872  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNSSuffix, Equals, dnsSuffix)
   873  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress, Equals, startAddress)
   874  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress, Equals, endAddress)
   875  
   876  	check.Assert(networkFound.Configuration.Features.DhcpService.IsEnabled, Equals, true)
   877  	check.Assert(networkFound.Configuration.Features.DhcpService.MaxLeaseTime, Equals, maxLeaseTime)
   878  	check.Assert(networkFound.Configuration.Features.DhcpService.DefaultLeaseTime, Equals, defaultLeaseTime)
   879  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.StartAddress, Equals, dhcpStartAddress)
   880  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.EndAddress, Equals, dhcpEndAddress)
   881  
   882  	err = vapp.Refresh()
   883  	check.Assert(err, IsNil)
   884  	vappNetworkConfig, err = vapp.RemoveNetwork(networkName)
   885  	check.Assert(err, IsNil)
   886  	check.Assert(vappNetworkConfig, NotNil)
   887  
   888  	isExist := false
   889  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
   890  		if networkConfig.NetworkName == networkName {
   891  			isExist = true
   892  		}
   893  	}
   894  	check.Assert(isExist, Equals, false)
   895  
   896  	task, err := vapp.Delete()
   897  	check.Assert(err, IsNil)
   898  	err = task.WaitTaskCompletion()
   899  	check.Assert(err, IsNil)
   900  	check.Assert(task.Task.Status, Equals, "success")
   901  }
   902  
   903  // Test_AddAndRemoveIsolatedVappNetworkIpv6 is identical to Test_AddAndRemoveIsolatedVappNetwork,
   904  // but it uses ipv6 values for network specification.
   905  func (vcd *TestVCD) Test_AddAndRemoveIsolatedVappNetworkIpv6(check *C) {
   906  	fmt.Printf("Running: %s\n", check.TestName())
   907  
   908  	vapp, err := deployVappForTest(vcd, "Test_AddAndRemoveIsolatedVappNetwork")
   909  	check.Assert(err, IsNil)
   910  	check.Assert(vapp, NotNil)
   911  
   912  	// Add Metadata
   913  	networkName := check.TestName()
   914  	description := "Created in test"
   915  	const gateway = "fe80:0:0:0:0:0:0:aaaa"
   916  	const prefixlength = "100"
   917  	// VCD API returns ipv6 addresses in expanded format, so this is
   918  	// needed to compare values properly.
   919  	const dns1 = "2001:4860:4860:0:0:0:0:8844"
   920  	const dns2 = "2001:4860:4860:0:0:0:0:8844"
   921  	const dnsSuffix = "biz.biz"
   922  	const startAddress = "fe80:0:0:0:0:0:0:aaab"
   923  	const endAddress = "fe80:0:0:0:0:0:0:bbbb"
   924  	const dhcpStartAddress = "fe80:0:0:0:0:0:0:cccc"
   925  	const dhcpEndAddress = "fe80:0:0:0:0:0:0:dddd"
   926  	const maxLeaseTime = 3500
   927  	const defaultLeaseTime = 2400
   928  	var guestVlanAllowed = true
   929  
   930  	vappNetworkSettings := &VappNetworkSettings{
   931  		Name:               networkName,
   932  		Gateway:            gateway,
   933  		SubnetPrefixLength: prefixlength,
   934  		DNS1:               dns1,
   935  		DNS2:               dns2,
   936  		DNSSuffix:          dnsSuffix,
   937  		StaticIPRanges:     []*types.IPRange{{StartAddress: startAddress, EndAddress: endAddress}},
   938  		DhcpSettings:       &DhcpSettings{IsEnabled: true, MaxLeaseTime: maxLeaseTime, DefaultLeaseTime: defaultLeaseTime, IPRange: &types.IPRange{StartAddress: dhcpStartAddress, EndAddress: dhcpEndAddress}},
   939  		GuestVLANAllowed:   &guestVlanAllowed,
   940  		Description:        description,
   941  	}
   942  
   943  	vappNetworkConfig, err := vapp.CreateVappNetwork(vappNetworkSettings, nil)
   944  	check.Assert(err, IsNil)
   945  	check.Assert(vappNetworkConfig, NotNil)
   946  
   947  	vappNetworkSettings.NetMask = "255.255.255.0"
   948  	vappNetworkConfig2, err := vapp.CreateVappNetwork(vappNetworkSettings, nil)
   949  	check.Assert(err, NotNil)
   950  	check.Assert(vappNetworkConfig2, IsNil)
   951  
   952  	networkFound := types.VAppNetworkConfiguration{}
   953  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
   954  		if networkConfig.NetworkName == networkName {
   955  			networkFound = networkConfig
   956  		}
   957  	}
   958  
   959  	check.Assert(networkFound.Description, Equals, description)
   960  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, gateway)
   961  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].SubnetPrefixLength, Equals, prefixlength)
   962  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, dns1)
   963  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS2, Equals, dns2)
   964  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNSSuffix, Equals, dnsSuffix)
   965  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress, Equals, startAddress)
   966  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress, Equals, endAddress)
   967  
   968  	check.Assert(networkFound.Configuration.Features.DhcpService.IsEnabled, Equals, true)
   969  	check.Assert(networkFound.Configuration.Features.DhcpService.MaxLeaseTime, Equals, maxLeaseTime)
   970  	check.Assert(networkFound.Configuration.Features.DhcpService.DefaultLeaseTime, Equals, defaultLeaseTime)
   971  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.StartAddress, Equals, dhcpStartAddress)
   972  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.EndAddress, Equals, dhcpEndAddress)
   973  
   974  	err = vapp.Refresh()
   975  	check.Assert(err, IsNil)
   976  	vappNetworkConfig, err = vapp.RemoveNetwork(networkName)
   977  	check.Assert(err, IsNil)
   978  	check.Assert(vappNetworkConfig, NotNil)
   979  
   980  	isExist := false
   981  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
   982  		if networkConfig.NetworkName == networkName {
   983  			isExist = true
   984  		}
   985  	}
   986  	check.Assert(isExist, Equals, false)
   987  
   988  	task, err := vapp.Delete()
   989  	check.Assert(err, IsNil)
   990  	err = task.WaitTaskCompletion()
   991  	check.Assert(err, IsNil)
   992  	check.Assert(task.Task.Status, Equals, "success")
   993  }
   994  
   995  func (vcd *TestVCD) Test_AddAndRemoveNatVappNetwork(check *C) {
   996  	fmt.Printf("Running: %s\n", check.TestName())
   997  
   998  	if vcd.config.VCD.Network.Net1 == "" {
   999  		check.Skip("Skipping test because no network was given")
  1000  	}
  1001  
  1002  	vapp, err := deployVappForTest(vcd, "Test_AddAndRemoveNatVappNetwork")
  1003  	check.Assert(err, IsNil)
  1004  	check.Assert(vapp, NotNil)
  1005  
  1006  	// Add Metadata
  1007  	networkName := "Test_AddAndRemoveNatVappNetwork"
  1008  	description := "Created in test"
  1009  	const gateway = "192.168.0.1"
  1010  	const netmask = "255.255.255.0"
  1011  	const dns1 = "8.8.8.8"
  1012  	const dns2 = "1.1.1.1"
  1013  	const dnsSuffix = "biz.biz"
  1014  	const startAddress = "192.168.0.10"
  1015  	const endAddress = "192.168.0.20"
  1016  	const dhcpStartAddress = "192.168.0.30"
  1017  	const dhcpEndAddress = "192.168.0.40"
  1018  	const maxLeaseTime = 3500
  1019  	const defaultLeaseTime = 2400
  1020  	var guestVlanAllowed = true
  1021  	var retainIpMacEnabled = true
  1022  
  1023  	orgVdcNetwork, err := vcd.vdc.GetOrgVdcNetworkByName(vcd.config.VCD.Network.Net1, false)
  1024  	check.Assert(err, IsNil)
  1025  	check.Assert(orgVdcNetwork, NotNil)
  1026  
  1027  	vappNetworkSettings := &VappNetworkSettings{
  1028  		Name:               networkName,
  1029  		Gateway:            gateway,
  1030  		NetMask:            netmask,
  1031  		DNS1:               dns1,
  1032  		DNS2:               dns2,
  1033  		DNSSuffix:          dnsSuffix,
  1034  		StaticIPRanges:     []*types.IPRange{{StartAddress: startAddress, EndAddress: endAddress}},
  1035  		DhcpSettings:       &DhcpSettings{IsEnabled: true, MaxLeaseTime: maxLeaseTime, DefaultLeaseTime: defaultLeaseTime, IPRange: &types.IPRange{StartAddress: dhcpStartAddress, EndAddress: dhcpEndAddress}},
  1036  		GuestVLANAllowed:   &guestVlanAllowed,
  1037  		Description:        description,
  1038  		RetainIpMacEnabled: &retainIpMacEnabled,
  1039  	}
  1040  
  1041  	vappNetworkConfig, err := vapp.CreateVappNetwork(vappNetworkSettings, orgVdcNetwork.OrgVDCNetwork)
  1042  	check.Assert(err, IsNil)
  1043  	check.Assert(vappNetworkConfig, NotNil)
  1044  
  1045  	networkFound := types.VAppNetworkConfiguration{}
  1046  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1047  		if networkConfig.NetworkName == networkName {
  1048  			networkFound = networkConfig
  1049  		}
  1050  	}
  1051  
  1052  	check.Assert(networkFound.Description, Equals, description)
  1053  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, gateway)
  1054  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Netmask, Equals, netmask)
  1055  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, dns1)
  1056  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS2, Equals, dns2)
  1057  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNSSuffix, Equals, dnsSuffix)
  1058  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress, Equals, startAddress)
  1059  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress, Equals, endAddress)
  1060  
  1061  	check.Assert(networkFound.Configuration.Features.DhcpService.IsEnabled, Equals, true)
  1062  	check.Assert(networkFound.Configuration.Features.DhcpService.MaxLeaseTime, Equals, maxLeaseTime)
  1063  	check.Assert(networkFound.Configuration.Features.DhcpService.DefaultLeaseTime, Equals, defaultLeaseTime)
  1064  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.StartAddress, Equals, dhcpStartAddress)
  1065  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.EndAddress, Equals, dhcpEndAddress)
  1066  
  1067  	check.Assert(*networkFound.Configuration.RetainNetInfoAcrossDeployments, Equals, retainIpMacEnabled)
  1068  
  1069  	check.Assert(networkFound.Configuration.ParentNetwork.Name, Equals, orgVdcNetwork.OrgVDCNetwork.Name)
  1070  
  1071  	err = vapp.Refresh()
  1072  	check.Assert(err, IsNil)
  1073  	vappNetworkConfig, err = vapp.RemoveNetwork(networkName)
  1074  	check.Assert(err, IsNil)
  1075  	check.Assert(vappNetworkConfig, NotNil)
  1076  
  1077  	isExist := false
  1078  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1079  		if networkConfig.NetworkName == networkName {
  1080  			isExist = true
  1081  		}
  1082  	}
  1083  	check.Assert(isExist, Equals, false)
  1084  
  1085  	task, err := vapp.Delete()
  1086  	check.Assert(err, IsNil)
  1087  	err = task.WaitTaskCompletion()
  1088  	check.Assert(err, IsNil)
  1089  	check.Assert(task.Task.Status, Equals, "success")
  1090  }
  1091  
  1092  func (vcd *TestVCD) Test_UpdateVappNetwork(check *C) {
  1093  	fmt.Printf("Running: %s\n", check.TestName())
  1094  
  1095  	if vcd.config.VCD.Network.Net1 == "" {
  1096  		check.Skip("Skipping test because no network was given")
  1097  	}
  1098  
  1099  	vapp, err := deployVappForTest(vcd, "Test_UpdateVappNetwork")
  1100  	check.Assert(err, IsNil)
  1101  	check.Assert(vapp, NotNil)
  1102  
  1103  	// Add
  1104  	networkName := "Test_UpdateVappNetwork"
  1105  	description := "Created in test"
  1106  	const gateway = "192.168.0.1"
  1107  	const netmask = "255.255.255.0"
  1108  	const dns1 = "8.8.8.8"
  1109  	const dns2 = "1.1.1.1"
  1110  	const dnsSuffix = "biz.biz"
  1111  	const startAddress = "192.168.0.10"
  1112  	const endAddress = "192.168.0.20"
  1113  	const dhcpStartAddress = "192.168.0.30"
  1114  	const dhcpEndAddress = "192.168.0.40"
  1115  	const maxLeaseTime = 3500
  1116  	const defaultLeaseTime = 2400
  1117  	var guestVlanAllowed = true
  1118  	var retainIpMacEnabled = true
  1119  
  1120  	orgVdcNetwork, err := vcd.vdc.GetOrgVdcNetworkByName(vcd.config.VCD.Network.Net1, false)
  1121  	check.Assert(err, IsNil)
  1122  	check.Assert(orgVdcNetwork, NotNil)
  1123  
  1124  	vappNetworkSettings := &VappNetworkSettings{
  1125  		Name:               networkName,
  1126  		Gateway:            gateway,
  1127  		NetMask:            netmask,
  1128  		DNS1:               dns1,
  1129  		DNS2:               dns2,
  1130  		DNSSuffix:          dnsSuffix,
  1131  		StaticIPRanges:     []*types.IPRange{{StartAddress: startAddress, EndAddress: endAddress}},
  1132  		DhcpSettings:       &DhcpSettings{IsEnabled: true, MaxLeaseTime: maxLeaseTime, DefaultLeaseTime: defaultLeaseTime, IPRange: &types.IPRange{StartAddress: dhcpStartAddress, EndAddress: dhcpEndAddress}},
  1133  		GuestVLANAllowed:   &guestVlanAllowed,
  1134  		Description:        description,
  1135  		RetainIpMacEnabled: &retainIpMacEnabled,
  1136  	}
  1137  
  1138  	vappNetworkConfig, err := vapp.CreateVappNetwork(vappNetworkSettings, nil)
  1139  	check.Assert(err, IsNil)
  1140  	check.Assert(vappNetworkConfig, NotNil)
  1141  
  1142  	networkFound := types.VAppNetworkConfiguration{}
  1143  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1144  		if networkConfig.NetworkName == networkName {
  1145  			networkFound = networkConfig
  1146  		}
  1147  	}
  1148  
  1149  	check.Assert(networkFound.Description, Equals, description)
  1150  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, gateway)
  1151  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Netmask, Equals, netmask)
  1152  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, dns1)
  1153  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS2, Equals, dns2)
  1154  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNSSuffix, Equals, dnsSuffix)
  1155  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress, Equals, startAddress)
  1156  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress, Equals, endAddress)
  1157  
  1158  	check.Assert(networkFound.Configuration.Features.DhcpService.IsEnabled, Equals, true)
  1159  	check.Assert(networkFound.Configuration.Features.DhcpService.MaxLeaseTime, Equals, maxLeaseTime)
  1160  	check.Assert(networkFound.Configuration.Features.DhcpService.DefaultLeaseTime, Equals, defaultLeaseTime)
  1161  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.StartAddress, Equals, dhcpStartAddress)
  1162  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.EndAddress, Equals, dhcpEndAddress)
  1163  
  1164  	var emptyFirewallService *types.FirewallService
  1165  	check.Assert(networkFound.Configuration.Features.FirewallService, Equals, emptyFirewallService)
  1166  	check.Assert(*networkFound.Configuration.RetainNetInfoAcrossDeployments, Equals, retainIpMacEnabled)
  1167  
  1168  	// Update
  1169  	updateNetworkName := "Test_UpdateVappNetworkUpdated"
  1170  	updateDescription := "Created in test Updated"
  1171  	const updateGateway = "192.168.0.1"
  1172  	const updateNetmask = "255.255.255.0"
  1173  	const updateDns1 = "8.8.8.7"
  1174  	const updateDns2 = "1.1.1.2"
  1175  	const updateDnsSuffix = "biz.biz2"
  1176  	const updateStartAddress = "192.168.0.11"
  1177  	const updateEndAddress = "192.168.0.21"
  1178  	const updateDhcpStartAddress = "192.168.0.31"
  1179  	const updateDhcpEndAddress = "192.168.0.41"
  1180  	const updateMaxLeaseTime = 3400
  1181  	const updateDefaultLeaseTime = 2300
  1182  	var updateGuestVlanAllowed = false
  1183  	var updateRetainIpMacEnabled = false
  1184  
  1185  	uuid, err := GetUuidFromHref(networkFound.Link.HREF, false)
  1186  	check.Assert(err, IsNil)
  1187  	check.Assert(uuid, NotNil)
  1188  
  1189  	updateVappNetworkSettings := &VappNetworkSettings{
  1190  		ID:                 uuid,
  1191  		Name:               updateNetworkName,
  1192  		Description:        updateDescription,
  1193  		Gateway:            updateGateway,
  1194  		NetMask:            updateNetmask,
  1195  		DNS1:               updateDns1,
  1196  		DNS2:               updateDns2,
  1197  		DNSSuffix:          updateDnsSuffix,
  1198  		StaticIPRanges:     []*types.IPRange{{StartAddress: updateStartAddress, EndAddress: updateEndAddress}},
  1199  		DhcpSettings:       &DhcpSettings{IsEnabled: true, MaxLeaseTime: updateMaxLeaseTime, DefaultLeaseTime: updateDefaultLeaseTime, IPRange: &types.IPRange{StartAddress: updateDhcpStartAddress, EndAddress: updateDhcpEndAddress}},
  1200  		GuestVLANAllowed:   &updateGuestVlanAllowed,
  1201  		RetainIpMacEnabled: &updateRetainIpMacEnabled,
  1202  	}
  1203  
  1204  	vappNetworkConfig, err = vapp.UpdateNetwork(updateVappNetworkSettings, orgVdcNetwork.OrgVDCNetwork)
  1205  	check.Assert(err, IsNil)
  1206  	check.Assert(vappNetworkConfig, NotNil)
  1207  
  1208  	networkFound = types.VAppNetworkConfiguration{}
  1209  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1210  		if networkConfig.NetworkName == updateNetworkName {
  1211  			networkFound = networkConfig
  1212  		}
  1213  	}
  1214  
  1215  	check.Assert(networkFound.Description, Equals, updateDescription)
  1216  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, updateGateway)
  1217  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Netmask, Equals, updateNetmask)
  1218  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, updateDns1)
  1219  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS2, Equals, updateDns2)
  1220  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNSSuffix, Equals, updateDnsSuffix)
  1221  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress, Equals, updateStartAddress)
  1222  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress, Equals, updateEndAddress)
  1223  
  1224  	check.Assert(networkFound.Configuration.Features.DhcpService.IsEnabled, Equals, true)
  1225  	check.Assert(networkFound.Configuration.Features.DhcpService.MaxLeaseTime, Equals, updateMaxLeaseTime)
  1226  	check.Assert(networkFound.Configuration.Features.DhcpService.DefaultLeaseTime, Equals, updateDefaultLeaseTime)
  1227  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.StartAddress, Equals, updateDhcpStartAddress)
  1228  	check.Assert(networkFound.Configuration.Features.DhcpService.IPRange.EndAddress, Equals, updateDhcpEndAddress)
  1229  
  1230  	check.Assert(*networkFound.Configuration.RetainNetInfoAcrossDeployments, Equals, updateRetainIpMacEnabled)
  1231  
  1232  	check.Assert(networkFound.Configuration.ParentNetwork.Name, Equals, orgVdcNetwork.OrgVDCNetwork.Name)
  1233  
  1234  	err = vapp.Refresh()
  1235  	check.Assert(err, IsNil)
  1236  	vappNetworkConfig, err = vapp.RemoveNetwork(updateNetworkName)
  1237  	check.Assert(err, IsNil)
  1238  	check.Assert(vappNetworkConfig, NotNil)
  1239  
  1240  	isExist := false
  1241  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1242  		if networkConfig.NetworkName == networkName {
  1243  			isExist = true
  1244  		}
  1245  	}
  1246  	check.Assert(isExist, Equals, false)
  1247  
  1248  	task, err := vapp.Delete()
  1249  	check.Assert(err, IsNil)
  1250  	err = task.WaitTaskCompletion()
  1251  	check.Assert(err, IsNil)
  1252  	check.Assert(task.Task.Status, Equals, "success")
  1253  }
  1254  
  1255  func (vcd *TestVCD) Test_AddAndRemoveVappNetworkWithMinimumValues(check *C) {
  1256  	fmt.Printf("Running: %s\n", check.TestName())
  1257  
  1258  	vapp, err := deployVappForTest(vcd, "Test_AddAndRemoveVappNetworkWithMinimumValues")
  1259  	check.Assert(err, IsNil)
  1260  	check.Assert(vapp, NotNil)
  1261  
  1262  	// Add Metadata
  1263  	networkName := "Test_AddAndRemoveVappNetworkWithMinimumValues"
  1264  	const gateway = "192.168.0.1"
  1265  	const netmask = "255.255.255.0"
  1266  
  1267  	vappNetworkSettings := &VappNetworkSettings{
  1268  		Name:    networkName,
  1269  		Gateway: gateway,
  1270  		NetMask: netmask,
  1271  	}
  1272  
  1273  	vappNetworkConfig, err := vapp.CreateVappNetwork(vappNetworkSettings, nil)
  1274  	check.Assert(err, IsNil)
  1275  	check.Assert(vappNetworkConfig, NotNil)
  1276  
  1277  	networkFound := types.VAppNetworkConfiguration{}
  1278  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1279  		if networkConfig.NetworkName == networkName {
  1280  			networkFound = networkConfig
  1281  		}
  1282  	}
  1283  
  1284  	var ipRange *types.IPRanges
  1285  	var networkFeatures *types.NetworkFeatures
  1286  	var parentNetwork *types.Reference
  1287  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, gateway)
  1288  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Netmask, Equals, netmask)
  1289  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, "")
  1290  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS2, Equals, "")
  1291  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNSSuffix, Equals, "")
  1292  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges, Equals, ipRange)
  1293  
  1294  	check.Assert(networkFound.Configuration.Features, Equals, networkFeatures)
  1295  
  1296  	check.Assert(*networkFound.Configuration.RetainNetInfoAcrossDeployments, Equals, false)
  1297  
  1298  	check.Assert(networkFound.Configuration.ParentNetwork, Equals, parentNetwork)
  1299  
  1300  	err = vapp.Refresh()
  1301  	check.Assert(err, IsNil)
  1302  	vappNetworkConfig, err = vapp.RemoveNetwork(networkName)
  1303  	check.Assert(err, IsNil)
  1304  	check.Assert(vappNetworkConfig, NotNil)
  1305  
  1306  	isExist := false
  1307  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1308  		if networkConfig.NetworkName == networkName {
  1309  			isExist = true
  1310  		}
  1311  	}
  1312  	check.Assert(isExist, Equals, false)
  1313  
  1314  	task, err := vapp.Delete()
  1315  	check.Assert(err, IsNil)
  1316  	err = task.WaitTaskCompletion()
  1317  	check.Assert(err, IsNil)
  1318  	check.Assert(task.Task.Status, Equals, "success")
  1319  }
  1320  
  1321  func (vcd *TestVCD) Test_AddAndRemoveOrgVappNetworkWithMinimumValues(check *C) {
  1322  	fmt.Printf("Running: %s\n", check.TestName())
  1323  
  1324  	if vcd.config.VCD.Network.Net1 == "" {
  1325  		check.Skip("Skipping test because no first network was given")
  1326  	}
  1327  	if vcd.config.VCD.Network.Net2 == "" {
  1328  		check.Skip("Skipping test because no second network was given")
  1329  	}
  1330  	vapp, err := deployVappForTest(vcd, "Test_AddAndRemoveOrgVappNetworkWithMinimumValues")
  1331  	check.Assert(err, IsNil)
  1332  	check.Assert(vapp, NotNil)
  1333  
  1334  	orgVdcNetwork, err := vcd.vdc.GetOrgVdcNetworkByName(vcd.config.VCD.Network.Net2, false)
  1335  	check.Assert(err, IsNil)
  1336  	check.Assert(orgVdcNetwork, NotNil)
  1337  
  1338  	vappNetworkSettings := &VappNetworkSettings{}
  1339  
  1340  	vappNetworkConfig, err := vapp.AddOrgNetwork(vappNetworkSettings, orgVdcNetwork.OrgVDCNetwork, false)
  1341  	check.Assert(err, IsNil)
  1342  	check.Assert(vappNetworkConfig, NotNil)
  1343  
  1344  	networkFound := types.VAppNetworkConfiguration{}
  1345  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1346  		if networkConfig.NetworkName == vcd.config.VCD.Network.Net2 {
  1347  			networkFound = networkConfig
  1348  		}
  1349  	}
  1350  
  1351  	var networkFeatures *types.NetworkFeatures
  1352  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].Gateway)
  1353  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Netmask, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].Netmask)
  1354  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].DNS1)
  1355  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress)
  1356  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress)
  1357  
  1358  	check.Assert(networkFound.Configuration.Features, Equals, networkFeatures)
  1359  
  1360  	check.Assert(*networkFound.Configuration.RetainNetInfoAcrossDeployments, Equals, false)
  1361  
  1362  	check.Assert(networkFound.Configuration.ParentNetwork.Name, Equals, vcd.config.VCD.Network.Net2)
  1363  
  1364  	err = vapp.Refresh()
  1365  	check.Assert(err, IsNil)
  1366  	vappNetworkConfig, err = vapp.RemoveNetwork(vcd.config.VCD.Network.Net2)
  1367  	check.Assert(err, IsNil)
  1368  	check.Assert(vappNetworkConfig, NotNil)
  1369  
  1370  	isExist := false
  1371  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1372  		if networkConfig.NetworkName == vcd.config.VCD.Network.Net2 {
  1373  			isExist = true
  1374  		}
  1375  	}
  1376  	check.Assert(isExist, Equals, false)
  1377  
  1378  	task, err := vapp.Delete()
  1379  	check.Assert(err, IsNil)
  1380  	err = task.WaitTaskCompletion()
  1381  	check.Assert(err, IsNil)
  1382  	check.Assert(task.Task.Status, Equals, "success")
  1383  }
  1384  
  1385  func (vcd *TestVCD) Test_AddAndRemoveOrgVappNetwork(check *C) {
  1386  	fmt.Printf("Running: %s\n", check.TestName())
  1387  
  1388  	if vcd.config.VCD.Network.Net1 == "" {
  1389  		check.Skip("Skipping test because no first network was given")
  1390  	}
  1391  	if vcd.config.VCD.Network.Net2 == "" {
  1392  		check.Skip("Skipping test because no second network was given")
  1393  	}
  1394  
  1395  	vapp, err := deployVappForTest(vcd, "Test_AddAndRemoveOrgVappNetwork")
  1396  	check.Assert(err, IsNil)
  1397  	check.Assert(vapp, NotNil)
  1398  
  1399  	orgVdcNetwork, err := vcd.vdc.GetOrgVdcNetworkByName(vcd.config.VCD.Network.Net2, false)
  1400  	check.Assert(err, IsNil)
  1401  	check.Assert(orgVdcNetwork, NotNil)
  1402  
  1403  	var retainIpMacEnabled = true
  1404  
  1405  	vappNetworkSettings := &VappNetworkSettings{
  1406  		RetainIpMacEnabled: &retainIpMacEnabled,
  1407  	}
  1408  
  1409  	vappNetworkConfig, err := vapp.AddOrgNetwork(vappNetworkSettings, orgVdcNetwork.OrgVDCNetwork, true)
  1410  	check.Assert(err, IsNil)
  1411  	check.Assert(vappNetworkConfig, NotNil)
  1412  
  1413  	networkFound := types.VAppNetworkConfiguration{}
  1414  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1415  		if networkConfig.NetworkName == vcd.config.VCD.Network.Net2 {
  1416  			networkFound = networkConfig
  1417  		}
  1418  	}
  1419  
  1420  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].Gateway)
  1421  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Netmask, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].Netmask)
  1422  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].DNS1)
  1423  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress)
  1424  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress)
  1425  
  1426  	check.Assert(*networkFound.Configuration.RetainNetInfoAcrossDeployments, Equals, retainIpMacEnabled)
  1427  
  1428  	check.Assert(networkFound.Configuration.ParentNetwork.Name, Equals, vcd.config.VCD.Network.Net2)
  1429  
  1430  	err = vapp.Refresh()
  1431  	check.Assert(err, IsNil)
  1432  	check.Assert(len(vapp.VApp.NetworkConfigSection.NetworkConfig), Equals, 2)
  1433  	vappNetworkConfig, err = vapp.RemoveNetwork(vcd.config.VCD.Network.Net2)
  1434  	check.Assert(err, IsNil)
  1435  	check.Assert(vappNetworkConfig, NotNil)
  1436  
  1437  	isExist := false
  1438  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1439  		if networkConfig.NetworkName == vcd.config.VCD.Network.Net2 {
  1440  			isExist = true
  1441  		}
  1442  	}
  1443  	check.Assert(isExist, Equals, false)
  1444  
  1445  	task, err := vapp.Delete()
  1446  	check.Assert(err, IsNil)
  1447  	err = task.WaitTaskCompletion()
  1448  	check.Assert(err, IsNil)
  1449  	check.Assert(task.Task.Status, Equals, "success")
  1450  }
  1451  
  1452  func (vcd *TestVCD) Test_UpdateOrgVappNetwork(check *C) {
  1453  	fmt.Printf("Running: %s\n", check.TestName())
  1454  
  1455  	if vcd.config.VCD.Network.Net1 == "" {
  1456  		check.Skip("Skipping test because no first network was given")
  1457  	}
  1458  	if vcd.config.VCD.Network.Net2 == "" {
  1459  		check.Skip("Skipping test because no second network was given")
  1460  	}
  1461  
  1462  	vapp, err := deployVappForTest(vcd, "Test_UpdateOrgVappNetwork")
  1463  	check.Assert(err, IsNil)
  1464  	check.Assert(vapp, NotNil)
  1465  
  1466  	orgVdcNetwork, err := vcd.vdc.GetOrgVdcNetworkByName(vcd.config.VCD.Network.Net2, false)
  1467  	check.Assert(err, IsNil)
  1468  	check.Assert(orgVdcNetwork, NotNil)
  1469  
  1470  	var retainIpMacEnabled = true
  1471  
  1472  	vappNetworkSettings := &VappNetworkSettings{
  1473  		RetainIpMacEnabled: &retainIpMacEnabled,
  1474  	}
  1475  
  1476  	vappNetworkConfig, err := vapp.AddOrgNetwork(vappNetworkSettings, orgVdcNetwork.OrgVDCNetwork, true)
  1477  	check.Assert(err, IsNil)
  1478  	check.Assert(vappNetworkConfig, NotNil)
  1479  
  1480  	networkFound := types.VAppNetworkConfiguration{}
  1481  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1482  		if networkConfig.NetworkName == vcd.config.VCD.Network.Net2 {
  1483  			networkFound = networkConfig
  1484  		}
  1485  	}
  1486  
  1487  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].Gateway)
  1488  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Netmask, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].Netmask)
  1489  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].DNS1)
  1490  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress)
  1491  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress)
  1492  
  1493  	check.Assert(*networkFound.Configuration.RetainNetInfoAcrossDeployments, Equals, retainIpMacEnabled)
  1494  
  1495  	check.Assert(networkFound.Configuration.ParentNetwork.Name, Equals, vcd.config.VCD.Network.Net2)
  1496  
  1497  	uuid, err := GetUuidFromHref(networkFound.Link.HREF, false)
  1498  	check.Assert(err, IsNil)
  1499  	check.Assert(uuid, NotNil)
  1500  
  1501  	var updateRetainIpMacEnabled = false
  1502  
  1503  	vappNetworkSettings = &VappNetworkSettings{
  1504  		ID:                 uuid,
  1505  		RetainIpMacEnabled: &updateRetainIpMacEnabled,
  1506  	}
  1507  
  1508  	vappNetworkConfig, err = vapp.UpdateOrgNetwork(vappNetworkSettings, false)
  1509  	check.Assert(err, IsNil)
  1510  	check.Assert(vappNetworkConfig, NotNil)
  1511  
  1512  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1513  		if networkConfig.NetworkName == vcd.config.VCD.Network.Net2 {
  1514  			networkFound = networkConfig
  1515  		}
  1516  	}
  1517  
  1518  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Gateway, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].Gateway)
  1519  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].Netmask, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].Netmask)
  1520  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].DNS1, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].DNS1)
  1521  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].StartAddress)
  1522  	check.Assert(networkFound.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress, Equals, orgVdcNetwork.OrgVDCNetwork.Configuration.IPScopes.IPScope[0].IPRanges.IPRange[0].EndAddress)
  1523  
  1524  	var emptyFirewallFeatures *types.NetworkFeatures
  1525  	check.Assert(networkFound.Configuration.Features, Equals, emptyFirewallFeatures)
  1526  	check.Assert(networkFound.Configuration.Features, Equals, emptyFirewallFeatures)
  1527  	check.Assert(*networkFound.Configuration.RetainNetInfoAcrossDeployments, Equals, updateRetainIpMacEnabled)
  1528  
  1529  	check.Assert(networkFound.Configuration.ParentNetwork.Name, Equals, vcd.config.VCD.Network.Net2)
  1530  
  1531  	err = vapp.Refresh()
  1532  	check.Assert(err, IsNil)
  1533  	check.Assert(len(vapp.VApp.NetworkConfigSection.NetworkConfig), Equals, 2)
  1534  	vappNetworkConfig, err = vapp.RemoveNetwork(vcd.config.VCD.Network.Net2)
  1535  	check.Assert(err, IsNil)
  1536  	check.Assert(vappNetworkConfig, NotNil)
  1537  
  1538  	isExist := false
  1539  	for _, networkConfig := range vappNetworkConfig.NetworkConfig {
  1540  		if networkConfig.NetworkName == vcd.config.VCD.Network.Net2 {
  1541  			isExist = true
  1542  		}
  1543  	}
  1544  	check.Assert(isExist, Equals, false)
  1545  
  1546  	task, err := vapp.Delete()
  1547  	check.Assert(err, IsNil)
  1548  	err = task.WaitTaskCompletion()
  1549  	check.Assert(err, IsNil)
  1550  	check.Assert(task.Task.Status, Equals, "success")
  1551  }
  1552  
  1553  // Test_AddNewVMFromMultiVmTemplate creates VM from OVA holding a few VMs
  1554  func (vcd *TestVCD) Test_AddNewVMFromMultiVmTemplate(check *C) {
  1555  
  1556  	if vcd.skipVappTests {
  1557  		check.Skip("Skipping test because vapp was not successfully created at setup")
  1558  	}
  1559  
  1560  	if vcd.config.OVA.OvaMultiVmPath == "" && vcd.config.VCD.Catalog.CatalogItemWithMultiVms == "" {
  1561  		check.Skip("skipping test because ovaMultiVmPath or catalogItemWithMultiVms has to be defined")
  1562  	}
  1563  
  1564  	if vcd.config.VCD.Catalog.VmNameInMultiVmItem == "" {
  1565  		check.Skip("skipping test because vmNameInMultiVmItem is not defined")
  1566  	}
  1567  
  1568  	// Populate Catalog
  1569  	catalog, err := vcd.org.GetCatalogByName(vcd.config.VCD.Catalog.NsxtBackedCatalogName, false)
  1570  	check.Assert(err, IsNil)
  1571  	check.Assert(catalog, NotNil)
  1572  
  1573  	uploadedItem := false
  1574  	itemName := vcd.config.VCD.Catalog.CatalogItemWithMultiVms
  1575  	if itemName == "" {
  1576  		check.Logf("Using `OvaMultiVmPath` '%s' for test. Will upload to use it.", vcd.config.OVA.OvaMultiVmPath)
  1577  		itemName = check.TestName()
  1578  		uploadTask, err := catalog.UploadOvf(vcd.config.OVA.OvaMultiVmPath, itemName, "upload from test", 1024)
  1579  		check.Assert(err, IsNil)
  1580  		err = uploadTask.WaitTaskCompletion()
  1581  		check.Assert(err, IsNil)
  1582  
  1583  		uploadedItem = true
  1584  		AddToCleanupList(itemName, "catalogItem", vcd.org.Org.Name+"|"+vcd.config.VCD.Catalog.NsxtBackedCatalogName, check.TestName())
  1585  	} else {
  1586  		check.Logf("Using pre-loaded `CatalogItemWithMultiVms` '%s' for test", itemName)
  1587  	}
  1588  
  1589  	vmInTemplateRecord, err := vcd.nsxtVdc.QueryVappSynchronizedVmTemplate(vcd.config.VCD.Catalog.NsxtBackedCatalogName, itemName, vcd.config.VCD.Catalog.VmNameInMultiVmItem)
  1590  	check.Assert(err, IsNil)
  1591  
  1592  	// Get VAppTemplate
  1593  	returnedVappTemplate, err := catalog.GetVappTemplateByHref(vmInTemplateRecord.HREF)
  1594  	check.Assert(err, IsNil)
  1595  
  1596  	vapp, err := deployVappForTest(vcd, "Test_AddNewVMFromMultiVmTemplate")
  1597  	check.Assert(err, IsNil)
  1598  	check.Assert(vapp, NotNil)
  1599  	task, err := vapp.AddNewVM(check.TestName(), *returnedVappTemplate, nil, true)
  1600  
  1601  	check.Assert(err, IsNil)
  1602  
  1603  	err = task.WaitTaskCompletion()
  1604  	check.Assert(err, IsNil)
  1605  	check.Assert(task.Task.Status, Equals, "success")
  1606  
  1607  	vm, err := vapp.GetVMByName(check.TestName(), true)
  1608  	check.Assert(err, IsNil)
  1609  
  1610  	// Cleanup the created VM
  1611  	err = vapp.RemoveVM(*vm)
  1612  	check.Assert(err, IsNil)
  1613  	task, err = vapp.Delete()
  1614  	check.Assert(err, IsNil)
  1615  	err = task.WaitTaskCompletion()
  1616  	check.Assert(err, IsNil)
  1617  	check.Assert(task.Task.Status, Equals, "success")
  1618  
  1619  	// Remove uploaded catalog item
  1620  	if uploadedItem {
  1621  		catalogItem, err := catalog.GetCatalogItemByName(itemName, true)
  1622  		check.Assert(err, IsNil)
  1623  
  1624  		err = catalogItem.Delete()
  1625  		check.Assert(err, IsNil)
  1626  	}
  1627  }
  1628  
  1629  // Test_AddNewVMWithComputeCapacity creates a new VM in vApp with VM using compute capacity
  1630  func (vcd *TestVCD) Test_AddNewVMWithComputeCapacity(check *C) {
  1631  	vcd.skipIfNotSysAdmin(check)
  1632  	if vcd.skipVappTests {
  1633  		check.Skip("Skipping test because vApp was not successfully created at setup")
  1634  	}
  1635  
  1636  	// Find VApp
  1637  	if vcd.vapp.VApp == nil {
  1638  		check.Skip("skipping test because no vApp is found")
  1639  	}
  1640  
  1641  	// Populate Catalog
  1642  	cat, err := vcd.org.GetCatalogByName(vcd.config.VCD.Catalog.Name, true)
  1643  	check.Assert(err, IsNil)
  1644  	check.Assert(cat, NotNil)
  1645  
  1646  	// Populate Catalog Item
  1647  	catitem, err := cat.GetCatalogItemByName(vcd.config.VCD.Catalog.CatalogItem, false)
  1648  	check.Assert(err, IsNil)
  1649  	check.Assert(catitem, NotNil)
  1650  
  1651  	// Get VAppTemplate
  1652  	vapptemplate, err := catitem.GetVAppTemplate()
  1653  	check.Assert(err, IsNil)
  1654  
  1655  	vapp, err := deployVappForTest(vcd, "Test_AddNewVMWithComputeCapacity")
  1656  	check.Assert(err, IsNil)
  1657  	check.Assert(vapp, NotNil)
  1658  
  1659  	// Create and assign compute policy
  1660  	newComputePolicy := &VdcComputePolicy{
  1661  		client: vcd.org.client,
  1662  		VdcComputePolicy: &types.VdcComputePolicy{
  1663  			Name:        check.TestName() + "_empty",
  1664  			Description: addrOf("Empty policy created by test"),
  1665  		},
  1666  	}
  1667  
  1668  	adminOrg, err := vcd.client.GetAdminOrgByName(vcd.org.Org.Name)
  1669  	check.Assert(err, IsNil)
  1670  	check.Assert(adminOrg, NotNil)
  1671  
  1672  	adminVdc, err := adminOrg.GetAdminVDCByName(vcd.vdc.Vdc.Name, false)
  1673  	if adminVdc == nil || err != nil {
  1674  		vcd.infoCleanup(notFoundMsg, "vdc", vcd.vdc.Vdc.Name)
  1675  	}
  1676  
  1677  	createdPolicy, err := adminOrg.CreateVdcComputePolicy(newComputePolicy.VdcComputePolicy)
  1678  	check.Assert(err, IsNil)
  1679  
  1680  	AddToCleanupList(createdPolicy.VdcComputePolicy.ID, "vdcComputePolicy", vcd.org.Org.Name, "Test_AddNewEmptyVMWithVmComputePolicy")
  1681  
  1682  	vdcComputePolicyHref, err := adminOrg.client.OpenApiBuildEndpoint(types.OpenApiPathVersion1_0_0, types.OpenApiEndpointVdcComputePolicies)
  1683  	check.Assert(err, IsNil)
  1684  
  1685  	// Get policy to existing ones (can be only default one)
  1686  	allAssignedComputePolicies, err := adminVdc.GetAllAssignedVdcComputePolicies(nil)
  1687  	check.Assert(err, IsNil)
  1688  	var policyReferences []*types.Reference
  1689  	for _, assignedPolicy := range allAssignedComputePolicies {
  1690  		policyReferences = append(policyReferences, &types.Reference{HREF: vdcComputePolicyHref.String() + assignedPolicy.VdcComputePolicy.ID})
  1691  	}
  1692  	policyReferences = append(policyReferences, &types.Reference{HREF: vdcComputePolicyHref.String() + createdPolicy.VdcComputePolicy.ID})
  1693  
  1694  	assignedVdcComputePolicies, err := adminVdc.SetAssignedComputePolicies(types.VdcComputePolicyReferences{VdcComputePolicyReference: policyReferences})
  1695  	check.Assert(err, IsNil)
  1696  	check.Assert(len(allAssignedComputePolicies)+1, Equals, len(assignedVdcComputePolicies.VdcComputePolicyReference))
  1697  	// end
  1698  
  1699  	var task Task
  1700  
  1701  	task, err = vapp.AddNewVMWithComputePolicy(check.TestName(), vapptemplate, nil, nil, createdPolicy.VdcComputePolicy, true)
  1702  
  1703  	check.Assert(err, IsNil)
  1704  
  1705  	err = task.WaitTaskCompletion()
  1706  	check.Assert(err, IsNil)
  1707  	check.Assert(task.Task.Status, Equals, "success")
  1708  
  1709  	createdVm, err := vapp.GetVMByName(check.TestName(), true)
  1710  	check.Assert(err, IsNil)
  1711  
  1712  	check.Assert(createdVm.VM.ComputePolicy, NotNil)
  1713  	check.Assert(createdVm.VM.ComputePolicy.VmSizingPolicy, NotNil)
  1714  	check.Assert(createdVm.VM.ComputePolicy.VmSizingPolicy.ID, Equals, createdPolicy.VdcComputePolicy.ID)
  1715  
  1716  	// Cleanup
  1717  	err = vapp.RemoveVM(*createdVm)
  1718  	check.Assert(err, IsNil)
  1719  
  1720  	// Ensure network is detached from vApp to avoid conflicts in other tests
  1721  	task, err = vapp.RemoveAllNetworks()
  1722  	check.Assert(err, IsNil)
  1723  	err = task.WaitTaskCompletion()
  1724  	check.Assert(err, IsNil)
  1725  	task, err = vapp.Delete()
  1726  	check.Assert(err, IsNil)
  1727  	err = task.WaitTaskCompletion()
  1728  	check.Assert(err, IsNil)
  1729  	check.Assert(task.Task.Status, Equals, "success")
  1730  
  1731  	// cleanup assigned compute policy
  1732  	var beforeTestPolicyReferences []*types.Reference
  1733  	for _, assignedPolicy := range allAssignedComputePolicies {
  1734  		beforeTestPolicyReferences = append(beforeTestPolicyReferences, &types.Reference{HREF: vdcComputePolicyHref.String() + assignedPolicy.VdcComputePolicy.ID})
  1735  	}
  1736  
  1737  	_, err = adminVdc.SetAssignedComputePolicies(types.VdcComputePolicyReferences{VdcComputePolicyReference: beforeTestPolicyReferences})
  1738  	check.Assert(err, IsNil)
  1739  }
  1740  
  1741  func (vcd *TestVCD) testUpdateVapp(op string, check *C, vapp *VApp, name, description string, vms []string) {
  1742  
  1743  	var err error
  1744  	switch op {
  1745  	case "update_desc", "remove_desc":
  1746  		printVerbose("[%s] testing vapp.UpdateDescription(\"%s\")\n", op, description)
  1747  		err = vapp.UpdateDescription(description)
  1748  		check.Assert(err, IsNil)
  1749  	case "update_both":
  1750  		printVerbose("[%s] testing vapp.UpdateNameDescription(\"%s\", \"%s\")\n", op, name, description)
  1751  		err = vapp.UpdateNameDescription(name, description)
  1752  		check.Assert(err, IsNil)
  1753  	case "rename":
  1754  		printVerbose("[%s] testing vapp.Rename(\"%s\")\n", op, name)
  1755  		err = vapp.Rename(name)
  1756  		check.Assert(err, IsNil)
  1757  	default:
  1758  		check.Assert("unhandled operation", Equals, "true")
  1759  	}
  1760  
  1761  	if name == "" {
  1762  		name = vapp.VApp.Name
  1763  	}
  1764  
  1765  	// Get a fresh copy of the vApp
  1766  	vapp, err = vcd.vdc.GetVAppByName(name, true)
  1767  	check.Assert(err, IsNil)
  1768  
  1769  	check.Assert(vapp.VApp.Name, Equals, name)
  1770  	check.Assert(vapp.VApp.Description, Equals, description)
  1771  	// check that the VMs still exist after vApp update
  1772  	for _, vm := range vms {
  1773  		printVerbose("checking VM %s\n", vm)
  1774  		_, err = vapp.GetVMByName(vm, true)
  1775  		check.Assert(err, IsNil)
  1776  	}
  1777  }
  1778  
  1779  func (vcd *TestVCD) Test_UpdateVappNameDescription(check *C) {
  1780  
  1781  	fmt.Printf("Running: %s\n", check.TestName())
  1782  
  1783  	vappName := check.TestName()
  1784  	vappDescription := vappName + " description"
  1785  	newVappName := vappName + "_new"
  1786  
  1787  	newVappDescription := vappName + " desc"
  1788  	// Compose VApp
  1789  	vapp, err := makeEmptyVapp(vcd.vdc, vappName, vappDescription)
  1790  	check.Assert(err, IsNil)
  1791  	AddToCleanupList(vappName, "vapp", "", "Test_RenameVapp")
  1792  
  1793  	check.Assert(vapp.VApp.Name, Equals, vappName)
  1794  	check.Assert(vapp.VApp.Description, Equals, vappDescription)
  1795  
  1796  	// Need a slight delay for the vApp to get the links that are needed for renaming
  1797  	time.Sleep(time.Second)
  1798  
  1799  	// change description
  1800  	vcd.testUpdateVapp("update_desc", check, vapp, "", newVappDescription, nil)
  1801  
  1802  	// remove description
  1803  	vcd.testUpdateVapp("remove_desc", check, vapp, vappName, "", nil)
  1804  
  1805  	// restore original
  1806  	vcd.testUpdateVapp("update_both", check, vapp, vappName, vappDescription, nil)
  1807  
  1808  	// change name
  1809  	vcd.testUpdateVapp("rename", check, vapp, newVappName, vappDescription, nil)
  1810  	AddToCleanupList(newVappName, "vapp", "", "Test_RenameVapp")
  1811  	// restore original
  1812  	vcd.testUpdateVapp("update_both", check, vapp, vappName, vappDescription, nil)
  1813  
  1814  	// Add two VMs
  1815  	_, err = makeEmptyVm(vapp, "vm1")
  1816  	check.Assert(err, IsNil)
  1817  	_, err = makeEmptyVm(vapp, "vm2")
  1818  	check.Assert(err, IsNil)
  1819  
  1820  	vms := []string{"vm1", "vm2"}
  1821  	// change description after adding VMs
  1822  	vcd.testUpdateVapp("update_desc", check, vapp, "", newVappDescription, vms)
  1823  	vcd.testUpdateVapp("remove_desc", check, vapp, vappName, "", nil)
  1824  	// restore original
  1825  	vcd.testUpdateVapp("update_both", check, vapp, vappName, vappDescription, vms)
  1826  
  1827  	// change name after adding VMs
  1828  	vcd.testUpdateVapp("rename", check, vapp, newVappName, vappDescription, vms)
  1829  	// restore original
  1830  	vcd.testUpdateVapp("update_both", check, vapp, vappName, vappDescription, vms)
  1831  
  1832  	// Remove vApp
  1833  	err = deleteVapp(vcd, vappName)
  1834  	check.Assert(err, IsNil)
  1835  }
  1836  
  1837  func (vcd *TestVCD) Test_Vapp_LeaseUpdate(check *C) {
  1838  	fmt.Printf("Running: %s\n", check.TestName())
  1839  
  1840  	if vcd.config.VCD.Org == "" {
  1841  		check.Skip("Organization not set in configuration")
  1842  	}
  1843  	org, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org)
  1844  	check.Assert(err, IsNil)
  1845  	orgVappLease := org.AdminOrg.OrgSettings.OrgVAppLeaseSettings
  1846  
  1847  	vappName := check.TestName()
  1848  	vappDescription := vappName + " description"
  1849  
  1850  	vapp, err := makeEmptyVapp(vcd.vdc, vappName, vappDescription)
  1851  	check.Assert(err, IsNil)
  1852  	AddToCleanupList(vappName, "vapp", "", "Test_Vapp_GetLease")
  1853  
  1854  	lease, err := vapp.GetLease()
  1855  	check.Assert(err, IsNil)
  1856  	check.Assert(lease, NotNil)
  1857  
  1858  	// Check that lease in vApp is the same as the default lease in the organization
  1859  	check.Assert(lease.StorageLeaseInSeconds, Equals, *orgVappLease.StorageLeaseSeconds)
  1860  	check.Assert(lease.DeploymentLeaseInSeconds, Equals, *orgVappLease.DeploymentLeaseSeconds)
  1861  	if testVerbose {
  1862  		fmt.Printf("lease deployment at Org level: %d\n", *orgVappLease.DeploymentLeaseSeconds)
  1863  		fmt.Printf("lease storage at Org level: %d\n", *orgVappLease.StorageLeaseSeconds)
  1864  		fmt.Printf("lease deployment in vApp before: %d\n", lease.DeploymentLeaseInSeconds)
  1865  		fmt.Printf("lease storage in vApp before: %d\n", lease.StorageLeaseInSeconds)
  1866  	}
  1867  	secondsInDay := 60 * 60 * 24
  1868  
  1869  	// Set lease to 90 days deployment, 7 days storage
  1870  	err = vapp.RenewLease(secondsInDay*90, secondsInDay*7)
  1871  	check.Assert(err, IsNil)
  1872  
  1873  	// Make sure the vApp internal values were updated
  1874  	check.Assert(vapp.VApp.LeaseSettingsSection.DeploymentLeaseInSeconds, Equals, secondsInDay*90)
  1875  	check.Assert(vapp.VApp.LeaseSettingsSection.StorageLeaseInSeconds, Equals, secondsInDay*7)
  1876  
  1877  	newLease, err := vapp.GetLease()
  1878  	check.Assert(err, IsNil)
  1879  	check.Assert(newLease, NotNil)
  1880  	check.Assert(newLease.DeploymentLeaseInSeconds, Equals, secondsInDay*90)
  1881  	check.Assert(newLease.StorageLeaseInSeconds, Equals, secondsInDay*7)
  1882  
  1883  	if testVerbose {
  1884  		fmt.Printf("lease deployment in vApp after: %d\n", newLease.DeploymentLeaseInSeconds)
  1885  		fmt.Printf("lease storage in vApp after: %d\n", newLease.StorageLeaseInSeconds)
  1886  	}
  1887  
  1888  	// Set lease to "never expires", which defaults to the Org maximum lease if the Org itself has lower limits
  1889  	err = vapp.RenewLease(0, 0)
  1890  	check.Assert(err, IsNil)
  1891  
  1892  	check.Assert(vapp.VApp.LeaseSettingsSection.DeploymentLeaseInSeconds, Equals, *orgVappLease.DeploymentLeaseSeconds)
  1893  
  1894  	check.Assert(vapp.VApp.LeaseSettingsSection.StorageLeaseInSeconds, Equals, *orgVappLease.StorageLeaseSeconds)
  1895  
  1896  	if *orgVappLease.DeploymentLeaseSeconds != 0 {
  1897  		// Check that setting a lease higher than allowed by the Org settings results in the defaults lease being set
  1898  		err = vapp.RenewLease(*orgVappLease.DeploymentLeaseSeconds+3600,
  1899  			*orgVappLease.StorageLeaseSeconds+3600)
  1900  		check.Assert(err, IsNil)
  1901  
  1902  		check.Assert(vapp.VApp.LeaseSettingsSection.DeploymentLeaseInSeconds, Equals, *orgVappLease.DeploymentLeaseSeconds)
  1903  		check.Assert(vapp.VApp.LeaseSettingsSection.StorageLeaseInSeconds, Equals, *orgVappLease.StorageLeaseSeconds)
  1904  	}
  1905  
  1906  	task, err := vapp.Delete()
  1907  	check.Assert(err, IsNil)
  1908  	err = task.WaitTaskCompletion()
  1909  	check.Assert(err, IsNil)
  1910  }