lego/vendor/github.com/exoscale/egoscale/templates.go

281 lines
18 KiB
Go

package egoscale
import (
"fmt"
)
// Template represents a machine to be deployed
//
// See: http://docs.cloudstack.apache.org/projects/cloudstack-administration/en/latest/templates.html
type Template struct {
Account string `json:"account,omitempty" doc:"the account name to which the template belongs"`
AccountID *UUID `json:"accountid,omitempty" doc:"the account id to which the template belongs"`
Bootable bool `json:"bootable,omitempty" doc:"true if the ISO is bootable, false otherwise"`
Checksum string `json:"checksum,omitempty" doc:"checksum of the template"`
Created string `json:"created,omitempty" doc:"the date this template was created"`
CrossZones bool `json:"crossZones,omitempty" doc:"true if the template is managed across all Zones, false otherwise"`
Details map[string]string `json:"details,omitempty" doc:"additional key/value details tied with template"`
DisplayText string `json:"displaytext,omitempty" doc:"the template display text"`
Domain string `json:"domain,omitempty" doc:"the name of the domain to which the template belongs"`
DomainID *UUID `json:"domainid,omitempty" doc:"the ID of the domain to which the template belongs"`
Format string `json:"format,omitempty" doc:"the format of the template."`
HostID *UUID `json:"hostid,omitempty" doc:"the ID of the secondary storage host for the template"`
HostName string `json:"hostname,omitempty" doc:"the name of the secondary storage host for the template"`
Hypervisor string `json:"hypervisor,omitempty" doc:"the hypervisor on which the template runs"`
ID *UUID `json:"id,omitempty" doc:"the template ID"`
IsDynamicallyScalable bool `json:"isdynamicallyscalable,omitempty" doc:"true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory"`
IsExtractable bool `json:"isextractable,omitempty" doc:"true if the template is extractable, false otherwise"`
IsFeatured bool `json:"isfeatured,omitempty" doc:"true if this template is a featured template, false otherwise"`
IsPublic bool `json:"ispublic,omitempty" doc:"true if this template is a public template, false otherwise"`
IsReady bool `json:"isready,omitempty" doc:"true if the template is ready to be deployed from, false otherwise."`
Name string `json:"name,omitempty" doc:"the template name"`
OsTypeID *UUID `json:"ostypeid,omitempty" doc:"the ID of the OS type for this template."`
OsTypeName string `json:"ostypename,omitempty" doc:"the name of the OS type for this template."`
PasswordEnabled bool `json:"passwordenabled,omitempty" doc:"true if the reset password feature is enabled, false otherwise"`
Removed string `json:"removed,omitempty" doc:"the date this template was removed"`
Size int64 `json:"size,omitempty" doc:"the size of the template"`
SourceTemplateID *UUID `json:"sourcetemplateid,omitempty" doc:"the template ID of the parent template if present"`
SSHKeyEnabled bool `json:"sshkeyenabled,omitempty" doc:"true if template is sshkey enabled, false otherwise"`
Status string `json:"status,omitempty" doc:"the status of the template"`
Tags []ResourceTag `json:"tags,omitempty" doc:"the list of resource tags associated with tempate"`
TemplateDirectory string `json:"templatedirectory,omitempty" doc:"Template directory"`
TemplateTag string `json:"templatetag,omitempty" doc:"the tag of this template"`
TemplateType string `json:"templatetype,omitempty" doc:"the type of the template"`
URL string `json:"url,omitempty" doc:"Original URL of the template where it was downloaded"`
ZoneID *UUID `json:"zoneid,omitempty" doc:"the ID of the zone for this template"`
ZoneName string `json:"zonename,omitempty" doc:"the name of the zone for this template"`
}
// ResourceType returns the type of the resource
func (Template) ResourceType() string {
return "Template"
}
// ListRequest builds the ListTemplates request
func (temp Template) ListRequest() (ListCommand, error) {
req := &ListTemplates{
Name: temp.Name,
Account: temp.Account,
DomainID: temp.DomainID,
ID: temp.ID,
ZoneID: temp.ZoneID,
Hypervisor: temp.Hypervisor,
//TODO Tags
}
if temp.IsFeatured {
req.TemplateFilter = "featured"
}
if temp.Removed != "" {
*req.ShowRemoved = true
}
return req, nil
}
// ListTemplates represents a template query filter
type ListTemplates struct {
TemplateFilter string `json:"templatefilter" doc:"possible values are \"featured\", \"self\", \"selfexecutable\",\"sharedexecutable\",\"executable\", and \"community\". * featured : templates that have been marked as featured and public. * self : templates that have been registered or created by the calling user. * selfexecutable : same as self, but only returns templates that can be used to deploy a new VM. * sharedexecutable : templates ready to be deployed that have been granted to the calling user by another user. * executable : templates that are owned by the calling user, or public templates, that can be used to deploy a VM. * community : templates that have been marked as public but not featured. * all : all templates (only usable by admins)."`
Account string `json:"account,omitempty" doc:"list resources by account. Must be used with the domainId parameter."`
DomainID *UUID `json:"domainid,omitempty" doc:"list only resources belonging to the domain specified"`
Hypervisor string `json:"hypervisor,omitempty" doc:"the hypervisor for which to restrict the search"`
ID *UUID `json:"id,omitempty" doc:"the template ID"`
IsRecursive *bool `json:"isrecursive,omitempty" doc:"defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves."`
Keyword string `json:"keyword,omitempty" doc:"List by keyword"`
ListAll *bool `json:"listall,omitempty" doc:"If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false"`
Name string `json:"name,omitempty" doc:"the template name"`
Page int `json:"page,omitempty"`
PageSize int `json:"pagesize,omitempty"`
ShowRemoved *bool `json:"showremoved,omitempty" doc:"show removed templates as well"`
Tags []ResourceTag `json:"tags,omitempty" doc:"List resources by tags (key/value pairs)"`
ZoneID *UUID `json:"zoneid,omitempty" doc:"list templates by zoneId"`
_ bool `name:"listTemplates" description:"List all public, private, and privileged templates."`
}
// ListTemplatesResponse represents a list of templates
type ListTemplatesResponse struct {
Count int `json:"count"`
Template []Template `json:"template"`
}
func (ListTemplates) response() interface{} {
return new(ListTemplatesResponse)
}
func (ListTemplates) each(resp interface{}, callback IterateItemFunc) {
temps, ok := resp.(*ListTemplatesResponse)
if !ok {
callback(nil, fmt.Errorf("wrong type. ListTemplatesResponse expected, got %T", resp))
return
}
for i := range temps.Template {
if !callback(&temps.Template[i], nil) {
break
}
}
}
// SetPage sets the current page
func (ls *ListTemplates) SetPage(page int) {
ls.Page = page
}
// SetPageSize sets the page size
func (ls *ListTemplates) SetPageSize(pageSize int) {
ls.PageSize = pageSize
}
// CreateTemplate (Async) represents a template creation
type CreateTemplate struct {
Bits int `json:"bits,omitempty" doc:"32 or 64 bit"`
Details map[string]string `json:"details,omitempty" doc:"Template details in key/value pairs."`
DisplayText string `json:"displaytext" doc:"the display text of the template. This is usually used for display purposes."`
IsDynamicallyScalable *bool `json:"isdynamicallyscalable,omitempty" doc:"true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory"`
IsFeatured *bool `json:"isfeatured,omitempty" doc:"true if this template is a featured template, false otherwise"`
IsPublic *bool `json:"ispublic,omitempty" doc:"true if this template is a public template, false otherwise"`
Name string `json:"name" doc:"the name of the template"`
OsTypeID *UUID `json:"ostypeid" doc:"the ID of the OS Type that best represents the OS of this template."`
PasswordEnabled *bool `json:"passwordenabled,omitempty" doc:"true if the template supports the password reset feature; default is false"`
RequiresHVM *bool `json:"requireshvm,omitempty" doc:"true if the template requres HVM, false otherwise"`
SnapshotID *UUID `json:"snapshotid,omitempty" doc:"the ID of the snapshot the template is being created from. Either this parameter, or volumeId has to be passed in"`
TemplateTag string `json:"templatetag,omitempty" doc:"the tag for this template."`
URL string `json:"url,omitempty" doc:"Optional, only for baremetal hypervisor. The directory name where template stored on CIFS server"`
VirtualMachineID *UUID `json:"virtualmachineid,omitempty" doc:"Optional, VM ID. If this presents, it is going to create a baremetal template for VM this ID refers to. This is only for VM whose hypervisor type is BareMetal"`
VolumeID *UUID `json:"volumeid,omitempty" doc:"the ID of the disk volume the template is being created from. Either this parameter, or snapshotId has to be passed in"`
_ bool `name:"createTemplate" description:"Creates a template of a virtual machine. The virtual machine must be in a STOPPED state. A template created from this command is automatically designated as a private template visible to the account that created it."`
}
func (CreateTemplate) response() interface{} {
return new(AsyncJobResult)
}
func (CreateTemplate) asyncResponse() interface{} {
return new(Template)
}
// CopyTemplate (Async) represents a template copy
type CopyTemplate struct {
DestZoneID *UUID `json:"destzoneid" doc:"ID of the zone the template is being copied to."`
ID *UUID `json:"id" doc:"Template ID."`
SourceZoneID *UUID `json:"sourcezoneid,omitempty" doc:"ID of the zone the template is currently hosted on. If not specified and template is cross-zone, then we will sync this template to region wide image store."`
_ bool `name:"copyTemplate" description:"Copies a template from one zone to another."`
}
func (CopyTemplate) response() interface{} {
return new(AsyncJobResult)
}
func (CopyTemplate) asyncResponse() interface{} {
return new(Template)
}
// UpdateTemplate represents a template change
type UpdateTemplate struct {
Bootable *bool `json:"bootable,omitempty" doc:"true if image is bootable, false otherwise"`
Details map[string]string `json:"details,omitempty" doc:"Details in key/value pairs."`
DisplayText string `json:"displaytext,omitempty" doc:"the display text of the image"`
Format string `json:"format,omitempty" doc:"the format for the image"`
ID *UUID `json:"id" doc:"the ID of the image file"`
IsDynamicallyScalable *bool `json:"isdynamicallyscalable,omitempty" doc:"true if template/ISO contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory"`
IsRouting *bool `json:"isrouting,omitempty" doc:"true if the template type is routing i.e., if template is used to deploy router"`
Name string `json:"name,omitempty" doc:"the name of the image file"`
OsTypeID *UUID `json:"ostypeid,omitempty" doc:"the ID of the OS type that best represents the OS of this image."`
PasswordEnabled *bool `json:"passwordenabled,omitempty" doc:"true if the image supports the password reset feature; default is false"`
SortKey int `json:"sortkey,omitempty" doc:"sort key of the template, integer"`
_ bool `name:"updateTemplate" description:"Updates attributes of a template."`
}
func (UpdateTemplate) response() interface{} {
return new(AsyncJobResult)
}
func (UpdateTemplate) asyncResponse() interface{} {
return new(Template)
}
// DeleteTemplate (Async) represents the deletion of a template
type DeleteTemplate struct {
ID *UUID `json:"id" doc:"the ID of the template"`
ZoneID *UUID `json:"zoneid,omitempty" doc:"the ID of zone of the template"`
_ bool `name:"deleteTemplate" description:"Deletes a template from the system. All virtual machines using the deleted template will not be affected."`
}
func (DeleteTemplate) response() interface{} {
return new(AsyncJobResult)
}
func (DeleteTemplate) asyncResponse() interface{} {
return new(booleanResponse)
}
// PrepareTemplate represents a template preparation
type PrepareTemplate struct {
TemplateID *UUID `json:"templateid" doc:"template ID of the template to be prepared in primary storage(s)."`
ZoneID *UUID `json:"zoneid" doc:"zone ID of the template to be prepared in primary storage(s)."`
_ bool `name:"prepareTemplate" description:"load template into primary storage"`
}
func (PrepareTemplate) response() interface{} {
return new(AsyncJobResult)
}
func (PrepareTemplate) asyncResponse() interface{} {
return new(Template)
}
// RegisterTemplate represents a template registration
type RegisterTemplate struct {
Account string `json:"account,omitempty" doc:"an optional accountName. Must be used with domainId."`
Bits int `json:"bits,omitempty" doc:"32 or 64 bits support. 64 by default"`
Checksum string `json:"checksum,omitempty" doc:"the MD5 checksum value of this template"`
Details map[string]string `json:"details,omitempty" doc:"Template details in key/value pairs."`
DisplayText string `json:"displaytext" doc:"the display text of the template. This is usually used for display purposes."`
DomainID *UUID `json:"domainid,omitempty" doc:"an optional domainId. If the account parameter is used, domainId must also be used."`
Format string `json:"format" doc:"the format for the template. Possible values include QCOW2, RAW, and VHD."`
Hypervisor string `json:"hypervisor" doc:"the target hypervisor for the template"`
IsDynamicallyScalable *bool `json:"isdynamicallyscalable,omitempty" doc:"true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory"`
IsExtractable *bool `json:"isextractable,omitempty" doc:"true if the template or its derivatives are extractable; default is false"`
IsFeatured *bool `json:"isfeatured,omitempty" doc:"true if this template is a featured template, false otherwise"`
IsPublic *bool `json:"ispublic,omitempty" doc:"true if the template is available to all accounts; default is true"`
IsRouting *bool `json:"isrouting,omitempty" doc:"true if the template type is routing i.e., if template is used to deploy router"`
IsSystem *bool `json:"issystem,omitempty" doc:"true if the template type is system i.e., if template is used to deploy system VM"`
Name string `json:"name" doc:"the name of the template"`
OsTypeID *UUID `json:"ostypeid" doc:"the ID of the OS Type that best represents the OS of this template."`
PasswordEnabled *bool `json:"passwordenabled,omitempty" doc:"true if the template supports the password reset feature; default is false"`
RequiresHVM *bool `json:"requireshvm,omitempty" doc:"true if this template requires HVM"`
SSHKeyEnabled *bool `json:"sshkeyenabled,omitempty" doc:"true if the template supports the sshkey upload feature; default is false"`
TemplateTag string `json:"templatetag,omitempty" doc:"the tag for this template."`
URL string `json:"url" doc:"the URL of where the template is hosted. Possible URL include http:// and https://"`
ZoneID *UUID `json:"zoneid" doc:"the ID of the zone the template is to be hosted on"`
_ bool `name:"registerTemplate" description:"Registers an existing template into the CloudStack cloud."`
}
func (RegisterTemplate) response() interface{} {
return new(Template)
}
// OSCategory represents an OS category
type OSCategory struct {
ID string `json:"id,omitempty" doc:"the ID of the OS category"`
Name string `json:"name,omitempty" doc:"the name of the OS category"`
}
// ListOSCategories lists the OS categories
type ListOSCategories struct {
ID string `json:"id,omitempty" doc:"list Os category by id"`
Keyword string `json:"keyword,omitempty" doc:"List by keyword"`
Name string `json:"name,omitempty" doc:"list os category by name"`
Page int `json:"page,omitempty"`
PageSize int `json:"pagesize,omitempty"`
_ bool `name:"listOsCategories" description:"Lists all supported OS categories for this cloud."`
}
// ListOSCategoriesResponse represents a list of OS categories
type ListOSCategoriesResponse struct {
Count int `json:"count"`
OSCategory []OSCategory `json:"oscategory"`
}
func (ListOSCategories) response() interface{} {
return new(ListOSCategoriesResponse)
}