|
Packit |
63bb0d |
/*
|
|
Packit |
63bb0d |
Copyright (c) 2018 VMware, Inc. All Rights Reserved.
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Licensed under the Apache License, Version 2.0 (the "License");
|
|
Packit |
63bb0d |
you may not use this file except in compliance with the License.
|
|
Packit |
63bb0d |
You may obtain a copy of the License at
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Unless required by applicable law or agreed to in writing, software
|
|
Packit |
63bb0d |
distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit |
63bb0d |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
Packit |
63bb0d |
See the License for the specific language governing permissions and
|
|
Packit |
63bb0d |
limitations under the License.
|
|
Packit |
63bb0d |
*/
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
package library
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
import (
|
|
Packit |
63bb0d |
"context"
|
|
Packit |
63bb0d |
"fmt"
|
|
Packit |
63bb0d |
"net/http"
|
|
Packit |
63bb0d |
"time"
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
"github.com/vmware/govmomi/vapi/internal"
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
const (
|
|
Packit |
63bb0d |
ItemTypeISO = "iso"
|
|
Packit |
63bb0d |
ItemTypeOVF = "ovf"
|
|
Packit |
63bb0d |
ItemTypeVMTX = "vm-template"
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Item provides methods to create, read, update, delete, and enumerate library items.
|
|
Packit |
63bb0d |
type Item struct {
|
|
Packit |
63bb0d |
Cached bool `json:"cached,omitempty"`
|
|
Packit |
63bb0d |
ContentVersion string `json:"content_version,omitempty"`
|
|
Packit |
63bb0d |
CreationTime *time.Time `json:"creation_time,omitempty"`
|
|
Packit |
63bb0d |
Description string `json:"description,omitempty"`
|
|
Packit |
63bb0d |
ID string `json:"id,omitempty"`
|
|
Packit |
63bb0d |
LastModifiedTime *time.Time `json:"last_modified_time,omitempty"`
|
|
Packit |
63bb0d |
LastSyncTime *time.Time `json:"last_sync_time,omitempty"`
|
|
Packit |
63bb0d |
LibraryID string `json:"library_id,omitempty"`
|
|
Packit |
63bb0d |
MetadataVersion string `json:"metadata_version,omitempty"`
|
|
Packit |
63bb0d |
Name string `json:"name,omitempty"`
|
|
Packit |
63bb0d |
Size int64 `json:"size,omitempty"`
|
|
Packit |
63bb0d |
SourceID string `json:"source_id,omitempty"`
|
|
Packit |
63bb0d |
Type string `json:"type,omitempty"`
|
|
Packit |
63bb0d |
Version string `json:"version,omitempty"`
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Patch merges updates from the given src.
|
|
Packit |
63bb0d |
func (i *Item) Patch(src *Item) {
|
|
Packit |
63bb0d |
if src.Name != "" {
|
|
Packit |
63bb0d |
i.Name = src.Name
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
if src.Description != "" {
|
|
Packit |
63bb0d |
i.Description = src.Description
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
if src.Type != "" {
|
|
Packit |
63bb0d |
i.Type = src.Type
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
if src.Version != "" {
|
|
Packit |
63bb0d |
i.Version = src.Version
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// CreateLibraryItem creates a new library item
|
|
Packit |
63bb0d |
func (c *Manager) CreateLibraryItem(ctx context.Context, item Item) (string, error) {
|
|
Packit |
63bb0d |
type createItemSpec struct {
|
|
Packit |
63bb0d |
Name string `json:"name"`
|
|
Packit |
63bb0d |
Description string `json:"description"`
|
|
Packit |
63bb0d |
LibraryID string `json:"library_id,omitempty"`
|
|
Packit |
63bb0d |
Type string `json:"type"`
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
spec := struct {
|
|
Packit |
63bb0d |
Item createItemSpec `json:"create_spec"`
|
|
Packit |
63bb0d |
}{
|
|
Packit |
63bb0d |
Item: createItemSpec{
|
|
Packit |
63bb0d |
Name: item.Name,
|
|
Packit |
63bb0d |
Description: item.Description,
|
|
Packit |
63bb0d |
LibraryID: item.LibraryID,
|
|
Packit |
63bb0d |
Type: item.Type,
|
|
Packit |
63bb0d |
},
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
url := c.Resource(internal.LibraryItemPath)
|
|
Packit |
63bb0d |
var res string
|
|
Packit |
63bb0d |
return res, c.Do(ctx, url.Request(http.MethodPost, spec), &res)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// CopyLibraryItem copies a library item
|
|
Packit |
63bb0d |
func (c *Manager) CopyLibraryItem(ctx context.Context, src *Item, dst Item) (string, error) {
|
|
Packit |
63bb0d |
body := struct {
|
|
Packit |
63bb0d |
Item `json:"destination_create_spec"`
|
|
Packit |
63bb0d |
}{dst}
|
|
Packit |
63bb0d |
url := c.Resource(internal.LibraryItemPath).WithID(src.ID).WithAction("copy")
|
|
Packit |
63bb0d |
var res string
|
|
Packit |
63bb0d |
return res, c.Do(ctx, url.Request(http.MethodPost, body), &res)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// SyncLibraryItem syncs a subscribed library item
|
|
Packit |
63bb0d |
func (c *Manager) SyncLibraryItem(ctx context.Context, item *Item, force bool) error {
|
|
Packit |
63bb0d |
body := struct {
|
|
Packit |
63bb0d |
Force bool `json:"force_sync_content"`
|
|
Packit |
63bb0d |
}{force}
|
|
Packit |
63bb0d |
url := c.Resource(internal.SubscribedLibraryItem).WithID(item.ID).WithAction("sync")
|
|
Packit |
63bb0d |
return c.Do(ctx, url.Request(http.MethodPost, body), nil)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// PublishLibraryItem publishes a library item to specified subscriptions.
|
|
Packit |
63bb0d |
// If no subscriptions are specified, then publishes the library item to all subscriptions.
|
|
Packit |
63bb0d |
func (c *Manager) PublishLibraryItem(ctx context.Context, item *Item, force bool, subscriptions []string) error {
|
|
Packit |
63bb0d |
body := internal.SubscriptionItemDestinationSpec{
|
|
Packit |
63bb0d |
Force: force,
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
for i := range subscriptions {
|
|
Packit |
63bb0d |
body.Subscriptions = append(body.Subscriptions, internal.SubscriptionDestination{ID: subscriptions[i]})
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
url := c.Resource(internal.LibraryItemPath).WithID(item.ID).WithAction("publish")
|
|
Packit |
63bb0d |
return c.Do(ctx, url.Request(http.MethodPost, body), nil)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// DeleteLibraryItem deletes an existing library item.
|
|
Packit |
63bb0d |
func (c *Manager) DeleteLibraryItem(ctx context.Context, item *Item) error {
|
|
Packit |
63bb0d |
url := c.Resource(internal.LibraryItemPath).WithID(item.ID)
|
|
Packit |
63bb0d |
return c.Do(ctx, url.Request(http.MethodDelete), nil)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// ListLibraryItems returns a list of all items in a content library.
|
|
Packit |
63bb0d |
func (c *Manager) ListLibraryItems(ctx context.Context, id string) ([]string, error) {
|
|
Packit |
63bb0d |
url := c.Resource(internal.LibraryItemPath).WithParam("library_id", id)
|
|
Packit |
63bb0d |
var res []string
|
|
Packit |
63bb0d |
return res, c.Do(ctx, url.Request(http.MethodGet), &res)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// GetLibraryItem returns information on a library item for the given ID.
|
|
Packit |
63bb0d |
func (c *Manager) GetLibraryItem(ctx context.Context, id string) (*Item, error) {
|
|
Packit |
63bb0d |
url := c.Resource(internal.LibraryItemPath).WithID(id)
|
|
Packit |
63bb0d |
var res Item
|
|
Packit |
63bb0d |
return &res, c.Do(ctx, url.Request(http.MethodGet), &res)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// GetLibraryItems returns a list of all the library items for the specified library.
|
|
Packit |
63bb0d |
func (c *Manager) GetLibraryItems(ctx context.Context, libraryID string) ([]Item, error) {
|
|
Packit |
63bb0d |
ids, err := c.ListLibraryItems(ctx, libraryID)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return nil, fmt.Errorf("get library items failed for: %s", err)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
var items []Item
|
|
Packit |
63bb0d |
for _, id := range ids {
|
|
Packit |
63bb0d |
item, err := c.GetLibraryItem(ctx, id)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return nil, fmt.Errorf("get library item for %s failed for %s", id, err)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
items = append(items, *item)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return items, nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// FindItem is the search criteria for finding library items.
|
|
Packit |
63bb0d |
type FindItem struct {
|
|
Packit |
63bb0d |
Cached *bool `json:"cached,omitempty"`
|
|
Packit |
63bb0d |
LibraryID string `json:"library_id,omitempty"`
|
|
Packit |
63bb0d |
Name string `json:"name,omitempty"`
|
|
Packit |
63bb0d |
SourceID string `json:"source_id,omitempty"`
|
|
Packit |
63bb0d |
Type string `json:"type,omitempty"`
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// FindLibraryItems returns the IDs of all the library items that match the
|
|
Packit |
63bb0d |
// search criteria.
|
|
Packit |
63bb0d |
func (c *Manager) FindLibraryItems(
|
|
Packit |
63bb0d |
ctx context.Context, search FindItem) ([]string, error) {
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
url := c.Resource(internal.LibraryItemPath).WithAction("find")
|
|
Packit |
63bb0d |
spec := struct {
|
|
Packit |
63bb0d |
Spec FindItem `json:"spec"`
|
|
Packit |
63bb0d |
}{search}
|
|
Packit |
63bb0d |
var res []string
|
|
Packit |
63bb0d |
return res, c.Do(ctx, url.Request(http.MethodPost, spec), &res)
|
|
Packit |
63bb0d |
}
|