You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2014/08/05 12:29:53 UTC
git commit: Moved shared OpenStackException and OpenStackResponse
class from libcloud.compute.drivers.openstack to libcloud.common.openstack
module.
Repository: libcloud
Updated Branches:
refs/heads/trunk 7132cb223 -> d7917ef5a
Moved shared OpenStackException and OpenStackResponse class from
libcloud.compute.drivers.openstack to libcloud.common.openstack module.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/d7917ef5
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/d7917ef5
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/d7917ef5
Branch: refs/heads/trunk
Commit: d7917ef5a2d27ce459cd797c37505eae0b387b4c
Parents: 7132cb2
Author: Tomaz Muraus <to...@apache.org>
Authored: Tue Aug 5 12:20:23 2014 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Tue Aug 5 12:20:23 2014 +0200
----------------------------------------------------------------------
libcloud/common/openstack.py | 82 ++++++++++++++++++++++++++++
libcloud/compute/drivers/openstack.py | 86 +++---------------------------
2 files changed, 89 insertions(+), 79 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/d7917ef5/libcloud/common/openstack.py
----------------------------------------------------------------------
diff --git a/libcloud/common/openstack.py b/libcloud/common/openstack.py
index 73bd27e..768f88b 100644
--- a/libcloud/common/openstack.py
+++ b/libcloud/common/openstack.py
@@ -16,15 +16,23 @@
"""
Common utilities for OpenStack
"""
+
import sys
import datetime
+try:
+ from lxml import etree as ET
+except ImportError:
+ from xml.etree import ElementTree as ET
+
from libcloud.utils.py3 import httplib
from libcloud.utils.iso8601 import parse_date
from libcloud.common.base import ConnectionUserAndKey, Response
+from libcloud.common.types import ProviderError
from libcloud.compute.types import (LibcloudError, InvalidCredsError,
MalformedResponseError)
+from libcloud.compute.types import KeyPairDoesNotExistError
try:
import simplejson as json
@@ -51,6 +59,8 @@ __all__ = [
'OpenStackBaseConnection',
'OpenStackAuthConnection',
'OpenStackServiceCatalog',
+ 'OpenStackResponse',
+ 'OpenStackException',
'OpenStackDriverMixin',
'AUTH_TOKEN_EXPIRES_GRACE_SECONDS'
@@ -658,6 +668,78 @@ class OpenStackBaseConnection(ConnectionUserAndKey):
self._set_up_connection_info(url=url)
+class OpenStackException(ProviderError):
+ pass
+
+
+class OpenStackResponse(Response):
+ node_driver = None
+
+ def success(self):
+ i = int(self.status)
+ return i >= 200 and i <= 299
+
+ def has_content_type(self, content_type):
+ content_type_value = self.headers.get('content-type') or ''
+ content_type_value = content_type_value.lower()
+ return content_type_value.find(content_type.lower()) > -1
+
+ def parse_body(self):
+ if self.status == httplib.NO_CONTENT or not self.body:
+ return None
+
+ if self.has_content_type('application/xml'):
+ try:
+ return ET.XML(self.body)
+ except:
+ raise MalformedResponseError(
+ 'Failed to parse XML',
+ body=self.body,
+ driver=self.node_driver)
+
+ elif self.has_content_type('application/json'):
+ try:
+ return json.loads(self.body)
+ except:
+ raise MalformedResponseError(
+ 'Failed to parse JSON',
+ body=self.body,
+ driver=self.node_driver)
+ else:
+ return self.body
+
+ def parse_error(self):
+ text = None
+ body = self.parse_body()
+
+ if self.has_content_type('application/xml'):
+ text = '; '.join([err.text or '' for err in body.getiterator()
+ if err.text])
+ elif self.has_content_type('application/json'):
+ values = list(body.values())
+
+ context = self.connection.context
+ driver = self.connection.driver
+ key_pair_name = context.get('key_pair_name', None)
+
+ if len(values) > 0 and values[0]['code'] == 404 and key_pair_name:
+ raise KeyPairDoesNotExistError(name=key_pair_name,
+ driver=driver)
+ elif len(values) > 0 and 'message' in values[0]:
+ text = ';'.join([fault_data['message'] for fault_data
+ in values])
+ else:
+ text = body
+ else:
+ # while we hope a response is always one of xml or json, we have
+ # seen html or text in the past, its not clear we can really do
+ # something to make it more readable here, so we will just pass
+ # it along as the whole response body in the text variable.
+ text = body
+
+ return '%s %s %s' % (self.status, self.error, text)
+
+
class OpenStackDriverMixin(object):
def __init__(self, *args, **kwargs):
http://git-wip-us.apache.org/repos/asf/libcloud/blob/d7917ef5/libcloud/compute/drivers/openstack.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/openstack.py b/libcloud/compute/drivers/openstack.py
index c09cee6..edad98a 100644
--- a/libcloud/compute/drivers/openstack.py
+++ b/libcloud/compute/drivers/openstack.py
@@ -21,6 +21,11 @@ try:
except ImportError:
import json
+try:
+ from lxml import etree as ET
+except ImportError:
+ from xml.etree import ElementTree as ET
+
import warnings
import base64
@@ -29,23 +34,18 @@ from libcloud.utils.py3 import b
from libcloud.utils.py3 import next
from libcloud.utils.py3 import urlparse
-try:
- from lxml import etree as ET
-except ImportError:
- from xml.etree import ElementTree as ET
from libcloud.common.openstack import OpenStackBaseConnection
from libcloud.common.openstack import OpenStackDriverMixin
-from libcloud.common.types import MalformedResponseError, ProviderError
+from libcloud.common.openstack import OpenStackException
+from libcloud.common.openstack import OpenStackResponse
from libcloud.utils.networking import is_private_subnet
from libcloud.compute.base import NodeSize, NodeImage
from libcloud.compute.base import (NodeDriver, Node, NodeLocation,
StorageVolume, VolumeSnapshot)
from libcloud.compute.base import KeyPair
from libcloud.compute.types import NodeState, Provider
-from libcloud.compute.types import KeyPairDoesNotExistError
from libcloud.pricing import get_size_price
-from libcloud.common.base import Response
from libcloud.utils.xml import findall
__all__ = [
@@ -67,78 +67,6 @@ ATOM_NAMESPACE = "http://www.w3.org/2005/Atom"
DEFAULT_API_VERSION = '1.1'
-class OpenStackException(ProviderError):
- pass
-
-
-class OpenStackResponse(Response):
- node_driver = None
-
- def success(self):
- i = int(self.status)
- return i >= 200 and i <= 299
-
- def has_content_type(self, content_type):
- content_type_value = self.headers.get('content-type') or ''
- content_type_value = content_type_value.lower()
- return content_type_value.find(content_type.lower()) > -1
-
- def parse_body(self):
- if self.status == httplib.NO_CONTENT or not self.body:
- return None
-
- if self.has_content_type('application/xml'):
- try:
- return ET.XML(self.body)
- except:
- raise MalformedResponseError(
- 'Failed to parse XML',
- body=self.body,
- driver=self.node_driver)
-
- elif self.has_content_type('application/json'):
- try:
- return json.loads(self.body)
- except:
- raise MalformedResponseError(
- 'Failed to parse JSON',
- body=self.body,
- driver=self.node_driver)
- else:
- return self.body
-
- def parse_error(self):
- text = None
- body = self.parse_body()
-
- if self.has_content_type('application/xml'):
- text = '; '.join([err.text or '' for err in body.getiterator()
- if err.text])
- elif self.has_content_type('application/json'):
- values = list(body.values())
-
- context = self.connection.context
- driver = self.connection.driver
- key_pair_name = context.get('key_pair_name', None)
-
- if len(values) > 0 and values[0]['code'] == 404 and key_pair_name:
- raise KeyPairDoesNotExistError(name=key_pair_name,
- driver=driver)
- elif len(values) > 0 and 'message' in values[0]:
- text = ';'.join([fault_data['message'] for fault_data
- in values])
- else:
- text = body
- else:
- # while we hope a response is always one of xml or json, we have
- # seen html or text in the past, its not clear we can really do
- # something to make it more readable here, so we will just pass
- # it along as the whole response body in the text variable.
- text = body
-
- return '%s %s %s' % (self.status, self.error, text)
-
-
class OpenStackComputeConnection(OpenStackBaseConnection):
# default config for http://devstack.org/
service_type = 'compute'