def from_creation_request_json(cls, collection, creation_json, ipsegment=lambda: randrange(255)): """ Create a :obj:`Server` from a JSON-serializable object that would be in the body of a create server request. """ now = collection.clock.seconds() server_json = creation_json['server'] self = cls( collection=collection, server_name=server_json['name'], server_id=('test-server{0}-id-{0}' .format(str(randrange(9999999999)))), metadata=server_json.get("metadata") or {}, creation_time=now, update_time=now, private_ips=[ IPv4Address(address="10.180.{0}.{1}" .format(ipsegment(), ipsegment())), ], public_ips=[ IPv4Address(address="198.101.241.{0}".format(ipsegment())), IPv6Address(address="2001:4800:780e:0510:d87b:9cbc:ff04:513a") ], creation_request_json=creation_json, flavor_ref=server_json['flavorRef'], image_ref=server_json['imageRef'] or '', disk_config="AUTO", # ^ TODO: https://github.com/rackerlabs/mimic/issues/163 status="ACTIVE", admin_password=random_string(12), ) collection.servers.append(self) return self
def test_selectable(self): """ When passing a custom selectable, the results should derive only from the characters you provide. """ desired_chars = "02468" for iteration in xrange(100): a_string = helper.random_string(1024, selectable=desired_chars) for char in a_string: self.assertTrue(char in desired_chars)
def from_creation_request_json(cls, collection, creation_json, ipsegment=lambda: randrange(255), max_metadata_items=40): """ Create a :obj:`Server` from a JSON-serializable object that would be in the body of a create server request. """ now = collection.clock.seconds() server_json = creation_json['server'] disk_config = server_json.get('OS-DCF:diskConfig', None) or "AUTO" if disk_config not in ["AUTO", "MANUAL"]: raise BadRequestError(nova_message=( "OS-DCF:diskConfig must be either 'MANUAL' or 'AUTO'.")) metadata = server_json.get("metadata") or {} cls.validate_metadata(metadata, max_metadata_items) while True: private_ip = IPv4Address( address="10.180.{0}.{1}".format(ipsegment(), ipsegment())) if private_ip not in [ addr for server in collection.servers for addr in server.private_ips ]: break self = cls( collection=collection, server_name=server_json['name'], server_id=('test-server{0}-id-{0}'.format( str(randrange(9999999999)))), metadata=metadata, creation_time=now, update_time=now, private_ips=[private_ip], public_ips=[ IPv4Address(address="198.101.241.{0}".format(ipsegment())), IPv6Address(address="2001:4800:780e:0510:d87b:9cbc:ff04:513a") ], key_name=None if 'key_name' not in server_json else server_json['key_name'], creation_request_json=creation_json, flavor_ref=server_json['flavorRef'], image_ref=server_json['imageRef'] or '', disk_config=disk_config, status="ACTIVE", admin_password=random_string(12), max_metadata_items=max_metadata_items) collection.servers.append(self) return self
def _get_default_data(self): """ Gets the default data point. This data point may be overridden by setting the override value. """ if self.type == METRIC_TYPE_INTEGER: return random.randint(0, 100000) elif self.type == METRIC_TYPE_NUMBER: if self.unit == 'percent': return random.uniform(0, 100) else: return random.uniform(0, 100000) elif self.type == METRIC_TYPE_STRING: return random_string(random.randint(12, 30), selectable=(string.letters + string.digits)) raise ValueError('No default data getter for type {0}!'.format(self.type))
def from_creation_request_json(cls, collection, creation_json, ipsegment=lambda: randrange(255), max_metadata_items=40): """ Create a :obj:`Server` from a JSON-serializable object that would be in the body of a create server request. """ now = collection.clock.seconds() server_json = creation_json['server'] disk_config = server_json.get('OS-DCF:diskConfig', None) or "AUTO" if disk_config not in ["AUTO", "MANUAL"]: raise BadRequestError(nova_message=( "OS-DCF:diskConfig must be either 'MANUAL' or 'AUTO'.")) metadata = server_json.get("metadata") or {} cls.validate_metadata(metadata, max_metadata_items) while True: private_ip = IPv4Address( address="10.180.{0}.{1}".format(ipsegment(), ipsegment())) if private_ip not in [addr for server in collection.servers for addr in server.private_ips]: break self = cls( collection=collection, server_name=server_json['name'], server_id=('test-server{0}-id-{0}' .format(str(randrange(9999999999)))), metadata=metadata, creation_time=now, update_time=now, private_ips=[private_ip], public_ips=[ IPv4Address(address="198.101.241.{0}".format(ipsegment())), IPv6Address(address="2001:4800:780e:0510:d87b:9cbc:ff04:513a") ], key_name=None if 'key_name' not in server_json else server_json['key_name'], creation_request_json=creation_json, flavor_ref=server_json['flavorRef'], image_ref=server_json['imageRef'] or '', disk_config=disk_config, status="ACTIVE", admin_password=random_string(12), max_metadata_items=max_metadata_items ) collection.servers.append(self) return self
def _get_default_data(self): """ Gets the default data point. This data point may be overridden by setting the override value. """ if self.type == METRIC_TYPE_INTEGER: return random.randint(0, 100000) elif self.type == METRIC_TYPE_NUMBER: if self.unit == 'percent': return random.uniform(0, 100) else: return random.uniform(0, 100000) elif self.type == METRIC_TYPE_STRING: return random_string(random.randint(12, 30), selectable=( string.ascii_letters + string.digits)) raise ValueError('No default data getter for type {0}!'.format(self.type))
def test_length(self): """ The random string you generate should have the length you specify. """ for l in range(100): self.assertEqual(len(helper.random_string(l)), l)
def request_action(self, http_action_request, server_id, absolutize_url): """ Perform the requested action on the provided server """ server = self.server_by_id(server_id) if server is None: return dumps(not_found("Instance " + server_id + " could not be found", http_action_request)) action_json = loads(http_action_request.content.read()) if "resize" in action_json: flavor = action_json["resize"].get("flavorRef") if not flavor: return dumps(bad_request("Resize requests require 'flavorRef' attribute", http_action_request)) server.status = "VERIFY_RESIZE" server.oldFlavor = server.flavor_ref server.flavor_ref = flavor http_action_request.setResponseCode(202) return b"" elif "confirmResize" in action_json or "revertResize" in action_json: if server.status == "VERIFY_RESIZE" and "confirmResize" in action_json: server.status = "ACTIVE" http_action_request.setResponseCode(204) return b"" elif server.status == "VERIFY_RESIZE" and "revertResize" in action_json: server.status = "ACTIVE" server.flavor_ref = server.oldFlavor http_action_request.setResponseCode(202) return b"" else: return dumps( conflicting( "Cannot '" + action_json.keys()[0] + "' instance " + server_id + " while it is in vm_state active", http_action_request, ) ) elif "rescue" in action_json: if server.status != "ACTIVE": return dumps( conflicting( "Cannot 'rescue' instance " + server_id + " while it is in task state other than active", http_action_request, ) ) else: server.status = "RESCUE" http_action_request.setResponseCode(200) password = random_string(12) return dumps({"adminPass": password}) elif "unrescue" in action_json: if server.status == "RESCUE": server.status = "ACTIVE" http_action_request.setResponseCode(200) return b"" else: return dumps( conflicting( "Cannot 'unrescue' instance " + server_id + " while it is in task state other than rescue", http_action_request, ) ) elif "reboot" in action_json: reboot_type = action_json["reboot"].get("type") if not reboot_type: return dumps(bad_request("Missing argument 'type' for reboot", http_action_request)) if reboot_type == "HARD": server.status = "HARD_REBOOT" http_action_request.setResponseCode(202) server.collection.clock.callLater(6.0, server.update_status, u"ACTIVE") return b"" elif reboot_type == "SOFT": server.status = "REBOOT" http_action_request.setResponseCode(202) server.collection.clock.callLater(3.0, server.update_status, u"ACTIVE") return b"" else: return dumps(bad_request("Argument 'type' for reboot is not HARD or SOFT", http_action_request)) elif "changePassword" in action_json: password = action_json["changePassword"].get("adminPass") if not password: return dumps(bad_request("No adminPass was specified", http_action_request)) if server.status == "ACTIVE": http_action_request.setResponseCode(202) return b"" else: return dumps( conflicting( "Cannot 'changePassword' instance " + server_id + " while it is in task state other than active", http_action_request, ) ) elif "rebuild" in action_json: image_ref = action_json["rebuild"].get("imageRef") if not image_ref: return dumps(bad_request("Could not parse imageRef from request.", http_action_request)) if server.status == "ACTIVE": server.image_ref = image_ref server.status = "REBUILD" http_action_request.setResponseCode(202) server.collection.clock.callLater(5.0, server.update_status, u"ACTIVE") server_details = server.detail_json(absolutize_url) server_details["adminPass"] = "******" return dumps({"server": server_details}) else: return dumps( conflicting( "Cannot 'rebuild' instance " + server_id + " while it is in task state other than active", http_action_request, ) ) else: return dumps(bad_request("There is no such action currently supported", http_action_request))
def request_action(self, http_action_request, server_id, absolutize_url, regional_image_collection, image_store): """ Perform the requested action on the provided server """ server = self.server_by_id(server_id) if server is None: return dumps(not_found("Instance " + server_id + " could not be found", http_action_request)) action_json = json_from_request(http_action_request) if 'resize' in action_json: flavor = action_json['resize'].get('flavorRef') if not flavor: return dumps(bad_request("Resize requests require 'flavorRef' attribute", http_action_request)) server.status = 'VERIFY_RESIZE' server.oldFlavor = server.flavor_ref server.flavor_ref = flavor http_action_request.setResponseCode(202) return b'' elif 'confirmResize' in action_json or 'revertResize' in action_json: if server.status == 'VERIFY_RESIZE' and 'confirmResize' in action_json: server.status = 'ACTIVE' http_action_request.setResponseCode(204) return b'' elif server.status == 'VERIFY_RESIZE' and 'revertResize' in action_json: server.status = 'ACTIVE' server.flavor_ref = server.oldFlavor http_action_request.setResponseCode(202) return b'' else: return dumps(conflicting( "Cannot '" + list(action_json.keys())[0] + "' instance " + server_id + " while it is in vm_state active", http_action_request) ) elif 'rescue' in action_json: if server.status != 'ACTIVE': return dumps(conflicting("Cannot 'rescue' instance " + server_id + " while it is in task state other than active", http_action_request)) else: server.status = 'RESCUE' http_action_request.setResponseCode(200) password = random_string(12) return dumps({"adminPass": password}) elif 'unrescue' in action_json: if server.status == 'RESCUE': server.status = 'ACTIVE' http_action_request.setResponseCode(200) return b'' else: return dumps(conflicting("Cannot 'unrescue' instance " + server_id + " while it is in task state other than rescue", http_action_request)) elif 'reboot' in action_json: reboot_type = action_json['reboot'].get('type') if not reboot_type: return dumps(bad_request("Missing argument 'type' for reboot", http_action_request)) if reboot_type == 'HARD': server.status = 'HARD_REBOOT' http_action_request.setResponseCode(202) server.collection.clock.callLater( 6.0, server.update_status, u"ACTIVE") return b'' elif reboot_type == 'SOFT': server.status = 'REBOOT' http_action_request.setResponseCode(202) server.collection.clock.callLater( 3.0, server.update_status, u"ACTIVE") return b'' else: return dumps(bad_request("Argument 'type' for reboot is not HARD or SOFT", http_action_request)) elif 'changePassword' in action_json: password = action_json['changePassword'].get('adminPass') if not password: return dumps(bad_request("No adminPass was specified", http_action_request)) if server.status == 'ACTIVE': http_action_request.setResponseCode(202) return b'' else: return dumps(conflicting("Cannot 'changePassword' instance " + server_id + " while it is in task state other than active", http_action_request)) elif 'rebuild' in action_json: image_ref = action_json['rebuild'].get('imageRef') if not image_ref: return dumps(bad_request("Could not parse imageRef from request.", http_action_request)) if server.status == 'ACTIVE': server.image_ref = image_ref server.status = 'REBUILD' http_action_request.setResponseCode(202) server.collection.clock.callLater( 5.0, server.update_status, u"ACTIVE") server_details = server.detail_json(absolutize_url) server_details['adminPass'] = '******' return dumps({"server": server_details}) else: return dumps(conflicting("Cannot 'rebuild' instance " + server_id + " while it is in task state other than active", http_action_request)) elif 'createImage' in action_json: image_name = action_json['createImage'].get('name') server == self.server_by_id(server_id) links = server.links_json(absolutize_url) server_id = server.server_id image_ref = server.image_ref image = image_store.get_image_by_id(image_ref) image_json = regional_image_collection.get_image(http_action_request, image_ref, absolutize_url) image_dict = loads(image_json) flavor_classes = image_dict['image']['metadata']['flavor_classes'] os_type = image_dict['image']['metadata']['os_type'] os_distro = image_dict['image']['metadata']['org.openstack__1__os_distro'] vm_mode = image_dict['image']['metadata']['vm_mode'] disk_config = image_dict['image']['metadata']['auto_disk_config'] image_id = text_type(uuid.uuid4()) image_size = image.image_size minRam = image.minRam minDisk = image.minDisk saved_image = RackspaceSavedImage(image_id=image_id, tenant_id=self.tenant_id, image_size=image_size, name=image_name, minRam=minRam, minDisk=minDisk, links=links, server_id=server_id, flavor_classes=flavor_classes, os_type=os_type, os_distro=os_distro, vm_mode=vm_mode, disk_config=disk_config) image_store.add_image_to_store(saved_image) http_action_request.setHeader(b"Location", b"www.someurl.com") http_action_request.setResponseCode(202) return b'' else: return dumps(bad_request("There is no such action currently supported", http_action_request))
def request_action(self, http_action_request, server_id, absolutize_url): """ Perform the requested action on the provided server """ server = self.server_by_id(server_id) if server is None: return dumps(not_found("Instance " + server_id + " could not be found", http_action_request)) action_json = loads(http_action_request.content.read()) if 'resize' in action_json: flavor = action_json['resize'].get('flavorRef') if not flavor: return dumps(bad_request("Resize requests require 'flavorRef' attribute", http_action_request)) server.status = 'VERIFY_RESIZE' server.oldFlavor = server.flavor_ref server.flavor_ref = flavor http_action_request.setResponseCode(202) return b'' elif 'confirmResize' in action_json or 'revertResize' in action_json: if server.status == 'VERIFY_RESIZE' and 'confirmResize' in action_json: server.status = 'ACTIVE' http_action_request.setResponseCode(204) return b'' elif server.status == 'VERIFY_RESIZE' and 'revertResize' in action_json: server.status = 'ACTIVE' server.flavor_ref = server.oldFlavor http_action_request.setResponseCode(202) return b'' else: return dumps(conflicting("Cannot '" + action_json.keys()[0] + "' instance " + server_id + " while it is in vm_state active", http_action_request)) elif 'rescue' in action_json: if server.status != 'ACTIVE': return dumps(conflicting("Cannot 'rescue' instance " + server_id + " while it is in task state other than active", http_action_request)) else: server.status = 'RESCUE' http_action_request.setResponseCode(200) password = random_string(12) return dumps({"adminPass": password}) elif 'unrescue' in action_json: if server.status == 'RESCUE': server.status = 'ACTIVE' http_action_request.setResponseCode(200) return b'' else: return dumps(conflicting("Cannot 'unrescue' instance " + server_id + " while it is in task state other than rescue", http_action_request)) elif 'reboot' in action_json: reboot_type = action_json['reboot'].get('type') if not reboot_type: return dumps(bad_request("Missing argument 'type' for reboot", http_action_request)) if reboot_type == 'HARD': server.status = 'HARD_REBOOT' http_action_request.setResponseCode(202) server.collection.clock.callLater( 6.0, server.update_status, u"ACTIVE") return b'' elif reboot_type == 'SOFT': server.status = 'REBOOT' http_action_request.setResponseCode(202) server.collection.clock.callLater( 3.0, server.update_status, u"ACTIVE") return b'' else: return dumps(bad_request("Argument 'type' for reboot is not HARD or SOFT", http_action_request)) elif 'changePassword' in action_json: password = action_json['changePassword'].get('adminPass') if not password: return dumps(bad_request("No adminPass was specified", http_action_request)) if server.status == 'ACTIVE': http_action_request.setResponseCode(202) return b'' else: return dumps(conflicting("Cannot 'changePassword' instance " + server_id + " while it is in task state other than active", http_action_request)) elif 'rebuild' in action_json: image_ref = action_json['rebuild'].get('imageRef') if not image_ref: return dumps(bad_request("Could not parse imageRef from request.", http_action_request)) if server.status == 'ACTIVE': server.image_ref = image_ref server.status = 'REBUILD' http_action_request.setResponseCode(202) server.collection.clock.callLater( 5.0, server.update_status, u"ACTIVE") server_details = server.detail_json(absolutize_url) server_details['adminPass'] = '******' return dumps({"server": server_details}) else: return dumps(conflicting("Cannot 'rebuild' instance " + server_id + " while it is in task state other than active", http_action_request)) else: return dumps(bad_request("There is no such action currently supported", http_action_request))
def request_action(self, http_action_request, server_id, absolutize_url, regional_image_collection, image_store): """ Perform the requested action on the provided server """ server = self.server_by_id(server_id) if server is None: return dumps(not_found("Instance " + server_id + " could not be found", http_action_request)) action_json = loads(http_action_request.content.read()) if "resize" in action_json: flavor = action_json["resize"].get("flavorRef") if not flavor: return dumps(bad_request("Resize requests require 'flavorRef' attribute", http_action_request)) server.status = "VERIFY_RESIZE" server.oldFlavor = server.flavor_ref server.flavor_ref = flavor http_action_request.setResponseCode(202) return b"" elif "confirmResize" in action_json or "revertResize" in action_json: if server.status == "VERIFY_RESIZE" and "confirmResize" in action_json: server.status = "ACTIVE" http_action_request.setResponseCode(204) return b"" elif server.status == "VERIFY_RESIZE" and "revertResize" in action_json: server.status = "ACTIVE" server.flavor_ref = server.oldFlavor http_action_request.setResponseCode(202) return b"" else: return dumps( conflicting( "Cannot '" + action_json.keys()[0] + "' instance " + server_id + " while it is in vm_state active", http_action_request, ) ) elif "reboot" in action_json: reboot_type = action_json["reboot"].get("type") if not reboot_type: return dumps(bad_request("Missing argument 'type' for reboot", http_action_request)) if reboot_type == "HARD": server.status = "HARD_REBOOT" http_action_request.setResponseCode(202) server.collection.clock.callLater(6.0, server.update_status, u"ACTIVE") return b"" elif reboot_type == "SOFT": server.status = "REBOOT" http_action_request.setResponseCode(202) server.collection.clock.callLater(3.0, server.update_status, u"ACTIVE") return b"" else: return dumps(bad_request("Argument 'type' for reboot is not HARD or SOFT", http_action_request)) elif "rescue" in action_json: if server.status == "ACTIVE": server.status = "RESCUE" http_action_request.setResponseCode(200) password = random_string(12) return dumps({"adminPass": password}) else: return dumps( conflicting( "Cannot 'rescue' instance " + server_id + " while it is in task state other than active", http_action_request, ) ) elif "unrescue" in action_json: if server.status == "RESCUE": server.status = "ACTIVE" http_action_request.setResponseCode(200) return b"" else: return dumps( conflicting( "Cannot '" + action_json.keys()[0] + "' instance " + server_id + " while it is in task state other than active", http_action_request, ) ) elif "changePassword" in action_json: password = action_json["changePassword"].get("adminPass") if not password: return dumps(bad_request("No adminPass was specified", http_action_request)) if server.status == "ACTIVE": http_action_request.setResponseCode(202) return b"" else: return dumps( conflicting( "Cannot 'changePassword' instance " + server_id + " while it is in task state other than active", http_action_request, ) ) elif "rebuild" in action_json: image_ref = action_json["rebuild"].get("imageRef") if not image_ref: return dumps(bad_request("Could not parse imageRef from request.", http_action_request)) if server.status == "ACTIVE": server.image_ref = image_ref server.status = "REBUILD" http_action_request.setResponseCode(202) server.collection.clock.callLater(5.0, server.update_status, u"ACTIVE") server_details = server.detail_json(absolutize_url) server_details["adminPass"] = "******" return dumps({"server": server_details}) else: return dumps( conflicting( "Cannot 'rebuild' instance " + server_id + " while it is in task state other than active", http_action_request, ) ) elif "createImage" in action_json: image_name = action_json["createImage"].get("name") server == self.server_by_id(server_id) links = server.links_json(absolutize_url) server_id = server.server_id image_ref = server.image_ref image = image_store.get_image_by_id(image_ref) image_json = regional_image_collection.get_image(http_action_request, image_ref, absolutize_url) image_dict = loads(image_json) flavor_classes = image_dict["image"]["metadata"]["flavor_classes"] os_type = image_dict["image"]["metadata"]["os_type"] os_distro = image_dict["image"]["metadata"]["org.openstack__1__os_distro"] vm_mode = image_dict["image"]["metadata"]["vm_mode"] disk_config = image_dict["image"]["metadata"]["auto_disk_config"] image_id = str(uuid.uuid4()) image_size = image.image_size minRam = image.minRam minDisk = image.minDisk saved_image = RackspaceSavedImage( image_id=image_id, tenant_id=self.tenant_id, image_size=image_size, name=image_name, minRam=minRam, minDisk=minDisk, links=links, server_id=server_id, flavor_classes=flavor_classes, os_type=os_type, os_distro=os_distro, vm_mode=vm_mode, disk_config=disk_config, ) image_store.add_image_to_store(saved_image) http_action_request.setHeader("Location", "www.someurl.com") http_action_request.setResponseCode(202) return b"" else: return dumps(bad_request("There is no such action currently supported", http_action_request))
def request_action(self, http_action_request, server_id, absolutize_url, regional_image_collection, image_store): """ Perform the requested action on the provided server """ server = self.server_by_id(server_id) if server is None: return dumps( not_found("Instance " + server_id + " could not be found", http_action_request)) action_json = json_from_request(http_action_request) if 'resize' in action_json: flavor = action_json['resize'].get('flavorRef') if not flavor: return dumps( bad_request( "Resize requests require 'flavorRef' attribute", http_action_request)) server.status = 'VERIFY_RESIZE' server.oldFlavor = server.flavor_ref server.flavor_ref = flavor http_action_request.setResponseCode(202) return b'' elif 'confirmResize' in action_json or 'revertResize' in action_json: if server.status == 'VERIFY_RESIZE' and 'confirmResize' in action_json: server.status = 'ACTIVE' http_action_request.setResponseCode(204) return b'' elif server.status == 'VERIFY_RESIZE' and 'revertResize' in action_json: server.status = 'ACTIVE' server.flavor_ref = server.oldFlavor http_action_request.setResponseCode(202) return b'' else: return dumps( conflicting( "Cannot '" + list(action_json.keys())[0] + "' instance " + server_id + " while it is in vm_state active", http_action_request)) elif 'rescue' in action_json: if server.status != 'ACTIVE': return dumps( conflicting( "Cannot 'rescue' instance " + server_id + " while it is in task state other than active", http_action_request)) else: server.status = 'RESCUE' http_action_request.setResponseCode(200) password = random_string(12) return dumps({"adminPass": password}) elif 'unrescue' in action_json: if server.status == 'RESCUE': server.status = 'ACTIVE' http_action_request.setResponseCode(200) return b'' else: return dumps( conflicting( "Cannot 'unrescue' instance " + server_id + " while it is in task state other than rescue", http_action_request)) elif 'reboot' in action_json: reboot_type = action_json['reboot'].get('type') if not reboot_type: return dumps( bad_request("Missing argument 'type' for reboot", http_action_request)) if reboot_type == 'HARD': server.status = 'HARD_REBOOT' http_action_request.setResponseCode(202) server.collection.clock.callLater(6.0, server.update_status, u"ACTIVE") return b'' elif reboot_type == 'SOFT': server.status = 'REBOOT' http_action_request.setResponseCode(202) server.collection.clock.callLater(3.0, server.update_status, u"ACTIVE") return b'' else: return dumps( bad_request( "Argument 'type' for reboot is not HARD or SOFT", http_action_request)) elif 'changePassword' in action_json: password = action_json['changePassword'].get('adminPass') if not password: return dumps( bad_request("No adminPass was specified", http_action_request)) if server.status == 'ACTIVE': http_action_request.setResponseCode(202) return b'' else: return dumps( conflicting( "Cannot 'changePassword' instance " + server_id + " while it is in task state other than active", http_action_request)) elif 'rebuild' in action_json: image_ref = action_json['rebuild'].get('imageRef') if not image_ref: return dumps( bad_request("Could not parse imageRef from request.", http_action_request)) if server.status == 'ACTIVE': server.image_ref = image_ref server.status = 'REBUILD' http_action_request.setResponseCode(202) server.collection.clock.callLater(5.0, server.update_status, u"ACTIVE") server_details = server.detail_json(absolutize_url) server_details['adminPass'] = '******' return dumps({"server": server_details}) else: return dumps( conflicting( "Cannot 'rebuild' instance " + server_id + " while it is in task state other than active", http_action_request)) elif 'createImage' in action_json: image_name = action_json['createImage'].get('name') server == self.server_by_id(server_id) links = server.links_json(absolutize_url) server_id = server.server_id image_ref = server.image_ref image = image_store.get_image_by_id(image_ref) image_json = regional_image_collection.get_image( http_action_request, image_ref, absolutize_url) image_dict = loads(image_json) flavor_classes = image_dict['image']['metadata']['flavor_classes'] os_type = image_dict['image']['metadata']['os_type'] os_distro = image_dict['image']['metadata'][ 'org.openstack__1__os_distro'] vm_mode = image_dict['image']['metadata']['vm_mode'] disk_config = image_dict['image']['metadata']['auto_disk_config'] image_id = text_type(uuid.uuid4()) image_size = image.image_size minRam = image.minRam minDisk = image.minDisk saved_image = RackspaceSavedImage(image_id=image_id, tenant_id=self.tenant_id, image_size=image_size, name=image_name, minRam=minRam, minDisk=minDisk, links=links, server_id=server_id, flavor_classes=flavor_classes, os_type=os_type, os_distro=os_distro, vm_mode=vm_mode, disk_config=disk_config) image_store.add_image_to_store(saved_image) http_action_request.setHeader(b"Location", b"www.someurl.com") http_action_request.setResponseCode(202) return b'' else: return dumps( bad_request("There is no such action currently supported", http_action_request))