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

     1  //go:build providervdc || functional || ALL
     2  
     3  package govcd
     4  
     5  import (
     6  	"fmt"
     7  	"github.com/vmware/go-vcloud-director/v2/types/v56"
     8  	. "gopkg.in/check.v1"
     9  	"strings"
    10  )
    11  
    12  func init() {
    13  	testingTags["providervdc"] = "provider_vdc_test.go"
    14  }
    15  
    16  func (vcd *TestVCD) Test_GetProviderVdc(check *C) {
    17  	if vcd.skipAdminTests {
    18  		check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName()))
    19  	}
    20  
    21  	var providerVdcs []*ProviderVdc
    22  	providerVdc, err := vcd.client.GetProviderVdcByName(vcd.config.VCD.NsxtProviderVdc.Name)
    23  	check.Assert(err, IsNil)
    24  	providerVdcs = append(providerVdcs, providerVdc)
    25  	providerVdc, err = vcd.client.GetProviderVdcById(providerVdc.ProviderVdc.ID)
    26  	check.Assert(err, IsNil)
    27  	providerVdcs = append(providerVdcs, providerVdc)
    28  	providerVdc, err = vcd.client.GetProviderVdcByHref(providerVdc.ProviderVdc.HREF)
    29  	check.Assert(err, IsNil)
    30  	providerVdcs = append(providerVdcs, providerVdc)
    31  
    32  	// Common asserts
    33  	for _, providerVdc := range providerVdcs {
    34  		check.Assert(providerVdc.ProviderVdc.Name, Equals, vcd.config.VCD.NsxtProviderVdc.Name)
    35  		foundStorageProfile := false
    36  		for _, storageProfile := range providerVdc.ProviderVdc.StorageProfiles.ProviderVdcStorageProfile {
    37  			if storageProfile.Name == vcd.config.VCD.NsxtProviderVdc.StorageProfile {
    38  				foundStorageProfile = true
    39  				break
    40  			}
    41  		}
    42  		check.Assert(foundStorageProfile, Equals, true)
    43  		check.Assert(*providerVdc.ProviderVdc.IsEnabled, Equals, true)
    44  		check.Assert(providerVdc.ProviderVdc.ComputeCapacity, NotNil)
    45  		check.Assert(providerVdc.ProviderVdc.Status, Equals, 1)
    46  		// This test may fail when the VCD has more than one network pool depending on the same NSX-T manager
    47  		//check.Assert(len(providerVdc.ProviderVdc.NetworkPoolReferences.NetworkPoolReference), Equals, 1)
    48  		check.Assert(len(providerVdc.ProviderVdc.NetworkPoolReferences.NetworkPoolReference) > 0, Equals, true)
    49  
    50  		foundNetworkPool := false
    51  		for _, networkPool := range providerVdc.ProviderVdc.NetworkPoolReferences.NetworkPoolReference {
    52  			if networkPool.Name == vcd.config.VCD.NsxtProviderVdc.NetworkPool {
    53  				foundNetworkPool = true
    54  				break
    55  			}
    56  		}
    57  		check.Assert(foundNetworkPool, Equals, true)
    58  		check.Assert(providerVdc.ProviderVdc.Link, NotNil)
    59  	}
    60  }
    61  
    62  func (vcd *TestVCD) Test_GetProviderVdcExtended(check *C) {
    63  	if vcd.skipAdminTests {
    64  		check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName()))
    65  	}
    66  
    67  	var providerVdcsExtended []*ProviderVdcExtended
    68  	providerVdcExtended, err := vcd.client.GetProviderVdcExtendedByName(vcd.config.VCD.NsxtProviderVdc.Name)
    69  	check.Assert(err, IsNil)
    70  	providerVdcsExtended = append(providerVdcsExtended, providerVdcExtended)
    71  	providerVdcExtended, err = vcd.client.GetProviderVdcExtendedById(providerVdcExtended.VMWProviderVdc.ID)
    72  	check.Assert(err, IsNil)
    73  	providerVdcsExtended = append(providerVdcsExtended, providerVdcExtended)
    74  	providerVdcExtended, err = vcd.client.GetProviderVdcExtendedByHref(providerVdcExtended.VMWProviderVdc.HREF)
    75  	check.Assert(err, IsNil)
    76  	providerVdcsExtended = append(providerVdcsExtended, providerVdcExtended)
    77  
    78  	// Common asserts
    79  	for _, providerVdcExtended := range providerVdcsExtended {
    80  		// Basic PVDC asserts
    81  		check.Assert(providerVdcExtended.VMWProviderVdc.Name, Equals, vcd.config.VCD.NsxtProviderVdc.Name)
    82  		foundStorageProfile := false
    83  		for _, storageProfile := range providerVdcExtended.VMWProviderVdc.StorageProfiles.ProviderVdcStorageProfile {
    84  			if storageProfile.Name == vcd.config.VCD.NsxtProviderVdc.StorageProfile {
    85  				foundStorageProfile = true
    86  				break
    87  			}
    88  		}
    89  		check.Assert(foundStorageProfile, Equals, true)
    90  		check.Assert(*providerVdcExtended.VMWProviderVdc.IsEnabled, Equals, true)
    91  		check.Assert(providerVdcExtended.VMWProviderVdc.ComputeCapacity, NotNil)
    92  		check.Assert(providerVdcExtended.VMWProviderVdc.Status, Equals, 1)
    93  		// This test may fail when the NSX-T manager has more than one network pool
    94  		//check.Assert(len(providerVdcExtended.VMWProviderVdc.NetworkPoolReferences.NetworkPoolReference), Equals, 1)
    95  		check.Assert(len(providerVdcExtended.VMWProviderVdc.NetworkPoolReferences.NetworkPoolReference) > 0, Equals, true)
    96  		foundNetworkPool := false
    97  		for _, networkPool := range providerVdcExtended.VMWProviderVdc.NetworkPoolReferences.NetworkPoolReference {
    98  			if networkPool.Name == vcd.config.VCD.NsxtProviderVdc.NetworkPool {
    99  				foundNetworkPool = true
   100  				break
   101  			}
   102  		}
   103  		check.Assert(foundNetworkPool, Equals, true)
   104  		check.Assert(providerVdcExtended.VMWProviderVdc.Link, NotNil)
   105  		// Extended PVDC asserts
   106  		check.Assert(providerVdcExtended.VMWProviderVdc.ComputeProviderScope, Equals, "vc1")
   107  		check.Assert(len(providerVdcExtended.VMWProviderVdc.DataStoreRefs.VimObjectRef), Equals, 4)
   108  		check.Assert(strings.HasPrefix(providerVdcExtended.VMWProviderVdc.HighestSupportedHardwareVersion, "vmx-"), Equals, true)
   109  		check.Assert(providerVdcExtended.VMWProviderVdc.HostReferences, NotNil)
   110  		check.Assert(providerVdcExtended.VMWProviderVdc.NsxTManagerReference, NotNil)
   111  		check.Assert(providerVdcExtended.VMWProviderVdc.NsxTManagerReference.Name, Equals, vcd.config.VCD.Nsxt.Manager)
   112  		check.Assert(providerVdcExtended.VMWProviderVdc.ResourcePoolRefs, NotNil)
   113  		check.Assert(providerVdcExtended.VMWProviderVdc.VimServer, NotNil)
   114  	}
   115  }
   116  
   117  func (vcd *TestVCD) Test_GetNonExistentProviderVdc(check *C) {
   118  	if vcd.skipAdminTests {
   119  		check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName()))
   120  	}
   121  
   122  	providerVdcExtended, err := vcd.client.GetProviderVdcExtendedByName("non-existent-pvdc")
   123  	check.Assert(providerVdcExtended, IsNil)
   124  	check.Assert(err, NotNil)
   125  	providerVdcExtended, err = vcd.client.GetProviderVdcExtendedById("non-existent-pvdc")
   126  	check.Assert(providerVdcExtended, IsNil)
   127  	check.Assert(err, NotNil)
   128  	providerVdcExtended, err = vcd.client.GetProviderVdcExtendedByHref("non-existent-pvdc")
   129  	check.Assert(providerVdcExtended, IsNil)
   130  	check.Assert(err, NotNil)
   131  	providerVdc, err := vcd.client.GetProviderVdcByName("non-existent-pvdc")
   132  	check.Assert(providerVdc, IsNil)
   133  	check.Assert(err, NotNil)
   134  	providerVdc, err = vcd.client.GetProviderVdcById("non-existent-pvdc")
   135  	check.Assert(providerVdc, IsNil)
   136  	check.Assert(err, NotNil)
   137  	providerVdc, err = vcd.client.GetProviderVdcByHref("non-existent-pvdc")
   138  	check.Assert(providerVdc, IsNil)
   139  	check.Assert(err, NotNil)
   140  }
   141  
   142  func (vcd *TestVCD) Test_GetProviderVdcConvertFromExtendedToNormal(check *C) {
   143  	if vcd.skipAdminTests {
   144  		check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName()))
   145  	}
   146  
   147  	providerVdcExtended, err := vcd.client.GetProviderVdcExtendedByName(vcd.config.VCD.NsxtProviderVdc.Name)
   148  	check.Assert(err, IsNil)
   149  	providerVdc, err := providerVdcExtended.ToProviderVdc()
   150  	check.Assert(err, IsNil)
   151  	check.Assert(providerVdc.ProviderVdc.Name, Equals, vcd.config.VCD.NsxtProviderVdc.Name)
   152  	foundStorageProfile := false
   153  	for _, storageProfile := range providerVdc.ProviderVdc.StorageProfiles.ProviderVdcStorageProfile {
   154  		if storageProfile.Name == vcd.config.VCD.NsxtProviderVdc.StorageProfile {
   155  			foundStorageProfile = true
   156  			break
   157  		}
   158  	}
   159  	check.Assert(foundStorageProfile, Equals, true)
   160  	check.Assert(*providerVdc.ProviderVdc.IsEnabled, Equals, true)
   161  	check.Assert(providerVdc.ProviderVdc.Status, Equals, 1)
   162  	// This test may fail when the NSX-T manager has more than one network pool
   163  	//check.Assert(len(providerVdc.ProviderVdc.NetworkPoolReferences.NetworkPoolReference), Equals, 1)
   164  	check.Assert(len(providerVdc.ProviderVdc.NetworkPoolReferences.NetworkPoolReference) > 0, Equals, true)
   165  	foundNetworkPool := false
   166  
   167  	for _, np := range providerVdc.ProviderVdc.NetworkPoolReferences.NetworkPoolReference {
   168  		if np.Name == vcd.config.VCD.NsxtProviderVdc.NetworkPool {
   169  			foundNetworkPool = true
   170  		}
   171  	}
   172  	check.Assert(foundNetworkPool, Equals, true)
   173  	check.Assert(providerVdc.ProviderVdc.Link, NotNil)
   174  }
   175  
   176  type providerVdcCreationElements struct {
   177  	label            string
   178  	name             string
   179  	description      string
   180  	resourcePoolName string
   181  	params           *types.ProviderVdcCreation
   182  	vcenter          *VCenter
   183  	config           TestConfig
   184  }
   185  
   186  func (vcd *TestVCD) Test_ProviderVdcCRUD(check *C) {
   187  	// Note: you need to have at least one free resource pool to test provider VDC creation,
   188  	// and at least two of them to test update. They should be indicated in
   189  	// vcd.config.Vsphere.ResourcePoolForVcd1 and vcd.config.Vsphere.ResourcePoolForVcd2
   190  
   191  	if vcd.skipAdminTests {
   192  		check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName()))
   193  	}
   194  	if vcd.config.Vsphere.ResourcePoolForVcd1 == "" {
   195  		check.Skip("no resource pool defined for this VCD")
   196  	}
   197  	providerVdcName := check.TestName()
   198  	providerVdcDescription := check.TestName()
   199  	storageProfileList, err := vcd.client.Client.QueryAllProviderVdcStorageProfiles()
   200  	check.Assert(err, IsNil)
   201  	check.Assert(len(storageProfileList) > 0, Equals, true)
   202  	var storageProfile types.QueryResultProviderVdcStorageProfileRecordType
   203  	for _, sp := range storageProfileList {
   204  		if sp.Name == vcd.config.VCD.NsxtProviderVdc.StorageProfile {
   205  			storageProfile = *sp
   206  		}
   207  	}
   208  	check.Assert(storageProfile.HREF, Not(Equals), "")
   209  
   210  	vcenter, err := vcd.client.GetVCenterByName(vcd.config.VCD.VimServer)
   211  	check.Assert(err, IsNil)
   212  	check.Assert(vcenter, NotNil)
   213  
   214  	resourcePool, err := vcenter.GetResourcePoolByName(vcd.config.Vsphere.ResourcePoolForVcd1)
   215  	check.Assert(err, IsNil)
   216  	check.Assert(resourcePool, NotNil)
   217  
   218  	nsxtManagers, err := vcd.client.QueryNsxtManagerByName(vcd.config.VCD.Nsxt.Manager)
   219  	check.Assert(err, IsNil)
   220  	check.Assert(len(nsxtManagers), Equals, 1)
   221  
   222  	hwVersion, err := resourcePool.GetDefaultHardwareVersion()
   223  	check.Assert(err, IsNil)
   224  
   225  	vcenterUrl, err := vcenter.GetVimServerUrl()
   226  	check.Assert(err, IsNil)
   227  
   228  	networkPool, err := vcd.client.GetNetworkPoolByName(vcd.config.VCD.NsxtProviderVdc.NetworkPool)
   229  	check.Assert(err, IsNil)
   230  	networkPoolHref, err := networkPool.GetOpenApiUrl()
   231  	check.Assert(err, IsNil)
   232  
   233  	providerVdcCreation := types.ProviderVdcCreation{
   234  		Name:                            providerVdcName,
   235  		Description:                     providerVdcDescription,
   236  		HighestSupportedHardwareVersion: hwVersion,
   237  		IsEnabled:                       true,
   238  		VimServer: []*types.Reference{
   239  			{
   240  				HREF: vcenterUrl,
   241  				ID:   extractUuid(vcenter.VSphereVCenter.VcId),
   242  				Name: vcenter.VSphereVCenter.Name,
   243  			},
   244  		},
   245  		ResourcePoolRefs: &types.VimObjectRefs{
   246  			VimObjectRef: []*types.VimObjectRef{
   247  				{
   248  					VimServerRef: &types.Reference{
   249  						HREF: vcenterUrl,
   250  						ID:   extractUuid(vcenter.VSphereVCenter.VcId),
   251  						Name: vcenter.VSphereVCenter.Name,
   252  					},
   253  					MoRef:         resourcePool.ResourcePool.Moref,
   254  					VimObjectType: "RESOURCE_POOL",
   255  				},
   256  			},
   257  		},
   258  		StorageProfile: []string{storageProfile.Name},
   259  		NsxTManagerReference: &types.Reference{
   260  			HREF: nsxtManagers[0].HREF,
   261  			ID:   extractUuid(nsxtManagers[0].HREF),
   262  			Name: nsxtManagers[0].Name,
   263  		},
   264  		NetworkPool: &types.Reference{
   265  			HREF: networkPoolHref,
   266  			Name: networkPool.NetworkPool.Name,
   267  			ID:   extractUuid(networkPool.NetworkPool.Id),
   268  			Type: networkPool.NetworkPool.PoolType,
   269  		},
   270  		AutoCreateNetworkPool: false,
   271  	}
   272  	providerVdcNoNetworkPoolCreation := types.ProviderVdcCreation{
   273  		Name:                            providerVdcName,
   274  		Description:                     providerVdcDescription,
   275  		HighestSupportedHardwareVersion: hwVersion,
   276  		IsEnabled:                       true,
   277  		VimServer: []*types.Reference{
   278  			{
   279  				HREF: vcenterUrl,
   280  				ID:   extractUuid(vcenter.VSphereVCenter.VcId),
   281  				Name: vcenter.VSphereVCenter.Name,
   282  			},
   283  		},
   284  		ResourcePoolRefs: &types.VimObjectRefs{
   285  			VimObjectRef: []*types.VimObjectRef{
   286  				{
   287  					VimServerRef: &types.Reference{
   288  						HREF: vcenterUrl,
   289  						ID:   extractUuid(vcenter.VSphereVCenter.VcId),
   290  						Name: vcenter.VSphereVCenter.Name,
   291  					},
   292  					MoRef:         resourcePool.ResourcePool.Moref,
   293  					VimObjectType: "RESOURCE_POOL",
   294  				},
   295  			},
   296  		},
   297  		StorageProfile:        []string{storageProfile.Name},
   298  		AutoCreateNetworkPool: false,
   299  	}
   300  	testProviderVdcCreation(vcd.client, check, providerVdcCreationElements{
   301  		label:            "ProviderVDC with network pool",
   302  		name:             providerVdcName,
   303  		description:      providerVdcDescription,
   304  		resourcePoolName: resourcePool.ResourcePool.Name,
   305  		params:           &providerVdcCreation,
   306  		vcenter:          vcenter,
   307  		config:           vcd.config,
   308  	})
   309  	testProviderVdcCreation(vcd.client, check, providerVdcCreationElements{
   310  		label:            "ProviderVDC without network pool",
   311  		name:             providerVdcName,
   312  		description:      providerVdcDescription,
   313  		resourcePoolName: resourcePool.ResourcePool.Name,
   314  		params:           &providerVdcNoNetworkPoolCreation,
   315  		vcenter:          vcenter,
   316  		config:           vcd.config,
   317  	})
   318  	providerVdcNoNetworkPoolCreation.AutoCreateNetworkPool = true
   319  	testProviderVdcCreation(vcd.client, check, providerVdcCreationElements{
   320  		label:            "ProviderVDC with automatic network pool",
   321  		name:             providerVdcName,
   322  		description:      providerVdcDescription,
   323  		resourcePoolName: resourcePool.ResourcePool.Name,
   324  		params:           &providerVdcNoNetworkPoolCreation,
   325  		vcenter:          vcenter,
   326  		config:           vcd.config,
   327  	})
   328  }
   329  
   330  func testProviderVdcCreation(client *VCDClient, check *C, creationElements providerVdcCreationElements) {
   331  
   332  	fmt.Printf("*** %s\n", creationElements.label)
   333  	providerVdcName := creationElements.name
   334  	providerVdcDescription := creationElements.description
   335  	storageProfileName := creationElements.params.StorageProfile[0]
   336  	resourcePoolName := creationElements.resourcePoolName
   337  
   338  	printVerbose("  creating provider VDC '%s' using resource pool '%s' and storage profile '%s'\n",
   339  		providerVdcName, resourcePoolName, storageProfileName)
   340  	providerVdcJson, err := client.CreateProviderVdc(creationElements.params)
   341  	check.Assert(err, IsNil)
   342  	check.Assert(providerVdcJson, NotNil)
   343  	check.Assert(providerVdcJson.VMWProviderVdc.Name, Equals, providerVdcName)
   344  
   345  	AddToCleanupList(providerVdcName, "provider_vdc", "", check.TestName())
   346  	retrievedPvdc, err := client.GetProviderVdcExtendedByName(providerVdcName)
   347  	check.Assert(err, IsNil)
   348  
   349  	err = retrievedPvdc.Disable()
   350  	check.Assert(err, IsNil)
   351  	check.Assert(retrievedPvdc.VMWProviderVdc.IsEnabled, NotNil)
   352  	check.Assert(*retrievedPvdc.VMWProviderVdc.IsEnabled, Equals, false)
   353  
   354  	err = retrievedPvdc.Enable()
   355  	check.Assert(err, IsNil)
   356  	check.Assert(retrievedPvdc.VMWProviderVdc.IsEnabled, NotNil)
   357  	check.Assert(*retrievedPvdc.VMWProviderVdc.IsEnabled, Equals, true)
   358  
   359  	newProviderVdcName := "TestNewName"
   360  	newProviderVdcDescription := "Test New provider VDC description"
   361  	printVerbose("  renaming provider VDC to '%s'\n", newProviderVdcName)
   362  	err = retrievedPvdc.Rename(newProviderVdcName, newProviderVdcDescription)
   363  	check.Assert(err, IsNil)
   364  	check.Assert(retrievedPvdc.VMWProviderVdc.Name, Equals, newProviderVdcName)
   365  	check.Assert(retrievedPvdc.VMWProviderVdc.Description, Equals, newProviderVdcDescription)
   366  
   367  	printVerbose("  renaming back provider VDC to '%s'\n", providerVdcName)
   368  	err = retrievedPvdc.Rename(providerVdcName, providerVdcDescription)
   369  	check.Assert(err, IsNil)
   370  	check.Assert(retrievedPvdc.VMWProviderVdc.Name, Equals, providerVdcName)
   371  	check.Assert(retrievedPvdc.VMWProviderVdc.Description, Equals, providerVdcDescription)
   372  
   373  	secondResourcePoolName := creationElements.config.Vsphere.ResourcePoolForVcd2
   374  	if secondResourcePoolName != "" {
   375  		printVerbose("  adding resource pool '%s' to provider VDC\n", secondResourcePoolName)
   376  		secondResourcePool, err := creationElements.vcenter.GetResourcePoolByName(secondResourcePoolName)
   377  		check.Assert(err, IsNil)
   378  		check.Assert(secondResourcePool, NotNil)
   379  		err = retrievedPvdc.AddResourcePools([]*ResourcePool{secondResourcePool})
   380  		check.Assert(err, IsNil)
   381  		err = retrievedPvdc.Refresh()
   382  		check.Assert(err, IsNil)
   383  		check.Assert(len(retrievedPvdc.VMWProviderVdc.ResourcePoolRefs.VimObjectRef), Equals, 2)
   384  
   385  		printVerbose("  removing resource pool '%s' from provider VDC\n", secondResourcePoolName)
   386  		err = retrievedPvdc.DeleteResourcePools([]*ResourcePool{secondResourcePool})
   387  		check.Assert(err, IsNil)
   388  		err = retrievedPvdc.Refresh()
   389  		check.Assert(err, IsNil)
   390  		check.Assert(len(retrievedPvdc.VMWProviderVdc.ResourcePoolRefs.VimObjectRef), Equals, 1)
   391  	}
   392  
   393  	secondStorageProfile := creationElements.config.VCD.NsxtProviderVdc.StorageProfile2
   394  	if secondStorageProfile != "" {
   395  		printVerbose("  adding storage profile '%s' to provider VDC\n", secondStorageProfile)
   396  		// Adds a storage profile
   397  		err = retrievedPvdc.AddStorageProfiles([]string{secondStorageProfile})
   398  		check.Assert(err, IsNil)
   399  		check.Assert(len(retrievedPvdc.VMWProviderVdc.StorageProfiles.ProviderVdcStorageProfile), Equals, 2)
   400  
   401  		printVerbose("  removing storage profile '%s' from provider VDC\n", secondStorageProfile)
   402  		// Remove a storage profile
   403  		err = retrievedPvdc.DeleteStorageProfiles([]string{secondStorageProfile})
   404  		check.Assert(err, IsNil)
   405  		check.Assert(len(retrievedPvdc.VMWProviderVdc.StorageProfiles.ProviderVdcStorageProfile), Equals, 1)
   406  	}
   407  
   408  	// Deleting while the Provider VDC is still enabled will fail
   409  	task, err := retrievedPvdc.Delete()
   410  	check.Assert(err, NotNil)
   411  
   412  	// Properly deleting provider VDC: first disabling, then removing
   413  	printVerbose("  disabling provider VDC '%s'\n", providerVdcName)
   414  	err = retrievedPvdc.Disable()
   415  	check.Assert(err, IsNil)
   416  	check.Assert(retrievedPvdc.VMWProviderVdc.IsEnabled, NotNil)
   417  	check.Assert(*retrievedPvdc.VMWProviderVdc.IsEnabled, Equals, false)
   418  
   419  	printVerbose("  removing provider VDC '%s'\n", providerVdcName)
   420  	task, err = retrievedPvdc.Delete()
   421  	check.Assert(err, IsNil)
   422  	err = task.WaitTaskCompletion()
   423  	check.Assert(err, IsNil)
   424  }