From 071b62c3b777192e11d4488790c4141f71de2c4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Nowak?= <luke@nexedi.com> Date: Wed, 9 May 2012 13:21:00 +0200 Subject: [PATCH] Extract instance in decorator. --- .../product/Vifib/Tool/VifibRestApiV1Tool.py | 134 ++++++++---------- 1 file changed, 63 insertions(+), 71 deletions(-) diff --git a/master/product/Vifib/Tool/VifibRestApiV1Tool.py b/master/product/Vifib/Tool/VifibRestApiV1Tool.py index 999014f06..213a65583 100644 --- a/master/product/Vifib/Tool/VifibRestApiV1Tool.py +++ b/master/product/Vifib/Tool/VifibRestApiV1Tool.py @@ -111,6 +111,36 @@ def responseSupport(anonymous=False): return wrapperResponseSupport return outer +def extractInstance(fn): + def wrapperExtractInstance(self, *args, **kwargs): + if not self.REQUEST['traverse_subpath']: + self.REQUEST.response.setStatus(404) + return self.REQUEST.response + instance_path = self.REQUEST['traverse_subpath'][:2] + try: + self.software_instance = self.restrictedTraverse(instance_path) + if getattr(self.software_instance, 'getPortalType', None) is None or \ + self.software_instance.getPortalType() not in ('Software Instance', + 'Slave Instance'): + raise WrongRequest('%r is not an instance' % instance_path) + except WrongRequest: + LOG('VifibRestApiV1Tool', ERROR, + 'Problem while trying to find instance:', error=True) + self.REQUEST.response.setStatus(404) + except (Unauthorized, KeyError): + self.REQUEST.response.setStatus(404) + except Exception: + LOG('VifibRestApiV1Tool', ERROR, + 'Problem while trying to find instance:', error=True) + self.REQUEST.response.setStatus(500) + self.REQUEST.response.setBody(json.dumps({'error': + 'There is system issue, please try again later.'})) + else: + self.REQUEST['traverse_subpath'] = self.REQUEST['traverse_subpath'][2:] + return fn(self, *args, **kwargs) + return self.REQUEST.response + wrapperExtractInstance.__doc__ = fn.__doc__ + return wrapperExtractInstance class GenericPublisher(Implicit): @responseSupport(True) def OPTIONS(self, *args, **kwargs): @@ -131,6 +161,7 @@ class InstancePublisher(GenericPublisher): @requireHeader({'Accept': 'application/json', 'Content-Type': 'application/json'}) @requireJson(dict(log=unicode)) + @extractInstance def __bang(self): person = self.getPortalObject().ERP5Site_getAuthenticatedMemberPersonValue() if person is None: @@ -142,36 +173,16 @@ class InstancePublisher(GenericPublisher): self.REQUEST.response.setBody(json.dumps({'error': 'There is system issue, please try again later.'})) return self.REQUEST.response - instance_path = '/'.join(self.REQUEST['traverse_subpath'][:-1]) try: - software_instance = self.restrictedTraverse(instance_path) - if getattr(software_instance, 'getPortalType', None) is None or \ - software_instance.getPortalType() not in ('Software Instance', - 'Slave Instance'): - raise WrongRequest('%r is not an instance' % instance_path) - except WrongRequest: - LOG('VifibRestApiV1Tool', ERROR, - 'Problem while trying to find instance:', error=True) - self.REQUEST.response.setStatus(404) - except (Unauthorized, KeyError): - self.REQUEST.response.setStatus(404) + self.software_instance.reportComputerPartitionBang(comment=self.jbody['log']) except Exception: LOG('VifibRestApiV1Tool', ERROR, - 'Problem while trying to find instance:', error=True) + 'Problem while trying to generate instance dict:', error=True) self.REQUEST.response.setStatus(500) self.REQUEST.response.setBody(json.dumps({'error': 'There is system issue, please try again later.'})) else: - try: - software_instance.reportComputerPartitionBang(comment=self.jbody['log']) - except Exception: - LOG('VifibRestApiV1Tool', ERROR, - 'Problem while trying to generate instance dict:', error=True) - self.REQUEST.response.setStatus(500) - self.REQUEST.response.setBody(json.dumps({'error': - 'There is system issue, please try again later.'})) - else: - self.REQUEST.response.setStatus(204) + self.REQUEST.response.setStatus(204) return self.REQUEST.response @requireHeader({'Accept': 'application/json', @@ -230,64 +241,45 @@ class InstancePublisher(GenericPublisher): return response @requireHeader({'Accept': 'application/json'}) + @extractInstance def __instance_info(self): certificate = False - if self.REQUEST['traverse_subpath'][-1] == 'certificate': + if self.REQUEST['traverse_subpath'] and self.REQUEST[ + 'traverse_subpath'][-1] == 'certificate': certificate = True - self.REQUEST['traverse_subpath'] = self.REQUEST['traverse_subpath'][:-1] - instance_path = '/'.join(self.REQUEST['traverse_subpath']) try: - software_instance = self.restrictedTraverse(instance_path) - if getattr(software_instance, 'getPortalType', None) is None or \ - software_instance.getPortalType() not in ('Software Instance', - 'Slave Instance'): - raise WrongRequest('%r is not an instance' % instance_path) - except WrongRequest: - LOG('VifibRestApiV1Tool', ERROR, - 'Problem while trying to find instance:', error=True) - self.REQUEST.response.setStatus(404) - except (Unauthorized, KeyError): - self.REQUEST.response.setStatus(404) + if certificate: + d = { + "ssl_key": self.software_instance.getSslKey(), + "ssl_certificate": self.software_instance.getSslCertificate() + } + else: + d = { + "title": self.software_instance.getTitle(), + "status": self.software_instance.getSlapState(), + "software_release": "", # not ready yet + "software_type": self.software_instance.getSourceReference(), + "slave": self.software_instance.getPortalType() == 'Slave Instance', + "connection": self.software_instance.getConnectionXmlAsDict(), + "parameter": self.software_instance.getInstanceXmlAsDict(), + "sla": self.software_instance.getSlaXmlAsDict(), + "children_list": [q.absolute_url() for q in \ + self.software_instance.getPredecessorValueList()], + "partition": { # not ready yet + "public_ip": [], + "private_ip": [], + "tap_interface": "", + } + } except Exception: LOG('VifibRestApiV1Tool', ERROR, - 'Problem while trying to find instance:', error=True) + 'Problem while trying to generate instance dict:', error=True) self.REQUEST.response.setStatus(500) self.REQUEST.response.setBody(json.dumps({'error': 'There is system issue, please try again later.'})) else: - try: - if certificate: - d = { - "ssl_key": software_instance.getSslKey(), - "ssl_certificate": software_instance.getSslCertificate() - } - else: - d = { - "title": software_instance.getTitle(), - "status": software_instance.getSlapState(), - "software_release": "", # not ready yet - "software_type": software_instance.getSourceReference(), - "slave": software_instance.getPortalType() == 'Slave Instance', - "connection": software_instance.getConnectionXmlAsDict(), - "parameter": software_instance.getInstanceXmlAsDict(), - "sla": software_instance.getSlaXmlAsDict(), - "children_list": [q.absolute_url() for q in \ - software_instance.getPredecessorValueList()], - "partition": { # not ready yet - "public_ip": [], - "private_ip": [], - "tap_interface": "", - } - } - except Exception: - LOG('VifibRestApiV1Tool', ERROR, - 'Problem while trying to generate instance dict:', error=True) - self.REQUEST.response.setStatus(500) - self.REQUEST.response.setBody(json.dumps({'error': - 'There is system issue, please try again later.'})) - else: - self.REQUEST.response.setStatus(200) - self.REQUEST.response.setBody(json.dumps(d)) + self.REQUEST.response.setStatus(200) + self.REQUEST.response.setBody(json.dumps(d)) return self.REQUEST.response @responseSupport() -- 2.30.9