DimensionData: Adding a new exception code/message, testing backup exceptions


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/a956d827
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/a956d827
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/a956d827

Branch: refs/heads/trunk
Commit: a956d8274ac388ec0001cc5552f934c87e89d3ce
Parents: 234ada0
Author: Jeffrey Dunham <[email protected]>
Authored: Sat Feb 6 16:58:47 2016 -0500
Committer: anthony-shaw <[email protected]>
Committed: Sun Feb 7 19:51:26 2016 +1100

----------------------------------------------------------------------
 libcloud/common/dimensiondata.py                | 26 +++++++++++++++-----
 ...92f_4314_8725_c8a4f4d13a87_backup_EXISTS.xml |  7 ++++++
 libcloud/test/backup/test_dimensiondata.py      | 21 ++++++++++++++++
 3 files changed, 48 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/a956d827/libcloud/common/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/common/dimensiondata.py b/libcloud/common/dimensiondata.py
index fc5c9be..ee75afd 100644
--- a/libcloud/common/dimensiondata.py
+++ b/libcloud/common/dimensiondata.py
@@ -81,6 +81,18 @@ API_ENDPOINTS = {
 # Default API end-point for the base connection class.
 DEFAULT_REGION = 'dd-na'
 
+BAD_CODE_XML_ELEMENTS = (
+    ('responseCode', SERVER_NS),
+    ('reponseCode', TYPES_URN),
+    ('result', GENERAL_NS)
+)
+
+BAD_MESSAGE_XML_ELEMENTS = (
+    ('message', SERVER_NS),
+    ('message', TYPES_URN),
+    ('resultDetail', GENERAL_NS)
+)
+
 
 class NetworkDomainServicePlan(object):
     ESSENTIALS = "ESSENTIALS"
@@ -97,12 +109,14 @@ class DimensionDataResponse(XmlResponse):
         body = self.parse_body()
 
         if self.status == httplib.BAD_REQUEST:
-            code = findtext(body, 'responseCode', SERVER_NS)
-            if code is None:
-                code = findtext(body, 'responseCode', TYPES_URN)
-            message = findtext(body, 'message', SERVER_NS)
-            if message is None:
-                message = findtext(body, 'message', TYPES_URN)
+            for response_code in BAD_CODE_XML_ELEMENTS:
+                code = findtext(body, response_code[0], response_code[1])
+                if code is not None:
+                    break
+            for message in BAD_MESSAGE_XML_ELEMENTS:
+                message = findtext(body, message[0], message[1])
+                if message is not None:
+                    break
             raise DimensionDataAPIException(code=code,
                                             msg=message,
                                             driver=self.connection.driver)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a956d827/libcloud/test/backup/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_EXISTS.xml
----------------------------------------------------------------------
diff --git 
a/libcloud/test/backup/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_EXISTS.xml
 
b/libcloud/test/backup/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_EXISTS.xml
new file mode 100644
index 0000000..5ffa67e
--- /dev/null
+++ 
b/libcloud/test/backup/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_EXISTS.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns0:Status xmlns:ns0="http://oec.api.opsource.net/schemas/general";>
+    <ns0:operation>Enable Backup for Server</ns0:operation>
+    <ns0:result>ERROR</ns0:result>
+    <ns0:resultDetail>Cloud backup for this server is already enabled or being 
enabled (state: NORMAL).</ns0:resultDetail>
+    <ns0:resultCode>REASON_550</ns0:resultCode>
+</ns0:Status>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a956d827/libcloud/test/backup/test_dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/test/backup/test_dimensiondata.py 
b/libcloud/test/backup/test_dimensiondata.py
index 5121d8b..11d2b73 100644
--- a/libcloud/test/backup/test_dimensiondata.py
+++ b/libcloud/test/backup/test_dimensiondata.py
@@ -16,6 +16,7 @@
 import sys
 from libcloud.utils.py3 import httplib
 
+from libcloud.common.dimensiondata import DimensionDataAPIException
 from libcloud.common.types import InvalidCredsError
 from libcloud.backup.drivers.dimensiondata import DimensionDataBackupDriver as 
DimensionData
 
@@ -58,6 +59,16 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
         self.assertEqual(target.address, 
'e75ead52-692f-4314-8725-c8a4f4d13a87')
         self.assertEqual(target.extra['servicePlan'], 'Enterprise')
 
+    def test_create_target_EXISTS(self):
+        DimensionDataMockHttp.type = 'EXISTS'
+        with self.assertRaises(DimensionDataAPIException) as context:
+            self.driver.create_target(
+                'name',
+                'e75ead52-692f-4314-8725-c8a4f4d13a87',
+                extra={'servicePlan': 'Enterprise'})
+        self.assertEqual(context.exception.code, 'ERROR')
+        self.assertEqual(context.exception.msg, 'Cloud backup for this server 
is already enabled or being enabled (state: NORMAL).')
+
     def test_update_target(self):
         target = self.driver.list_targets()[0]
         extra = {'servicePlan': 'Enterprise'}
@@ -109,6 +120,10 @@ class DimensionDataMockHttp(MockHttp):
         body = self.fixtures.load('oec_0_9_myaccount.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
+    def _oec_0_9_myaccount_EXISTS(self, method, url, body, headers):
+        body = self.fixtures.load('oec_0_9_myaccount.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
     def _oec_0_9_myaccount_INPROGRESS(self, method, url, body, headers):
         body = self.fixtures.load('oec_0_9_myaccount.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
@@ -141,6 +156,12 @@ class DimensionDataMockHttp(MockHttp):
             
'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
+    def 
_oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_EXISTS(
+            self, method, url, body, headers):
+        body = self.fixtures.load(
+            
'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_EXISTS.xml')
+        return (httplib.BAD_REQUEST, body, {}, httplib.responses[httplib.OK])
+
     def 
_oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_modify(
             self, method, url, body, headers):
         body = self.fixtures.load(

Reply via email to