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 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))