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