[Kimchi-devel] [PATCH 01/16] Move generate_action_handler() function to Resource() class

Aline Manera alinefm at linux.vnet.ibm.com
Tue Dec 24 10:43:46 UTC 2013


On 12/24/2013 01:16 AM, Mark Wu wrote:
> On 12/24/2013 10:26 AM, Sheldon wrote:
>> On 12/24/2013 02:41 AM, Aline Manera wrote:
>>> From: Aline Manera <alinefm at br.ibm.com>
>>>
>>> generate_action_handler() function is only used by Resources 
>>> instances so move
>>> it to Resource()
>>>
>>> Signed-off-by: Aline Manera <alinefm at br.ibm.com>
>>> ---
>>>   src/kimchi/controller.py |   75 
>>> +++++++++++++++++++++++-----------------------
>>>   1 file changed, 37 insertions(+), 38 deletions(-)
>>>
>>> diff --git a/src/kimchi/controller.py b/src/kimchi/controller.py
>>> index 2940278..ba8b53d 100644
>>> --- a/src/kimchi/controller.py
>>> +++ b/src/kimchi/controller.py
>>> @@ -103,33 +103,6 @@ def validate_params(params, instance, action):
>>>               e.message for e in validator.iter_errors(request)))
>>>
>>>
>>> -def generate_action_handler(instance, action_name, action_args=None):
>>> -    def wrapper(*args, **kwargs):
>>> -        validate_method(('POST'))
>>> -        try:
>>> -            model_args = list(instance.model_args)
>>> -            if action_args is not None:
>>> -                model_args.extend(parse_request()[key] for key in 
>>> action_args)
>>> -            fn = getattr(instance.model, model_fn(instance, 
>>> action_name))
>>> -            fn(*model_args)
>>> -            raise internal_redirect(instance.uri_fmt %
>>> - tuple(instance.model_args))
>>> -        except MissingParameter, param:
>>> -            raise cherrypy.HTTPError(400, "Missing parameter: '%s'" 
>>> % param)
>>> -        except InvalidParameter, param:
>>> -            raise cherrypy.HTTPError(400, "Invalid parameter: '%s'" 
>>> % param)
>>> -        except InvalidOperation, msg:
>>> -            raise cherrypy.HTTPError(400, "Invalid operation: '%s'" 
>>> % msg)
>>> -        except OperationFailed, msg:
>>> -            raise cherrypy.HTTPError(500, "Operation Failed: '%s'" 
>>> % msg)
>>> -        except NotFoundError, msg:
>>> -            raise cherrypy.HTTPError(404, "Not found: '%s'" % msg)
>>> -
>>> -    wrapper.__name__ = action_name
>>> -    wrapper.exposed = True
>>> -    return wrapper
>>> -
>>> -
>>>   class Resource(object):
>>>       """
>>>       A Resource represents a single entity in the API (such as a 
>>> Virtual Machine)
>>> @@ -153,6 +126,32 @@ class Resource(object):
>>>           self.model_args = (ident,)
>>>           self.update_params = []
>>>
>>> +    def generate_action_handler(self, instance, action_name, 
>>> action_args=None):
>> do we still need instance? Here instance is same with self.
>>
>> I think it is OK.
> It's good to move it to Resource class,  but you need remove the 
> redundant parameter 'instance' as
> Sheldon suggested.
>

ACK.

>>
>> + def generate_action_handler(self, action_name, action_args=None):
>>> +        def wrapper(*args, **kwargs):
>>> +            validate_method(('POST'))
>>> +            try:
>>> +                model_args = list(instance.model_args)
>>> +                if action_args is not None:
>>> +                    model_args.extend(parse_request()[key] for key 
>>> in action_args)
>>> +                fn = getattr(instance.model, model_fn(instance, 
>>> action_name))
>>> +                fn(*model_args)
>>> +                raise internal_redirect(instance.uri_fmt %
>>> + tuple(instance.model_args))
>>> +            except MissingParameter, param:
>>> +                raise cherrypy.HTTPError(400, "Missing parameter: 
>>> '%s'" % param)
>>> +            except InvalidParameter, param:
>>> +                raise cherrypy.HTTPError(400, "Invalid parameter: 
>>> '%s'" % param)
>>> +            except InvalidOperation, msg:
>>> +                raise cherrypy.HTTPError(400, "Invalid operation: 
>>> '%s'" % msg)
>>> +            except OperationFailed, msg:
>>> +                raise cherrypy.HTTPError(500, "Operation Failed: 
>>> '%s'" % msg)
>>> +            except NotFoundError, msg:
>>> +                raise cherrypy.HTTPError(404, "Not found: '%s'" % msg)
>>> +
>>> +        wrapper.__name__ = action_name
>>> +        wrapper.exposed = True
>>> +        return wrapper
>>> +
>>>       def lookup(self):
>>>           try:
>>>               lookup = getattr(self.model, model_fn(self, 'lookup'))
>>> @@ -369,9 +368,9 @@ class VM(Resource):
>>>           self.update_params = ["name"]
>>>           self.screenshot = VMScreenShot(model, ident)
>>>           self.uri_fmt = '/vms/%s'
>>> -        self.start = generate_action_handler(self, 'start')
>>> -        self.stop = generate_action_handler(self, 'stop')
>>> -        self.connect = generate_action_handler(self, 'connect')
>>> +        self.start = self.generate_action_handler(self, 'start')
>> then you can call
>> + self.start = self.generate_action_handler('start')
>>> +        self.stop = self.generate_action_handler(self, 'stop')
>>> +        self.connect = self.generate_action_handler(self, 'connect')
>>>
>>>       @property
>>>       def data(self):
>>> @@ -453,8 +452,8 @@ class Network(Resource):
>>>       def __init__(self, model, ident):
>>>           super(Network, self).__init__(model, ident)
>>>           self.uri_fmt = "/networks/%s"
>>> -        self.activate = generate_action_handler(self, 'activate')
>>> -        self.deactivate = generate_action_handler(self, 'deactivate')
>>> +        self.activate = self.generate_action_handler(self, 'activate')
>>> +        self.deactivate = self.generate_action_handler(self, 
>>> 'deactivate')
>>>
>>>       @property
>>>       def data(self):
>>> @@ -475,8 +474,8 @@ class StorageVolume(Resource):
>>>           self.info = {}
>>>           self.model_args = [self.pool, self.ident]
>>>           self.uri_fmt = '/storagepools/%s/storagevolumes/%s'
>>> -        self.resize = generate_action_handler(self, 'resize', 
>>> ['size'])
>>> -        self.wipe = generate_action_handler(self, 'wipe')
>>> +        self.resize = self.generate_action_handler(self, 'resize', 
>>> ['size'])
>>> +        self.wipe = self.generate_action_handler(self, 'wipe')
>>>
>>>       @property
>>>       def data(self):
>>> @@ -522,8 +521,8 @@ class StoragePool(Resource):
>>>           super(StoragePool, self).__init__(model, ident)
>>>           self.update_params = ["autostart"]
>>>           self.uri_fmt = "/storagepools/%s"
>>> -        self.activate = generate_action_handler(self, 'activate')
>>> -        self.deactivate = generate_action_handler(self, 'deactivate')
>>> +        self.activate = self.generate_action_handler(self, 'activate')
>>> +        self.deactivate = self.generate_action_handler(self, 
>>> 'deactivate')
>>>
>>>       @property
>>>       def data(self):
>>> @@ -689,8 +688,8 @@ class Host(Resource):
>>>           self.stats = HostStats(self.model)
>>>           self.stats.exposed = True
>>>           self.uri_fmt = '/host/%s'
>>> -        self.reboot = generate_action_handler(self, 'reboot')
>>> -        self.shutdown = generate_action_handler(self, 'shutdown')
>>> +        self.reboot = self.generate_action_handler(self, 'reboot')
>>> +        self.shutdown = self.generate_action_handler(self, 'shutdown')
>>>           self.partitions = Partitions(self.model)
>>>           self.partitions.exposed = True
>>>
>>
>>
>




More information about the Kimchi-devel mailing list