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 functionality for vAppTemplate and media image/item #225

Merged
merged 9 commits into from
Aug 2, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
* Added method `(*VCDClient) QueryProviderVdcs()`
* Added method `(*VCDClient) QueryProviderVdcStorageProfiles()`
* Added method `(*VCDClient) QueryNetworkPools()`
* Added get/add/delete metadata functions for vApp template and media item [#225](https://github.com/vmware/go-vcloud-director/pull/225).

## 2.3.1 (Jul 29, 2019)

Expand Down
25 changes: 21 additions & 4 deletions govcd/media.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ import (

type MediaItem struct {
MediaItem *types.MediaRecordType
client *Client
vdc *Vdc
}

func NewMediaItem(cli *Client) *MediaItem {
func NewMediaItem(vdc *Vdc) *MediaItem {
return &MediaItem{
MediaItem: new(types.MediaRecordType),
client: cli,
vdc: vdc,
}
}

Expand Down Expand Up @@ -313,7 +313,7 @@ func (mediaItem *MediaItem) Delete() (Task, error) {
util.Logger.Printf("[TRACE] Deleting media item: %#v", mediaItem.MediaItem.Name)

// Return the task
return mediaItem.client.ExecuteTaskRequest(mediaItem.MediaItem.HREF, http.MethodDelete,
return mediaItem.vdc.client.ExecuteTaskRequest(mediaItem.MediaItem.HREF, http.MethodDelete,
"", "error deleting Media item: %s", nil)
}

Expand All @@ -337,3 +337,20 @@ func FindMediaAsCatalogItem(org *Org, catalogName, mediaName string) (CatalogIte
}
return media, nil
}

// Refresh refreshes the media item information by href
func (mediaItem *MediaItem) Refresh() error {

if mediaItem.MediaItem == nil {
return fmt.Errorf("cannot refresh, Object is empty")
}

if mediaItem.MediaItem.Name == "nil" {
return fmt.Errorf("cannot refresh, Name is empty")
}

latestMediaItem, err := mediaItem.vdc.FindMediaImage(mediaItem.MediaItem.Name)
*mediaItem = latestMediaItem

return err
}
27 changes: 27 additions & 0 deletions govcd/media_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,3 +166,30 @@ func (vcd *TestVCD) Test_FindMediaAsCatalogItem(check *C) {
check.Assert(catalogItem.CatalogItem.Name, Equals, itemName)

}

// Tests System function Refresh
func (vcd *TestVCD) Test_RefreshMediaImage(check *C) {
skipWhenMediaPathMissing(vcd, check)
itemName := "TestRefreshMedia"

uploadTask, err := vcd.vdc.UploadMediaImage(itemName, "upload from test", vcd.config.Media.MediaPath, 1024)
check.Assert(err, IsNil)
check.Assert(uploadTask, NotNil)
err = uploadTask.WaitTaskCompletion()
check.Assert(err, IsNil)

AddToCleanupList(itemName, "mediaImage", vcd.org.Org.Name+"|"+vcd.vdc.Vdc.Name, "Test_UploadMediaImage")

mediaItem, err := vcd.vdc.FindMediaImage(itemName)
check.Assert(err, IsNil)
check.Assert(mediaItem, NotNil)
check.Assert(mediaItem, Not(Equals), MediaItem{})

oldMediaItem := mediaItem
mediaItem.Refresh()

check.Assert(mediaItem, NotNil)
check.Assert(oldMediaItem.MediaItem.ID, Equals, mediaItem.MediaItem.ID)
check.Assert(oldMediaItem.MediaItem.Name, Equals, mediaItem.MediaItem.Name)
check.Assert(oldMediaItem.MediaItem.HREF, Equals, mediaItem.MediaItem.HREF)
}
111 changes: 107 additions & 4 deletions govcd/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package govcd

import (
"fmt"
"github.com/vmware/go-vcloud-director/v2/types/v56"
"net/http"
"net/url"
Expand All @@ -24,7 +25,7 @@ func (vm *VM) DeleteMetadata(key string) (Task, error) {
}

// AddMetadata() function calls private function addMetadata() with vm.client and vm.VM.HREF
// which adds metadata key, value pair provided as input to VM.
// which adds metadata key/value pair provided as input to VM.
func (vm *VM) AddMetadata(key string, value string) (Task, error) {
return addMetadata(vm.client, key, value, vm.VM.HREF)
}
Expand Down Expand Up @@ -54,7 +55,7 @@ func (vdc *Vdc) DeleteMetadata(key string) (Vdc, error) {
return *vdc, nil
}

// AddMetadata() function adds metadata key, value pair provided as input to VDC.
// AddMetadata() function adds metadata key/value pair provided as input to VDC.
func (vdc *Vdc) AddMetadata(key string, value string) (Vdc, error) {
task, err := addMetadata(vdc.client, key, value, getAdminVdcURL(vdc.Vdc.HREF))
if err != nil {
Expand All @@ -74,7 +75,7 @@ func (vdc *Vdc) AddMetadata(key string, value string) (Vdc, error) {
return *vdc, nil
}

// AddMetadata() function adds metadata key, value pair provided as input to VDC.
// AddMetadata() function adds metadata key/value pair provided as input to VDC.
// and returns task
func (vdc *Vdc) AddMetadataAsync(key string, value string) (Task, error) {
return addMetadata(vdc.client, key, value, getAdminVdcURL(vdc.Vdc.HREF))
Expand Down Expand Up @@ -123,7 +124,7 @@ func deleteMetadata(client *Client, key string, requestUri string) (Task, error)
}

// AddMetadata() function calls private function addMetadata() with vapp.client and vapp.VApp.HREF
// which adds metadata key, value pair provided as input.
// which adds metadata key/value pair provided as input
func (vapp *VApp) AddMetadata(key string, value string) (Task, error) {
return addMetadata(vapp.client, key, value, vapp.VApp.HREF)
}
Expand All @@ -147,3 +148,105 @@ func addMetadata(client *Client, key string, value string, requestUri string) (T
return client.ExecuteTaskRequest(apiEndpoint.String(), http.MethodPut,
types.MimeMetaDataValue, "error adding metadata: %s", newMetadata)
}

// GetMetadata() function calls private function getMetadata() with catalogItem.client and catalogItem.CatalogItem.HREF
// which returns a *types.Metadata struct for provided catalog item input.
func (vAppTemplate *VAppTemplate) GetMetadata() (*types.Metadata, error) {
return getMetadata(vAppTemplate.client, vAppTemplate.VAppTemplate.HREF)
}

// AddMetadata() function adds metadata key/value pair provided as input and returned update VAppTemplate
func (vAppTemplate *VAppTemplate) AddMetadata(key string, value string) (*VAppTemplate, error) {
task, err := vAppTemplate.AddMetadataAsync(key, value)
if err != nil {
return nil, err
}
err = task.WaitTaskCompletion()
if err != nil {
return nil, fmt.Errorf("error completing add metadata for vApp template task: %#v", err)
}

err = vAppTemplate.Refresh()
if err != nil {
return nil, fmt.Errorf("error refreshing vApp template: %#v", err)
}

return vAppTemplate, nil
}

// AddMetadataAsync() function calls private function addMetadata() with vAppTemplate.client and vAppTemplate.VAppTemplate.HREF
// which adds metadata key/value pair provided as input.
func (vAppTemplate *VAppTemplate) AddMetadataAsync(key string, value string) (Task, error) {
return addMetadata(vAppTemplate.client, key, value, vAppTemplate.VAppTemplate.HREF)
}

// DeleteMetadata() function calls deletes metadata depending on key provided as input from media item.
func (vAppTemplate *VAppTemplate) DeleteMetadata(key string) error {
task, err := vAppTemplate.DeleteMetadataAsync(key)
if err != nil {
return err
}
err = task.WaitTaskCompletion()
if err != nil {
return fmt.Errorf("error completing delete metadata for vApp template task: %#v", err)
}

return nil
}

// DeleteMetadataAsync() function calls private function deleteMetadata() with vAppTemplate.client and vAppTemplate.VAppTemplate.HREF
// which deletes metadata depending on key provided as input from catalog item.
func (vAppTemplate *VAppTemplate) DeleteMetadataAsync(key string) (Task, error) {
return deleteMetadata(vAppTemplate.client, key, vAppTemplate.VAppTemplate.HREF)
}

// GetMetadata() function calls private function getMetadata() with mediaItem.client and mediaItem.MediaItem.HREF
// which returns a *types.Metadata struct for provided media item input.
func (mediaItem *MediaItem) GetMetadata() (*types.Metadata, error) {
return getMetadata(mediaItem.vdc.client, mediaItem.MediaItem.HREF)
}

// AddMetadata() function adds metadata key/value pair provided as input.
func (mediaItem *MediaItem) AddMetadata(key string, value string) (*MediaItem, error) {
task, err := mediaItem.AddMetadataAsync(key, value)
if err != nil {
return nil, err
}
err = task.WaitTaskCompletion()
if err != nil {
return nil, fmt.Errorf("error completing add metadata for media item task: %s", err)
}

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

return mediaItem, nil
}

// AddMetadataAsync() function calls private function addMetadata() with mediaItem.client and mediaItem.MediaItem.HREF
// which adds metadata key/value pair provided as input.
func (mediaItem *MediaItem) AddMetadataAsync(key string, value string) (Task, error) {
return addMetadata(mediaItem.vdc.client, key, value, mediaItem.MediaItem.HREF)
}

// DeleteMetadata() function calls deletes metadata depending on key provided as input from media item.
func (mediaItem *MediaItem) DeleteMetadata(key string) error {
task, err := mediaItem.DeleteMetadataAsync(key)
if err != nil {
return err
}
err = task.WaitTaskCompletion()
if err != nil {
return fmt.Errorf("error completing delete metadata for media item task: %s", err)
}

return nil
}

// DeleteMetadataAsync() function calls private function deleteMetadata() with mediaItem.client and mediaItem.MediaItem.HREF
// which deletes metadata depending on key provided as input from media item.
func (mediaItem *MediaItem) DeleteMetadataAsync(key string) (Task, error) {
return deleteMetadata(mediaItem.vdc.client, key, mediaItem.MediaItem.HREF)
}
Loading