Blame vendor/github.com/vmware/govmomi/vapi/library/library_item.go

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
}