Example #1
0
 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
Example #2
0
 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)
Example #3
0
 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)
Example #4
0
    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
Example #5
0
 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))
Example #6
0
    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
Example #7
0
 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))
Example #8
0
 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)
Example #9
0
    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))
Example #10
0
    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))
Example #11
0
    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))
Example #12
0
 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)
Example #13
0
    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))
Example #14
0
    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))