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 }