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)
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.assertThat(out_dict, matchers.DictMatches(expected_dict))
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)
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)
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)