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]
70 changes: 44 additions & 26 deletions govcd/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -729,22 +729,12 @@ func (org *Org) GetMetadata() (*types.Metadata, error) {

// AddMetadataEntry adds metadata key/value pair provided as input to the corresponding organization seen as administrator
// and waits for completion.
func (adminOrg *AdminOrg) AddMetadataEntry(typedValue, key, value string) (*AdminOrg, error) {
func (adminOrg *AdminOrg) AddMetadataEntry(typedValue, key, value string) error {
task, err := adminOrg.AddMetadataEntryAsync(typedValue, key, value)
if err != nil {
return nil, err
}
err = task.WaitTaskCompletion()
if err != nil {
return nil, fmt.Errorf("error completing add metadata for organization task: %s", err)
}

err = adminOrg.Refresh()
if err != nil {
return nil, fmt.Errorf("error refreshing organization: %s", err)
return err
}

return adminOrg, nil
return task.WaitTaskCompletion()
}

// AddMetadataEntryAsync adds metadata key/value pair provided as input to the corresponding organization seen as administrator
Expand Down Expand Up @@ -779,22 +769,12 @@ func (disk *Disk) GetMetadata() (*types.Metadata, error) {
}

// AddMetadataEntry adds metadata key/value pair provided as input to the corresponding independent disk and waits for completion.
func (disk *Disk) AddMetadataEntry(typedValue, key, value string) (*Disk, error) {
func (disk *Disk) AddMetadataEntry(typedValue, key, value string) error {
task, err := disk.AddMetadataEntryAsync(typedValue, key, value)
if err != nil {
return nil, err
}
err = task.WaitTaskCompletion()
if err != nil {
return nil, fmt.Errorf("error completing add metadata for independent disk task: %s", err)
}

err = disk.Refresh()
if err != nil {
return nil, fmt.Errorf("error refreshing independent disk: %s", err)
return err
}

return disk, nil
return task.WaitTaskCompletion()
}

// AddMetadataEntryAsync adds metadata key/value pair provided as input to the corresponding independent disk and returns a task.
Expand All @@ -821,3 +801,41 @@ func (disk *Disk) DeleteMetadataEntry(key string) error {
func (disk *Disk) DeleteMetadataEntryAsync(key string) (Task, error) {
return deleteMetadata(disk.client, key, disk.Disk.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
}
return task.WaitTaskCompletion()
}

// 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
}

return task.WaitTaskCompletion()
}

// 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/"))
}
46 changes: 44 additions & 2 deletions govcd/metadata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -758,7 +758,7 @@ func (vcd *TestVCD) Test_MetadataOnAdminOrgCRUD(check *C) {
existingMetaDataCount := len(metadata.MetadataEntry)

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

// Check if metadata was added correctly
Expand Down Expand Up @@ -830,7 +830,7 @@ func (vcd *TestVCD) Test_MetadataOnIndependentDiskCRUD(check *C) {
existingMetaDataCount := len(metadata.MetadataEntry)

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

// Check if metadata was added correctly
Expand All @@ -856,3 +856,45 @@ func (vcd *TestVCD) Test_MetadataOnIndependentDiskCRUD(check *C) {
check.Assert(metadata, NotNil)
check.Assert(len(metadata.MetadataEntry), Equals, 0)
}

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)
}