Revision 8614814c kamaki/clients/compute.py
b/kamaki/clients/compute.py | ||
---|---|---|
36 | 36 |
|
37 | 37 |
class ComputeClient(Client): |
38 | 38 |
"""OpenStack Compute API 1.1 client""" |
39 |
|
|
39 |
|
|
40 | 40 |
def raise_for_status(self, r): |
41 | 41 |
d = r.json |
42 | 42 |
if not d: |
... | ... | |
46 | 46 |
message = '%s: %s' % (key, val.get('message', '')) |
47 | 47 |
details = val.get('details', '') |
48 | 48 |
raise ClientError(message, r.status_code, details) |
49 |
|
|
49 |
|
|
50 | 50 |
def list_servers(self, detail=False): |
51 | 51 |
"""List servers, returned detailed output if detailed is True""" |
52 |
|
|
52 |
|
|
53 | 53 |
path = '/servers/detail' if detail else '/servers' |
54 | 54 |
r = self.get(path, success=200) |
55 | 55 |
return r.json['servers']['values'] |
56 |
|
|
56 |
|
|
57 | 57 |
def get_server_details(self, server_id): |
58 | 58 |
"""Return detailed output on a server specified by its id""" |
59 |
|
|
59 |
|
|
60 | 60 |
path = '/servers/%s' % (server_id,) |
61 | 61 |
r = self.get(path, success=200) |
62 | 62 |
return r.json['server'] |
63 |
|
|
63 |
|
|
64 | 64 |
def create_server(self, name, flavor_id, image_id, personality=None): |
65 | 65 |
"""Submit request to create a new server |
66 | 66 |
|
... | ... | |
78 | 78 |
'imageRef': image_id}} |
79 | 79 |
if personality: |
80 | 80 |
req['server']['personality'] = personality |
81 |
|
|
81 |
|
|
82 | 82 |
r = self.post('/servers', json=req, success=202) |
83 | 83 |
return r.json['server'] |
84 |
|
|
84 |
|
|
85 | 85 |
def update_server_name(self, server_id, new_name): |
86 | 86 |
"""Update the name of the server as reported by the API. |
87 | 87 |
|
... | ... | |
91 | 91 |
path = '/servers/%s' % (server_id,) |
92 | 92 |
req = {'server': {'name': new_name}} |
93 | 93 |
self.put(path, json=req, success=204) |
94 |
|
|
94 |
|
|
95 | 95 |
def delete_server(self, server_id): |
96 | 96 |
"""Submit a deletion request for a server specified by id""" |
97 |
|
|
97 |
|
|
98 | 98 |
path = '/servers/%s' % (server_id,) |
99 | 99 |
self.delete(path, success=204) |
100 |
|
|
100 |
|
|
101 | 101 |
def reboot_server(self, server_id, hard=False): |
102 | 102 |
"""Submit a reboot request for a server specified by id""" |
103 |
|
|
103 |
|
|
104 | 104 |
path = '/servers/%s/action' % (server_id,) |
105 | 105 |
type = 'HARD' if hard else 'SOFT' |
106 | 106 |
req = {'reboot': {'type': type}} |
107 | 107 |
self.post(path, json=req, success=202) |
108 |
|
|
108 |
|
|
109 | 109 |
def get_server_metadata(self, server_id, key=None): |
110 | 110 |
path = '/servers/%s/meta' % (server_id,) |
111 | 111 |
if key: |
112 | 112 |
path += '/%s' % key |
113 | 113 |
r = self.get(path, success=200) |
114 | 114 |
return r.json['meta'] if key else r.json['metadata']['values'] |
115 |
|
|
115 |
|
|
116 | 116 |
def create_server_metadata(self, server_id, key, val): |
117 | 117 |
path = '/servers/%d/meta/%s' % (server_id, key) |
118 | 118 |
req = {'meta': {key: val}} |
119 | 119 |
r = self.put(path, json=req, success=201) |
120 | 120 |
return r.json['meta'] |
121 |
|
|
121 |
|
|
122 | 122 |
def update_server_metadata(self, server_id, **metadata): |
123 | 123 |
path = '/servers/%d/meta' % (server_id,) |
124 | 124 |
req = {'metadata': metadata} |
125 | 125 |
r = self.post(path, json=req, success=201) |
126 | 126 |
return r.json['metadata'] |
127 |
|
|
127 |
|
|
128 | 128 |
def delete_server_metadata(self, server_id, key): |
129 | 129 |
path = '/servers/%d/meta/%s' % (server_id, key) |
130 | 130 |
self.delete(path, success=204) |
131 |
|
|
132 |
|
|
131 |
|
|
133 | 132 |
def list_flavors(self, detail=False): |
134 | 133 |
path = '/flavors/detail' if detail else '/flavors' |
135 | 134 |
r = self.get(path, success=200) |
... | ... | |
139 | 138 |
path = '/flavors/%d' % flavor_id |
140 | 139 |
r = self.get(path, success=200) |
141 | 140 |
return r.json['flavor'] |
142 |
|
|
143 |
|
|
141 |
|
|
144 | 142 |
def list_images(self, detail=False): |
145 | 143 |
path = '/images/detail' if detail else '/images' |
146 | 144 |
r = self.get(path, success=200) |
147 | 145 |
return r.json['images']['values'] |
148 |
|
|
146 |
|
|
149 | 147 |
def get_image_details(self, image_id): |
150 | 148 |
path = '/images/%s' % (image_id,) |
151 | 149 |
r = self.get(path, success=200) |
152 | 150 |
return r.json['image'] |
153 |
|
|
151 |
|
|
154 | 152 |
def delete_image(self, image_id): |
155 | 153 |
path = '/images/%s' % (image_id,) |
156 | 154 |
self.delete(path, success=204) |
... | ... | |
161 | 159 |
path += '/%s' % key |
162 | 160 |
r = self.get(path, success=200) |
163 | 161 |
return r.json['meta'] if key else r.json['metadata']['values'] |
164 |
|
|
162 |
|
|
165 | 163 |
def create_image_metadata(self, image_id, key, val): |
166 | 164 |
path = '/images/%s/meta/%s' % (image_id, key) |
167 | 165 |
req = {'meta': {key: val}} |
Also available in: Unified diff