Beispiel #1
0
    def invoke(self, context):
        try:
            method = getattr(self.controller,
                             ec2utils.camelcase_to_underscore(self.action))
        except AttributeError:
            LOG.debug('Unsupported API request: controller = '
                        '%(controller)s, action = %(action)s',
                        {'controller': self.controller,
                         'action': self.action})
            # TODO(gundlach): Raise custom exception, trap in apiserver,
            #       and reraise as 400 error.
            raise exception.InvalidRequest()

        args = ec2utils.dict_from_dotted_str(self.args.items())

        for key in args.keys():
            # NOTE(vish): Turn numeric dict keys into lists
            if isinstance(args[key], dict):
                if args[key] != {} and args[key].keys()[0].isdigit():
                    s = args[key].items()
                    s.sort()
                    args[key] = [v for k, v in s]

        result = method(context, **args)
        return self._render_response(result, context.request_id)
Beispiel #2
0
    def invoke(self, context):
        try:
            # Raise NotImplemented exception for Admin specific request if
            # admin flag is set to false in nova.conf
            if (isinstance(self.controller, AdminController) and
                          (not FLAGS.allow_ec2_admin_api)):
                ## Raise InvalidRequest exception for EC2 Admin interface ##
                LOG.exception("Unsupported API request")
                raise exception.InvalidRequest()

            method = getattr(self.controller,
                             ec2utils.camelcase_to_underscore(self.action))
        except AttributeError:
            controller = self.controller
            action = self.action
            _error = _('Unsupported API request: controller = %(controller)s,'
                    ' action = %(action)s') % locals()
            LOG.exception(_error)
            # TODO: Raise custom exception, trap in apiserver,
            #       and reraise as 400 error.
            raise exception.InvalidRequest()

        args = ec2utils.dict_from_dotted_str(self.args.items())

        for key in args.keys():
            # NOTE(vish): Turn numeric dict keys into lists
            if isinstance(args[key], dict):
                if args[key] != {} and args[key].keys()[0].isdigit():
                    s = args[key].items()
                    s.sort()
                    args[key] = [v for k, v in s]

        result = method(context, **args)
        return self._render_response(result, context.request_id)
Beispiel #3
0
    def test_dict_from_dotted_str(self):
        in_str = [('BlockDeviceMapping.1.DeviceName', '/dev/sda1'),
                  ('BlockDeviceMapping.1.Ebs.SnapshotId', 'snap-0000001c'),
                  ('BlockDeviceMapping.1.Ebs.VolumeSize', '80'),
                  ('BlockDeviceMapping.1.Ebs.DeleteOnTermination', 'false'),
                  ('BlockDeviceMapping.2.DeviceName', '/dev/sdc'),
                  ('BlockDeviceMapping.2.VirtualName', 'ephemeral0')]
        expected_dict = {
            'block_device_mapping': {
            '1': {'device_name': '/dev/sda1',
                  'ebs': {'snapshot_id': 'snap-0000001c',
                          'volume_size': 80,
                          'delete_on_termination': False}},
            '2': {'device_name': '/dev/sdc',
                  'virtual_name': 'ephemeral0'}}}
        out_dict = ec2utils.dict_from_dotted_str(in_str)

        self.assertDictMatch(out_dict, expected_dict)
Beispiel #4
0
    def test_dict_from_dotted_str(self):
        in_str = [
            ("BlockDeviceMapping.1.DeviceName", "/dev/sda1"),
            ("BlockDeviceMapping.1.Ebs.SnapshotId", "snap-0000001c"),
            ("BlockDeviceMapping.1.Ebs.VolumeSize", "80"),
            ("BlockDeviceMapping.1.Ebs.DeleteOnTermination", "false"),
            ("BlockDeviceMapping.2.DeviceName", "/dev/sdc"),
            ("BlockDeviceMapping.2.VirtualName", "ephemeral0"),
        ]
        expected_dict = {
            "block_device_mapping": {
                "1": {
                    "device_name": "/dev/sda1",
                    "ebs": {"snapshot_id": "snap-0000001c", "volume_size": 80, "delete_on_termination": False},
                },
                "2": {"device_name": "/dev/sdc", "virtual_name": "ephemeral0"},
            }
        }
        out_dict = ec2utils.dict_from_dotted_str(in_str)

        self.assertDictMatch(out_dict, expected_dict)