134 lines
5.9 KiB
Go
134 lines
5.9 KiB
Go
package cloudapi
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/joyent/gocommon/client"
|
|
"github.com/joyent/gocommon/errors"
|
|
)
|
|
|
|
// Image represent the software packages that will be available on newly provisioned machines
|
|
type Image struct {
|
|
Id string // Unique identifier for the image
|
|
Name string // Image friendly name
|
|
OS string // Underlying operating system
|
|
Version string // Image version
|
|
Type string // Image type, one of 'smartmachine' or 'virtualmachine'
|
|
Description string // Image description
|
|
Requirements map[string]interface{} // Minimum requirements for provisioning a machine with this image, e.g. 'password' indicates that a password must be provided
|
|
Homepage string // URL for a web page including detailed information for this image (new in API version 7.0)
|
|
PublishedAt string `json:"published_at"` // Time this image has been made publicly available (new in API version 7.0)
|
|
Public bool // Indicates if the image is publicly available (new in API version 7.1)
|
|
State string // Current image state. One of 'active', 'unactivated', 'disabled', 'creating', 'failed' (new in API version 7.1)
|
|
Tags map[string]string // A map of key/value pairs that allows clients to categorize images by any given criteria (new in API version 7.1)
|
|
EULA string // URL of the End User License Agreement (EULA) for the image (new in API version 7.1)
|
|
ACL []string // An array of account UUIDs given access to a private image. The field is only relevant to private images (new in API version 7.1)
|
|
Owner string // The UUID of the user owning the image
|
|
}
|
|
|
|
// ExportImageOpts represent the option that can be specified
|
|
// when exporting an image.
|
|
type ExportImageOpts struct {
|
|
MantaPath string `json:"manta_path"` // The Manta path prefix to use when exporting the image
|
|
}
|
|
|
|
// MantaLocation represent the properties that allow a user
|
|
// to retrieve the image file and manifest from Manta
|
|
type MantaLocation struct {
|
|
MantaURL string `json:"manta_url"` // Manta datacenter URL
|
|
ImagePath string `json:"image_path"` // Path to the image
|
|
ManifestPath string `json:"manifest_path"` // Path to the image manifest
|
|
}
|
|
|
|
// CreateImageFromMachineOpts represent the option that can be specified
|
|
// when creating a new image from an existing machine.
|
|
type CreateImageFromMachineOpts struct {
|
|
Machine string `json:"machine"` // The machine UUID from which the image is to be created
|
|
Name string `json:"name"` // Image name
|
|
Version string `json:"version"` // Image version
|
|
Description string `json:"description,omitempty"` // Image description
|
|
Homepage string `json:"homepage,omitempty"` // URL for a web page including detailed information for this image
|
|
EULA string `json:"eula,omitempty"` // URL of the End User License Agreement (EULA) for the image
|
|
ACL []string `json:"acl,omitempty"` // An array of account UUIDs given access to a private image. The field is only relevant to private images
|
|
Tags map[string]string `json:"tags,omitempty"` // A map of key/value pairs that allows clients to categorize images by any given criteria
|
|
}
|
|
|
|
// ListImages provides a list of images available in the datacenter.
|
|
// See API docs: http://apidocs.joyent.com/cloudapi/#ListImages
|
|
func (c *Client) ListImages(filter *Filter) ([]Image, error) {
|
|
var resp []Image
|
|
req := request{
|
|
method: client.GET,
|
|
url: apiImages,
|
|
filter: filter,
|
|
resp: &resp,
|
|
}
|
|
if _, err := c.sendRequest(req); err != nil {
|
|
return nil, errors.Newf(err, "failed to get list of images")
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
// GetImage returns the image specified by imageId.
|
|
// See API docs: http://apidocs.joyent.com/cloudapi/#GetImage
|
|
func (c *Client) GetImage(imageID string) (*Image, error) {
|
|
var resp Image
|
|
req := request{
|
|
method: client.GET,
|
|
url: makeURL(apiImages, imageID),
|
|
resp: &resp,
|
|
}
|
|
if _, err := c.sendRequest(req); err != nil {
|
|
return nil, errors.Newf(err, "failed to get image with id: %s", imageID)
|
|
}
|
|
return &resp, nil
|
|
}
|
|
|
|
// DeleteImage (Beta) Delete the image specified by imageId. Must be image owner to do so.
|
|
// See API docs: http://apidocs.joyent.com/cloudapi/#DeleteImage
|
|
func (c *Client) DeleteImage(imageID string) error {
|
|
req := request{
|
|
method: client.DELETE,
|
|
url: makeURL(apiImages, imageID),
|
|
expectedStatus: http.StatusNoContent,
|
|
}
|
|
if _, err := c.sendRequest(req); err != nil {
|
|
return errors.Newf(err, "failed to delete image with id: %s", imageID)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ExportImage (Beta) Exports an image to the specified Manta path.
|
|
// See API docs: http://apidocs.joyent.com/cloudapi/#ListImages
|
|
func (c *Client) ExportImage(imageID string, opts ExportImageOpts) (*MantaLocation, error) {
|
|
var resp MantaLocation
|
|
req := request{
|
|
method: client.POST,
|
|
url: fmt.Sprintf("%s/%s?action=%s", apiImages, imageID, actionExport),
|
|
reqValue: opts,
|
|
resp: &resp,
|
|
}
|
|
if _, err := c.sendRequest(req); err != nil {
|
|
return nil, errors.Newf(err, "failed to export image %s to %s", imageID, opts.MantaPath)
|
|
}
|
|
return &resp, nil
|
|
}
|
|
|
|
// CreateImageFromMachine (Beta) Create a new custom image from a machine.
|
|
// See API docs: http://apidocs.joyent.com/cloudapi/#ListImages
|
|
func (c *Client) CreateImageFromMachine(opts CreateImageFromMachineOpts) (*Image, error) {
|
|
var resp Image
|
|
req := request{
|
|
method: client.POST,
|
|
url: apiImages,
|
|
reqValue: opts,
|
|
resp: &resp,
|
|
expectedStatus: http.StatusCreated,
|
|
}
|
|
if _, err := c.sendRequest(req); err != nil {
|
|
return nil, errors.Newf(err, "failed to create image from machine %s", opts.Machine)
|
|
}
|
|
return &resp, nil
|
|
}
|