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'

Reply via email to