33
38
XML_NS_V11 = 'http://docs.openstack.org/compute/api/v1.1'
43
compute_power_state.NOSTATE: 'BUILD',
44
compute_power_state.RUNNING: 'ACTIVE',
45
compute_power_state.BLOCKED: 'ACTIVE',
46
compute_power_state.SUSPENDED: 'SUSPENDED',
47
compute_power_state.PAUSED: 'PAUSED',
48
compute_power_state.SHUTDOWN: 'SHUTDOWN',
49
compute_power_state.SHUTOFF: 'SHUTOFF',
50
compute_power_state.CRASHED: 'ERROR',
51
compute_power_state.FAILED: 'ERROR',
52
compute_power_state.BUILDING: 'BUILD',
56
def status_from_power_state(power_state):
57
"""Map the power state to the server status string"""
58
return _STATUS_MAP[power_state]
61
def power_states_from_status(status):
62
"""Map the server status string to a list of power states"""
64
for power_state, status_map in _STATUS_MAP.iteritems():
65
# Skip the 'None' state
66
if power_state is None:
68
if status.lower() == status_map.lower():
69
power_states.append(power_state)
36
73
def get_pagination_params(request):
37
74
"""Return marker, limit tuple from request.
151
195
Returns: 'http://www.nova.com'
155
#removes the first instance that matches /v#.#/
156
new_href = re.sub(r'[/][v][0-9]+\.[0-9]+[/]', '/', href, count=1)
158
#if no version was found, try finding /v#.# at the end of the string
160
new_href = re.sub(r'[/][v][0-9]+\.[0-9]+$', '', href, count=1)
162
LOG.debug(_("Error removing version from href: %s") % href)
163
msg = _('could not parse version from href')
164
raise ValueError(msg)
167
msg = _('href does not contain version')
168
raise ValueError(msg)
198
parsed_url = urlparse.urlsplit(href)
199
new_path = re.sub(r'^/v[0-9]+\.[0-9]+(/|$)', r'\1', parsed_url.path,
202
if new_path == parsed_url.path:
203
msg = _('href %s does not contain version') % href
205
raise ValueError(msg)
207
parsed_url = list(parsed_url)
208
parsed_url[2] = new_path
209
return urlparse.urlunsplit(parsed_url)
172
212
def get_version_from_href(href):
192
232
except IndexError:
237
def check_img_metadata_quota_limit(context, metadata):
240
num_metadata = len(metadata)
241
quota_metadata = quota.allowed_metadata_items(context, num_metadata)
242
if quota_metadata < num_metadata:
243
expl = _("Image metadata limit exceeded")
244
raise webob.exc.HTTPRequestEntityTooLarge(explanation=expl,
245
headers={'Retry-After': 0})
248
class MetadataXMLDeserializer(wsgi.XMLDeserializer):
250
def extract_metadata(self, metadata_node):
251
"""Marshal the metadata attribute of a parsed request"""
252
if metadata_node is None:
255
for meta_node in self.find_children_named(metadata_node, "meta"):
256
key = meta_node.getAttribute("key")
257
metadata[key] = self.extract_text(meta_node)
260
def _extract_metadata_container(self, datastring):
261
dom = minidom.parseString(datastring)
262
metadata_node = self.find_first_child_named(dom, "metadata")
263
metadata = self.extract_metadata(metadata_node)
264
return {'body': {'metadata': metadata}}
266
def create(self, datastring):
267
return self._extract_metadata_container(datastring)
269
def update_all(self, datastring):
270
return self._extract_metadata_container(datastring)
272
def update(self, datastring):
273
dom = minidom.parseString(datastring)
274
metadata_item = self.extract_metadata(dom)
275
return {'body': {'meta': metadata_item}}
278
class MetadataHeadersSerializer(wsgi.ResponseHeadersSerializer):
280
def delete(self, response, data):
281
response.status_int = 204
284
class MetadataXMLSerializer(wsgi.XMLDictSerializer):
285
def __init__(self, xmlns=wsgi.XMLNS_V11):
286
super(MetadataXMLSerializer, self).__init__(xmlns=xmlns)
288
def _meta_item_to_xml(self, doc, key, value):
289
node = doc.createElement('meta')
290
doc.appendChild(node)
291
node.setAttribute('key', '%s' % key)
292
text = doc.createTextNode('%s' % value)
293
node.appendChild(text)
296
def meta_list_to_xml(self, xml_doc, meta_items):
297
container_node = xml_doc.createElement('metadata')
298
for (key, value) in meta_items:
299
item_node = self._meta_item_to_xml(xml_doc, key, value)
300
container_node.appendChild(item_node)
301
return container_node
303
def _meta_list_to_xml_string(self, metadata_dict):
304
xml_doc = minidom.Document()
305
items = metadata_dict['metadata'].items()
306
container_node = self.meta_list_to_xml(xml_doc, items)
307
xml_doc.appendChild(container_node)
308
self._add_xmlns(container_node)
309
return xml_doc.toxml('UTF-8')
311
def index(self, metadata_dict):
312
return self._meta_list_to_xml_string(metadata_dict)
314
def create(self, metadata_dict):
315
return self._meta_list_to_xml_string(metadata_dict)
317
def update_all(self, metadata_dict):
318
return self._meta_list_to_xml_string(metadata_dict)
320
def _meta_item_to_xml_string(self, meta_item_dict):
321
xml_doc = minidom.Document()
322
item_key, item_value = meta_item_dict.items()[0]
323
item_node = self._meta_item_to_xml(xml_doc, item_key, item_value)
324
xml_doc.appendChild(item_node)
325
self._add_xmlns(item_node)
326
return xml_doc.toxml('UTF-8')
328
def show(self, meta_item_dict):
329
return self._meta_item_to_xml_string(meta_item_dict['meta'])
331
def update(self, meta_item_dict):
332
return self._meta_item_to_xml_string(meta_item_dict['meta'])
334
def default(self, *args, **kwargs):
338
def check_snapshots_enabled(f):
340
def inner(*args, **kwargs):
341
if not FLAGS.allow_instance_snapshots:
342
LOG.warn(_('Rejecting snapshot request, snapshots currently'
344
msg = _("Instance snapshots are not permitted at this time.")
345
raise webob.exc.HTTPBadRequest(explanation=msg)
346
return f(*args, **kwargs)