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  }