github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/metadata_test.go (about) 1 //go:build vapp || vdc || metadata || functional || ALL 2 3 /* 4 * Copyright 2022 VMware, Inc. All rights reserved. Licensed under the Apache v2 License. 5 */ 6 7 package govcd 8 9 import ( 10 "fmt" 11 "strings" 12 13 "github.com/vmware/go-vcloud-director/v2/types/v56" 14 15 . "gopkg.in/check.v1" 16 ) 17 18 // TODO: All tests here are deprecated in favor of those present in "metadata_v2_test". Remove this file once go-vcloud-director v3.0 is released. 19 20 func (vcd *TestVCD) Test_AddAndDeleteMetadataForVdc(check *C) { 21 vcd.skipIfNotSysAdmin(check) 22 if vcd.config.VCD.Vdc == "" { 23 check.Skip("skipping test because VDC name is empty") 24 } 25 26 fmt.Printf("Running: %s\n", check.TestName()) 27 28 // Add metadata 29 vdc, err := vcd.vdc.AddMetadata("key", "value") 30 check.Assert(err, IsNil) 31 check.Assert(vdc, Not(Equals), Vdc{}) 32 33 AddToCleanupList("key", "vdcMetaData", vcd.org.Org.Name+"|"+vcd.config.VCD.Vdc, check.TestName()) 34 35 // Check if metadata was added correctly 36 metadata, err := vcd.vdc.GetMetadata() 37 check.Assert(err, IsNil) 38 check.Assert(len(metadata.MetadataEntry), Equals, 1) 39 check.Assert(metadata.MetadataEntry[0].Key, Equals, "key") 40 check.Assert(metadata.MetadataEntry[0].TypedValue.Value, Equals, "value") 41 42 // Remove metadata 43 vdc, err = vcd.vdc.DeleteMetadata("key") 44 check.Assert(err, IsNil) 45 check.Assert(vdc, Not(Equals), Vdc{}) 46 47 metadata, err = vcd.vdc.GetMetadata() 48 check.Assert(err, IsNil) 49 check.Assert(len(metadata.MetadataEntry), Equals, 0) 50 } 51 52 func (vcd *TestVCD) Test_AddAndDeleteMetadataOnVapp(check *C) { 53 fmt.Printf("Running: %s\n", check.TestName()) 54 55 if vcd.skipVappTests { 56 check.Skip("Skipping test because vApp was not successfully created at setup") 57 } 58 // Add metadata 59 task, err := vcd.vapp.AddMetadata("key", "value") 60 check.Assert(err, IsNil) 61 err = task.WaitTaskCompletion() 62 check.Assert(err, IsNil) 63 check.Assert(task.Task.Status, Equals, "success") 64 65 // Check if metadata was added correctly 66 metadata, err := vcd.vapp.GetMetadata() 67 check.Assert(err, IsNil) 68 check.Assert(len(metadata.MetadataEntry), Equals, 1) 69 check.Assert(metadata.MetadataEntry[0].Key, Equals, "key") 70 check.Assert(metadata.MetadataEntry[0].TypedValue.Value, Equals, "value") 71 72 // Remove metadata 73 task, err = vcd.vapp.DeleteMetadata("key") 74 check.Assert(err, IsNil) 75 err = task.WaitTaskCompletion() 76 check.Assert(err, IsNil) 77 check.Assert(task.Task.Status, Equals, "success") 78 79 metadata, err = vcd.vapp.GetMetadata() 80 check.Assert(err, IsNil) 81 check.Assert(len(metadata.MetadataEntry), Equals, 0) 82 } 83 84 func (vcd *TestVCD) Test_AddAndDeleteMetadataOnVm(check *C) { 85 fmt.Printf("Running: %s\n", check.TestName()) 86 87 if vcd.skipVappTests { 88 check.Skip("Skipping test because vApp was not successfully created at setup") 89 } 90 91 // Find VApp 92 if vcd.vapp.VApp == nil { 93 check.Skip("skipping test because no vApp is found") 94 } 95 96 vapp := vcd.findFirstVapp() 97 vmType, vmName := vcd.findFirstVm(vapp) 98 if vmName == "" { 99 check.Skip("skipping test because no VM is found") 100 } 101 102 vm := NewVM(&vcd.client.Client) 103 vm.VM = &vmType 104 105 existingMetadata, err := vm.GetMetadata() 106 check.Assert(err, IsNil) 107 108 // Add metadata 109 task, err := vm.AddMetadata("key", "value") 110 check.Assert(err, IsNil) 111 err = task.WaitTaskCompletion() 112 check.Assert(err, IsNil) 113 check.Assert(task.Task.Status, Equals, "success") 114 115 // Check if metadata was added correctly 116 metadata, err := vm.GetMetadata() 117 check.Assert(err, IsNil) 118 check.Assert(len(metadata.MetadataEntry), Equals, len(existingMetadata.MetadataEntry)+1) 119 found := false 120 for _, entry := range metadata.MetadataEntry { 121 if entry.Key == "key" && entry.TypedValue.Value == "value" { 122 found = true 123 } 124 } 125 check.Assert(found, Equals, true) 126 127 // Remove metadata 128 task, err = vm.DeleteMetadata("key") 129 check.Assert(err, IsNil) 130 err = task.WaitTaskCompletion() 131 check.Assert(err, IsNil) 132 check.Assert(task.Task.Status, Equals, "success") 133 metadata, err = vm.GetMetadata() 134 check.Assert(err, IsNil) 135 check.Assert(len(metadata.MetadataEntry), Equals, len(existingMetadata.MetadataEntry)) 136 } 137 138 func (vcd *TestVCD) Test_AddAndDeleteMetadataOnVAppTemplate(check *C) { 139 fmt.Printf("Running: %s\n", check.TestName()) 140 cat, err := vcd.org.GetCatalogByName(vcd.config.VCD.Catalog.Name, false) 141 if err != nil { 142 check.Skip("Test_DeleteMetadataOnCatalogItem: Catalog not found. Test can't proceed") 143 return 144 } 145 146 if vcd.config.VCD.Catalog.CatalogItem == "" { 147 check.Skip("Test_DeleteMetadataOnCatalogItem: Catalog Item not given. Test can't proceed") 148 } 149 150 catItem, err := cat.GetCatalogItemByName(vcd.config.VCD.Catalog.CatalogItem, false) 151 check.Assert(err, IsNil) 152 check.Assert(catItem, NotNil) 153 check.Assert(catItem.CatalogItem.Name, Equals, vcd.config.VCD.Catalog.CatalogItem) 154 155 vAppTemplate, err := catItem.GetVAppTemplate() 156 check.Assert(err, IsNil) 157 check.Assert(vAppTemplate, NotNil) 158 check.Assert(vAppTemplate.VAppTemplate.Name, Equals, vcd.config.VCD.Catalog.CatalogItem) 159 160 // Check how much metaData exist 161 metadata, err := vAppTemplate.GetMetadata() 162 check.Assert(err, IsNil) 163 check.Assert(metadata, NotNil) 164 existingMetaDataCount := len(metadata.MetadataEntry) 165 166 // Add metadata 167 _, err = vAppTemplate.AddMetadata("key", "value") 168 check.Assert(err, IsNil) 169 170 // Check if metadata was added correctly 171 metadata, err = vAppTemplate.GetMetadata() 172 check.Assert(err, IsNil) 173 check.Assert(metadata, NotNil) 174 check.Assert(len(metadata.MetadataEntry), Equals, existingMetaDataCount+1) 175 var foundEntry *types.MetadataEntry 176 for _, entry := range metadata.MetadataEntry { 177 if entry.Key == "key" { 178 foundEntry = entry 179 } 180 } 181 check.Assert(foundEntry, NotNil) 182 check.Assert(foundEntry.Key, Equals, "key") 183 check.Assert(foundEntry.TypedValue.Value, Equals, "value") 184 185 // Remove metadata 186 err = vAppTemplate.DeleteMetadata("key") 187 check.Assert(err, IsNil) 188 metadata, err = vAppTemplate.GetMetadata() 189 check.Assert(err, IsNil) 190 check.Assert(len(metadata.MetadataEntry), Equals, 0) 191 } 192 193 func (vcd *TestVCD) Test_AddAndDeleteMetadataOnMediaRecord(check *C) { 194 fmt.Printf("Running: %s\n", check.TestName()) 195 196 //prepare media item 197 skipWhenMediaPathMissing(vcd, check) 198 itemName := "TestAddMediaMetaDataEntry" 199 200 org, err := vcd.client.GetAdminOrgByName(vcd.org.Org.Name) 201 check.Assert(err, IsNil) 202 check.Assert(org, NotNil) 203 204 catalog, err := org.GetCatalogByName(vcd.config.VCD.Catalog.Name, false) 205 check.Assert(err, IsNil) 206 check.Assert(catalog, NotNil) 207 check.Assert(catalog.Catalog.Name, Equals, vcd.config.VCD.Catalog.Name) 208 209 uploadTask, err := catalog.UploadMediaImage(itemName, "upload from test", vcd.config.Media.MediaPath, 1024) 210 check.Assert(err, IsNil) 211 check.Assert(uploadTask, NotNil) 212 err = uploadTask.WaitTaskCompletion() 213 check.Assert(err, IsNil) 214 215 AddToCleanupList(itemName, "mediaCatalogImage", vcd.org.Org.Name+"|"+vcd.config.VCD.Catalog.Name, check.TestName()) 216 217 err = vcd.org.Refresh() 218 check.Assert(err, IsNil) 219 220 mediaRecord, err := catalog.QueryMedia(itemName) 221 check.Assert(err, IsNil) 222 check.Assert(mediaRecord, NotNil) 223 check.Assert(mediaRecord.MediaRecord.Name, Equals, itemName) 224 225 // Add metadata 226 _, err = mediaRecord.AddMetadata("key", "value") 227 check.Assert(err, IsNil) 228 229 // Check if metadata was added correctly 230 metadata, err := mediaRecord.GetMetadata() 231 check.Assert(err, IsNil) 232 check.Assert(metadata, NotNil) 233 check.Assert(len(metadata.MetadataEntry), Equals, 1) 234 check.Assert(metadata.MetadataEntry[0].Key, Equals, "key") 235 check.Assert(metadata.MetadataEntry[0].TypedValue.Value, Equals, "value") 236 237 // Remove metadata 238 err = mediaRecord.DeleteMetadata("key") 239 check.Assert(err, IsNil) 240 metadata, err = mediaRecord.GetMetadata() 241 check.Assert(err, IsNil) 242 check.Assert(len(metadata.MetadataEntry), Equals, 0) 243 244 // Remove catalog item so far other tests don't fail 245 task, err := mediaRecord.Delete() 246 check.Assert(err, IsNil) 247 err = task.WaitTaskCompletion() 248 check.Assert(err, IsNil) 249 } 250 251 func (vcd *TestVCD) Test_MetadataOnAdminCatalogCRUD(check *C) { 252 fmt.Printf("Running: %s\n", check.TestName()) 253 254 var catalogName string = check.TestName() 255 256 org, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org) 257 check.Assert(err, IsNil) 258 check.Assert(org, NotNil) 259 260 catalog, err := vcd.org.CreateCatalog(catalogName, catalogName) 261 check.Assert(err, IsNil) 262 check.Assert(catalog, NotNil) 263 AddToCleanupList(catalogName, "catalog", org.AdminOrg.Name, catalogName) 264 265 adminCatalog, err := org.GetAdminCatalogByName(catalogName, true) 266 check.Assert(err, IsNil) 267 check.Assert(adminCatalog, NotNil) 268 269 testMetadataCRUDActionsDeprecated(adminCatalog, check, func() { 270 metadata, err := catalog.GetMetadata() 271 check.Assert(err, IsNil) 272 check.Assert(metadata, NotNil) 273 check.Assert(len(metadata.MetadataEntry), Equals, 1) 274 var foundEntry *types.MetadataEntry 275 for _, entry := range metadata.MetadataEntry { 276 if entry.Key == "key" { 277 foundEntry = entry 278 } 279 } 280 check.Assert(foundEntry, NotNil) 281 check.Assert(foundEntry.Key, Equals, "key") 282 check.Assert(foundEntry.TypedValue.Value, Equals, "value") 283 }) 284 err = catalog.Delete(true, true) 285 check.Assert(err, IsNil) 286 } 287 288 func (vcd *TestVCD) Test_MetadataEntryForVdcCRUD(check *C) { 289 vcd.skipIfNotSysAdmin(check) 290 if vcd.config.VCD.Vdc == "" { 291 check.Skip("skipping test because VDC name is empty") 292 } 293 294 fmt.Printf("Running: %s\n", check.TestName()) 295 296 testMetadataCRUDActionsDeprecated(vcd.vdc, check, nil) 297 } 298 299 func (vcd *TestVCD) Test_MetadataEntryOnVappCRUD(check *C) { 300 fmt.Printf("Running: %s\n", check.TestName()) 301 302 if vcd.skipVappTests { 303 check.Skip("Skipping test because vApp was not successfully created at setup") 304 } 305 testMetadataCRUDActionsDeprecated(vcd.vapp, check, nil) 306 } 307 308 func (vcd *TestVCD) Test_MetadataEntryOnVmCRUD(check *C) { 309 fmt.Printf("Running: %s\n", check.TestName()) 310 311 if vcd.skipVappTests { 312 check.Skip("Skipping test because vapp was not successfully created at setup") 313 } 314 315 // Find VApp 316 if vcd.vapp.VApp == nil { 317 check.Skip("skipping test because no vApp is found") 318 } 319 320 vapp := vcd.findFirstVapp() 321 vmType, vmName := vcd.findFirstVm(vapp) 322 if vmName == "" { 323 check.Skip("skipping test because no VM is found") 324 } 325 326 vm := NewVM(&vcd.client.Client) 327 vm.VM = &vmType 328 329 testMetadataCRUDActionsDeprecated(vm, check, nil) 330 } 331 332 func (vcd *TestVCD) Test_MetadataEntryOnVAppTemplateCRUD(check *C) { 333 fmt.Printf("Running: %s\n", check.TestName()) 334 cat, err := vcd.org.GetCatalogByName(vcd.config.VCD.Catalog.Name, false) 335 if err != nil { 336 check.Skip("Test_DeleteMetadataOnCatalogItem: Catalog not found. Test can't proceed") 337 return 338 } 339 340 if vcd.config.VCD.Catalog.CatalogItem == "" { 341 check.Skip("Test_DeleteMetadataOnCatalogItem: Catalog Item not given. Test can't proceed") 342 } 343 344 catItem, err := cat.GetCatalogItemByName(vcd.config.VCD.Catalog.CatalogItem, false) 345 check.Assert(err, IsNil) 346 check.Assert(catItem, NotNil) 347 check.Assert(catItem.CatalogItem.Name, Equals, vcd.config.VCD.Catalog.CatalogItem) 348 349 vAppTemplate, err := catItem.GetVAppTemplate() 350 check.Assert(err, IsNil) 351 check.Assert(vAppTemplate, NotNil) 352 check.Assert(vAppTemplate.VAppTemplate.Name, Equals, vcd.config.VCD.Catalog.CatalogItem) 353 354 testMetadataCRUDActionsDeprecated(&vAppTemplate, check, nil) 355 } 356 357 func (vcd *TestVCD) Test_MetadataEntryOnMediaRecordCRUD(check *C) { 358 fmt.Printf("Running: %s\n", check.TestName()) 359 360 //prepare media item 361 skipWhenMediaPathMissing(vcd, check) 362 itemName := "TestAddMediaMetaData" 363 364 org, err := vcd.client.GetAdminOrgByName(vcd.org.Org.Name) 365 check.Assert(err, IsNil) 366 check.Assert(org, NotNil) 367 368 catalog, err := org.GetCatalogByName(vcd.config.VCD.Catalog.Name, false) 369 check.Assert(err, IsNil) 370 check.Assert(catalog, NotNil) 371 check.Assert(catalog.Catalog.Name, Equals, vcd.config.VCD.Catalog.Name) 372 373 uploadTask, err := catalog.UploadMediaImage(itemName, "upload from test", vcd.config.Media.MediaPath, 1024) 374 check.Assert(err, IsNil) 375 check.Assert(uploadTask, NotNil) 376 err = uploadTask.WaitTaskCompletion() 377 check.Assert(err, IsNil) 378 379 AddToCleanupList(itemName, "mediaCatalogImage", vcd.org.Org.Name+"|"+vcd.config.VCD.Catalog.Name, check.TestName()) 380 381 err = vcd.org.Refresh() 382 check.Assert(err, IsNil) 383 384 mediaRecord, err := catalog.QueryMedia(itemName) 385 check.Assert(err, IsNil) 386 check.Assert(mediaRecord, NotNil) 387 check.Assert(mediaRecord.MediaRecord.Name, Equals, itemName) 388 389 testMetadataCRUDActionsDeprecated(mediaRecord, check, nil) 390 task, err := mediaRecord.Delete() 391 check.Assert(err, IsNil) 392 err = task.WaitTaskCompletion() 393 check.Assert(err, IsNil) 394 } 395 396 func (vcd *TestVCD) Test_MetadataOnAdminOrgCRUD(check *C) { 397 fmt.Printf("Running: %s\n", check.TestName()) 398 adminOrg, err := vcd.client.GetAdminOrgById(vcd.org.Org.ID) 399 if err != nil { 400 check.Skip("Test_AddMetadataOnAdminOrg: Organization (admin) not found. Test can't proceed") 401 return 402 } 403 org, err := vcd.client.GetOrgById(vcd.org.Org.ID) 404 if err != nil { 405 check.Skip("Test_AddMetadataOnAdminOrg: Organization not found. Test can't proceed") 406 return 407 } 408 409 testMetadataCRUDActionsDeprecated(adminOrg, check, func() { 410 metadata, err := org.GetMetadata() 411 check.Assert(err, IsNil) 412 check.Assert(metadata, NotNil) 413 check.Assert(len(metadata.MetadataEntry), Equals, 1) 414 var foundEntry *types.MetadataEntry 415 for _, entry := range metadata.MetadataEntry { 416 if entry.Key == "key" { 417 foundEntry = entry 418 } 419 } 420 check.Assert(foundEntry, NotNil) 421 check.Assert(foundEntry.Key, Equals, "key") 422 check.Assert(foundEntry.TypedValue.Value, Equals, "value") 423 }) 424 425 } 426 427 func (vcd *TestVCD) Test_MetadataOnIndependentDiskCRUD(check *C) { 428 fmt.Printf("Running: %s\n", check.TestName()) 429 // Create disk 430 diskCreateParamsDisk := &types.Disk{ 431 Name: TestCreateDisk, 432 SizeMb: 11, 433 Description: TestCreateDisk, 434 } 435 436 diskCreateParams := &types.DiskCreateParams{ 437 Disk: diskCreateParamsDisk, 438 } 439 440 task, err := vcd.vdc.CreateDisk(diskCreateParams) 441 check.Assert(err, IsNil) 442 443 diskHREF := task.Task.Owner.HREF 444 PrependToCleanupList(diskHREF, "disk", "", check.TestName()) 445 446 err = task.WaitTaskCompletion() 447 check.Assert(err, IsNil) 448 449 disk, err := vcd.vdc.GetDiskByHref(diskHREF) 450 check.Assert(err, IsNil) 451 452 testMetadataCRUDActionsDeprecated(disk, check, nil) 453 454 task, err = disk.Delete() 455 check.Assert(err, IsNil) 456 err = task.WaitTaskCompletion() 457 check.Assert(err, IsNil) 458 } 459 460 func (vcd *TestVCD) Test_MetadataOnVdcNetworkCRUD(check *C) { 461 fmt.Printf("Running: %s\n", check.TestName()) 462 net, err := vcd.vdc.GetOrgVdcNetworkByName(vcd.config.VCD.Network.Net1, false) 463 if err != nil { 464 check.Skip(fmt.Sprintf("%s: Network %s not found. Test can't proceed", check.TestName(), vcd.config.VCD.Network.Net1)) 465 return 466 } 467 468 testMetadataCRUDActionsDeprecated(net, check, nil) 469 } 470 471 func (vcd *TestVCD) Test_MetadataOnCatalogItemCRUD(check *C) { 472 fmt.Printf("Running: %s\n", check.TestName()) 473 catalog, err := vcd.org.GetCatalogByName(vcd.config.VCD.Catalog.Name, false) 474 if err != nil { 475 check.Skip(fmt.Sprintf("%s: Catalog %s not found. Test can't proceed", check.TestName(), vcd.config.VCD.Catalog.Name)) 476 return 477 } 478 479 catalogItem, err := catalog.GetCatalogItemByName(vcd.config.VCD.Catalog.CatalogItem, false) 480 if err != nil { 481 check.Skip(fmt.Sprintf("%s: Catalog item %s not found. Test can't proceed", check.TestName(), vcd.config.VCD.Catalog.CatalogItem)) 482 return 483 } 484 485 testMetadataCRUDActionsDeprecated(catalogItem, check, nil) 486 } 487 488 func (vcd *TestVCD) Test_MetadataOnProviderVdcCRUD(check *C) { 489 fmt.Printf("Running: %s\n", check.TestName()) 490 vcd.skipIfNotSysAdmin(check) 491 providerVdc, err := vcd.client.GetProviderVdcByName(vcd.config.VCD.NsxtProviderVdc.Name) 492 if err != nil { 493 check.Skip(fmt.Sprintf("%s: Provider VDC %s not found. Test can't proceed", check.TestName(), vcd.config.VCD.NsxtProviderVdc.Name)) 494 return 495 } 496 497 testMetadataCRUDActionsDeprecated(providerVdc, check, nil) 498 } 499 500 func (vcd *TestVCD) Test_MetadataOnOpenApiOrgVdcNetworkCRUD(check *C) { 501 fmt.Printf("Running: %s\n", check.TestName()) 502 net, err := vcd.vdc.GetOpenApiOrgVdcNetworkByName(vcd.config.VCD.Network.Net1) 503 if err != nil { 504 check.Skip(fmt.Sprintf("%s: Network %s not found. Test can't proceed", check.TestName(), vcd.config.VCD.Network.Net1)) 505 return 506 } 507 508 testMetadataCRUDActionsDeprecated(net, check, nil) 509 } 510 511 func (vcd *TestVCD) Test_MetadataByHrefCRUD(check *C) { 512 fmt.Printf("Running: %s\n", check.TestName()) 513 vcd.skipIfNotSysAdmin(check) 514 storageProfileRef, err := vcd.vdc.FindStorageProfileReference(vcd.config.VCD.StorageProfile.SP1) 515 if err != nil { 516 check.Skip(fmt.Sprintf("%s: Storage Profile %s not found. Test can't proceed", check.TestName(), vcd.config.VCD.StorageProfile.SP1)) 517 return 518 } 519 520 storageProfileAdminHref := strings.ReplaceAll(storageProfileRef.HREF, "api", "api/admin") 521 522 // Check how much metadata exists 523 metadata, err := vcd.client.GetMetadataByHref(storageProfileAdminHref) 524 check.Assert(err, IsNil) 525 check.Assert(metadata, NotNil) 526 existingMetaDataCount := len(metadata.MetadataEntry) 527 528 // Add metadata 529 err = vcd.client.AddMetadataEntryByHref(storageProfileAdminHref, types.MetadataStringValue, "key", "value") 530 check.Assert(err, IsNil) 531 532 // Check if metadata was added correctly 533 metadata, err = vcd.client.GetMetadataByHref(storageProfileAdminHref) 534 check.Assert(err, IsNil) 535 check.Assert(metadata, NotNil) 536 check.Assert(len(metadata.MetadataEntry), Equals, existingMetaDataCount+1) 537 var foundEntry *types.MetadataEntry 538 for _, entry := range metadata.MetadataEntry { 539 if entry.Key == "key" { 540 foundEntry = entry 541 } 542 } 543 check.Assert(foundEntry, NotNil) 544 check.Assert(foundEntry.Key, Equals, "key") 545 check.Assert(foundEntry.TypedValue.Value, Equals, "value") 546 547 // Check the same without admin privileges 548 metadata, err = vcd.client.GetMetadataByHref(storageProfileRef.HREF) 549 check.Assert(err, IsNil) 550 check.Assert(metadata, NotNil) 551 check.Assert(len(metadata.MetadataEntry), Equals, existingMetaDataCount+1) 552 for _, entry := range metadata.MetadataEntry { 553 if entry.Key == "key" { 554 foundEntry = entry 555 } 556 } 557 check.Assert(foundEntry, NotNil) 558 check.Assert(foundEntry.Key, Equals, "key") 559 check.Assert(foundEntry.TypedValue.Value, Equals, "value") 560 561 // Merge updated metadata with a new entry 562 err = vcd.client.MergeMetadataByHref(storageProfileAdminHref, types.MetadataStringValue, map[string]interface{}{ 563 "key": "valueUpdated", 564 "key2": "value2", 565 }) 566 check.Assert(err, IsNil) 567 568 // Check that the first key was updated and the second, created 569 metadata, err = vcd.client.GetMetadataByHref(storageProfileRef.HREF) 570 check.Assert(err, IsNil) 571 check.Assert(metadata, NotNil) 572 check.Assert(len(metadata.MetadataEntry), Equals, existingMetaDataCount+2) 573 for _, entry := range metadata.MetadataEntry { 574 switch entry.Key { 575 case "key": 576 check.Assert(entry.TypedValue.Value, Equals, "valueUpdated") 577 case "key2": 578 check.Assert(entry.TypedValue.Value, Equals, "value2") 579 } 580 } 581 582 // Delete the metadata 583 err = vcd.client.DeleteMetadataEntryByHref(storageProfileAdminHref, "key") 584 check.Assert(err, IsNil) 585 err = vcd.client.DeleteMetadataEntryByHref(storageProfileAdminHref, "key2") 586 check.Assert(err, IsNil) 587 // Check if metadata was deleted correctly 588 metadata, err = vcd.client.GetMetadataByHref(storageProfileAdminHref) 589 check.Assert(err, IsNil) 590 check.Assert(metadata, NotNil) 591 check.Assert(len(metadata.MetadataEntry), Equals, 0) 592 } 593 594 type metadataCompatibleDeprecated interface { 595 GetMetadata() (*types.Metadata, error) 596 AddMetadataEntry(typedValue, key, value string) error 597 MergeMetadata(typedValue string, metadata map[string]interface{}) error 598 DeleteMetadataEntry(key string) error 599 } 600 601 func testMetadataCRUDActionsDeprecated(resource metadataCompatibleDeprecated, check *C, extraCheck func()) { 602 // Check how much metadata exists 603 metadata, err := resource.GetMetadata() 604 check.Assert(err, IsNil) 605 check.Assert(metadata, NotNil) 606 existingMetaDataCount := len(metadata.MetadataEntry) 607 608 // Add metadata 609 err = resource.AddMetadataEntry(types.MetadataStringValue, "key", "value") 610 check.Assert(err, IsNil) 611 612 // Check if metadata was added correctly 613 metadata, err = resource.GetMetadata() 614 check.Assert(err, IsNil) 615 check.Assert(metadata, NotNil) 616 check.Assert(len(metadata.MetadataEntry), Equals, existingMetaDataCount+1) 617 var foundEntry *types.MetadataEntry 618 for _, entry := range metadata.MetadataEntry { 619 if entry.Key == "key" { 620 foundEntry = entry 621 } 622 } 623 check.Assert(foundEntry, NotNil) 624 check.Assert(foundEntry.Key, Equals, "key") 625 check.Assert(foundEntry.TypedValue.Value, Equals, "value") 626 627 if extraCheck != nil { 628 extraCheck() 629 } 630 631 // Merge updated metadata with a new entry 632 err = resource.MergeMetadata(types.MetadataStringValue, map[string]interface{}{ 633 "key": "valueUpdated", 634 "key2": "value2", 635 }) 636 check.Assert(err, IsNil) 637 638 // Check that the first key was updated and the second, created 639 metadata, err = resource.GetMetadata() 640 check.Assert(err, IsNil) 641 check.Assert(metadata, NotNil) 642 check.Assert(len(metadata.MetadataEntry), Equals, existingMetaDataCount+2) 643 for _, entry := range metadata.MetadataEntry { 644 switch entry.Key { 645 case "key": 646 check.Assert(entry.TypedValue.Value, Equals, "valueUpdated") 647 case "key2": 648 check.Assert(entry.TypedValue.Value, Equals, "value2") 649 } 650 } 651 652 err = resource.DeleteMetadataEntry("key") 653 check.Assert(err, IsNil) 654 err = resource.DeleteMetadataEntry("key2") 655 check.Assert(err, IsNil) 656 // Check if metadata was deleted correctly 657 metadata, err = resource.GetMetadata() 658 check.Assert(err, IsNil) 659 check.Assert(metadata, NotNil) 660 check.Assert(len(metadata.MetadataEntry), Equals, existingMetaDataCount) 661 }