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 }