Adding in tests to test default values, fixing a bug found where defaults didn't work properly Closes #722
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/af7376cd Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/af7376cd Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/af7376cd Branch: refs/heads/trunk Commit: af7376cd3f757db8aad293b9641049d676082ed0 Parents: 9b2aef8 Author: Jeffrey Dunham <[email protected]> Authored: Mon Mar 14 18:29:24 2016 -0400 Committer: anthony-shaw <[email protected]> Committed: Wed Mar 16 08:12:32 2016 +1100 ---------------------------------------------------------------------- libcloud/backup/drivers/dimensiondata.py | 16 +++-- ...ver_e75ead52_692f_4314_8725_c8a4f4d13a87.xml | 2 +- ...ad52_692f_4314_8725_c8a4f4d13a87_DEFAULT.xml | 27 ++++++++ libcloud/test/backup/test_dimensiondata.py | 66 ++++++++++++++++++-- 4 files changed, 100 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/af7376cd/libcloud/backup/drivers/dimensiondata.py ---------------------------------------------------------------------- diff --git a/libcloud/backup/drivers/dimensiondata.py b/libcloud/backup/drivers/dimensiondata.py index 6645169..cea656a 100644 --- a/libcloud/backup/drivers/dimensiondata.py +++ b/libcloud/backup/drivers/dimensiondata.py @@ -35,6 +35,8 @@ from libcloud.common.dimensiondata import GENERAL_NS, BACKUP_NS from libcloud.utils.py3 import basestring from libcloud.utils.xml import fixxpath, findtext, findall +DEFAULT_BACKUP_PLAN = 'Advanced' + class DimensionDataBackupDriver(BackupDriver): """ @@ -113,7 +115,11 @@ class DimensionDataBackupDriver(BackupDriver): :rtype: Instance of :class:`BackupTarget` """ - service_plan = extra.get('servicePlan', 'Advanced') + if extra is not None: + service_plan = extra.get('servicePlan', DEFAULT_BACKUP_PLAN) + else: + service_plan = DEFAULT_BACKUP_PLAN + create_node = ET.Element('NewBackup', {'xmlns': BACKUP_NS}) create_node.set('servicePlan', service_plan) @@ -180,8 +186,7 @@ class DimensionDataBackupDriver(BackupDriver): return NotImplementedError( 'create_target_from_container not supported for this driver') - def update_target(self, target, name=None, address=None, extra=None, - type=BackupTargetType.VIRTUAL): + def update_target(self, target, name=None, address=None, extra=None): """ Update the properties of a backup target, only changing the serviceplan is supported. @@ -200,7 +205,10 @@ class DimensionDataBackupDriver(BackupDriver): :rtype: Instance of :class:`BackupTarget` """ - service_plan = extra.get('servicePlan', 'Advanced') + if extra is not None: + service_plan = extra.get('servicePlan', DEFAULT_BACKUP_PLAN) + else: + service_plan = DEFAULT_BACKUP_PLAN request = ET.Element('ModifyBackup', {'xmlns': BACKUP_NS}) request.set('servicePlan', service_plan) http://git-wip-us.apache.org/repos/asf/libcloud/blob/af7376cd/libcloud/test/backup/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87.xml ---------------------------------------------------------------------- diff --git a/libcloud/test/backup/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87.xml b/libcloud/test/backup/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87.xml index c64c530..07b1319 100644 --- a/libcloud/test/backup/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87.xml +++ b/libcloud/test/backup/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87.xml @@ -9,7 +9,7 @@ <networkInfo networkDomainId="553f26b6-2a73-42c3-a78b-6116f11291d0"> <primaryNic id="5e869800-df7b-4626-bcbf-8643b8be11fd" privateIpv4="10.0.4.8" ipv6="2607:f480:1111:1282:2960:fb72:7154:6160" vlanId="bc529e20-dc6f-42ba-be20-0ffe44d1993f" vlanName="Production VLAN" state="NORMAL" /> </networkInfo> - <backup assetId="5579f3a7-4c32-4cf5-8a7e-b45c36a35c10" servicePlan="Advanced" state="NORMAL" /> + <backup assetId="5579f3a7-4c32-4cf5-8a7e-b45c36a35c10" servicePlan="Essentials" state="NORMAL" /> <monitoring monitoringId="11049" servicePlan="ESSENTIALS" state="NORMAL" /> <softwareLabel>MSSQL2008R2S</softwareLabel> <sourceImageId>3ebf3c0f-90fe-4a8b-8585-6e65b316592c</sourceImageId> http://git-wip-us.apache.org/repos/asf/libcloud/blob/af7376cd/libcloud/test/backup/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87_DEFAULT.xml ---------------------------------------------------------------------- diff --git a/libcloud/test/backup/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87_DEFAULT.xml b/libcloud/test/backup/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87_DEFAULT.xml new file mode 100644 index 0000000..c64c530 --- /dev/null +++ b/libcloud/test/backup/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87_DEFAULT.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<server xmlns="urn:didata.com:api:cloud:types" id="e75ead52-692f-4314-8725-c8a4f4d13a87" datacenterId="NA9"> + <name>Production Web Server</name> + <description>Server to host our main web application.</description> + <operatingSystem id="WIN2008S32" displayName="WIN2008S/32" family="WINDOWS" /> + <cpu count="2" speed="STANDARD" coresPerSocket="1" /> + <memoryGb>4</memoryGb> + <disk id="c2e1f199-116e-4dbc-9960-68720b832b0a" scsiId="0" sizeGb="50" speed="STANDARD" state="NORMAL" /> + <networkInfo networkDomainId="553f26b6-2a73-42c3-a78b-6116f11291d0"> + <primaryNic id="5e869800-df7b-4626-bcbf-8643b8be11fd" privateIpv4="10.0.4.8" ipv6="2607:f480:1111:1282:2960:fb72:7154:6160" vlanId="bc529e20-dc6f-42ba-be20-0ffe44d1993f" vlanName="Production VLAN" state="NORMAL" /> + </networkInfo> + <backup assetId="5579f3a7-4c32-4cf5-8a7e-b45c36a35c10" servicePlan="Advanced" state="NORMAL" /> + <monitoring monitoringId="11049" servicePlan="ESSENTIALS" state="NORMAL" /> + <softwareLabel>MSSQL2008R2S</softwareLabel> + <sourceImageId>3ebf3c0f-90fe-4a8b-8585-6e65b316592c</sourceImageId> + <createTime>2015-12-02T10:31:33.000Z</createTime> + <deployed>true</deployed> + <started>true</started> + <state>PENDING_CHANGE</state> + <progress> + <action>DEPLOY_SERVER</action> + <requestTime>2015-12-02T11:07:40.000Z</requestTime> + <userName>devuser1</userName> + </progress> + <vmwareTools versionStatus="CURRENT" runningStatus="RUNNING" apiVersion="9354" /> + <virtualHardware version="vmx-08" upToDate="false" /> + </server> http://git-wip-us.apache.org/repos/asf/libcloud/blob/af7376cd/libcloud/test/backup/test_dimensiondata.py ---------------------------------------------------------------------- diff --git a/libcloud/test/backup/test_dimensiondata.py b/libcloud/test/backup/test_dimensiondata.py index 5411cb4..62fa4e9 100644 --- a/libcloud/test/backup/test_dimensiondata.py +++ b/libcloud/test/backup/test_dimensiondata.py @@ -13,12 +13,18 @@ # See the License for the specific language governing permissions and # limitations under the License. +try: + from lxml import etree as ET +except ImportError: + from xml.etree import ElementTree as ET + 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 +from libcloud.backup.drivers.dimensiondata import DEFAULT_BACKUP_PLAN from libcloud.test import MockHttp, unittest from libcloud.test.backup import TestCaseMixin @@ -59,6 +65,14 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin): self.assertEqual(target.address, 'e75ead52-692f-4314-8725-c8a4f4d13a87') self.assertEqual(target.extra['servicePlan'], 'Enterprise') + def test_create_target_DEFAULT(self): + DimensionDataMockHttp.type = 'DEFAULT' + target = self.driver.create_target( + 'name', + 'e75ead52-692f-4314-8725-c8a4f4d13a87') + self.assertEqual(target.id, 'ee7c4b64-f7af-4a4f-8384-be362273530f') + self.assertEqual(target.address, 'e75ead52-692f-4314-8725-c8a4f4d13a87') + def test_create_target_EXISTS(self): DimensionDataMockHttp.type = 'EXISTS' with self.assertRaises(DimensionDataAPIException) as context: @@ -71,15 +85,20 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin): def test_update_target(self): target = self.driver.list_targets()[0] - extra = {'servicePlan': 'Enterprise'} + extra = {'servicePlan': 'Essentials'} new_target = self.driver.update_target(target, extra=extra) - self.assertEqual(new_target.extra['servicePlan'], 'Enterprise') + self.assertEqual(new_target.extra['servicePlan'], 'Essentials') + + def test_update_target_DEFAULT(self): + DimensionDataMockHttp.type = 'DEFAULT' + target = 'e75ead52-692f-4314-8725-c8a4f4d13a87' + self.driver.update_target(target) def test_update_target_STR(self): target = 'e75ead52-692f-4314-8725-c8a4f4d13a87' - extra = {'servicePlan': 'Advanced'} + extra = {'servicePlan': 'Essentials'} new_target = self.driver.update_target(target, extra=extra) - self.assertEqual(new_target.extra['servicePlan'], 'Advanced') + self.assertEqual(new_target.extra['servicePlan'], 'Essentials') def test_delete_target(self): target = self.driver.list_targets()[0] @@ -242,6 +261,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_DEFAULT(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]) @@ -267,6 +290,11 @@ class DimensionDataMockHttp(MockHttp): 'caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87.xml') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) + def _caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87_DEFAULT(self, method, url, body, headers): + body = self.fixtures.load( + 'caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_e75ead52_692f_4314_8725_c8a4f4d13a87_DEFAULT.xml') + return (httplib.OK, body, {}, httplib.responses[httplib.OK]) + def _caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server(self, method, url, body, headers): body = self.fixtures.load( 'caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server.xml') @@ -325,6 +353,18 @@ class DimensionDataMockHttp(MockHttp): 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_INFO_NOJOB.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_DEFAULT( + self, method, url, body, headers): + if method != 'POST': + raise InvalidRequestError('Only POST is accepted for this test') + request = ET.fromstring(body) + service_plan = request.get('servicePlan') + if service_plan != DEFAULT_BACKUP_PLAN: + raise InvalidRequestError('The default plan %s should have been passed in. Not %s' % (DEFAULT_BACKUP_PLAN, service_plan)) + body = self.fixtures.load( + 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_ENABLE.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( self, method, url, body, headers): if method == 'POST': @@ -354,8 +394,22 @@ class DimensionDataMockHttp(MockHttp): 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( - 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_modify.xml') + request = ET.fromstring(body) + service_plan = request.get('servicePlan') + if service_plan != 'Essentials': + raise InvalidRequestError("Expected Essentials backup plan in request") + body = self.fixtures.load('oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_modify.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_modify_DEFAULT( + self, method, url, body, headers): + request = ET.fromstring(body) + service_plan = request.get('servicePlan') + if service_plan != DEFAULT_BACKUP_PLAN: + raise InvalidRequestError("Expected % backup plan in test" % DEFAULT_BACKUP_PLAN) + body = self.fixtures.load('oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_e75ead52_692f_4314_8725_c8a4f4d13a87_backup_modify.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_client_30b1ff76_c76d_4d7c_b39d_3b72be0384c8(
