Author: tomaz
Date: Sun Oct 23 20:23:56 2011
New Revision: 1187966
URL: http://svn.apache.org/viewvc?rev=1187966&view=rev
Log:
Refactor response classes and add a new XmlResponse and JsonResponse class.
Modify driver-specific response classes to inherit one of those two classes
where applicable.
Contributed by Caio Romão <caioromao at gmail dot com>, part of LIBCLOUD-97.
Modified:
libcloud/trunk/libcloud/common/aws.py
libcloud/trunk/libcloud/common/base.py
libcloud/trunk/libcloud/common/cloudstack.py
libcloud/trunk/libcloud/common/gogrid.py
libcloud/trunk/libcloud/common/linode.py
libcloud/trunk/libcloud/compute/drivers/bluebox.py
libcloud/trunk/libcloud/compute/drivers/brightbox.py
libcloud/trunk/libcloud/compute/drivers/dreamhost.py
libcloud/trunk/libcloud/compute/drivers/elasticstack.py
libcloud/trunk/libcloud/compute/drivers/ibm_sbc.py
libcloud/trunk/libcloud/compute/drivers/opennebula.py
libcloud/trunk/libcloud/compute/drivers/opsource.py
libcloud/trunk/libcloud/compute/drivers/rimuhosting.py
libcloud/trunk/libcloud/compute/drivers/slicehost.py
libcloud/trunk/libcloud/compute/drivers/vcloud.py
libcloud/trunk/libcloud/compute/drivers/voxel.py
libcloud/trunk/libcloud/compute/drivers/vpsnet.py
libcloud/trunk/libcloud/dns/drivers/zerigo.py
libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py
libcloud/trunk/libcloud/storage/drivers/atmos.py
Modified: libcloud/trunk/libcloud/common/aws.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/common/aws.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/common/aws.py (original)
+++ libcloud/trunk/libcloud/common/aws.py Sun Oct 23 20:23:56 2011
@@ -13,18 +13,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-from xml.etree import ElementTree as ET
+from libcloud.common.base import XmlResponse
-from libcloud.common.base import Response
-from libcloud.common.types import MalformedResponseError
-
-class AWSBaseResponse(Response):
- def parse_body(self):
- if not self.body:
- return None
-
- try:
- body = ET.XML(self.body)
- except:
- raise MalformedResponseError("Failed to parse XML", body=self.body)
- return body
+class AWSBaseResponse(XmlResponse): pass
Modified: libcloud/trunk/libcloud/common/base.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/common/base.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/common/base.py (original)
+++ libcloud/trunk/libcloud/common/base.py Sun Oct 23 20:23:56 2011
@@ -18,11 +18,17 @@ import urllib
import StringIO
import ssl
+from xml.etree import ElementTree as ET
from pipes import quote as pquote
import urlparse
+try:
+ import simplejson as json
+except:
+ import json
+
import libcloud
-from libcloud.common.types import LibcloudError
+from libcloud.common.types import LibcloudError, MalformedResponseError
from libcloud.httplib_ssl import LibcloudHTTPSConnection
from httplib import HTTPConnection as LibcloudHTTPConnection
@@ -39,9 +45,10 @@ class Response(object):
headers = {}
error = None
connection = None
+ parse_zero_length_body = False
def __init__(self, response, connection):
- self.body = response.read()
+ self.body = response.read().strip()
self.status = response.status
self.headers = dict(response.getheaders())
self.error = response.reason
@@ -83,6 +90,46 @@ class Response(object):
"""
return self.status == httplib.OK or self.status == httplib.CREATED
+
+class JsonResponse(Response):
+ """
+ A Base JSON Response class to derive from.
+ """
+ def parse_body(self):
+ if len(self.body) == 0 and not self.parse_zero_length_body:
+ return self.body
+
+ try:
+ body = json.loads(self.body)
+ except:
+ raise MalformedResponseError(
+ "Failed to parse JSON",
+ body=self.body,
+ driver=self.connection.driver)
+ return body
+
+ parse_error = parse_body
+
+
+class XmlResponse(Response):
+ """
+ A Base XML Response class to derive from.
+ """
+ def parse_body(self):
+ if len(self.body) == 0 and not self.parse_zero_length_body:
+ return self.body
+
+ try:
+ body = ET.XML(self.body)
+ except:
+ raise MalformedResponseError("Failed to parse XML",
+ body=self.body,
+ driver=self.connection.driver)
+ return body
+
+ parse_error = parse_body
+
+
class RawResponse(Response):
def __init__(self, connection):
Modified: libcloud/trunk/libcloud/common/cloudstack.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/common/cloudstack.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/common/cloudstack.py (original)
+++ libcloud/trunk/libcloud/common/cloudstack.py Sun Oct 23 20:23:56 2011
@@ -19,26 +19,10 @@ import hmac
import time
import urllib
-try:
- import simplejson as json
-except:
- import json
-
-from libcloud.common.base import ConnectionUserAndKey, Response
+from libcloud.common.base import ConnectionUserAndKey, JsonResponse
from libcloud.common.types import MalformedResponseError
-class CloudStackResponse(Response):
- def parse_body(self):
- try:
- body = json.loads(self.body)
- except:
- raise MalformedResponseError(
- "Failed to parse JSON",
- body=self.body,
- driver=self.connection.driver)
- return body
-
- parse_error = parse_body
+class CloudStackResponse(JsonResponse): pass
class CloudStackConnection(ConnectionUserAndKey):
responseCls = CloudStackResponse
Modified: libcloud/trunk/libcloud/common/gogrid.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/common/gogrid.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/common/gogrid.py (original)
+++ libcloud/trunk/libcloud/common/gogrid.py Sun Oct 23 20:23:56 2011
@@ -16,14 +16,9 @@
import hashlib
import time
-try:
- import simplejson as json
-except ImportError:
- import json
-
from libcloud.common.types import InvalidCredsError, LibcloudError
from libcloud.common.types import MalformedResponseError
-from libcloud.common.base import ConnectionUserAndKey, Response
+from libcloud.common.base import ConnectionUserAndKey, JsonResponse
from libcloud.compute.base import NodeLocation
HOST = 'api.gogrid.com'
@@ -36,7 +31,7 @@ __all__ = ["GoGridResponse",
"BaseGoGridDriver",
]
-class GoGridResponse(Response):
+class GoGridResponse(JsonResponse):
def __init__(self, *args, **kwargs):
self.driver = BaseGoGridDriver
@@ -50,19 +45,14 @@ class GoGridResponse(Response):
if not self.body:
return None
try:
- return json.loads(self.body)['status'] == 'success'
+ return self.parse_body()['status'] == 'success'
except ValueError:
raise MalformedResponseError('Malformed reply',
body=self.body, driver=self.driver)
- def parse_body(self):
- if not self.body:
- return None
- return json.loads(self.body)
-
def parse_error(self):
try:
- return json.loads(self.body)["list"][0]['message']
+ return self.parse_body()["list"][0]["message"]
except (ValueError, KeyError):
return None
Modified: libcloud/trunk/libcloud/common/linode.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/common/linode.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/common/linode.py (original)
+++ libcloud/trunk/libcloud/common/linode.py Sun Oct 23 20:23:56 2011
@@ -13,13 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-try:
- import simplejson as json
-except ImportError:
- import json
-
-from libcloud.common.base import ConnectionKey, Response
-from libcloud.common.types import InvalidCredsError, MalformedResponseError
+from libcloud.common.base import ConnectionKey, JsonResponse
+from libcloud.common.types import InvalidCredsError
__all__ = [
'API_HOST',
@@ -65,7 +60,7 @@ class LinodeException(Exception):
return "<LinodeException code %u '%s'>" % (self.code, self.message)
-class LinodeResponse(Response):
+class LinodeResponse(JsonResponse):
"""Linode API response
Wraps the HTTP response returned by the Linode API, which should be JSON in
@@ -106,10 +101,7 @@ class LinodeResponse(Response):
None and errorarray will indicate an invalid JSON exception.
@return: C{list} of objects and C{list} of errors"""
- try:
- js = json.loads(self.body)
- except:
- raise MalformedResponseError("Failed to parse JSON",
body=self.body)
+ js = super(LinodeResponse, self).parse_body()
try:
if isinstance(js, dict):
Modified: libcloud/trunk/libcloud/compute/drivers/bluebox.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/bluebox.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/bluebox.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/bluebox.py Sun Oct 23 20:23:56 2011
@@ -26,14 +26,10 @@ import copy
import urllib
import base64
-try:
- import simplejson as json
-except ImportError:
- import json
-
-from libcloud.common.base import Response, ConnectionUserAndKey
+from libcloud.common.base import JsonResponse, ConnectionUserAndKey
from libcloud.compute.providers import Provider
from libcloud.compute.types import NodeState, InvalidCredsError
+from libcloud.common.types import MalformedResponseError
from libcloud.compute.base import Node, NodeDriver
from libcloud.compute.base import NodeSize, NodeImage, NodeLocation
from libcloud.compute.base import NodeAuthPassword, NodeAuthSSHKey
@@ -83,14 +79,7 @@ NODE_STATE_MAP = { 'queued': NodeState.P
'error': NodeState.TERMINATED,
'unknown': NodeState.UNKNOWN }
-class BlueboxResponse(Response):
- def parse_body(self):
- try:
- js = json.loads(self.body)
- return js
- except ValueError:
- return self.body
-
+class BlueboxResponse(JsonResponse):
def parse_error(self):
if int(self.status) == 401:
if not self.body:
Modified: libcloud/trunk/libcloud/compute/drivers/brightbox.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/brightbox.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/brightbox.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/brightbox.py Sun Oct 23 20:23:56
2011
@@ -18,7 +18,7 @@ Brightbox Driver
import httplib
import base64
-from libcloud.common.base import ConnectionUserAndKey, Response
+from libcloud.common.base import ConnectionUserAndKey, JsonResponse
from libcloud.compute.types import Provider, NodeState, InvalidCredsError
from libcloud.compute.base import NodeDriver
from libcloud.compute.base import Node, NodeImage, NodeSize, NodeLocation
@@ -31,18 +31,18 @@ except ImportError:
API_VERSION = '1.0'
-class BrightboxResponse(Response):
+class BrightboxResponse(JsonResponse):
def success(self):
return self.status >= 200 and self.status < 400
def parse_body(self):
- if self.headers['content-type'].split('; ')[0] == 'application/json'
and len(self.body) > 0:
- return json.loads(self.body)
+ if self.headers['content-type'].split('; ')[0] == 'application/json':
+ return super(BrightboxResponse, self).parse_body()
else:
return self.body
def parse_error(self):
- return json.loads(self.body)['error']
+ return super(BrightboxResponse, self).parse_body()['error']
class BrightboxConnection(ConnectionUserAndKey):
Modified: libcloud/trunk/libcloud/compute/drivers/dreamhost.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/dreamhost.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/dreamhost.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/dreamhost.py Sun Oct 23 20:23:56
2011
@@ -16,14 +16,9 @@
DreamHost Driver
"""
-try:
- import simplejson as json
-except ImportError:
- import json
-
import copy
-from libcloud.common.base import ConnectionKey, Response
+from libcloud.common.base import ConnectionKey, JsonResponse
from libcloud.common.types import InvalidCredsError
from libcloud.compute.base import Node, NodeDriver, NodeSize
from libcloud.compute.base import NodeImage
@@ -81,13 +76,13 @@ class DreamhostAPIException(Exception):
return "<DreamhostException '%s'>" % (self.args[0])
-class DreamhostResponse(Response):
+class DreamhostResponse(JsonResponse):
"""
Response class for DreamHost PS
"""
def parse_body(self):
- resp = json.loads(self.body)
+ resp = super(DreamhostResponse, self).parse_body()
if resp['result'] != 'success':
raise Exception(self._api_parse_error(resp))
return resp['data']
Modified: libcloud/trunk/libcloud/compute/drivers/elasticstack.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/elasticstack.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/elasticstack.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/elasticstack.py Sun Oct 23 20:23:56
2011
@@ -28,8 +28,8 @@ try:
except ImportError:
import json
-from libcloud.common.base import ConnectionUserAndKey, Response
-from libcloud.common.types import InvalidCredsError, MalformedResponseError
+from libcloud.common.base import ConnectionUserAndKey, JsonResponse
+from libcloud.common.types import InvalidCredsError
from libcloud.compute.types import NodeState
from libcloud.compute.base import NodeDriver, NodeSize, Node
from libcloud.compute.base import NodeImage
@@ -111,26 +111,13 @@ class ElasticStackException(Exception):
return "<ElasticStackException '%s'>" % (self.args[0])
-class ElasticStackResponse(Response):
+class ElasticStackResponse(JsonResponse):
def success(self):
if self.status == 401:
raise InvalidCredsError()
return self.status >= 200 and self.status <= 299
- def parse_body(self):
- if not self.body:
- return self.body
-
- try:
- data = json.loads(self.body)
- except:
- raise MalformedResponseError('Failed to parse JSON',
- body=self.body,
- driver=ElasticStackBaseNodeDriver)
-
- return data
-
def parse_error(self):
error_header = self.headers.get('x-elastic-error', '')
return 'X-Elastic-Error: %s (%s)' % (error_header, self.body.strip())
Modified: libcloud/trunk/libcloud/compute/drivers/ibm_sbc.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/ibm_sbc.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/ibm_sbc.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/ibm_sbc.py Sun Oct 23 20:23:56 2011
@@ -17,25 +17,18 @@ Driver for the IBM Developer Cloud.
"""
import base64, urllib
-from libcloud.common.base import Response, ConnectionUserAndKey
+from libcloud.common.base import XmlResponse, ConnectionUserAndKey
from libcloud.common.types import InvalidCredsError
from libcloud.compute.types import NodeState, Provider
from libcloud.compute.base import NodeDriver, Node, NodeImage, NodeSize,
NodeLocation, NodeAuthSSHKey
-from xml.etree import ElementTree as ET
-
HOST = 'www-147.ibm.com'
REST_BASE = '/computecloud/enterprise/api/rest/20100331'
-class IBMResponse(Response):
+class IBMResponse(XmlResponse):
def success(self):
return int(self.status) == 200
- def parse_body(self):
- if not self.body:
- return None
- return ET.XML(self.body)
-
def parse_error(self):
if int(self.status) == 401:
if not self.body:
Modified: libcloud/trunk/libcloud/compute/drivers/opennebula.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/opennebula.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/opennebula.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/opennebula.py Sun Oct 23 20:23:56
2011
@@ -30,11 +30,10 @@ import hashlib
import httplib
from libcloud.compute.base import NodeState, NodeDriver, Node, NodeLocation
-from libcloud.common.base import ConnectionUserAndKey, Response
+from libcloud.common.base import ConnectionUserAndKey, XmlResponse
from libcloud.compute.base import NodeImage, NodeSize
from libcloud.common.types import InvalidCredsError
from libcloud.compute.providers import Provider
-from libcloud.common.base import Response
API_HOST = ''
API_PORT = (4567, 443)
@@ -42,7 +41,7 @@ API_SECURE = True
DEFAULT_API_VERSION = '3.0'
-class OpenNebulaResponse(Response):
+class OpenNebulaResponse(XmlResponse):
"""
Response class for the OpenNebula driver.
"""
@@ -51,11 +50,6 @@ class OpenNebulaResponse(Response):
i = int(self.status)
return i >= 200 and i <= 299
- def parse_body(self):
- if not self.body:
- return None
- return ET.XML(self.body)
-
def parse_error(self):
if int(self.status) == httplib.UNAUTHORIZED:
raise InvalidCredsError(self.body)
Modified: libcloud/trunk/libcloud/compute/drivers/opsource.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/opsource.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/opsource.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/opsource.py Sun Oct 23 20:23:56 2011
@@ -22,8 +22,7 @@ import httplib
from libcloud.compute.base import NodeDriver, Node, NodeAuthPassword
from libcloud.compute.base import NodeSize, NodeImage, NodeLocation
from libcloud.common.types import LibcloudError, InvalidCredsError
-from libcloud.common.base import ConnectionUserAndKey, Response
-from libcloud.common.types import MalformedResponseError
+from libcloud.common.base import ConnectionUserAndKey, XmlResponse
from libcloud.utils import fixxpath, findtext, findall
from libcloud.compute.types import NodeState, Provider
@@ -88,18 +87,7 @@ IPPLAN_NS = NAMESPACE_BASE + "/ipplan"
WHITELABEL_NS = NAMESPACE_BASE + "/whitelabel"
-class OpsourceResponse(Response):
-
- def parse_body(self):
- try:
- body = ET.XML(self.body)
- except:
- raise MalformedResponseError(
- 'Failed to parse XML',
- body=self.body,
- driver=OpsourceNodeDriver)
-
- return body
+class OpsourceResponse(XmlResponse):
def parse_error(self):
if self.status == httplib.UNAUTHORIZED:
@@ -107,13 +95,7 @@ class OpsourceResponse(Response):
elif self.status == httplib.FORBIDDEN:
raise InvalidCredsError(self.body)
- try:
- body = ET.XML(self.body)
- except:
- raise MalformedResponseError(
- 'Failed to parse XML',
- body=self.body,
- driver=OpsourceNodeDriver)
+ body = self.parse_body()
if self.status == httplib.BAD_REQUEST:
code = findtext(body, 'resultCode', SERVER_NS)
Modified: libcloud/trunk/libcloud/compute/drivers/rimuhosting.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/rimuhosting.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/rimuhosting.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/rimuhosting.py Sun Oct 23 20:23:56
2011
@@ -20,7 +20,7 @@ try:
except ImportError:
import json
-from libcloud.common.base import ConnectionKey, Response
+from libcloud.common.base import ConnectionKey, JsonResponse
from libcloud.common.types import InvalidCredsError
from libcloud.compute.types import Provider, NodeState
from libcloud.compute.base import NodeDriver, NodeSize, Node, NodeLocation
@@ -40,7 +40,7 @@ class RimuHostingException(Exception):
def __repr__(self):
return "<RimuHostingException '%s'>" % (self.args[0])
-class RimuHostingResponse(Response):
+class RimuHostingResponse(JsonResponse):
def __init__(self, response, connection):
self.body = response.read()
self.status = response.status
@@ -55,17 +55,15 @@ class RimuHostingResponse(Response):
if self.status == 403:
raise InvalidCredsError()
return True
+
def parse_body(self):
try:
- js = json.loads(self.body)
+ js = super(RimuHostingResponse, self).parse_body()
if js[js.keys()[0]]['response_type'] == "ERROR":
raise RimuHostingException(
js[js.keys()[0]]['human_readable_message']
)
return js[js.keys()[0]]
- except ValueError:
- raise RimuHostingException('Could not parse body: %s'
- % (self.body))
except KeyError:
raise RimuHostingException('Could not parse body: %s'
% (self.body))
Modified: libcloud/trunk/libcloud/compute/drivers/slicehost.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/slicehost.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/slicehost.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/slicehost.py Sun Oct 23 20:23:56
2011
@@ -21,40 +21,17 @@ import socket
from xml.etree import ElementTree as ET
from xml.parsers.expat import ExpatError
-from libcloud.common.base import ConnectionKey, Response
-from libcloud.compute.types import (
- NodeState, Provider, InvalidCredsError, MalformedResponseError)
+from libcloud.common.base import ConnectionKey, XmlResponse
+from libcloud.compute.types import NodeState, Provider, InvalidCredsError
from libcloud.compute.base import NodeSize, NodeDriver, NodeImage, NodeLocation
from libcloud.compute.base import Node, is_private_subnet
-class SlicehostResponse(Response):
-
- def parse_body(self):
- # length of 1 can't be valid XML, but on destroy node,
- # slicehost returns a 1 byte response with a "Content-Type:
- # application/xml" header. booya.
- if not self.body or len(self.body) <= 1:
- return None
- try:
- body = ET.XML(self.body)
- except:
- raise MalformedResponseError(
- "Failed to parse XML",
- body=self.body,
- driver=SlicehostNodeDriver)
- return body
-
+class SlicehostResponse(XmlResponse):
def parse_error(self):
if self.status == 401:
raise InvalidCredsError(self.body)
- try:
- body = ET.XML(self.body)
- except:
- raise MalformedResponseError(
- "Failed to parse XML",
- body=self.body,
- driver=SlicehostNodeDriver)
+ body = super(SlicehostResponse, self).parse_body()
try:
return "; ".join([ err.text
for err in
Modified: libcloud/trunk/libcloud/compute/drivers/vcloud.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/vcloud.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/vcloud.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/vcloud.py Sun Oct 23 20:23:56 2011
@@ -23,7 +23,7 @@ from urlparse import urlparse
from xml.etree import ElementTree as ET
from xml.parsers.expat import ExpatError
-from libcloud.common.base import Response, ConnectionUserAndKey
+from libcloud.common.base import XmlResponse, ConnectionUserAndKey
from libcloud.common.types import InvalidCredsError
from libcloud.compute.providers import Provider
from libcloud.compute.types import NodeState
@@ -198,18 +198,7 @@ class InstantiateVAppXML(object):
{'href': self.net_href}
)
-class VCloudResponse(Response):
-
- def parse_body(self):
- if not self.body:
- return None
- try:
- return ET.XML(self.body)
- except ExpatError, e:
- raise Exception("%s: %s" % (e, self.parse_error()))
-
- def parse_error(self):
- return self.error
+class VCloudResponse(XmlResponse):
def success(self):
return self.status in (httplib.OK, httplib.CREATED,
Modified: libcloud/trunk/libcloud/compute/drivers/voxel.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/voxel.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/voxel.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/voxel.py Sun Oct 23 20:23:56 2011
@@ -19,9 +19,7 @@ Voxel VoxCloud driver
import datetime
import hashlib
-from xml.etree import ElementTree as ET
-
-from libcloud.common.base import Response, ConnectionUserAndKey
+from libcloud.common.base import XmlResponse, ConnectionUserAndKey
from libcloud.common.types import InvalidCredsError
from libcloud.compute.providers import Provider
from libcloud.compute.types import NodeState
@@ -30,7 +28,7 @@ from libcloud.compute.base import NodeSi
VOXEL_API_HOST = "api.voxel.net"
-class VoxelResponse(Response):
+class VoxelResponse(XmlResponse):
def __init__(self, response, connection):
self.parsed = None
@@ -41,7 +39,7 @@ class VoxelResponse(Response):
if not self.body:
return None
if not self.parsed:
- self.parsed = ET.XML(self.body)
+ self.parsed = super(VoxelResponse, self).parse_body()
return self.parsed
def parse_error(self):
@@ -49,7 +47,7 @@ class VoxelResponse(Response):
if not self.body:
return None
if not self.parsed:
- self.parsed = ET.XML(self.body)
+ self.parsed = super(VoxelResponse, self).parse_body()
for err in self.parsed.findall('err'):
code = err.get('code')
err_list.append("(%s) %s" % (code, err.get('msg')))
@@ -64,7 +62,7 @@ class VoxelResponse(Response):
def success(self):
if not self.parsed:
- self.parsed = ET.XML(self.body)
+ self.parsed = super(VoxelResponse, self).parse_body()
stat = self.parsed.get('stat')
if stat != "ok":
return False
Modified: libcloud/trunk/libcloud/compute/drivers/vpsnet.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/vpsnet.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/vpsnet.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/vpsnet.py Sun Oct 23 20:23:56 2011
@@ -22,8 +22,8 @@ try:
except ImportError:
import json
-from libcloud.common.base import ConnectionUserAndKey, Response
-from libcloud.common.types import InvalidCredsError
+from libcloud.common.base import ConnectionUserAndKey, JsonResponse
+from libcloud.common.types import InvalidCredsError, MalformedResponseError
from libcloud.compute.providers import Provider
from libcloud.compute.types import NodeState
from libcloud.compute.base import Node, NodeDriver
@@ -37,13 +37,12 @@ DISK_PER_NODE = 10
BANDWIDTH_PER_NODE = 250
-class VPSNetResponse(Response):
+class VPSNetResponse(JsonResponse):
def parse_body(self):
try:
- js = json.loads(self.body)
- return js
- except ValueError:
+ return super(VPSNetResponse, self).parse_body()
+ except MalformedResponseError:
return self.body
def success(self):
@@ -54,8 +53,8 @@ class VPSNetResponse(Response):
def parse_error(self):
try:
- errors = json.loads(self.body)['errors'][0]
- except ValueError:
+ errors = super(VPSNetResponse, self).parse_body()['errors'][0]
+ except MalformedResponseError:
return self.body
else:
return "\n".join(errors)
Modified: libcloud/trunk/libcloud/dns/drivers/zerigo.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/dns/drivers/zerigo.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/dns/drivers/zerigo.py (original)
+++ libcloud/trunk/libcloud/dns/drivers/zerigo.py Sun Oct 23 20:23:56 2011
@@ -26,7 +26,7 @@ from xml.etree import ElementTree as ET
from libcloud.utils import fixxpath, findtext, findattr, findall
from libcloud.utils import merge_valid_keys, get_new_obj
-from libcloud.common.base import Response, ConnectionUserAndKey
+from libcloud.common.base import XmlResponse, ConnectionUserAndKey
from libcloud.common.types import InvalidCredsError, LibcloudError
from libcloud.common.types import MalformedResponseError, LazyList
from libcloud.dns.types import Provider, RecordType
@@ -72,17 +72,7 @@ class ZerigoError(LibcloudError):
len(self.errors)))
-class ZerigoDNSResponse(Response):
- def parse_body(self):
- if not self.body or (self.body and not self.body.strip()):
- return None
-
- try:
- body = ET.XML(self.body)
- except:
- raise MalformedResponseError('Failed to parse XML', body=self.body)
- return body
-
+class ZerigoDNSResponse(XmlResponse):
def success(self):
return self.status in [httplib.OK, httplib.CREATED, httplib.ACCEPTED]
Modified: libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py (original)
+++ libcloud/trunk/libcloud/loadbalancer/drivers/rackspace.py Sun Oct 23
20:23:56 2011
@@ -21,7 +21,7 @@ except ImportError:
import json
from libcloud.utils import reverse_dict
-from libcloud.common.base import Response
+from libcloud.common.base import JsonResponse
from libcloud.loadbalancer.base import LoadBalancer, Member, Driver, Algorithm
from libcloud.loadbalancer.base import DEFAULT_ALGORITHM
from libcloud.loadbalancer.types import State
@@ -29,16 +29,15 @@ from libcloud.common.openstack import Op
from libcloud.common.rackspace import (
AUTH_URL_US, AUTH_URL_UK)
-class RackspaceResponse(Response):
-
- def success(self):
- return 200 <= int(self.status) <= 299
+class RackspaceResponse(JsonResponse):
def parse_body(self):
if not self.body:
return None
- else:
- return json.loads(self.body)
+ return super(RackspaceResponse, self).parse_body()
+
+ def success(self):
+ return 200 <= int(self.status) <= 299
class RackspaceConnection(OpenStackBaseConnection):
Modified: libcloud/trunk/libcloud/storage/drivers/atmos.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/storage/drivers/atmos.py?rev=1187966&r1=1187965&r2=1187966&view=diff
==============================================================================
--- libcloud/trunk/libcloud/storage/drivers/atmos.py (original)
+++ libcloud/trunk/libcloud/storage/drivers/atmos.py Sun Oct 23 20:23:56 2011
@@ -24,7 +24,7 @@ import urlparse
from xml.etree import ElementTree
from libcloud import utils
-from libcloud.common.base import ConnectionUserAndKey, Response
+from libcloud.common.base import ConnectionUserAndKey, XmlResponse
from libcloud.common.types import LazyList
from libcloud.storage.base import Object, Container, StorageDriver, CHUNK_SIZE
@@ -41,21 +41,17 @@ class AtmosError(Exception):
self.code = code
self.message = message
-class AtmosResponse(Response):
+class AtmosResponse(XmlResponse):
def success(self):
return self.status in (httplib.OK, httplib.CREATED, httplib.NO_CONTENT,
httplib.PARTIAL_CONTENT)
- def parse_body(self):
- if not self.body:
- return None
- tree = ElementTree.fromstring(self.body)
- return tree
-
def parse_error(self):
- if not self.body:
+ tree = self.parse_body()
+
+ if tree is None:
return None
- tree = ElementTree.fromstring(self.body)
+
code = int(tree.find('Code').text)
message = tree.find('Message').text
raise AtmosError(code, message)