Change in vdsm[master]: core: refactor in BindingXMLRPC

laravot at redhat.com laravot at redhat.com
Sun Apr 13 12:52:46 UTC 2014


Liron Ar has uploaded a new change for review.

Change subject: core: refactor in BindingXMLRPC
......................................................................

core: refactor in BindingXMLRPC

moved logic from do_PUT to methods.

Change-Id: I64bb1b0a4cb85ce822929f1907847dd63eb69fc2
Signed-off-by: Liron Aravot <laravot at redhat.com>
---
M vdsm/BindingXMLRPC.py
1 file changed, 83 insertions(+), 49 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/40/26740/1

diff --git a/vdsm/BindingXMLRPC.py b/vdsm/BindingXMLRPC.py
index 76251f5..10146d5 100644
--- a/vdsm/BindingXMLRPC.py
+++ b/vdsm/BindingXMLRPC.py
@@ -126,59 +126,32 @@
                 return basehandler.setup(self)
 
             def do_PUT(self):
-                try:
-                    contentLength = self.headers.getheader(
-                        self.HEADER_CONTENT_LENGTH)
-                    if not contentLength:
-                        self.send_error(httplib.LENGTH_REQUIRED,
-                                        "missing content length")
-                        return
+                contentLength = self._getIntHeader(self.HEADER_CONTENT_LENGTH,
+                                                   httplib.LENGTH_REQUIRED)
+                image = self._constructImageFromRequestInfo()
+                methodArgs = {'fileObj': self.rfile,
+                              'length': contentLength}
+                # Optional header
+                volUUID = self.headers.getheader(self.HEADER_VOLUME)
 
-                    try:
-                        contentLength = int(contentLength)
-                    except ValueError:
-                        self.send_error(httplib.BAD_REQUEST,
-                                        "invalid content length %r" %
-                                        contentLength)
-                        return
-
-                    # Required headers
-                    spUUID = self.headers.getheader(self.HEADER_POOL)
-                    sdUUID = self.headers.getheader(self.HEADER_DOMAIN)
-                    imgUUID = self.headers.getheader(self.HEADER_IMAGE)
-                    if not all((spUUID, sdUUID, imgUUID)):
-                        self.send_error(httplib.BAD_REQUEST,
-                                        "missing or empty required header(s):"
-                                        " spUUID=%s sdUUID=%s imgUUID=%s"
-                                        % (spUUID, sdUUID, imgUUID))
-                        return
-
-                    # Optional headers
-                    volUUID = self.headers.getheader(self.HEADER_VOLUME)
-
-                    uploadFinishedEvent = threading.Event()
-
-                    def upload_finished():
-                        uploadFinishedEvent.set()
-
-                    methodArgs = {'fileObj': self.rfile,
-                                  'contentLength': contentLength}
-                    image = API.Image(imgUUID, spUUID, sdUUID)
+                def operation():
+                    opEndEvent, opEndCallback = self._createEventAndSetCallback()
                     response = image.downloadFromStream(methodArgs,
-                                                        upload_finished,
-                                                        volUUID)
+                                                        opEndCallback, volUUID)
+                    json_response = self._convertToJson(response)
+                    self._waitForEvent(opEndEvent)
+                    headers = {self.HEADER_CONTENT_TYPE:
+                               'application/json',
+                               self.HEADER_CONTENT_LENGTH:
+                               len(json_response)}
+                    self.handle_response(headers,
+                                         json_response)
 
-                    while not uploadFinishedEvent.is_set():
-                        uploadFinishedEvent.wait()
+                self._performSocketOp(operation)
 
-                    json_response = json.dumps(response)
-                    self.send_response(httplib.OK)
-                    self.send_header(self.HEADER_CONTENT_TYPE,
-                                     'application/json')
-                    self.send_header(self.HEADER_CONTENT_LENGTH,
-                                     len(json_response))
-                    self.end_headers()
-                    self.wfile.write(json_response)
+            def _performSocketOp(self, execFunc):
+                try:
+                    execFunc()
 
                 except socket.timeout:
                     self.send_error(httplib.REQUEST_TIMEOUT,
@@ -188,6 +161,67 @@
                     self.send_error(httplib.INTERNAL_SERVER_ERROR,
                                     "error during execution", exc_info=True)
 
+            def _constructImageFromRequestInfo(self):
+                # Required headers
+                spUUID = self.headers.getheader(self.HEADER_POOL)
+                sdUUID = self.headers.getheader(self.HEADER_DOMAIN)
+                imgUUID = self.headers.getheader(self.HEADER_IMAGE)
+                if not all((spUUID, sdUUID, imgUUID)):
+                    self.send_error(httplib.BAD_REQUEST,
+                                    "missing or empty required header(s):"
+                                    " spUUID=%s sdUUID=%s imgUUID=%s"
+                                    % (spUUID, sdUUID, imgUUID))
+                    return
+
+                return API.Image(imgUUID, spUUID, sdUUID)
+
+            @staticmethod
+            def _createEventAndSetCallback(self):
+                opFinishedEvent = threading.Event()
+
+                def setCallback():
+                    opFinishedEvent.set()
+
+                return opFinishedEvent, setCallback
+
+            @staticmethod
+            def _waitForEvent(event):
+                while not event.is_set():
+                    event.wait()
+
+            @staticmethod
+            def _convertToJson(data):
+                return json.dumps(data)
+
+            def _getIntHeader(self, headerName, missingError):
+                value = self.headers.getheader(
+                    headerName)
+                if not value:
+                    self.send_error(missingError,
+                                    "missing header %s" % headerName)
+                    return
+
+                try:
+                    value = int(value)
+                except ValueError:
+                    self.send_error(httplib.BAD_REQUEST,
+                                    "invalid header value %r" %
+                                    value)
+                    return
+
+                return value
+
+            def handle_response(self, headers, body=None):
+                self.send_response(httplib.OK)
+
+                for k, v in headers.iteritems():
+                    self.send_header(k, v)
+
+                self.end_headers()
+
+                if body is not None:
+                    self.wfile.write(body)
+
             def send_error(self, error, message, exc_info=False):
                 try:
                     self.log.error(message, exc_info=exc_info)


-- 
To view, visit http://gerrit.ovirt.org/26740
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I64bb1b0a4cb85ce822929f1907847dd63eb69fc2
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Liron Ar <laravot at redhat.com>


More information about the vdsm-patches mailing list