123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- package images
- import (
- "fmt"
- "net/url"
- "time"
- "devel.mephi.ru/iacherepanov/openstack-gophercloud"
- "devel.mephi.ru/iacherepanov/openstack-gophercloud/pagination"
- )
- // ListOptsBuilder allows extensions to add additional parameters to the
- // List request.
- type ListOptsBuilder interface {
- ToImageListQuery() (string, error)
- }
- // ListOpts allows the filtering and sorting of paginated collections through
- // the API. Filtering is achieved by passing in struct field values that map to
- // the server attributes you want to see returned. Marker and Limit are used
- // for pagination.
- //
- // http://developer.openstack.org/api-ref-image-v2.html
- type ListOpts struct {
- // ID is the ID of the image.
- // Multiple IDs can be specified by constructing a string
- // such as "in:uuid1,uuid2,uuid3".
- ID string `q:"id"`
- // Integer value for the limit of values to return.
- Limit int `q:"limit"`
- // UUID of the server at which you want to set a marker.
- Marker string `q:"marker"`
- // Name filters on the name of the image.
- // Multiple names can be specified by constructing a string
- // such as "in:name1,name2,name3".
- Name string `q:"name"`
- // Visibility filters on the visibility of the image.
- Visibility ImageVisibility `q:"visibility"`
- // MemberStatus filters on the member status of the image.
- MemberStatus ImageMemberStatus `q:"member_status"`
- // Owner filters on the project ID of the image.
- Owner string `q:"owner"`
- // Status filters on the status of the image.
- // Multiple statuses can be specified by constructing a string
- // such as "in:saving,queued".
- Status ImageStatus `q:"status"`
- // SizeMin filters on the size_min image property.
- SizeMin int64 `q:"size_min"`
- // SizeMax filters on the size_max image property.
- SizeMax int64 `q:"size_max"`
- // Sort sorts the results using the new style of sorting. See the OpenStack
- // Image API reference for the exact syntax.
- //
- // Sort cannot be used with the classic sort options (sort_key and sort_dir).
- Sort string `q:"sort"`
- // SortKey will sort the results based on a specified image property.
- SortKey string `q:"sort_key"`
- // SortDir will sort the list results either ascending or decending.
- SortDir string `q:"sort_dir"`
- // Tags filters on specific image tags.
- Tags []string `q:"tag"`
- // CreatedAtQuery filters images based on their creation date.
- CreatedAtQuery *ImageDateQuery
- // UpdatedAtQuery filters images based on their updated date.
- UpdatedAtQuery *ImageDateQuery
- // ContainerFormat filters images based on the container_format.
- // Multiple container formats can be specified by constructing a
- // string such as "in:bare,ami".
- ContainerFormat string `q:"container_format"`
- // DiskFormat filters images based on the disk_format.
- // Multiple disk formats can be specified by constructing a string
- // such as "in:qcow2,iso".
- DiskFormat string `q:"disk_format"`
- }
- // ToImageListQuery formats a ListOpts into a query string.
- func (opts ListOpts) ToImageListQuery() (string, error) {
- q, err := gophercloud.BuildQueryString(opts)
- params := q.Query()
- if opts.CreatedAtQuery != nil {
- createdAt := opts.CreatedAtQuery.Date.Format(time.RFC3339)
- if v := opts.CreatedAtQuery.Filter; v != "" {
- createdAt = fmt.Sprintf("%s:%s", v, createdAt)
- }
- params.Add("created_at", createdAt)
- }
- if opts.UpdatedAtQuery != nil {
- updatedAt := opts.UpdatedAtQuery.Date.Format(time.RFC3339)
- if v := opts.UpdatedAtQuery.Filter; v != "" {
- updatedAt = fmt.Sprintf("%s:%s", v, updatedAt)
- }
- params.Add("updated_at", updatedAt)
- }
- q = &url.URL{RawQuery: params.Encode()}
- return q.String(), err
- }
- // List implements image list request.
- func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
- url := listURL(c)
- if opts != nil {
- query, err := opts.ToImageListQuery()
- if err != nil {
- return pagination.Pager{Err: err}
- }
- url += query
- }
- return pagination.NewPager(c, url, func(r pagination.PageResult) pagination.Page {
- return ImagePage{pagination.LinkedPageBase{PageResult: r}}
- })
- }
- // CreateOptsBuilder allows extensions to add parameters to the Create request.
- type CreateOptsBuilder interface {
- // Returns value that can be passed to json.Marshal
- ToImageCreateMap() (map[string]interface{}, error)
- }
- // CreateOpts represents options used to create an image.
- type CreateOpts struct {
- // Name is the name of the new image.
- Name string `json:"name" required:"true"`
- // Id is the the image ID.
- ID string `json:"id,omitempty"`
- // Visibility defines who can see/use the image.
- Visibility *ImageVisibility `json:"visibility,omitempty"`
- // Tags is a set of image tags.
- Tags []string `json:"tags,omitempty"`
- // ContainerFormat is the format of the
- // container. Valid values are ami, ari, aki, bare, and ovf.
- ContainerFormat string `json:"container_format,omitempty"`
- // DiskFormat is the format of the disk. If set,
- // valid values are ami, ari, aki, vhd, vmdk, raw, qcow2, vdi,
- // and iso.
- DiskFormat string `json:"disk_format,omitempty"`
- // MinDisk is the amount of disk space in
- // GB that is required to boot the image.
- MinDisk int `json:"min_disk,omitempty"`
- // MinRAM is the amount of RAM in MB that
- // is required to boot the image.
- MinRAM int `json:"min_ram,omitempty"`
- // protected is whether the image is not deletable.
- Protected *bool `json:"protected,omitempty"`
- // properties is a set of properties, if any, that
- // are associated with the image.
- Properties map[string]string `json:"-"`
- }
- // ToImageCreateMap assembles a request body based on the contents of
- // a CreateOpts.
- func (opts CreateOpts) ToImageCreateMap() (map[string]interface{}, error) {
- b, err := gophercloud.BuildRequestBody(opts, "")
- if err != nil {
- return nil, err
- }
- if opts.Properties != nil {
- for k, v := range opts.Properties {
- b[k] = v
- }
- }
- return b, nil
- }
- // Create implements create image request.
- func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) (r CreateResult) {
- b, err := opts.ToImageCreateMap()
- if err != nil {
- r.Err = err
- return r
- }
- _, r.Err = client.Post(createURL(client), b, &r.Body, &gophercloud.RequestOpts{OkCodes: []int{201}})
- return
- }
- // Delete implements image delete request.
- func Delete(client *gophercloud.ServiceClient, id string) (r DeleteResult) {
- _, r.Err = client.Delete(deleteURL(client, id), nil)
- return
- }
- // Get implements image get request.
- func Get(client *gophercloud.ServiceClient, id string) (r GetResult) {
- _, r.Err = client.Get(getURL(client, id), &r.Body, nil)
- return
- }
- // Update implements image updated request.
- func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) (r UpdateResult) {
- b, err := opts.ToImageUpdateMap()
- if err != nil {
- r.Err = err
- return r
- }
- _, r.Err = client.Patch(updateURL(client, id), b, &r.Body, &gophercloud.RequestOpts{
- OkCodes: []int{200},
- MoreHeaders: map[string]string{"Content-Type": "application/openstack-images-v2.1-json-patch"},
- })
- return
- }
- // UpdateOptsBuilder allows extensions to add additional parameters to the
- // Update request.
- type UpdateOptsBuilder interface {
- // returns value implementing json.Marshaler which when marshaled matches
- // the patch schema:
- // http://specs.openstack.org/openstack/glance-specs/specs/api/v2/http-patch-image-api-v2.html
- ToImageUpdateMap() ([]interface{}, error)
- }
- // UpdateOpts implements UpdateOpts
- type UpdateOpts []Patch
- // ToImageUpdateMap assembles a request body based on the contents of
- // UpdateOpts.
- func (opts UpdateOpts) ToImageUpdateMap() ([]interface{}, error) {
- m := make([]interface{}, len(opts))
- for i, patch := range opts {
- patchJSON := patch.ToImagePatchMap()
- m[i] = patchJSON
- }
- return m, nil
- }
- // Patch represents a single update to an existing image. Multiple updates
- // to an image can be submitted at the same time.
- type Patch interface {
- ToImagePatchMap() map[string]interface{}
- }
- // UpdateVisibility represents an updated visibility property request.
- type UpdateVisibility struct {
- Visibility ImageVisibility
- }
- // ToImagePatchMap assembles a request body based on UpdateVisibility.
- func (u UpdateVisibility) ToImagePatchMap() map[string]interface{} {
- return map[string]interface{}{
- "op": "replace",
- "path": "/visibility",
- "value": u.Visibility,
- }
- }
- // ReplaceImageName represents an updated image_name property request.
- type ReplaceImageName struct {
- NewName string
- }
- // ToImagePatchMap assembles a request body based on ReplaceImageName.
- func (r ReplaceImageName) ToImagePatchMap() map[string]interface{} {
- return map[string]interface{}{
- "op": "replace",
- "path": "/name",
- "value": r.NewName,
- }
- }
- // ReplaceImageChecksum represents an updated checksum property request.
- type ReplaceImageChecksum struct {
- Checksum string
- }
- // ReplaceImageChecksum assembles a request body based on ReplaceImageChecksum.
- func (rc ReplaceImageChecksum) ToImagePatchMap() map[string]interface{} {
- return map[string]interface{}{
- "op": "replace",
- "path": "/checksum",
- "value": rc.Checksum,
- }
- }
- // ReplaceImageTags represents an updated tags property request.
- type ReplaceImageTags struct {
- NewTags []string
- }
- // ToImagePatchMap assembles a request body based on ReplaceImageTags.
- func (r ReplaceImageTags) ToImagePatchMap() map[string]interface{} {
- return map[string]interface{}{
- "op": "replace",
- "path": "/tags",
- "value": r.NewTags,
- }
- }
|