def update_server(self, server_id, name=None, meta=None, accessIPv4=None, accessIPv6=None): doc = Document() server = Element("server") doc.append(server) if name: server.add_attr("name", name) if accessIPv4: server.add_attr("accessIPv4", accessIPv4) if accessIPv6: server.add_attr("accessIPv6", accessIPv6) if meta: metadata = Element("metadata") server.append(metadata) for k, v in meta: meta = Element("meta", key=k) meta.append(Text(v)) metadata.append(meta) resp, body = self.put('servers/%s' % str(server_id), str(doc), self.headers) return resp, xml_to_json(etree.fromstring(body))
def set_image_metadata(self, image_id, meta): """Sets the metadata for an image""" post_body = json.dumps({'metadata': meta}) resp, body = self.put('images/%s/metadata' % str(image_id), post_body, self.headers) body = xml_to_json(etree.fromstring(body)) return resp, body['metadata']
def set_image_metadata_item(self, image_id, key, meta): """Sets the value for a specific image metadata key""" post_body = json.dumps({'meta': meta}) resp, body = self.put('images/%s/metadata/%s' % (str(image_id), key), post_body, self.headers) body = xml_to_json(etree.fromstring(body)) return resp, body['meta']
def create_volume(self, size, display_name=None, metadata=None): """Creates a new Volume. :param size: Size of volume in GB. (Required) :param display_name: Optional Volume Name. :param metadata: An optional dictionary of values for metadata. """ volume = Element("volume", xmlns=XMLNS_11, size=size) if display_name: volume.add_attr('display_name', display_name) if metadata: _metadata = Element('metadata') volume.append(_metadata) for key, value in metadata.items(): meta = Element('meta') meta.add_attr('key', key) meta.append(Text(value)) _metadata.append(meta) resp, body = self.post('os-volumes', str(Document(volume)), self.headers) body = xml_to_json(etree.fromstring(body)) return resp, body
def _parse_links(self, node, json): """Append multiple links under a list""" # look for links if 'link' in json: # remove single link element del json['link'] json['links'] = [xml_to_json(x) for x in node.findall('{http://www.w3.org/2005/Atom}link')] return json
def list_images(self, params=None): """Returns a list of all images filtered by any parameters""" url = 'images' if params: param_list = urllib.urlencode(params) url += "?" + param_list resp, body = self.get(url, self.headers) body = xml_to_json(etree.fromstring(body)) return resp, body['images']
def list_images_with_detail(self, params=None): """Returns a detailed list of images filtered by any parameters""" url = 'images/detail' if params: param_list = urllib.urlencode(params) url = "images/detail?" + param_list resp, body = self.get(url, self.headers) body = xml_to_json(etree.fromstring(body)) return resp, body['images']
def _parse_volume(self, body): vol = dict((attr, body.get(attr)) for attr in body.keys()) for child in body.getchildren(): tag = child.tag if tag.startswith("{"): ns, tag = tag.split("}", 1) if tag == 'metadata': vol['metadata'] = dict((meta.get('key'), meta.text) for meta in list(child)) else: vol[tag] = xml_to_json(child) return vol
def update_image_metadata(self, image_id, meta): """Updates the metadata for an image""" post_body = Element('metadata', meta) for k, v in meta: metadata = Element('meta', key=k) text = Text(v) metadata.append(text) post_body.append(metadata) resp, body = self.post('images/%s/metadata' % str(image_id), post_body, self.headers) body = xml_to_json(etree.fromstring(body)) return resp, body['metadata']
def _parse_volume(self, body): vol = dict((attr, body.get(attr)) for attr in body.keys()) for child in body.getchildren(): tag = child.tag if tag.startswith("{"): ns, tag = tag.split("}", 1) if tag == 'metadata': vol['metadata'] = dict( (meta.get('key'), meta.text) for meta in list(child)) else: vol[tag] = xml_to_json(child) return vol
def _parse_server(self, body): json = xml_to_json(body) if 'metadata' in json and json['metadata']: # NOTE(danms): if there was metadata, we need to re-parse # that as a special type metadata_tag = body.find('{%s}metadata' % XMLNS_11) json["metadata"] = self._parse_key_value(metadata_tag) if 'link' in json: self._parse_links(body, json) for sub in ['image', 'flavor']: if sub in json and 'link' in json[sub]: self._parse_links(body, json[sub]) return json
def _parse_image(self, node): """Parses detailed XML image information into dictionary""" json = xml_to_json(node) self._parse_links(node, json) # parse all metadata if 'metadata' in json: tag = node.find('{%s}metadata' % XMLNS_11) json['metadata'] = dict((x.get('key'), x.text) for x in tag.getchildren()) # parse server information if 'server' in json: tag = node.find('{%s}server' % XMLNS_11) json['server'] = self._parse_server(tag) return json
def create_flavor(self, name, ram, vcpus, disk, ephemeral, flavor_id, swap, rxtx): """Creates a new flavor or instance type""" flavor = Element("flavor", xmlns=XMLNS_11, ram=ram, vcpus=vcpus, disk=disk, id=flavor_id, swap=swap, rxtx_factor=rxtx, name=name) flavor.add_attr('xmlns:OS-FLV-EXT-DATA', XMLNS_OS_FLV_EXT_DATA) flavor.add_attr('OS-FLV-EXT-DATA:ephemeral', ephemeral) resp, body = self.post('flavors', str(Document(flavor)), self.headers) body = xml_to_json(etree.fromstring(body)) flavor = self._format_flavor(body) return resp, flavor
def create_keypair(self, name, pub_key=None): doc = Document() keypair_element = Element("keypair") if pub_key: public_key_element = Element("public_key") public_key_text = Text(pub_key) public_key_element.append(public_key_text) keypair_element.append(public_key_element) name_element = Element("name") name_text = Text(name) name_element.append(name_text) keypair_element.append(name_element) doc.append(keypair_element) resp, body = self.post("os-keypairs", headers=self.headers, body=str(doc)) body = xml_to_json(etree.fromstring(body)) return resp, body
def list_image_metadata(self, image_id): """Lists all metadata items for an image""" resp, body = self.get("images/%s/metadata" % str(image_id), self.headers) body = xml_to_json(etree.fromstring(body)) return resp, body['metadata']
def _parse_array(self, node): array = [] for child in node.getchildren(): array.append(xml_to_json(child)) return array
def get_image_metadata_item(self, image_id, key): """Returns the value for a specific image metadata key""" resp, body = self.get("images/%s/metadata/%s.xml" % (str(image_id), key), self.headers) body = xml_to_json(etree.fromstring(body)) return resp, body['meta']
def _parse_links(self, node, json): del json['link'] json['links'] = [] for linknode in node.findall('{http://www.w3.org/2005/Atom}link'): json['links'].append(xml_to_json(linknode))
def get_flavor_details(self, flavor_id): resp, body = self.get("flavors/%s" % str(flavor_id), self.headers) body = xml_to_json(etree.fromstring(body)) flavor = self._format_flavor(body) return resp, flavor
def get_keypair(self, key_name): resp, body = self.get("os-keypairs/%s" % str(key_name), self.headers) body = xml_to_json(etree.fromstring(body)) return resp, body
def list_keypairs(self): resp, body = self.get("os-keypairs", self.headers) node = etree.fromstring(body) body = [{"keypair": xml_to_json(x)} for x in node.getchildren()] return resp, body
def _parse_body(self, body): json = xml_to_json(body) return json
def _parse_resp(self, body): return xml_to_json(etree.fromstring(body))
def _parse_floating_ip(self, body): json = xml_to_json(body) return json
def _parse_array(self, node): return [self._format_flavor(xml_to_json(x)) for x in node]
def _parse_server(self, node): json = xml_to_json(node) return self._parse_links(node, json)
def list_keypairs(self): resp, body = self.get("os-keypairs", self.headers) node = etree.fromstring(body) body = [{'keypair': xml_to_json(x)} for x in node.getchildren()] return resp, body