DimensionData: Adding better node states, more than just running and terminated


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

Branch: refs/heads/trunk
Commit: d44fd923e099f374128813fdbf73d7f5464cee03
Parents: 6d9e820
Author: Jeffrey Dunham <jeffrey.a.dun...@gmail.com>
Authored: Fri Feb 19 21:47:37 2016 -0500
Committer: anthony-shaw <anthony.p.s...@gmail.com>
Committed: Sun Feb 28 16:18:56 2016 +1100

----------------------------------------------------------------------
 libcloud/compute/drivers/dimensiondata.py       |  37 +++++--
 libcloud/compute/types.py                       |   6 ++
 ...745_4d8a_9cbc_8dabe5a7d0e4_server_server.xml | 105 ++++++++++++++++++-
 libcloud/test/compute/test_dimensiondata.py     |  14 ++-
 4 files changed, 152 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/d44fd923/libcloud/compute/drivers/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/dimensiondata.py 
b/libcloud/compute/drivers/dimensiondata.py
index 651536e..268798f 100644
--- a/libcloud/compute/drivers/dimensiondata.py
+++ b/libcloud/compute/drivers/dimensiondata.py
@@ -42,6 +42,21 @@ from libcloud.utils.xml import fixxpath, findtext, findall
 from libcloud.utils.py3 import basestring
 from libcloud.compute.types import NodeState, Provider
 
+# Node state map is a dictionary with the keys as tuples
+# 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,
+}
+
 
 class DimensionDataNodeDriver(NodeDriver):
     """
@@ -1826,16 +1841,14 @@ class DimensionDataNodeDriver(NodeDriver):
 
     def _to_nodes(self, object):
         node_elements = object.findall(fixxpath('server', TYPES_URN))
-
         return [self._to_node(el) for el in node_elements]
 
     def _to_node(self, element):
-        if findtext(element, 'started', TYPES_URN) == 'true':
-            state = NodeState.RUNNING
-        else:
-            state = NodeState.TERMINATED
-
+        started = findtext(element, 'started', TYPES_URN)
         status = self._to_status(element.find(fixxpath('progress', TYPES_URN)))
+        dd_state = findtext(element, 'state', TYPES_URN)
+
+        node_state = self._get_node_state(dd_state, started, status.action)
 
         has_network_info \
             = element.find(fixxpath('networkInfo', TYPES_URN)) is not None
@@ -1885,7 +1898,7 @@ class DimensionDataNodeDriver(NodeDriver):
 
         n = Node(id=element.get('id'),
                  name=findtext(element, 'name', TYPES_URN),
-                 state=state,
+                 state=node_state,
                  public_ips=[public_ip] if public_ip is not None else [],
                  private_ips=[private_ip] if private_ip is not None else [],
                  driver=self.connection.driver,
@@ -1927,6 +1940,16 @@ class DimensionDataNodeDriver(NodeDriver):
         return s
 
     @staticmethod
+    def _get_node_state(state, started, action):
+        try:
+            return NODE_STATE_MAP[(state, started, action)]
+        except KeyError:
+            if started == 'true':
+                return NodeState.RUNNING
+            else:
+                return NodeState.TERMINATED
+
+    @staticmethod
     def _location_to_location_id(location):
         if isinstance(location, NodeLocation):
             return location.id

http://git-wip-us.apache.org/repos/asf/libcloud/blob/d44fd923/libcloud/compute/types.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/types.py b/libcloud/compute/types.py
index 1cef29c..32b640c 100644
--- a/libcloud/compute/types.py
+++ b/libcloud/compute/types.py
@@ -222,25 +222,31 @@ class NodeState(Type):
     Standard states for a node
 
     :cvar RUNNING: Node is running.
+    :cvar STARTING: Node is starting up.
     :cvar REBOOTING: Node is rebooting.
     :cvar TERMINATED: Node is terminated. This node can't be started later on.
+    :cvar STOPPING: Node is currently trying to stop.
     :cvar STOPPED: Node is stopped. This node can be started later on.
     :cvar PENDING: Node is pending.
     :cvar SUSPENDED: Node is suspended.
     :cvar ERROR: Node is an error state. Usually no operations can be performed
                  on the node once it ends up in the error state.
     :cvar PAUSED: Node is paused.
+    :cvar RECONFIGURING: Node is being reconfigured.
     :cvar UNKNOWN: Node state is unknown.
     """
     RUNNING = 'running'
+    STARTING = 'starting'
     REBOOTING = 'rebooting'
     TERMINATED = 'terminated'
     PENDING = 'pending'
     UNKNOWN = 'unknown'
+    STOPPING = 'stopping'
     STOPPED = 'stopped'
     SUSPENDED = 'suspended'
     ERROR = 'error'
     PAUSED = 'paused'
+    RECONFIGURING = 'reconfiguring'
 
 
 class StorageVolumeState(Type):

http://git-wip-us.apache.org/repos/asf/libcloud/blob/d44fd923/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 c3d607f..bc333d8 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
@@ -19,7 +19,7 @@
         <vmwareTools versionStatus="NEED_UPGRADE" runningStatus="RUNNING" 
apiVersion="8389" />
         <virtualHardware version="vmx-08" upToDate="false" />
     </server>
-    <!-- MCP 2.0 Server -->
+    <!-- MCP 2.0 Server State: SHUTTING_DOWN-->
     <server id="5a32d6e4-9707-4813-a269-56ab4d989f4d" datacenterId="NA9">
         <name>Production Web Server MCP 2</name>
         <description>Server to host our main web application.</description>
@@ -46,4 +46,107 @@
         <vmwareTools versionStatus="CURRENT" runningStatus="RUNNING" 
apiVersion="9354" />
         <virtualHardware version="vmx-08" upToDate="false" />
     </server>
+    <!-- MCP 2.0 Server State: RECONFIGURING-->
+    <server id="5a32d6e4-9707-4813-a269-56ab4d989f4d" datacenterId="NA9">
+        <name>Production Web Server MCP 2</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="91002e08-8dc1-47a1-ad33-04f501c06f87" 
servicePlan="Advanced" state="NORMAL" />
+        <monitoring monitoringId="11039" 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>RECONFIGURE_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>
+    <!-- MCP 2.0 Server State: UNKNOWN - running-->
+    <server id="5a32d6e4-9707-4813-a269-56ab4d989f4d" datacenterId="NA9">
+        <name>Production Web Server MCP 2</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="91002e08-8dc1-47a1-ad33-04f501c06f87" 
servicePlan="Advanced" state="NORMAL" />
+        <monitoring monitoringId="11039" 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>UNKNOWN</state>
+        <progress>
+            <action>SHUTDOWN_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>
+    <!-- MCP 2.0 Server State: UNKNOWN-terminated-->
+    <server id="5a32d6e4-9707-4813-a269-56ab4d989f4d" datacenterId="NA9">
+        <name>Production Web Server MCP 21</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="91002e08-8dc1-47a1-ad33-04f501c06f87" 
servicePlan="Advanced" state="NORMAL" />
+        <monitoring monitoringId="11039" 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>false</started>
+        <state>UNKNOWN</state>
+        <progress>
+            <action>SHUTDOWN_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>
+    <!-- MCP 2.0 Server State: STOPPED-->
+    <server id="5a32d6e4-9707-4813-a269-56ab4d989f4d" datacenterId="NA9">
+        <name>Production Web Server MCP 2</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="91002e08-8dc1-47a1-ad33-04f501c06f87" 
servicePlan="Advanced" state="NORMAL" />
+        <monitoring monitoringId="11039" 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>false</started>
+        <state>NORMAL</state>
+        <vmwareTools versionStatus="CURRENT" runningStatus="RUNNING" 
apiVersion="9354" />
+        <virtualHardware version="vmx-08" upToDate="false" />
+    </server>
 </servers>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/d44fd923/libcloud/test/compute/test_dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_dimensiondata.py 
b/libcloud/test/compute/test_dimensiondata.py
index 3bb0210..2443ea5 100644
--- a/libcloud/test/compute/test_dimensiondata.py
+++ b/libcloud/test/compute/test_dimensiondata.py
@@ -61,12 +61,22 @@ class DimensionDataTests(unittest.TestCase, TestCaseMixin):
     def test_list_nodes_response(self):
         DimensionDataMockHttp.type = None
         ret = self.driver.list_nodes()
-        self.assertEqual(len(ret), 2)
+        self.assertEqual(len(ret), 6)
+
+    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')
 
     def test_list_nodes_response_PAGINATED(self):
         DimensionDataMockHttp.type = 'PAGINATED'
         ret = self.driver.list_nodes()
-        self.assertEqual(len(ret), 4)
+        self.assertEqual(len(ret), 8)
 
     # 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

Reply via email to