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

     1  //go:build providervdc || functional || ALL
     2  
     3  package govcd
     4  
     5  import (
     6  	"fmt"
     7  	"github.com/kr/pretty"
     8  	"github.com/vmware/go-vcloud-director/v2/types/v56"
     9  	. "gopkg.in/check.v1"
    10  	"net/url"
    11  )
    12  
    13  func (vcd *TestVCD) Test_GetNetworkPools(check *C) {
    14  
    15  	if vcd.skipAdminTests {
    16  		check.Skip("this test requires system administrator privileges")
    17  	}
    18  	knownNetworkPoolName := vcd.config.VCD.NsxtProviderVdc.NetworkPool
    19  	networkPools, err := vcd.client.GetNetworkPoolSummaries(nil)
    20  	check.Assert(err, IsNil)
    21  	check.Assert(len(networkPools) > 0, Equals, true)
    22  
    23  	checkNetworkPoolName := false
    24  	foundNetworkPool := false
    25  	if knownNetworkPoolName != "" {
    26  		checkNetworkPoolName = true
    27  	}
    28  
    29  	for i, nps := range networkPools {
    30  		if nps.Name == knownNetworkPoolName {
    31  			foundNetworkPool = true
    32  		}
    33  		networkPoolById, err := vcd.client.GetNetworkPoolById(nps.Id)
    34  		check.Assert(err, IsNil)
    35  		check.Assert(networkPoolById, NotNil)
    36  		check.Assert(networkPoolById.NetworkPool.Id, Equals, nps.Id)
    37  		check.Assert(networkPoolById.NetworkPool.Name, Equals, nps.Name)
    38  
    39  		networkPoolByName, err := vcd.client.GetNetworkPoolByName(nps.Name)
    40  		check.Assert(err, IsNil)
    41  		check.Assert(networkPoolByName, NotNil)
    42  		check.Assert(networkPoolByName.NetworkPool.Id, Equals, nps.Id)
    43  		check.Assert(networkPoolByName.NetworkPool.Name, Equals, nps.Name)
    44  		if testVerbose {
    45  			fmt.Printf("%d, %# v\n", i, pretty.Formatter(networkPoolByName.NetworkPool))
    46  		}
    47  	}
    48  	if checkNetworkPoolName {
    49  		check.Assert(foundNetworkPool, Equals, true)
    50  	}
    51  }
    52  
    53  // Test_CreateNetworkPoolGeneve shows the creation of a "GENEVE" network pool
    54  // using first the low-level method, then using the shortcut methods,
    55  // and finally using the shortcut method without explicit transport zone
    56  func (vcd *TestVCD) Test_CreateNetworkPoolGeneve(check *C) {
    57  	if vcd.skipAdminTests {
    58  		check.Skip("this test requires system administrator privileges")
    59  	}
    60  	if vcd.config.VCD.Nsxt.Manager == "" {
    61  		check.Skip("no manager name is available")
    62  	}
    63  	networkPoolName := check.TestName()
    64  
    65  	managers, err := vcd.client.QueryNsxtManagerByName(vcd.config.VCD.Nsxt.Manager)
    66  	check.Assert(err, IsNil)
    67  	check.Assert(len(managers), Equals, 1)
    68  
    69  	manager := managers[0]
    70  	managerId := "urn:vcloud:nsxtmanager:" + extractUuid(manager.HREF)
    71  
    72  	transportZones, err := vcd.client.GetAllNsxtTransportZones(managerId, nil)
    73  	check.Assert(err, IsNil)
    74  	if len(transportZones) == 0 {
    75  		check.Skip("no available transport zones found")
    76  	}
    77  	var importableTransportZones []*types.TransportZone
    78  
    79  	for _, tz := range transportZones {
    80  		if !tz.AlreadyImported {
    81  			importableTransportZones = append(importableTransportZones, tz)
    82  		}
    83  	}
    84  	if len(importableTransportZones) == 0 {
    85  		check.Skip("no unimported transport zone found")
    86  	}
    87  
    88  	for _, transportZone := range importableTransportZones {
    89  		config := types.NetworkPool{
    90  			Name:        networkPoolName,
    91  			Description: "test network pool geneve",
    92  			PoolType:    types.NetworkPoolGeneveType,
    93  			ManagingOwnerRef: types.OpenApiReference{
    94  				Name: manager.Name,
    95  				ID:   managerId,
    96  			},
    97  			Backing: types.NetworkPoolBacking{
    98  				TransportZoneRef: types.OpenApiReference{
    99  					Name: transportZone.Name,
   100  					ID:   transportZone.Id,
   101  				},
   102  				ProviderRef: types.OpenApiReference{
   103  					Name: manager.Name,
   104  					ID:   managerId,
   105  				},
   106  			},
   107  		}
   108  		runTestCreateNetworkPool("geneve-full-config-("+transportZone.Name+")", func() (*NetworkPool, error) {
   109  			return vcd.client.CreateNetworkPool(&config)
   110  		}, func(_ *NetworkPool) {
   111  			tzs, err := vcd.client.GetAllNsxtTransportZones(managerId, nil)
   112  			check.Assert(err, IsNil)
   113  			for _, tz := range tzs {
   114  				if tz.Name == transportZone.Name {
   115  					check.Assert(tz.AlreadyImported, Equals, true)
   116  				}
   117  			}
   118  		},
   119  			check)
   120  
   121  		runTestCreateNetworkPool("geneve-names-("+transportZone.Name+")", func() (*NetworkPool, error) {
   122  			return vcd.client.CreateNetworkPoolGeneve(networkPoolName, "test network pool geneve", manager.Name, transportZone.Name, types.BackingUseExplicit)
   123  		}, nil, check)
   124  	}
   125  	if len(importableTransportZones) == 1 {
   126  		// When no transport zone name is provided and there is only one TZ, we ask for that (unnamed) only one to be used
   127  		runTestCreateNetworkPool("geneve-names-no-tz-name-only-element", func() (*NetworkPool, error) {
   128  			return vcd.client.CreateNetworkPoolGeneve(networkPoolName, "test network pool geneve", manager.Name, "", types.BackingUseWhenOnlyOne)
   129  		}, nil, check)
   130  	}
   131  	// When no transport zone name is provided, the first one available will be used
   132  	runTestCreateNetworkPool("geneve-names-no-tz-name-first-element", func() (*NetworkPool, error) {
   133  		return vcd.client.CreateNetworkPoolGeneve(networkPoolName, "test network pool geneve", manager.Name, "", types.BackingUseFirstAvailable)
   134  	}, nil, check)
   135  }
   136  
   137  // Test_CreateNetworkPoolPortgroup shows the creation of a "PORTGROUP_BACKED" network pool
   138  // using first the low-level method, then using the shortcut methods,
   139  // and finally using the shortcut method without explicit port group
   140  func (vcd *TestVCD) Test_CreateNetworkPoolPortgroup(check *C) {
   141  	if vcd.skipAdminTests {
   142  		check.Skip("this test requires system administrator privileges")
   143  	}
   144  	if vcd.config.VCD.VimServer == "" {
   145  		check.Skip("no vCenter found in configuration")
   146  	}
   147  
   148  	vCenter, err := vcd.client.GetVCenterByName(vcd.config.VCD.VimServer)
   149  	check.Assert(err, IsNil)
   150  
   151  	networkPoolName := check.TestName()
   152  
   153  	var params = make(url.Values)
   154  	params.Set("filter", "virtualCenter.id=="+vCenter.VSphereVCenter.VcId)
   155  	portgroups, err := vcd.client.GetAllVcenterImportableDvpgs(params)
   156  	check.Assert(err, IsNil)
   157  	check.Assert(len(portgroups) > 0, Equals, true)
   158  
   159  	var sameHost []*VcenterImportableDvpg
   160  	for _, pg := range portgroups {
   161  
   162  		for _, other := range portgroups {
   163  			if len(sameHost) > 0 {
   164  				break
   165  			}
   166  			if other.VcenterImportableDvpg.BackingRef.ID == pg.VcenterImportableDvpg.BackingRef.ID {
   167  				continue
   168  			}
   169  			if other.Parent().ID == pg.Parent().ID {
   170  				sameHost = append(sameHost, pg)
   171  				sameHost = append(sameHost, other)
   172  				break
   173  			}
   174  		}
   175  		config := types.NetworkPool{
   176  			Name:        networkPoolName,
   177  			Description: "test network pool port group",
   178  			PoolType:    types.NetworkPoolPortGroupType,
   179  			ManagingOwnerRef: types.OpenApiReference{
   180  				Name: vCenter.VSphereVCenter.Name,
   181  				ID:   vCenter.VSphereVCenter.VcId,
   182  			},
   183  			Backing: types.NetworkPoolBacking{
   184  				PortGroupRefs: []types.OpenApiReference{
   185  					{
   186  						ID:   pg.VcenterImportableDvpg.BackingRef.ID,
   187  						Name: pg.VcenterImportableDvpg.BackingRef.Name,
   188  					},
   189  				},
   190  				ProviderRef: types.OpenApiReference{
   191  					Name: vCenter.VSphereVCenter.Name,
   192  					ID:   vCenter.VSphereVCenter.VcId,
   193  				},
   194  			},
   195  		}
   196  
   197  		runTestCreateNetworkPool("port-group-full-config-("+pg.VcenterImportableDvpg.BackingRef.Name+")", func() (*NetworkPool, error) {
   198  			return vcd.client.CreateNetworkPool(&config)
   199  		}, nil, check)
   200  		runTestCreateNetworkPool("port-group-names-("+pg.VcenterImportableDvpg.BackingRef.Name+")", func() (*NetworkPool, error) {
   201  			return vcd.client.CreateNetworkPoolPortGroup(networkPoolName, "test network pool port group", vCenter.VSphereVCenter.Name,
   202  				[]string{pg.VcenterImportableDvpg.BackingRef.Name}, types.BackingUseExplicit)
   203  		}, nil, check)
   204  	}
   205  	if len(sameHost) == 2 {
   206  		names := []string{
   207  			sameHost[0].VcenterImportableDvpg.BackingRef.Name,
   208  			sameHost[1].VcenterImportableDvpg.BackingRef.Name,
   209  		}
   210  		runTestCreateNetworkPool("port-group-multi-names", func() (*NetworkPool, error) {
   211  			return vcd.client.CreateNetworkPoolPortGroup(networkPoolName, "test network pool port group",
   212  				vCenter.VSphereVCenter.Name, names, types.BackingUseExplicit)
   213  		}, nil, check)
   214  	}
   215  	if len(portgroups) == 1 {
   216  		// When no port group name is provided, and only one is available, we ask for that (unnamed) one to be used
   217  		runTestCreateNetworkPool("port-group-names-no-pg-name-only-element", func() (*NetworkPool, error) {
   218  			return vcd.client.CreateNetworkPoolPortGroup(networkPoolName, "test network pool port group", vCenter.VSphereVCenter.Name, []string{""}, types.BackingUseWhenOnlyOne)
   219  		}, nil, check)
   220  	}
   221  	// When no port group name is provided, the first one available will be used
   222  	runTestCreateNetworkPool("port-group-names-no-pg-name-first-element", func() (*NetworkPool, error) {
   223  		return vcd.client.CreateNetworkPoolPortGroup(networkPoolName, "test network pool port group", vCenter.VSphereVCenter.Name, []string{""}, types.BackingUseFirstAvailable)
   224  	}, nil, check)
   225  }
   226  
   227  // Test_CreateNetworkPoolVlan shows the creation of a "VLAN" network pool
   228  // using first the low-level method, then using the shortcut methods,
   229  // and finally using the shortcut method without explicit distributed switch
   230  func (vcd *TestVCD) Test_CreateNetworkPoolVlan(check *C) {
   231  	if vcd.skipAdminTests {
   232  		check.Skip("this test requires system administrator privileges")
   233  	}
   234  	if vcd.config.VCD.VimServer == "" {
   235  		check.Skip("no vCenter found in configuration")
   236  	}
   237  
   238  	vCenter, err := vcd.client.GetVCenterByName(vcd.config.VCD.VimServer)
   239  	check.Assert(err, IsNil)
   240  
   241  	networkPoolName := check.TestName()
   242  
   243  	switches, err := vcd.client.GetAllVcenterDistributedSwitches(vCenter.VSphereVCenter.VcId, nil)
   244  	check.Assert(err, IsNil)
   245  	if len(switches) == 0 {
   246  		check.Skip("no available distributed found in vCenter")
   247  	}
   248  	// range ID for network pools
   249  	ranges := []types.VlanIdRange{
   250  		{StartId: 1, EndId: 100},
   251  		{StartId: 201, EndId: 300},
   252  	}
   253  	// updateWithRanges updates the network pool
   254  	updateWithRanges := func(pool *NetworkPool) {
   255  		check.Assert(len(pool.NetworkPool.Backing.VlanIdRanges.Values), Equals, 2)
   256  		pool.NetworkPool.Backing.VlanIdRanges.Values = []types.VlanIdRange{{StartId: 1001, EndId: 2000}}
   257  
   258  		updatedName := pool.NetworkPool.Name + "-changed"
   259  		updatedDescription := pool.NetworkPool.Description + " - changed"
   260  		pool.NetworkPool.Name = updatedName
   261  		pool.NetworkPool.Description = updatedDescription
   262  		err = pool.Update()
   263  		check.Assert(err, IsNil)
   264  		retrievedNetworkPool, err := pool.vcdClient.GetNetworkPoolById(pool.NetworkPool.Id)
   265  		check.Assert(err, IsNil)
   266  		check.Assert(retrievedNetworkPool, NotNil)
   267  		check.Assert(retrievedNetworkPool.NetworkPool.Id, Equals, pool.NetworkPool.Id)
   268  		check.Assert(retrievedNetworkPool.NetworkPool.Name, Equals, updatedName)
   269  		check.Assert(retrievedNetworkPool.NetworkPool.Description, Equals, updatedDescription)
   270  
   271  		err = pool.Update()
   272  		check.Assert(err, IsNil)
   273  		newPool, err := vcd.client.GetNetworkPoolById(pool.NetworkPool.Id)
   274  		check.Assert(err, IsNil)
   275  		check.Assert(len(newPool.NetworkPool.Backing.VlanIdRanges.Values), Equals, 1)
   276  	}
   277  	for _, sw := range switches {
   278  		config := types.NetworkPool{
   279  			Name:        networkPoolName,
   280  			Description: "test network pool VLAN",
   281  			PoolType:    types.NetworkPoolVlanType,
   282  			ManagingOwnerRef: types.OpenApiReference{
   283  				Name: vCenter.VSphereVCenter.Name,
   284  				ID:   vCenter.VSphereVCenter.VcId,
   285  			},
   286  			Backing: types.NetworkPoolBacking{
   287  				VlanIdRanges: types.VlanIdRanges{
   288  					Values: ranges,
   289  				},
   290  				VdsRefs: []types.OpenApiReference{
   291  					{
   292  						Name: sw.BackingRef.Name,
   293  						ID:   sw.BackingRef.ID,
   294  					},
   295  				},
   296  				ProviderRef: types.OpenApiReference{
   297  					Name: vCenter.VSphereVCenter.Name,
   298  					ID:   vCenter.VSphereVCenter.VcId,
   299  				},
   300  			},
   301  		}
   302  
   303  		runTestCreateNetworkPool("vlan-full-config-("+sw.BackingRef.Name+")",
   304  			func() (*NetworkPool, error) {
   305  				return vcd.client.CreateNetworkPool(&config)
   306  			},
   307  			updateWithRanges,
   308  			check)
   309  
   310  		runTestCreateNetworkPool("vlan-names-("+sw.BackingRef.Name+")",
   311  			func() (*NetworkPool, error) {
   312  				return vcd.client.CreateNetworkPoolVlan(networkPoolName, "test network pool VLAN", vCenter.VSphereVCenter.Name, sw.BackingRef.Name, ranges, types.BackingUseExplicit)
   313  			},
   314  			updateWithRanges,
   315  			check)
   316  	}
   317  	if len(switches) == 1 {
   318  		// When no switch name is provided, and only one is available, we ask to use that (unnamed) one
   319  		runTestCreateNetworkPool("vlan-names-no-sw-name-only-element", func() (*NetworkPool, error) {
   320  			return vcd.client.CreateNetworkPoolVlan(networkPoolName, "test network pool VLAN", vCenter.VSphereVCenter.Name, "", ranges, types.BackingUseWhenOnlyOne)
   321  		},
   322  			updateWithRanges,
   323  			check)
   324  	}
   325  	// When no switch name is provided, the first one available will be used
   326  	runTestCreateNetworkPool("vlan-names-no-sw-name-first-element", func() (*NetworkPool, error) {
   327  		return vcd.client.CreateNetworkPoolVlan(networkPoolName, "test network pool VLAN", vCenter.VSphereVCenter.Name, "", ranges, types.BackingUseFirstAvailable)
   328  	},
   329  		updateWithRanges,
   330  		check)
   331  }
   332  
   333  // runTestCreateNetworkPool runs a generic test for network pool creation, using `creationFunc` for creating the object
   334  // and `postCreation` to run updates or other management actions
   335  func runTestCreateNetworkPool(label string, creationFunc func() (*NetworkPool, error), postCreation func(pool *NetworkPool), check *C) {
   336  	fmt.Printf("[test create network pool] %s\n", label)
   337  
   338  	networkPool, err := creationFunc()
   339  	check.Assert(err, IsNil)
   340  	defer func() {
   341  		if networkPool != nil {
   342  			_ = networkPool.Delete()
   343  		}
   344  	}()
   345  	check.Assert(networkPool, NotNil)
   346  	networkPoolName := networkPool.NetworkPool.Name
   347  	if postCreation != nil {
   348  		postCreation(networkPool)
   349  		// Refresh the network pool
   350  		networkPool, err = networkPool.vcdClient.GetNetworkPoolById(networkPool.NetworkPool.Id)
   351  		check.Assert(err, IsNil)
   352  	}
   353  
   354  	// if no update was run through the postCreation
   355  	if networkPool.NetworkPool.Name == networkPoolName {
   356  		updatedName := networkPool.NetworkPool.Name + "-update"
   357  		updatedDescription := networkPool.NetworkPool.Description + " - update"
   358  		networkPool.NetworkPool.Name = updatedName
   359  		networkPool.NetworkPool.Description = updatedDescription
   360  		err = networkPool.Update()
   361  		check.Assert(err, IsNil)
   362  		retrievedNetworkPool, err := networkPool.vcdClient.GetNetworkPoolById(networkPool.NetworkPool.Id)
   363  		check.Assert(err, IsNil)
   364  		check.Assert(retrievedNetworkPool, NotNil)
   365  		check.Assert(retrievedNetworkPool.NetworkPool.Id, Equals, networkPool.NetworkPool.Id)
   366  		check.Assert(retrievedNetworkPool.NetworkPool.Name, Equals, updatedName)
   367  		check.Assert(retrievedNetworkPool.NetworkPool.Description, Equals, updatedDescription)
   368  	}
   369  
   370  	err = networkPool.Delete()
   371  	check.Assert(err, IsNil)
   372  	networkPool = nil
   373  }