[pkg-eucalyptus-commits] [SCM] managing cloud instances for Eucalyptus branch, master, updated. 3.0.0-alpha3-257-g1da8e3a

Garrett Holmstrom gholms at fedoraproject.org
Sun Jun 16 02:30:05 UTC 2013


The following commit has been merged in the master branch:
commit ce778cc004262903b0e9d07c7dd474266b20319b
Author: Garrett Holmstrom <gholms at fedoraproject.org>
Date:   Wed Feb 13 15:12:51 2013 -0800

    Change ServerError -> AWSError

diff --git a/euca2ools/commands/euare/__init__.py b/euca2ools/commands/euare/__init__.py
index 9ec120e..f601ed7 100644
--- a/euca2ools/commands/euare/__init__.py
+++ b/euca2ools/commands/euare/__init__.py
@@ -28,6 +28,7 @@
 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
 
+from euca2ools.exceptions import AWSError
 from requestbuilder import Arg, SERVICE
 import requestbuilder.auth
 import requestbuilder.service
@@ -40,6 +41,10 @@ class Euare(requestbuilder.service.BaseService):
     AUTH_CLASS = requestbuilder.auth.QuerySigV2Auth
     URL_ENVVAR = 'EUARE_URL'
 
+    def handle_http_error(self, response):
+        raise AWSError(response)
+
+
 class EuareRequest(Euca2oolsQueryRequest):
     SERVICE_CLASS = Euare
     ARGS = [Arg('-U', '--url', dest='url', metavar='URL', route_to=SERVICE,
diff --git a/euca2ools/commands/euca/__init__.py b/euca2ools/commands/euca/__init__.py
index 7d808ff..9e39910 100644
--- a/euca2ools/commands/euca/__init__.py
+++ b/euca2ools/commands/euca/__init__.py
@@ -29,6 +29,7 @@
 # POSSIBILITY OF SUCH DAMAGE.
 
 import argparse
+from euca2ools.exceptions import AWSError
 from operator import itemgetter
 import os.path
 from requestbuilder import Arg, MutuallyExclusiveArgList, AUTH, SERVICE
@@ -105,6 +106,7 @@ class EC2CompatibleQuerySigV2Auth(QuerySigV2Auth):
         if not self.args.get('secret_key'):
             raise AuthError('missing secret key')
 
+
 class Eucalyptus(requestbuilder.service.BaseService):
     NAME = 'ec2'
     DESCRIPTION = 'Eucalyptus compute cloud service'
@@ -156,6 +158,9 @@ class Eucalyptus(requestbuilder.service.BaseService):
             self.auth.args['shell_configfile'] = self.args['shell_configfile']
             self.auth.configure()
 
+    def handle_http_error(self, response):
+        raise AWSError(response)
+
 
 class EucalyptusRequest(Euca2oolsQueryRequest, TabifyingCommand):
     SERVICE_CLASS = Eucalyptus
diff --git a/euca2ools/commands/walrus/__init__.py b/euca2ools/commands/walrus/__init__.py
index 7cf9025..f1c66c4 100644
--- a/euca2ools/commands/walrus/__init__.py
+++ b/euca2ools/commands/walrus/__init__.py
@@ -28,6 +28,7 @@
 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
 
+from euca2ools.exceptions import AWSError
 from requestbuilder import Arg, SERVICE
 import requestbuilder.auth
 import requestbuilder.request
@@ -41,6 +42,9 @@ class Walrus(requestbuilder.service.BaseService):
     AUTH_CLASS = requestbuilder.auth.S3RestAuth
     URL_ENVVAR = 'S3_URL'
 
+    def handle_http_error(self, response):
+        raise AWSError(response)
+
 
 class WalrusRequest(Euca2oolsRequest):
     SERVICE_CLASS = Walrus
diff --git a/euca2ools/exceptions.py b/euca2ools/exceptions.py
index 9e30702..a3c8ddd 100644
--- a/euca2ools/exceptions.py
+++ b/euca2ools/exceptions.py
@@ -130,3 +130,35 @@ class ParseError(EucaError):
     def __init__(self, msg):
         self._message = msg
 
+######## NEW CODE STARTS HERE ########
+
+import io
+import requestbuilder.exceptions
+from requestbuilder.xmlparse import parse_aws_xml
+import six
+
+class AWSError(requestbuilder.exceptions.ServerError):
+    def __init__(self, response, *args):
+        requestbuilder.exceptions.ServerError.__init__(self, response, *args)
+        self.code     = None # API error code
+        self.message  = None # Error message
+        self.elements = {}   # Elements in the error response's body
+
+        if self.body:
+            try:
+                parsed = parse_aws_xml(io.StringIO(six.text_type(self.body)))
+                parsed = parsed[parsed.keys()[0]]  # Strip off the root element
+                self.code     = parsed.get('Code')
+                self.message  = parsed.get('Message')
+                self.elements = parsed
+            except ValueError:
+                # Dump the unparseable message body so we don't include
+                # unusable garbage in the exception.  Since Eucalyptus
+                # frequently returns plain text and/or broken XML, store it
+                # in case we need it later.
+                self.message = self.body
+                self.body    = None
+
+    def __str__(self):
+        return '({code}) {msg}'.format(code=(self.code or self.status_code),
+                                       msg=(self.message or ''))

-- 
managing cloud instances for Eucalyptus



More information about the pkg-eucalyptus-commits mailing list