Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add metadata support for VDC networks #442

Merged
merged 13 commits into from
Mar 24, 2022
3 changes: 3 additions & 0 deletions .changes/v2.15.0/442-improvements.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
* Added support to set, get and delete metadata to VDC Networks with the methods
`OrgVDCNetwork.AddMetadataEntry`, `OrgVDCNetwork.AddMetadataEntryAsync`, `OrgVDCNetwork.GetMetadata`,
`OrgVDCNetwork.DeleteMetadataEntry` and `OrgVDCNetwork.DeleteMetadataEntryAsync`. [GH-442]
58 changes: 58 additions & 0 deletions govcd/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -716,3 +716,61 @@ func (adminCatalog *AdminCatalog) DeleteMetadataEntryAsync(key string) (Task, er
func (catalog *Catalog) GetMetadata() (*types.Metadata, error) {
return getMetadata(catalog.client, catalog.Catalog.HREF)
}

// GetMetadata returns OrgVDCNetwork metadata.
func (orgVdcNetwork *OrgVDCNetwork) GetMetadata() (*types.Metadata, error) {
return getMetadata(orgVdcNetwork.client, orgVdcNetwork.OrgVDCNetwork.HREF)
}

// AddMetadataEntry adds OrgVDCNetwork metadata typedValue and key/value pair provided as input
// and waits for the task to finish.
func (orgVdcNetwork *OrgVDCNetwork) AddMetadataEntry(typedValue, key, value string) error {
task, err := orgVdcNetwork.AddMetadataEntryAsync(typedValue, key, value)
if err != nil {
return err
}
err = task.WaitTaskCompletion()
if err != nil {
return err
}

err = orgVdcNetwork.Refresh()
if err != nil {
return err
}

return nil
}

// AddMetadataEntryAsync adds OrgVDCNetwork metadata typedValue and key/value pair provided as input
// and returns the task.
func (orgVdcNetwork *OrgVDCNetwork) AddMetadataEntryAsync(typedValue, key, value string) (Task, error) {
return addMetadata(orgVdcNetwork.client, typedValue, key, value, strings.ReplaceAll(orgVdcNetwork.OrgVDCNetwork.HREF, "/api/", "/api/admin/"))
}

// DeleteMetadataEntry deletes OrgVDCNetwork metadata depending on key provided as input
// and waits for the task to finish.
func (orgVdcNetwork *OrgVDCNetwork) DeleteMetadataEntry(key string) error {
task, err := orgVdcNetwork.DeleteMetadataEntryAsync(key)
if err != nil {
return err
}

err = task.WaitTaskCompletion()
if err != nil {
return err
}

err = orgVdcNetwork.Refresh()
if err != nil {
return err
}

return nil
}

// DeleteMetadataEntryAsync deletes OrgVDCNetwork metadata depending on key provided as input
// and returns a task.
func (orgVdcNetwork *OrgVDCNetwork) DeleteMetadataEntryAsync(key string) (Task, error) {
return deleteMetadata(orgVdcNetwork.client, key, strings.ReplaceAll(orgVdcNetwork.OrgVDCNetwork.HREF, "/api/", "/api/admin/"))
}
42 changes: 42 additions & 0 deletions govcd/metadata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -737,3 +737,45 @@ func (vcd *TestVCD) Test_MetadataEntryOnMediaRecordCRUD(check *C) {
}
}
}

func (vcd *TestVCD) Test_MetadataOnVdcNetworkCRUD(check *C) {
fmt.Printf("Running: %s\n", check.TestName())
net, err := vcd.vdc.GetOrgVdcNetworkByName(vcd.config.VCD.Network.Net1, false)
if err != nil {
check.Skip(fmt.Sprintf("Test_MetadataOnVdcNetworkCRUD: Network %s not found. Test can't proceed", vcd.config.VCD.Network.Net1))
return
}

// Check how much metadata exists
metadata, err := net.GetMetadata()
check.Assert(err, IsNil)
check.Assert(metadata, NotNil)
existingMetaDataCount := len(metadata.MetadataEntry)

// Add metadata
err = net.AddMetadataEntry(types.MetadataStringValue, "key", "value")
check.Assert(err, IsNil)

// Check if metadata was added correctly
metadata, err = net.GetMetadata()
check.Assert(err, IsNil)
check.Assert(metadata, NotNil)
check.Assert(len(metadata.MetadataEntry), Equals, existingMetaDataCount+1)
var foundEntry *types.MetadataEntry
for _, entry := range metadata.MetadataEntry {
if entry.Key == "key" {
foundEntry = entry
}
}
check.Assert(foundEntry, NotNil)
check.Assert(foundEntry.Key, Equals, "key")
check.Assert(foundEntry.TypedValue.Value, Equals, "value")

err = net.DeleteMetadataEntry("key")
check.Assert(err, IsNil)
// Check if metadata was deleted correctly
metadata, err = net.GetMetadata()
check.Assert(err, IsNil)
check.Assert(metadata, NotNil)
check.Assert(len(metadata.MetadataEntry), Equals, 0)
}