1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
// The glance package provides a way to access the OpenStack Image Service APIs.
// See http://docs.openstack.org/api/openstack-image-service/2.0/content/.
package glance
import (
"fmt"
"launchpad.net/~gophers/goose/unstable-001/client"
goosehttp "launchpad.net/~gophers/goose/unstable-001/http"
"net/http"
)
const (
apiImages = "/images"
apiImagesDetail = "/images/detail"
)
// Client provides a means to access the OpenStack Image Service.
type Client struct {
client client.Client
}
func New(client client.Client) *Client {
return &Client{client}
}
type Link struct {
Href string
Rel string
Type string
}
type Image struct {
Id string
Name string
Links []Link
}
// ListImages lists IDs, names, and links for available images.
func (c *Client) ListImages() ([]Image, error) {
var resp struct {
Images []Image
}
requestData := goosehttp.RequestData{RespValue: &resp, ExpectedStatus: []int{http.StatusOK}}
err := c.client.SendRequest(client.GET, "compute", apiImages, &requestData,
"failed to get list of images")
if err != nil {
return nil, err
}
return resp.Images, nil
}
type ImageMetadata struct {
Architecture string
State string `json:"image_state"`
Location string `json:"image_location"`
KernelId interface{} `json:"kernel_id"`
ProjectId interface{} `json:"project_id"`
RAMDiskId interface{} `json:"ramdisk_id"`
OwnerId interface{} `json:"owner_id"`
}
type ImageDetail struct {
Id string
Name string
Created string
Updated string
Progress int
Status string
MinimumRAM int `json:"minRam"`
MinimumDisk int `json:"minDisk"`
Links []Link
Metadata ImageMetadata
}
// ListImageDetails lists all details for available images.
func (c *Client) ListImagesDetail() ([]ImageDetail, error) {
var resp struct {
Images []ImageDetail
}
requestData := goosehttp.RequestData{RespValue: &resp}
err := c.client.SendRequest(client.GET, "compute", apiImagesDetail, &requestData,
"failed to get list of images details")
if err != nil {
return nil, err
}
return resp.Images, nil
}
// GetImageDetail lists details of the specified image.
func (c *Client) GetImageDetail(imageId string) (*ImageDetail, error) {
var resp struct {
Image ImageDetail
}
url := fmt.Sprintf("%s/%s", apiImages, imageId)
requestData := goosehttp.RequestData{RespValue: &resp}
err := c.client.SendRequest(client.GET, "compute", url, &requestData,
"failed to get details for imageId=%s", imageId)
if err != nil {
return nil, err
}
return &resp.Image, nil
}
|