Adding some MCP1.0 love Fixing bug in wait_for_state exception Closes #709
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/579c1bf2 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/579c1bf2 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/579c1bf2 Branch: refs/heads/trunk Commit: 579c1bf2a675566991cbbc1080a619600d683c23 Parents: b693e9f Author: Jeffrey Dunham <jeffrey.a.dun...@gmail.com> Authored: Sat Feb 20 01:10:03 2016 -0500 Committer: anthony-shaw <anthony.p.s...@gmail.com> Committed: Sun Feb 28 16:19:01 2016 +1100 ---------------------------------------------------------------------- libcloud/common/dimensiondata.py | 12 ++++---- libcloud/compute/drivers/dimensiondata.py | 29 ++++++++++++++------ ...745_4d8a_9cbc_8dabe5a7d0e4_server_server.xml | 26 +++++++++++++++++- libcloud/test/compute/test_dimensiondata.py | 28 +++++++++++++------ 4 files changed, 72 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/579c1bf2/libcloud/common/dimensiondata.py ---------------------------------------------------------------------- diff --git a/libcloud/common/dimensiondata.py b/libcloud/common/dimensiondata.py index 469f933..ca0b57f 100644 --- a/libcloud/common/dimensiondata.py +++ b/libcloud/common/dimensiondata.py @@ -458,17 +458,19 @@ class DimensionDataConnection(ConnectionUserAndKey): while cnt < timeout / poll_interval: result = func(*args, **kwargs) if isinstance(result, Node): - if result.state is state: - return result - elif result.status is state or result.status in state: + object_state = result.state + else: + object_state = result.status + + if object_state is state or object_state in state: return result sleep(poll_interval) cnt += 1 msg = 'Status check for object %s timed out' % (result) - raise DimensionDataAPIException(code=result.status, + raise DimensionDataAPIException(code=object_state, msg=msg, - driver=self.connection.driver) + driver=self.driver) def _get_orgId(self): """ http://git-wip-us.apache.org/repos/asf/libcloud/blob/579c1bf2/libcloud/compute/drivers/dimensiondata.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/dimensiondata.py b/libcloud/compute/drivers/dimensiondata.py index 268798f..1561c78 100644 --- a/libcloud/compute/drivers/dimensiondata.py +++ b/libcloud/compute/drivers/dimensiondata.py @@ -46,15 +46,26 @@ from libcloud.compute.types import NodeState, Provider # These tuples represent: # (<state_of_node_from_didata>, <is node started?>, <action happening>) NODE_STATE_MAP = { - ('NORMAL', 'true', None): NodeState.RUNNING, - ('NORMAL', 'false', None): NodeState.STOPPED, - ('PENDING_CHANGE', 'true', 'START_SERVER'): NodeState.STARTING, - ('PENDING_ADD', 'true', 'DEPLOY_SERVER'): NodeState.STARTING, - ('PENDING_CHANGE', 'true', 'SHUTDOWN_SERVER'): NodeState.STOPPING, - ('PENDING_CHANGE', 'true', 'REBOOT_SERVER'): NodeState.REBOOTING, - ('PENDING_CHANGE', 'true', 'RESET_SERVER'): NodeState.REBOOTING, - ('PENDING_CHANGE', 'true', 'RECONFIGURE_SERVER'): NodeState.RECONFIGURING, - ('PENDING_CHANGE', 'true', 'POWER_OFF_SERVER'): NodeState.STOPPING, + ('NORMAL', 'true', None): + NodeState.RUNNING, + ('NORMAL', 'false', None): + NodeState.STOPPED, + ('PENDING_CHANGE', 'true', 'START_SERVER'): + NodeState.STARTING, + ('PENDING_ADD', 'true', 'DEPLOY_SERVER'): + NodeState.STARTING, + ('PENDING_ADD', 'true', 'DEPLOY_SERVER_WITH_DISK_SPEED'): + NodeState.STARTING, + ('PENDING_CHANGE', 'true', 'SHUTDOWN_SERVER'): + NodeState.STOPPING, + ('PENDING_CHANGE', 'true', 'POWER_OFF_SERVER'): + NodeState.STOPPING, + ('PENDING_CHANGE', 'true', 'REBOOT_SERVER'): + NodeState.REBOOTING, + ('PENDING_CHANGE', 'true', 'RESET_SERVER'): + NodeState.REBOOTING, + ('PENDING_CHANGE', 'true', 'RECONFIGURE_SERVER'): + NodeState.RECONFIGURING, } http://git-wip-us.apache.org/repos/asf/libcloud/blob/579c1bf2/libcloud/test/compute/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server.xml ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server.xml b/libcloud/test/compute/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server.xml index bc333d8..f134822 100644 --- a/libcloud/test/compute/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server.xml +++ b/libcloud/test/compute/fixtures/dimensiondata/caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <servers xmlns="urn:didata.com:api:cloud:types" pageNumber="1" pageCount="2" totalCount="2" pageSize="250"> - <!-- MCP 1.0 Server --> + <!-- MCP 1.0 Server State: RUNNING--> <server id="e75ead52-692f-4314-8725-c8a4f4d13a87" datacenterId="NA1"> <name>Production Web Server MCP 1</name> <description>nopassword0</description> @@ -19,6 +19,30 @@ <vmwareTools versionStatus="NEED_UPGRADE" runningStatus="RUNNING" apiVersion="8389" /> <virtualHardware version="vmx-08" upToDate="false" /> </server> + <!-- MCP 1.0 Server State: STARTING--> + <server id="e75ead52-692f-4314-8725-c8a4f4d13a88" datacenterId="NA1"> + <name>Production Web Server MCP 1</name> + <description>nopassword0</description> + <operatingSystem id="REDHAT632" displayName="REDHAT6/32" family="UNIX" /> + <cpu count="4" speed="STANDARD" coresPerSocket="1" /> + <memoryGb>2</memoryGb> + <disk id="74f81c56-96cc-4cca-b4d7-a88f641a6ea2" scsiId="0" sizeGb="10" speed="STANDARD" state="NORMAL" /> + <nic id="43b24e9e-c1c9-4d53-965b-89bcaa725103" privateIpv4="10.160.117.25" networkId="c550be0e-65c1-11e4-811f-005056806999" networkName="Test1" state="NORMAL" /> + <backup assetId="5579f3a7-4c32-4cf5-8a7e-b45c36a35c10" servicePlan="Enterprise" state="NORMAL" /> + <monitoring monitoringId="11049" servicePlan="ESSENTIALS" state="NORMAL" /> + <sourceImageId>e9ec6eb4-4634-49de-b914-01eb74da5fb9</sourceImageId> + <createTime>2015-08-11T16:51:05.000Z</createTime> + <deployed>true</deployed> + <started>true</started> + <state>PENDING_ADD</state> + <progress> + <action>DEPLOY_SERVER_WITH_DISK_SPEED</action> + <requestTime>2015-12-02T11:07:40.000Z</requestTime> + <userName>devuser1</userName> + </progress> + <vmwareTools versionStatus="NEED_UPGRADE" runningStatus="RUNNING" apiVersion="8389" /> + <virtualHardware version="vmx-08" upToDate="false" /> + </server> <!-- MCP 2.0 Server State: SHUTTING_DOWN--> <server id="5a32d6e4-9707-4813-a269-56ab4d989f4d" datacenterId="NA9"> <name>Production Web Server MCP 2</name> http://git-wip-us.apache.org/repos/asf/libcloud/blob/579c1bf2/libcloud/test/compute/test_dimensiondata.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_dimensiondata.py b/libcloud/test/compute/test_dimensiondata.py index bf0bb0c..b4c4ab3 100644 --- a/libcloud/test/compute/test_dimensiondata.py +++ b/libcloud/test/compute/test_dimensiondata.py @@ -61,22 +61,24 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin): def test_list_nodes_response(self): DimensionDataMockHttp.type = None ret = self.driver.list_nodes() - self.assertEqual(len(ret), 6) + self.assertEqual(len(ret), 7) def test_server_states(self): DimensionDataMockHttp.type = None ret = self.driver.list_nodes() self.assertTrue(ret[0].state == 'running') - self.assertTrue(ret[1].state == 'stopping') - self.assertTrue(ret[2].state == 'reconfiguring') - self.assertTrue(ret[3].state == 'running') - self.assertTrue(ret[4].state == 'terminated') - self.assertTrue(ret[5].state == 'stopped') + print(ret[1].state) + self.assertTrue(ret[1].state == 'starting') + self.assertTrue(ret[2].state == 'stopping') + self.assertTrue(ret[3].state == 'reconfiguring') + self.assertTrue(ret[4].state == 'running') + self.assertTrue(ret[5].state == 'terminated') + self.assertTrue(ret[6].state == 'stopped') def test_list_nodes_response_PAGINATED(self): DimensionDataMockHttp.type = 'PAGINATED' ret = self.driver.list_nodes() - self.assertEqual(len(ret), 8) + self.assertEqual(len(ret), 9) # We're making sure here the filters make it to the URL # See _caas_2_1_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_server_ALLFILTERS for asserts @@ -398,11 +400,21 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin): self.driver.ex_get_vlan, vlan_id='0e56433f-d808-4669-821d-812769517ff8') - def test_ex_wait_for_state_node(self): + def test_ex_wait_for_state_NODE(self): self.driver.ex_wait_for_state('running', self.driver.ex_get_node_by_id, id='e75ead52-692f-4314-8725-c8a4f4d13a87') + def test_ex_wait_for_state_FAIL(self): + with self.assertRaises(DimensionDataAPIException) as context: + self.driver.ex_wait_for_state('starting', + self.driver.ex_get_node_by_id, + id='e75ead52-692f-4314-8725-c8a4f4d13a87', + timeout=2 + ) + self.assertEqual(context.exception.code, 'running') + self.assertTrue('timed out' in context.exception.msg) + def test_ex_update_vlan(self): vlan = self.driver.ex_get_vlan('0e56433f-d808-4669-821d-812769517ff8') vlan.name = 'new name'