def invoke(self, context): try: # Raise NotImplemented exception for Admin specific request if # admin flag is set to false in engine.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)