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 disassociate_floating_ip_from_server(self, floating_ip, server_id): """Disassociate the provided floating IP from a specific server""" url = "servers/%s/action" % str(server_id) doc = Document() server = Element("removeFloatingIp") doc.append(server) server.add_attr("address", floating_ip) resp, body = self.post(url, str(doc), self.headers) return resp, body
def rebuild(self, server_id, image_ref, name=None, meta=None, personality=None, adminPass=None, disk_config=None): rebuild = Element("rebuild", xmlns=XMLNS_11, imageRef=image_ref) if name: rebuild.add_attr("name", name) if adminPass: rebuild.add_attr("adminPass", adminPass) if meta: metadata = Element("metadata") rebuild.append(metadata) for k, v in meta.items(): meta = Element("meta", key=k) meta.append(Text(v)) metadata.append(meta) resp, body = self.post('servers/%s/action' % server_id, str(Document(rebuild)), self.headers) server = self._parse_server(etree.fromstring(body)) return resp, server
def create_image(self, server_id, image_name): metadata = element('metadata') image = element('createImage', metadata, xmlns=XMLNS_11, name=image_name) return self.post('servers/%s/action' % server_id, str(Document(image)), self.headers)
def resize(self, server_id, flavor_ref, disk_config=None): resize = Element("resize", xmlns=XMLNS_11, flavorRef=flavor_ref) if disk_config is not None: raise Exception("Sorry, disk_config not supported via XML yet") return self.post('servers/%s/action' % server_id, str(Document(resize)), self.headers)
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 create_server(self, name, image_ref, flavor_ref, **kwargs): """ Creates an instance of a server. name (Required): The name of the server. image_ref (Required): Reference to the image used to build the server. flavor_ref (Required): The flavor used to build the server. Following optional keyword arguments are accepted: adminPass: Sets the initial root password. key_name: Key name of keypair that was created earlier. meta: A dictionary of values to be used as metadata. personality: A list of dictionaries for files to be injected into the server. security_groups: A list of security group dicts. networks: A list of network dicts with UUID and fixed_ip. user_data: User data for instance. availability_zone: Availability zone in which to launch instance. accessIPv4: The IPv4 access address for the server. accessIPv6: The IPv6 access address for the server. min_count: Count of minimum number of instances to launch. max_count: Count of maximum number of instances to launch. disk_config: Determines if user or admin controls disk configuration. """ server = Element("server", xmlns=XMLNS_11, imageRef=image_ref, flavorRef=flavor_ref, name=name) for attr in ["adminPass", "accessIPv4", "accessIPv6", "key_name"]: if attr in kwargs: server.add_attr(attr, kwargs[attr]) if 'meta' in kwargs: metadata = Element("metadata") server.append(metadata) for k, v in kwargs['meta'].items(): meta = Element("meta", key=k) meta.append(Text(v)) metadata.append(meta) if 'personality' in kwargs: personality = Element('personality') server.append(personality) for k in kwargs['personality']: temp = Element('file', path=k['path']) temp.append(Text(k['contents'])) personality.append(temp) resp, body = self.post('servers', str(Document(server)), self.headers) server = self._parse_server(etree.fromstring(body)) return resp, server
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_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 remove_security_group(self, server_id, security_group_name): secgrp = Element('removeSecurityGroup', name=security_group_name) return self.post('servers/%s/action' % server_id, str(Document(secgrp)), self.headers)
def revert_resize(self, server_id): revert = Element('revertResize') return self.post('servers/%s/action' % server_id, str(Document(revert)), self.headers)
def confirm_resize(self, server_id): conf = Element('confirmResize') return self.post('servers/%s/action' % server_id, str(Document(conf)), self.headers)
def reboot(self, server_id, reboot_type): reboot = Element("reboot", xmlns=XMLNS_11, type=reboot_type) return self.post("servers/%s/action" % server_id, str(Document(reboot)), self.headers)
def change_password(self, server_id, password): cpw = Element("changePassword", xmlns=XMLNS_11, adminPass=password) return self.post("servers/%s/action" % server_id, str(Document(cpw)), self.headers)