You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2015/05/06 15:10:49 UTC
[1/4] libcloud git commit: LIBCLOUD-698 rename OpSource Dimension
Data. Added Dimension Data driver.
Repository: libcloud
Updated Branches:
refs/heads/trunk c94ded833 -> cfd815eb8
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/test_dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_dimensiondata.py b/libcloud/test/compute/test_dimensiondata.py
new file mode 100644
index 0000000..47a8e16
--- /dev/null
+++ b/libcloud/test/compute/test_dimensiondata.py
@@ -0,0 +1,251 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import sys
+import unittest
+from libcloud.utils.py3 import httplib
+
+from libcloud.common.types import InvalidCredsError
+from libcloud.compute.drivers.dimensiondata import DimensionDataNodeDriver as DimensionData
+from libcloud.compute.drivers.dimensiondata import DimensionDataAPIException
+from libcloud.compute.base import Node, NodeAuthPassword, NodeLocation
+
+from libcloud.test import MockHttp
+from libcloud.test.compute import TestCaseMixin
+from libcloud.test.file_fixtures import ComputeFileFixtures
+
+from libcloud.test.secrets import DIMENSIONDATA_PARAMS
+
+
+class DimensionDataTests(unittest.TestCase, TestCaseMixin):
+
+ def setUp(self):
+ DimensionData.connectionCls.conn_classes = (None, DimensionDataMockHttp)
+ DimensionDataMockHttp.type = None
+ self.driver = DimensionData(*DIMENSIONDATA_PARAMS)
+
+ def test_invalid_creds(self):
+ DimensionDataMockHttp.type = 'UNAUTHORIZED'
+ try:
+ self.driver.list_nodes()
+ self.assertTrue(
+ False) # Above command should have thrown an InvalidCredsException
+ except InvalidCredsError:
+ pass
+
+ def test_list_sizes_response(self):
+ DimensionDataMockHttp.type = None
+ ret = self.driver.list_sizes()
+ self.assertEqual(len(ret), 1)
+ size = ret[0]
+ self.assertEqual(size.name, 'default')
+
+ def test_reboot_node_response(self):
+ node = Node(id='11', name=None, state=None,
+ public_ips=None, private_ips=None, driver=self.driver)
+ ret = node.reboot()
+ self.assertTrue(ret is True)
+
+ def test_reboot_node_response_INPROGRESS(self):
+ DimensionDataMockHttp.type = 'INPROGRESS'
+ node = Node(id='11', name=None, state=None,
+ public_ips=None, private_ips=None, driver=self.driver)
+ try:
+ node.reboot()
+ self.assertTrue(
+ False) # above command should have thrown DimensionDataAPIException
+ except DimensionDataAPIException:
+ pass
+
+ def test_destroy_node_response(self):
+ node = Node(id='11', name=None, state=None,
+ public_ips=None, private_ips=None, driver=self.driver)
+ ret = node.destroy()
+ self.assertTrue(ret is True)
+
+ def test_destroy_node_response_INPROGRESS(self):
+ DimensionDataMockHttp.type = 'INPROGRESS'
+ node = Node(id='11', name=None, state=None,
+ public_ips=None, private_ips=None, driver=self.driver)
+ try:
+ node.destroy()
+ self.assertTrue(
+ False) # above command should have thrown DimensionDataAPIException
+ except DimensionDataAPIException:
+ pass
+
+ def test_create_node_response(self):
+ rootPw = NodeAuthPassword('pass123')
+ image = self.driver.list_images()[0]
+ network = self.driver.ex_list_networks()[0]
+ node = self.driver.create_node(name='test2', image=image, auth=rootPw,
+ ex_description='test2 node', ex_network=network,
+ ex_isStarted=False)
+ self.assertEqual(node.id, 'e75ead52-692f-4314-8725-c8a4f4d13a87')
+ self.assertEqual(node.extra['status'].action, 'DEPLOY_SERVER')
+
+ def test_ex_shutdown_graceful(self):
+ node = Node(id='11', name=None, state=None,
+ public_ips=None, private_ips=None, driver=self.driver)
+ ret = self.driver.ex_shutdown_graceful(node)
+ self.assertTrue(ret is True)
+
+ def test_ex_shutdown_graceful_INPROGRESS(self):
+ DimensionDataMockHttp.type = 'INPROGRESS'
+ node = Node(id='11', name=None, state=None,
+ public_ips=None, private_ips=None, driver=self.driver)
+ try:
+ self.driver.ex_shutdown_graceful(node)
+ self.assertTrue(
+ False) # above command should have thrown DimensionDataAPIException
+ except DimensionDataAPIException:
+ pass
+
+ def test_ex_start_node(self):
+ node = Node(id='11', name=None, state=None,
+ public_ips=None, private_ips=None, driver=self.driver)
+ ret = self.driver.ex_start_node(node)
+ self.assertTrue(ret is True)
+
+ def test_ex_start_node_INPROGRESS(self):
+ DimensionDataMockHttp.type = 'INPROGRESS'
+ node = Node(id='11', name=None, state=None,
+ public_ips=None, private_ips=None, driver=self.driver)
+ try:
+ self.driver.ex_start_node(node)
+ self.assertTrue(
+ False) # above command should have thrown DimensionDataAPIException
+ except DimensionDataAPIException:
+ pass
+
+ def test_ex_power_off(self):
+ node = Node(id='11', name=None, state=None,
+ public_ips=None, private_ips=None, driver=self.driver)
+ ret = self.driver.ex_power_off(node)
+ self.assertTrue(ret is True)
+
+ def test_ex_power_off_INPROGRESS(self):
+ DimensionDataMockHttp.type = 'INPROGRESS'
+ node = Node(id='11', name=None, state=None,
+ public_ips=None, private_ips=None, driver=self.driver)
+ try:
+ self.driver.ex_power_off(node)
+ self.assertTrue(
+ False) # above command should have thrown DimensionDataAPIException
+ except DimensionDataAPIException:
+ pass
+
+ def test_ex_list_networks(self):
+ nets = self.driver.ex_list_networks()
+ self.assertEqual(nets[0].name, 'test-net1')
+ self.assertTrue(isinstance(nets[0].location, NodeLocation))
+
+ def test_node_public_ip(self):
+ nodes = self.driver.list_nodes()
+ node = [n for n in nodes if n.id ==
+ 'abadbc7e-9e10-46ca-9d4a-194bcc6b6c16'][0]
+ self.assertEqual(node.public_ips[0], '200.16.132.7')
+
+
+class DimensionDataMockHttp(MockHttp):
+
+ fixtures = ComputeFileFixtures('dimensiondata')
+
+ def _oec_0_9_myaccount_UNAUTHORIZED(self, method, url, body, headers):
+ return (httplib.UNAUTHORIZED, "", {}, httplib.responses[httplib.UNAUTHORIZED])
+
+ def _oec_0_9_myaccount(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])
+
+ def _oec_0_9_base_image(self, method, url, body, headers):
+ body = self.fixtures.load('oec_0_9_base_image.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_deployed(self, method, url, body, headers):
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_deployed.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_pendingDeploy(self, method, url, body, headers):
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_pendingDeploy.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_datacenter(self, method, url, body, headers):
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_datacenter.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11(self, method, url, body, headers):
+ body = None
+ action = url.split('?')[-1]
+
+ if action == 'restart':
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_restart.xml')
+ elif action == 'shutdown':
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_shutdown.xml')
+ elif action == 'delete':
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_delete.xml')
+ elif action == 'start':
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_start.xml')
+ elif action == 'poweroff':
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_poweroff.xml')
+
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_INPROGRESS(self, method, url, body, headers):
+ body = None
+ action = url.split('?')[-1]
+
+ if action == 'restart':
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_restart_INPROGRESS.xml')
+ elif action == 'shutdown':
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_shutdown_INPROGRESS.xml')
+ elif action == 'delete':
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_delete_INPROGRESS.xml')
+ elif action == 'start':
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_start_INPROGRESS.xml')
+ elif action == 'poweroff':
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_poweroff_INPROGRESS.xml')
+
+ return (httplib.BAD_REQUEST, body, {}, httplib.responses[httplib.OK])
+
+ def _oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server(self, method, url, body, headers):
+ body = self.fixtures.load(
+ '_oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_networkWithLocation(self, method, url, body, headers):
+ body = self.fixtures.load(
+ 'oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_networkWithLocation.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+
+if __name__ == '__main__':
+ sys.exit(unittest.main())
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/secrets.py-dist
----------------------------------------------------------------------
diff --git a/libcloud/test/secrets.py-dist b/libcloud/test/secrets.py-dist
index cca4930..d6ea913 100644
--- a/libcloud/test/secrets.py-dist
+++ b/libcloud/test/secrets.py-dist
@@ -30,6 +30,7 @@ IBM_PARAMS = ('user', 'secret')
# OPENSTACK_PARAMS = ('user_name', 'api_key', secure_bool, 'host', port_int)
OPENSTACK_PARAMS = ('user_name', 'api_key', False, 'host', 8774)
OPENNEBULA_PARAMS = ('user', 'key')
+DIMENSIONDATA_PARAMS = ('user', 'password')
OPSOURCE_PARAMS = ('user', 'password')
RACKSPACE_PARAMS = ('user', 'key')
RACKSPACE_NOVA_PARAMS = ('user_name', 'api_key', False, 'host', 8774)
[3/4] libcloud git commit: Re-generate supported providers tables.
Posted by to...@apache.org.
Re-generate supported providers tables.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/bfec2c46
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/bfec2c46
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/bfec2c46
Branch: refs/heads/trunk
Commit: bfec2c469f1a65df7d06116447b2207651e7e5da
Parents: 119c190
Author: Tomaz Muraus <to...@apache.org>
Authored: Wed May 6 14:54:28 2015 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Wed May 6 14:54:28 2015 +0200
----------------------------------------------------------------------
docs/compute/_supported_methods_block_storage.rst | 5 +++--
docs/compute/_supported_methods_image_management.rst | 5 +++--
docs/compute/_supported_methods_key_pair_management.rst | 3 ++-
docs/compute/_supported_methods_main.rst | 5 +++--
docs/compute/_supported_providers.rst | 5 +++--
5 files changed, 14 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/bfec2c46/docs/compute/_supported_methods_block_storage.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_block_storage.rst b/docs/compute/_supported_methods_block_storage.rst
index ee33104..62dbf55 100644
--- a/docs/compute/_supported_methods_block_storage.rst
+++ b/docs/compute/_supported_methods_block_storage.rst
@@ -9,8 +9,8 @@ Provider list volumes create volume destroy volume
`CloudFrames`_ no no no no no no no
`CloudSigma (API v2.0)`_ no no no no no no no
`CloudStack`_ yes yes yes yes yes no yes
-`DigitalOcean`_ no no no no no no no
-`DimensionData`_ no no no no no no no
+`DigitalOcean`_ no no no no no no no
+`DimensionData`_ no no no no no no no
`Dreamhost`_ no no no no no no no
`Amazon EC2`_ yes yes yes yes yes yes yes
`Amazon EC2 (ap-northeast-1)`_ yes yes yes yes yes yes yes
@@ -79,6 +79,7 @@ Provider list volumes create volume destroy volume
.. _`CloudSigma (API v2.0)`: http://www.cloudsigma.com/
.. _`CloudStack`: http://cloudstack.org/
.. _`DigitalOcean`: https://www.digitalocean.com
+.. _`DimensionData`: http://www.dimensiondata.com/
.. _`Dreamhost`: http://dreamhost.com/
.. _`Amazon EC2`: http://aws.amazon.com/ec2/
.. _`Amazon EC2 (ap-northeast-1)`: http://aws.amazon.com/ec2/
http://git-wip-us.apache.org/repos/asf/libcloud/blob/bfec2c46/docs/compute/_supported_methods_image_management.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_image_management.rst b/docs/compute/_supported_methods_image_management.rst
index aa0d8ec..4596736 100644
--- a/docs/compute/_supported_methods_image_management.rst
+++ b/docs/compute/_supported_methods_image_management.rst
@@ -9,8 +9,8 @@ Provider list images get image create image delete
`CloudFrames`_ yes no no no no
`CloudSigma (API v2.0)`_ yes no no no no
`CloudStack`_ yes no no no no
-`DigitalOcean`_ yes yes yes yes no
-`DimensionData`_ yes no no no no
+`DigitalOcean`_ yes yes yes yes no
+`DimensionData`_ yes no no no no
`Dreamhost`_ yes no no no no
`Amazon EC2`_ yes yes yes yes yes
`Amazon EC2 (ap-northeast-1)`_ yes yes yes yes yes
@@ -79,6 +79,7 @@ Provider list images get image create image delete
.. _`CloudSigma (API v2.0)`: http://www.cloudsigma.com/
.. _`CloudStack`: http://cloudstack.org/
.. _`DigitalOcean`: https://www.digitalocean.com
+.. _`DimensionData`: http://www.dimensiondata.com/
.. _`Dreamhost`: http://dreamhost.com/
.. _`Amazon EC2`: http://aws.amazon.com/ec2/
.. _`Amazon EC2 (ap-northeast-1)`: http://aws.amazon.com/ec2/
http://git-wip-us.apache.org/repos/asf/libcloud/blob/bfec2c46/docs/compute/_supported_methods_key_pair_management.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_key_pair_management.rst b/docs/compute/_supported_methods_key_pair_management.rst
index 4260f86..e82f909 100644
--- a/docs/compute/_supported_methods_key_pair_management.rst
+++ b/docs/compute/_supported_methods_key_pair_management.rst
@@ -10,7 +10,7 @@ Provider list key pairs get key pair create key pai
`CloudSigma (API v2.0)`_ no no no no no no
`CloudStack`_ yes yes yes yes no yes
`DigitalOcean`_ yes no yes no no yes
-`DimensionData`_ no no no no no no
+`DimensionData`_ no no no no no no
`Dreamhost`_ no no no no no no
`Amazon EC2`_ yes yes yes yes no yes
`Amazon EC2 (ap-northeast-1)`_ yes yes yes yes no yes
@@ -79,6 +79,7 @@ Provider list key pairs get key pair create key pai
.. _`CloudSigma (API v2.0)`: http://www.cloudsigma.com/
.. _`CloudStack`: http://cloudstack.org/
.. _`DigitalOcean`: https://www.digitalocean.com
+.. _`DimensionData`: http://www.dimensiondata.com/
.. _`Dreamhost`: http://dreamhost.com/
.. _`Amazon EC2`: http://aws.amazon.com/ec2/
.. _`Amazon EC2 (ap-northeast-1)`: http://aws.amazon.com/ec2/
http://git-wip-us.apache.org/repos/asf/libcloud/blob/bfec2c46/docs/compute/_supported_methods_main.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_main.rst b/docs/compute/_supported_methods_main.rst
index 7928cbd..4f92ab8 100644
--- a/docs/compute/_supported_methods_main.rst
+++ b/docs/compute/_supported_methods_main.rst
@@ -9,8 +9,8 @@ Provider list nodes create node reboot node destroy
`CloudFrames`_ yes yes yes yes yes yes no
`CloudSigma (API v2.0)`_ yes yes no yes yes yes no
`CloudStack`_ yes yes yes yes yes yes yes
-`DigitalOcean`_ yes yes yes yes yes yes no
-`DimensionData`_ yes yes yes yes yes yes yes
+`DigitalOcean`_ yes yes yes yes yes yes no
+`DimensionData`_ yes yes yes yes yes yes yes
`Dreamhost`_ yes yes yes yes yes yes no
`Amazon EC2`_ yes yes yes yes yes yes yes
`Amazon EC2 (ap-northeast-1)`_ yes yes yes yes yes yes yes
@@ -79,6 +79,7 @@ Provider list nodes create node reboot node destroy
.. _`CloudSigma (API v2.0)`: http://www.cloudsigma.com/
.. _`CloudStack`: http://cloudstack.org/
.. _`DigitalOcean`: https://www.digitalocean.com
+.. _`DimensionData`: http://www.dimensiondata.com/
.. _`Dreamhost`: http://dreamhost.com/
.. _`Amazon EC2`: http://aws.amazon.com/ec2/
.. _`Amazon EC2 (ap-northeast-1)`: http://aws.amazon.com/ec2/
http://git-wip-us.apache.org/repos/asf/libcloud/blob/bfec2c46/docs/compute/_supported_providers.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_providers.rst b/docs/compute/_supported_providers.rst
index 4ae0d91..bab0f97 100644
--- a/docs/compute/_supported_providers.rst
+++ b/docs/compute/_supported_providers.rst
@@ -10,7 +10,7 @@ Provider Documentation
`CloudSigma (API v2.0)`_ :doc:`Click </compute/drivers/cloudsigma>` CLOUDSIGMA :mod:`libcloud.compute.drivers.cloudsigma` :class:`CloudSigmaNodeDriver`
`CloudStack`_ :doc:`Click </compute/drivers/cloudstack>` CLOUDSTACK :mod:`libcloud.compute.drivers.cloudstack` :class:`CloudStackNodeDriver`
`DigitalOcean`_ :doc:`Click </compute/drivers/digital_ocean>` DIGITAL_OCEAN :mod:`libcloud.compute.drivers.digitalocean` :class:`DigitalOceanNodeDriver`
-`Dimension Data`_ :doc:`Click </compute/drivers/dimensiondata>` DIMENSIONDATA :mod:`libcloud.compute.drivers.dimensiondata` :class:`DimensionDataNodeDriver`
+`DimensionData`_ :doc:`Click </compute/drivers/dimensiondata>` DIMENSIONDATA :mod:`libcloud.compute.drivers.dimensiondata` :class:`DimensionDataNodeDriver`
`Dreamhost`_ DREAMHOST :mod:`libcloud.compute.drivers.dreamhost` :class:`DreamhostNodeDriver`
`Amazon EC2`_ :doc:`Click </compute/drivers/ec2>` EC2 :mod:`libcloud.compute.drivers.ec2` :class:`EC2NodeDriver`
`Amazon EC2 (ap-northeast-1)`_ EC2_AP_NORTHEAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2APNENodeDriver`
@@ -21,7 +21,7 @@ Provider Documentation
`Amazon EC2 (sa-east-1)`_ EC2_SA_EAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2SAEastNodeDriver`
`Amazon EC2`_ EC2_US_EAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2NodeDriver`
`Amazon EC2 (us-west-1)`_ EC2_US_WEST :mod:`libcloud.compute.drivers.ec2` :class:`EC2USWestNodeDriver`
-`Amazon EC2 (us-west-2)`_ EC2_US_WEST_OREGON :mod:`libcloud.compute.drivers.ec2` :class:`EC2USWestOregonNodeDriver`
+`Amazon EC2 (us-west-2)`_ EC2_US_WEST_OREGON :mod:`libcloud.compute.drivers.ec2` :class:`EC2USWestOregonNodeDriver`
`Enomaly Elastic Computing Platform`_ ECP :mod:`libcloud.compute.drivers.ecp` :class:`ECPNodeDriver`
`ElasticHosts`_ ELASTICHOSTS :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsNodeDriver`
`ElasticHosts (syd-y)`_ ELASTICHOSTS_AU1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsAU1NodeDriver`
@@ -79,6 +79,7 @@ Provider Documentation
.. _`CloudSigma (API v2.0)`: http://www.cloudsigma.com/
.. _`CloudStack`: http://cloudstack.org/
.. _`DigitalOcean`: https://www.digitalocean.com
+.. _`DimensionData`: http://www.dimensiondata.com/
.. _`Dreamhost`: http://dreamhost.com/
.. _`Amazon EC2`: http://aws.amazon.com/ec2/
.. _`Amazon EC2 (ap-northeast-1)`: http://aws.amazon.com/ec2/
[2/4] libcloud git commit: LIBCLOUD-698 rename OpSource Dimension
Data. Added Dimension Data driver.
Posted by to...@apache.org.
LIBCLOUD-698 rename OpSource Dimension Data. Added Dimension Data driver.
LIBCLOUD-698 Added provider type for dimension data
LIBCLOUD-698 Added missing text fixtures and test parameters
LIBCLOUD-698 Reformatted lines as "DimensionData" is quite a long string, PEP8 compliance completed.
LIBCLOUD-698 worked through casing changes from original opsource driver, replaced kwargs with named parameters as per libcloud BP.
LIBCLOUD-698 Added some documentation of the driver
LIBCLOUD-698 Added indexes and support matrix for the driver
Closes #507
Signed-off-by: Tomaz Muraus <to...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/119c1903
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/119c1903
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/119c1903
Branch: refs/heads/trunk
Commit: 119c1903e5309ac9efef6a1d1df7ac13789ad11c
Parents: c94ded8
Author: Anthony Shaw <an...@gmail.com>
Authored: Tue Apr 21 14:04:09 2015 +1000
Committer: Tomaz Muraus <to...@apache.org>
Committed: Wed May 6 14:52:54 2015 +0200
----------------------------------------------------------------------
CHANGES.rst | 4 +
.../images/provider_logos/dimensiondata.png | Bin 0 -> 52936 bytes
.../_supported_methods_block_storage.rst | 3 +-
.../_supported_methods_image_management.rst | 3 +-
.../_supported_methods_key_pair_management.rst | 1 +
docs/compute/_supported_methods_main.rst | 3 +-
docs/compute/_supported_providers.rst | 3 +-
docs/compute/drivers/dimensiondata.rst | 54 ++
libcloud/compute/drivers/__init__.py | 1 +
libcloud/compute/drivers/dimensiondata.py | 589 +++++++++++++++++++
libcloud/compute/providers.py | 2 +
libcloud/compute/types.py | 2 +
...f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server.xml | 6 +
...c_2745_4d8a_9cbc_8dabe5a7d0e4_datacenter.xml | 12 +
...8a_9cbc_8dabe5a7d0e4_networkWithLocation.xml | 11 +
..._4d8a_9cbc_8dabe5a7d0e4_server_11_delete.xml | 7 +
...8dabe5a7d0e4_server_11_delete_INPROGRESS.xml | 7 +
...d8a_9cbc_8dabe5a7d0e4_server_11_poweroff.xml | 7 +
...abe5a7d0e4_server_11_poweroff_INPROGRESS.xml | 7 +
...4d8a_9cbc_8dabe5a7d0e4_server_11_restart.xml | 6 +
...dabe5a7d0e4_server_11_restart_INPROGRESS.xml | 7 +
...d8a_9cbc_8dabe5a7d0e4_server_11_shutdown.xml | 6 +
...abe5a7d0e4_server_11_shutdown_INPROGRESS.xml | 7 +
...5_4d8a_9cbc_8dabe5a7d0e4_server_11_start.xml | 7 +
..._8dabe5a7d0e4_server_11_start_INPROGRESS.xml | 7 +
...5_4d8a_9cbc_8dabe5a7d0e4_server_deployed.xml | 46 ++
...a_9cbc_8dabe5a7d0e4_server_pendingDeploy.xml | 26 +
.../dimensiondata/oec_0_9_base_image.xml | 339 +++++++++++
.../dimensiondata/oec_0_9_myaccount.xml | 26 +
libcloud/test/compute/test_dimensiondata.py | 251 ++++++++
libcloud/test/secrets.py-dist | 1 +
31 files changed, 1447 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index d241f32..06f61fa 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -153,6 +153,10 @@ Compute
(GITHUB-506)
[Avi Nanhkoesingh]
+- Add new driver for the Dimension Data provider based on the OpSource driver.
+ (LIBCLOUD-698, GITHUB-507)
+ [Anthony Shaw]
+
Storage
~~~~~~~
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/docs/_static/images/provider_logos/dimensiondata.png
----------------------------------------------------------------------
diff --git a/docs/_static/images/provider_logos/dimensiondata.png b/docs/_static/images/provider_logos/dimensiondata.png
new file mode 100644
index 0000000..6a15b86
Binary files /dev/null and b/docs/_static/images/provider_logos/dimensiondata.png differ
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/docs/compute/_supported_methods_block_storage.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_block_storage.rst b/docs/compute/_supported_methods_block_storage.rst
index 47f2097..ee33104 100644
--- a/docs/compute/_supported_methods_block_storage.rst
+++ b/docs/compute/_supported_methods_block_storage.rst
@@ -9,7 +9,8 @@ Provider list volumes create volume destroy volume
`CloudFrames`_ no no no no no no no
`CloudSigma (API v2.0)`_ no no no no no no no
`CloudStack`_ yes yes yes yes yes no yes
-`DigitalOcean`_ no no no no no no no
+`DigitalOcean`_ no no no no no no no
+`DimensionData`_ no no no no no no no
`Dreamhost`_ no no no no no no no
`Amazon EC2`_ yes yes yes yes yes yes yes
`Amazon EC2 (ap-northeast-1)`_ yes yes yes yes yes yes yes
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/docs/compute/_supported_methods_image_management.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_image_management.rst b/docs/compute/_supported_methods_image_management.rst
index 81196e3..aa0d8ec 100644
--- a/docs/compute/_supported_methods_image_management.rst
+++ b/docs/compute/_supported_methods_image_management.rst
@@ -9,7 +9,8 @@ Provider list images get image create image delete
`CloudFrames`_ yes no no no no
`CloudSigma (API v2.0)`_ yes no no no no
`CloudStack`_ yes no no no no
-`DigitalOcean`_ yes yes yes yes no
+`DigitalOcean`_ yes yes yes yes no
+`DimensionData`_ yes no no no no
`Dreamhost`_ yes no no no no
`Amazon EC2`_ yes yes yes yes yes
`Amazon EC2 (ap-northeast-1)`_ yes yes yes yes yes
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/docs/compute/_supported_methods_key_pair_management.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_key_pair_management.rst b/docs/compute/_supported_methods_key_pair_management.rst
index 4c691e4..4260f86 100644
--- a/docs/compute/_supported_methods_key_pair_management.rst
+++ b/docs/compute/_supported_methods_key_pair_management.rst
@@ -10,6 +10,7 @@ Provider list key pairs get key pair create key pai
`CloudSigma (API v2.0)`_ no no no no no no
`CloudStack`_ yes yes yes yes no yes
`DigitalOcean`_ yes no yes no no yes
+`DimensionData`_ no no no no no no
`Dreamhost`_ no no no no no no
`Amazon EC2`_ yes yes yes yes no yes
`Amazon EC2 (ap-northeast-1)`_ yes yes yes yes no yes
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/docs/compute/_supported_methods_main.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_main.rst b/docs/compute/_supported_methods_main.rst
index 03a91f1..7928cbd 100644
--- a/docs/compute/_supported_methods_main.rst
+++ b/docs/compute/_supported_methods_main.rst
@@ -9,7 +9,8 @@ Provider list nodes create node reboot node destroy
`CloudFrames`_ yes yes yes yes yes yes no
`CloudSigma (API v2.0)`_ yes yes no yes yes yes no
`CloudStack`_ yes yes yes yes yes yes yes
-`DigitalOcean`_ yes yes yes yes yes yes no
+`DigitalOcean`_ yes yes yes yes yes yes no
+`DimensionData`_ yes yes yes yes yes yes yes
`Dreamhost`_ yes yes yes yes yes yes no
`Amazon EC2`_ yes yes yes yes yes yes yes
`Amazon EC2 (ap-northeast-1)`_ yes yes yes yes yes yes yes
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/docs/compute/_supported_providers.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_providers.rst b/docs/compute/_supported_providers.rst
index 23556d9..4ae0d91 100644
--- a/docs/compute/_supported_providers.rst
+++ b/docs/compute/_supported_providers.rst
@@ -10,6 +10,7 @@ Provider Documentation
`CloudSigma (API v2.0)`_ :doc:`Click </compute/drivers/cloudsigma>` CLOUDSIGMA :mod:`libcloud.compute.drivers.cloudsigma` :class:`CloudSigmaNodeDriver`
`CloudStack`_ :doc:`Click </compute/drivers/cloudstack>` CLOUDSTACK :mod:`libcloud.compute.drivers.cloudstack` :class:`CloudStackNodeDriver`
`DigitalOcean`_ :doc:`Click </compute/drivers/digital_ocean>` DIGITAL_OCEAN :mod:`libcloud.compute.drivers.digitalocean` :class:`DigitalOceanNodeDriver`
+`Dimension Data`_ :doc:`Click </compute/drivers/dimensiondata>` DIMENSIONDATA :mod:`libcloud.compute.drivers.dimensiondata` :class:`DimensionDataNodeDriver`
`Dreamhost`_ DREAMHOST :mod:`libcloud.compute.drivers.dreamhost` :class:`DreamhostNodeDriver`
`Amazon EC2`_ :doc:`Click </compute/drivers/ec2>` EC2 :mod:`libcloud.compute.drivers.ec2` :class:`EC2NodeDriver`
`Amazon EC2 (ap-northeast-1)`_ EC2_AP_NORTHEAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2APNENodeDriver`
@@ -20,7 +21,7 @@ Provider Documentation
`Amazon EC2 (sa-east-1)`_ EC2_SA_EAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2SAEastNodeDriver`
`Amazon EC2`_ EC2_US_EAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2NodeDriver`
`Amazon EC2 (us-west-1)`_ EC2_US_WEST :mod:`libcloud.compute.drivers.ec2` :class:`EC2USWestNodeDriver`
-`Amazon EC2 (us-west-2)`_ EC2_US_WEST_OREGON :mod:`libcloud.compute.drivers.ec2` :class:`EC2USWestOregonNodeDriver`
+`Amazon EC2 (us-west-2)`_ EC2_US_WEST_OREGON :mod:`libcloud.compute.drivers.ec2` :class:`EC2USWestOregonNodeDriver`
`Enomaly Elastic Computing Platform`_ ECP :mod:`libcloud.compute.drivers.ecp` :class:`ECPNodeDriver`
`ElasticHosts`_ ELASTICHOSTS :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsNodeDriver`
`ElasticHosts (syd-y)`_ ELASTICHOSTS_AU1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsAU1NodeDriver`
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/docs/compute/drivers/dimensiondata.rst
----------------------------------------------------------------------
diff --git a/docs/compute/drivers/dimensiondata.rst b/docs/compute/drivers/dimensiondata.rst
new file mode 100644
index 0000000..7b71211
--- /dev/null
+++ b/docs/compute/drivers/dimensiondata.rst
@@ -0,0 +1,54 @@
+Dimension Data Cloud Compute Driver Documentation
+=======================================
+
+Dimension Data are a global IT Services company and form part of the NTT Group.
+Dimension Data provide IT-as-a-Service to customers around the globe on their
+cloud platform (Compute as a Service). The CaaS service is available either on
+one of the public cloud instances or as a private instance on premises.
+
+.. figure:: /_static/images/provider_logos/dimensiondata.png
+ :align: center
+ :width: 300
+ :target: http://cloud.dimensiondata.com/
+
+CaaS has its own non-standard `API`_ , `libcloud` provides a Python
+wrapper on top of this `API`_ with common methods with other IaaS solutions and
+Public cloud providers. Therefore, you can use use the Dimension Data libcloud
+driver to communicate with both the public and private M
+
+Instantiating a driver
+----------------------
+
+When you instantiate a driver you need to pass the following arguments to the
+driver constructor:
+
+* ``user_id`` - Your Dimension Data Cloud username
+* ``key`` - Your Dimension Data Cloud password
+
+The base `libcloud` API allows you to:
+
+* list nodes, images, instance types, locations
+
+Non-standard functionality and extension methods
+------------------------------------------------
+
+The Dimension Data driver exposes some `libcloud` non-standard
+functionalities through extension methods and arguments.
+
+These functionalities include:
+
+* start and stop a node
+* list networks
+
+For information on how to use these functionalities please see the method
+docstrings below. You can also use an interactive shell for exploration as
+shown in the examples.
+
+API Docs
+--------
+
+.. autoclass:: libcloud.compute.drivers.dimensiondata.DimensionDataNodeDriver
+ :members:
+ :inherited-members:
+
+.. _`API`: http://cloud.dimensiondata.com/au/en/services/public-cloud/api
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/compute/drivers/__init__.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/__init__.py b/libcloud/compute/drivers/__init__.py
index ab02a6b..fd534e8 100644
--- a/libcloud/compute/drivers/__init__.py
+++ b/libcloud/compute/drivers/__init__.py
@@ -21,6 +21,7 @@ __all__ = [
'abiquo',
'brightbox',
'bluebox',
+ 'dimensiondata',
'dummy',
'ec2',
'ecp',
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/compute/drivers/dimensiondata.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/dimensiondata.py b/libcloud/compute/drivers/dimensiondata.py
new file mode 100644
index 0000000..da99ac6
--- /dev/null
+++ b/libcloud/compute/drivers/dimensiondata.py
@@ -0,0 +1,589 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Dimension Data Driver
+"""
+
+try:
+ from lxml import etree as ET
+except ImportError:
+ from xml.etree import ElementTree as ET
+
+from base64 import b64encode
+
+from libcloud.utils.py3 import httplib
+from libcloud.utils.py3 import b
+
+from libcloud.compute.base import NodeDriver, Node
+from libcloud.compute.base import NodeSize, NodeImage, NodeLocation
+from libcloud.common.types import LibcloudError, InvalidCredsError
+from libcloud.common.base import ConnectionUserAndKey, XmlResponse
+from libcloud.utils.xml import fixxpath, findtext, findall
+from libcloud.compute.types import NodeState, Provider
+
+# Roadmap / TODO:
+#
+# 1.0 - Copied from OpSource API, named provider details.
+
+# setup a few variables to represent all of the DimensionData cloud namespaces
+NAMESPACE_BASE = "http://oec.api.opsource.net/schemas"
+ORGANIZATION_NS = NAMESPACE_BASE + "/organization"
+SERVER_NS = NAMESPACE_BASE + "/server"
+NETWORK_NS = NAMESPACE_BASE + "/network"
+DIRECTORY_NS = NAMESPACE_BASE + "/directory"
+RESET_NS = NAMESPACE_BASE + "/reset"
+VIP_NS = NAMESPACE_BASE + "/vip"
+IMAGEIMPORTEXPORT_NS = NAMESPACE_BASE + "/imageimportexport"
+DATACENTER_NS = NAMESPACE_BASE + "/datacenter"
+SUPPORT_NS = NAMESPACE_BASE + "/support"
+GENERAL_NS = NAMESPACE_BASE + "/general"
+IPPLAN_NS = NAMESPACE_BASE + "/ipplan"
+WHITELABEL_NS = NAMESPACE_BASE + "/whitelabel"
+
+
+class DimensionDataResponse(XmlResponse):
+
+ def parse_error(self):
+ if self.status == httplib.UNAUTHORIZED:
+ raise InvalidCredsError(self.body)
+ elif self.status == httplib.FORBIDDEN:
+ raise InvalidCredsError(self.body)
+
+ body = self.parse_body()
+
+ if self.status == httplib.BAD_REQUEST:
+ code = findtext(body, 'resultCode', SERVER_NS)
+ message = findtext(body, 'resultDetail', SERVER_NS)
+ raise DimensionDataAPIException(code,
+ message,
+ driver=DimensionDataNodeDriver)
+
+ return self.body
+
+
+class DimensionDataAPIException(LibcloudError):
+ def __init__(self, code, msg, driver):
+ self.code = code
+ self.msg = msg
+ self.driver = driver
+
+ def __str__(self):
+ return "%s: %s" % (self.code, self.msg)
+
+ def __repr__(self):
+ return ("<DimensionDataAPIException: code='%s', msg='%s'>" %
+ (self.code, self.msg))
+
+
+class DimensionDataConnection(ConnectionUserAndKey):
+ """
+ Connection class for the DimensionData driver
+ """
+
+ host = 'api-na.dimensiondata.com'
+ api_path = '/oec'
+ api_version = '0.9'
+ _orgId = None
+ responseCls = DimensionDataResponse
+
+ allow_insecure = False
+
+ def add_default_headers(self, headers):
+ headers['Authorization'] = \
+ ('Basic %s' % b64encode(b('%s:%s' % (self.user_id,
+ self.key))).decode('utf-8'))
+ return headers
+
+ def request(self, action, params=None, data='',
+ headers=None, method='GET'):
+ action = "%s/%s/%s" % (self.api_path, self.api_version, action)
+
+ return super(DimensionDataConnection, self).request(
+ action=action,
+ params=params, data=data,
+ method=method, headers=headers)
+
+ def request_with_orgId(self, action, params=None, data='',
+ headers=None, method='GET'):
+ action = "%s/%s" % (self.get_resource_path(), action)
+
+ return super(DimensionDataConnection, self).request(
+ action=action,
+ params=params, data=data,
+ method=method, headers=headers)
+
+ def get_resource_path(self):
+ """
+ This method returns a resource path which is necessary for referencing
+ resources that require a full path instead of just an ID, such as
+ networks, and customer snapshots.
+ """
+ return ("%s/%s/%s" % (self.api_path, self.api_version,
+ self._get_orgId()))
+
+ def _get_orgId(self):
+ """
+ Send the /myaccount API request to DimensionData cloud and parse the
+ 'orgId' from the XML response object. We need the orgId to use most
+ of the other API functions
+ """
+ if self._orgId is None:
+ body = self.request('myaccount').object
+ self._orgId = findtext(body, 'orgId', DIRECTORY_NS)
+ return self._orgId
+
+
+class DimensionDataStatus(object):
+ """
+ DimensionData API pending operation status class
+ action, request_time, user_name, number_of_steps, update_time,
+ step.name, step.number, step.percent_complete, failure_reason,
+ """
+ def __init__(self, action=None, request_time=None, user_name=None,
+ number_of_steps=None, update_time=None, step_name=None,
+ step_number=None, step_percent_complete=None,
+ failure_reason=None):
+ self.action = action
+ self.request_time = request_time
+ self.user_name = user_name
+ self.number_of_steps = number_of_steps
+ self.update_time = update_time
+ self.step_name = step_name
+ self.step_number = step_number
+ self.step_percent_complete = step_percent_complete
+ self.failure_reason = failure_reason
+
+ def __repr__(self):
+ return (('<DimensionDataStatus: action=%s, request_time=%s, '
+ 'user_name=%s, number_of_steps=%s, update_time=%s, '
+ 'step_name=%s, step_number=%s, '
+ 'step_percent_complete=%s, failure_reason=%s')
+ % (self.action, self.request_time, self.user_name,
+ self.number_of_steps, self.update_time, self.step_name,
+ self.step_number, self.step_percent_complete,
+ self.failure_reason))
+
+
+class DimensionDataNetwork(object):
+ """
+ DimensionData network with location.
+ """
+
+ def __init__(self, id, name, description, location, private_net,
+ multicast, status):
+ self.id = str(id)
+ self.name = name
+ self.description = description
+ self.location = location
+ self.private_net = private_net
+ self.multicast = multicast
+ self.status = status
+
+ def __repr__(self):
+ return (('<DimensionDataNetwork: id=%s, name=%s, description=%s, '
+ 'location=%s, private_net=%s, multicast=%s>')
+ % (self.id, self.name, self.description, self.location,
+ self.private_net, self.multicast))
+
+
+class DimensionDataNodeDriver(NodeDriver):
+ """
+ DimensionData node driver.
+ """
+
+ connectionCls = DimensionDataConnection
+ name = 'DimensionData'
+ website = 'http://www.dimensiondata.com/'
+ type = Provider.DIMENSIONDATA
+ features = {'create_node': ['password']}
+
+ def create_node(self, name, image, auth, ex_description,
+ ex_network, ex_is_started=True, **kwargs):
+ """
+ Create a new DimensionData node
+
+ :keyword name: String with a name for this new node (required)
+ :type name: ``str``
+
+ :keyword image: OS Image to boot on node. (required)
+ :type image: :class:`NodeImage`
+
+ :keyword auth: Initial authentication information for the
+ node (required)
+ :type auth: :class:`NodeAuthPassword`
+
+ :keyword ex_description: description for this node (required)
+ :type ex_description: ``str``
+
+ :keyword ex_network: Network to create the node within (required)
+ :type ex_network: :class:`DimensionDataNetwork`
+
+ :keyword ex_is_started: Start server after creation? default
+ true (required)
+ :type ex_is_started: ``bool``
+
+ :return: The newly created :class:`Node`. NOTE: DimensionData does not
+ provide a
+ way to determine the ID of the server that was just created,
+ so the returned :class:`Node` is not guaranteed to be the same
+ one that was created. This is only the case when multiple
+ nodes with the same name exist.
+ :rtype: :class:`Node`
+ """
+
+ # XXX: Node sizes can be adjusted after a node is created, but
+ # cannot be set at create time because size is part of the
+ # image definition.
+ password = None
+ auth_obj = self._get_and_check_auth(auth)
+ password = auth_obj.password
+
+ if not isinstance(ex_network, DimensionDataNetwork):
+ raise ValueError('ex_network must be of DimensionDataNetwork type')
+ vlanResourcePath = "%s/%s" % (self.connection.get_resource_path(),
+ ex_network.id)
+
+ imageResourcePath = None
+ if 'resourcePath' in image.extra:
+ imageResourcePath = image.extra['resourcePath']
+ else:
+ imageResourcePath = "%s/%s" % (self.connection.get_resource_path(),
+ image.id)
+
+ server_elm = ET.Element('Server', {'xmlns': SERVER_NS})
+ ET.SubElement(server_elm, "name").text = name
+ ET.SubElement(server_elm, "description").text = ex_description
+ ET.SubElement(server_elm, "vlanResourcePath").text = vlanResourcePath
+ ET.SubElement(server_elm, "imageResourcePath").text = imageResourcePath
+ ET.SubElement(server_elm, "administratorPassword").text = password
+ ET.SubElement(server_elm, "isStarted").text = str(ex_is_started)
+
+ self.connection.request_with_orgId('server',
+ method='POST',
+ data=ET.tostring(server_elm)).object
+
+ # XXX: return the last node in the list that has a matching name. this
+ # is likely but not guaranteed to be the node we just created
+ # because DimensionData allows multiple
+ # nodes to have the same name
+ node = list(filter(lambda x: x.name == name, self.list_nodes()))[-1]
+
+ if getattr(auth_obj, "generated", False):
+ node.extra['password'] = auth_obj.password
+
+ return node
+
+ def destroy_node(self, node):
+ body = self.connection.request_with_orgId(
+ 'server/%s?delete' % (node.id)).object
+
+ result = findtext(body, 'result', GENERAL_NS)
+ return result == 'SUCCESS'
+
+ def reboot_node(self, node):
+ body = self.connection.request_with_orgId(
+ 'server/%s?restart' % (node.id)).object
+ result = findtext(body, 'result', GENERAL_NS)
+ return result == 'SUCCESS'
+
+ def list_nodes(self):
+ nodes = self._to_nodes(
+ self.connection.request_with_orgId('server/deployed').object)
+ nodes.extend(self._to_nodes(
+ self.connection.request_with_orgId('server/pendingDeploy').object))
+ return nodes
+
+ def list_images(self, location=None):
+ """
+ return a list of available images
+ Currently only returns the default 'base OS images' provided by
+ DimensionData. Customer images (snapshots) are not yet supported.
+
+ @inherits: :class:`NodeDriver.list_images`
+ """
+ return self._to_base_images(
+ self.connection.request('base/image').object)
+
+ def list_sizes(self, location=None):
+ return [
+ NodeSize(id=1,
+ name="default",
+ ram=0,
+ disk=0,
+ bandwidth=0,
+ price=0,
+ driver=self.connection.driver),
+ ]
+
+ def list_locations(self):
+ """
+ list locations (datacenters) available for instantiating servers and
+ networks.
+
+ @inherits: :class:`NodeDriver.list_locations`
+ """
+ return self._to_locations(
+ self.connection.request_with_orgId('datacenter').object)
+
+ def list_networks(self, location=None):
+ """
+ List networks deployed across all data center locations for your
+ organization. The response includes the location of each network.
+
+
+ :keyword location: The location
+ :type location: :class:`NodeLocation`
+
+ :return: a list of DimensionDataNetwork objects
+ :rtype: ``list`` of :class:`DimensionDataNetwork`
+ """
+ return self._to_networks(
+ self.connection.request_with_orgId('networkWithLocation').object)
+
+ def _to_base_images(self, object):
+ images = []
+ for element in object.findall(fixxpath("ServerImage", SERVER_NS)):
+ images.append(self._to_base_image(element))
+
+ return images
+
+ def _to_base_image(self, element):
+ # Eventually we will probably need multiple _to_image() functions
+ # that parse <ServerImage> differently than <DeployedImage>.
+ # DeployedImages are customer snapshot images, and ServerImages are
+ # 'base' images provided by DimensionData
+ location_id = findtext(element, 'location', SERVER_NS)
+ location = self.ex_get_location_by_id(location_id)
+
+ extra = {
+ 'description': findtext(element, 'description', SERVER_NS),
+ 'OS_type': findtext(element, 'operatingSystem/type', SERVER_NS),
+ 'OS_displayName': findtext(element, 'operatingSystem/displayName',
+ SERVER_NS),
+ 'cpuCount': findtext(element, 'cpuCount', SERVER_NS),
+ 'resourcePath': findtext(element, 'resourcePath', SERVER_NS),
+ 'memory': findtext(element, 'memory', SERVER_NS),
+ 'osStorage': findtext(element, 'osStorage', SERVER_NS),
+ 'additionalStorage': findtext(element, 'additionalStorage',
+ SERVER_NS),
+ 'created': findtext(element, 'created', SERVER_NS),
+ 'location': location,
+ }
+
+ return NodeImage(id=str(findtext(element, 'id', SERVER_NS)),
+ name=str(findtext(element, 'name', SERVER_NS)),
+ extra=extra,
+ driver=self.connection.driver)
+
+ def ex_start_node(self, node):
+ """
+ Powers on an existing deployed server
+
+ :param node: Node which should be used
+ :type node: :class:`Node`
+
+ :rtype: ``bool``
+ """
+ body = self.connection.request_with_orgId(
+ 'server/%s?start' % node.id).object
+ result = findtext(body, 'result', GENERAL_NS)
+ return result == 'SUCCESS'
+
+ def ex_shutdown_graceful(self, node):
+ """
+ This function will attempt to "gracefully" stop a server by
+ initiating a shutdown sequence within the guest operating system.
+ A successful response on this function means the system has
+ successfully passed the request into the operating system.
+
+ :param node: Node which should be used
+ :type node: :class:`Node`
+
+ :rtype: ``bool``
+ """
+ body = self.connection.request_with_orgId(
+ 'server/%s?shutdown' % (node.id)).object
+ result = findtext(body, 'result', GENERAL_NS)
+ return result == 'SUCCESS'
+
+ def ex_power_off(self, node):
+ """
+ This function will abruptly power-off a server. Unlike
+ ex_shutdown_graceful, success ensures the node will stop but some OS
+ and application configurations may be adversely affected by the
+ equivalent of pulling the power plug out of the machine.
+
+ :param node: Node which should be used
+ :type node: :class:`Node`
+
+ :rtype: ``bool``
+ """
+ body = self.connection.request_with_orgId(
+ 'server/%s?poweroff' % node.id).object
+ result = findtext(body, 'result', GENERAL_NS)
+ return result == 'SUCCESS'
+
+ def ex_list_networks(self):
+ """
+ List networks deployed across all data center locations for your
+ organization. The response includes the location of each network.
+
+ :return: a list of DimensionDataNetwork objects
+ :rtype: ``list`` of :class:`DimensionDataNetwork`
+ """
+ response = self.connection.request_with_orgId('networkWithLocation') \
+ .object
+ return self._to_networks(response)
+
+ def ex_get_location_by_id(self, id):
+ """
+ Get location by ID.
+
+ :param id: ID of the node location which should be used
+ :type id: ``str``
+
+ :rtype: :class:`NodeLocation`
+ """
+ location = None
+ if id is not None:
+ location = list(
+ filter(lambda x: x.id == id, self.list_locations()))[0]
+ return location
+
+ def _to_networks(self, object):
+ networks = []
+ for element in findall(object, 'network', NETWORK_NS):
+ networks.append(self._to_network(element))
+
+ return networks
+
+ def _to_network(self, element):
+ multicast = False
+ if findtext(element, 'multicast', NETWORK_NS) == 'true':
+ multicast = True
+
+ status = self._to_status(element.find(fixxpath('status', NETWORK_NS)))
+
+ location_id = findtext(element, 'location', NETWORK_NS)
+ location = self.ex_get_location_by_id(location_id)
+
+ return DimensionDataNetwork(
+ id=findtext(element, 'id', NETWORK_NS),
+ name=findtext(element, 'name', NETWORK_NS),
+ description=findtext(element, 'description',
+ NETWORK_NS),
+ location=location,
+ private_net=findtext(element, 'privateNet',
+ NETWORK_NS),
+ multicast=multicast,
+ status=status)
+
+ def _to_locations(self, object):
+ locations = []
+ for element in object.findall(fixxpath('datacenter', DATACENTER_NS)):
+ locations.append(self._to_location(element))
+
+ return locations
+
+ def _to_location(self, element):
+ l = NodeLocation(id=findtext(element, 'location', DATACENTER_NS),
+ name=findtext(element, 'displayName', DATACENTER_NS),
+ country=findtext(element, 'country', DATACENTER_NS),
+ driver=self)
+ return l
+
+ def _to_nodes(self, object):
+ node_elements = object.findall(fixxpath('DeployedServer', SERVER_NS))
+ node_elements.extend(object.findall(
+ fixxpath('PendingDeployServer', SERVER_NS)))
+ return [self._to_node(el) for el in node_elements]
+
+ def _to_node(self, element):
+ if findtext(element, 'isStarted', SERVER_NS) == 'true':
+ state = NodeState.RUNNING
+ else:
+ state = NodeState.TERMINATED
+
+ status = self._to_status(element.find(fixxpath('status', SERVER_NS)))
+
+ extra = {
+ 'description': findtext(element, 'description', SERVER_NS),
+ 'sourceImageId': findtext(element, 'sourceImageId', SERVER_NS),
+ 'networkId': findtext(element, 'networkId', SERVER_NS),
+ 'machineName': findtext(element, 'machineName', SERVER_NS),
+ 'deployedTime': findtext(element, 'deployedTime', SERVER_NS),
+ 'cpuCount': findtext(element, 'machineSpecification/cpuCount',
+ SERVER_NS),
+ 'memoryMb': findtext(element, 'machineSpecification/memoryMb',
+ SERVER_NS),
+ 'osStorageGb': findtext(element,
+ 'machineSpecification/osStorageGb',
+ SERVER_NS),
+ 'additionalLocalStorageGb': findtext(
+ element, 'machineSpecification/additionalLocalStorageGb',
+ SERVER_NS),
+ 'OS_type': findtext(element,
+ 'machineSpecification/operatingSystem/type',
+ SERVER_NS),
+ 'OS_displayName': findtext(
+ element, 'machineSpecification/operatingSystem/displayName',
+ SERVER_NS),
+ 'status': status,
+ }
+
+ public_ip = findtext(element, 'publicIpAddress', SERVER_NS)
+
+ n = Node(id=findtext(element, 'id', SERVER_NS),
+ name=findtext(element, 'name', SERVER_NS),
+ state=state,
+ public_ips=[public_ip] if public_ip is not None else [],
+ private_ips=findtext(element, 'privateIpAddress', SERVER_NS),
+ driver=self.connection.driver,
+ extra=extra)
+ return n
+
+ def _to_status(self, element):
+ if element is None:
+ return DimensionDataStatus()
+ s = DimensionDataStatus(action=findtext(element, 'action', SERVER_NS),
+ request_time=findtext(
+ element,
+ 'requestTime',
+ SERVER_NS),
+ user_name=findtext(
+ element,
+ 'userName',
+ SERVER_NS),
+ number_of_steps=findtext(
+ element,
+ 'numberOfSteps',
+ SERVER_NS),
+ step_name=findtext(
+ element,
+ 'step/name',
+ SERVER_NS),
+ step_number=findtext(
+ element,
+ 'step_number',
+ SERVER_NS),
+ step_percent_complete=findtext(
+ element,
+ 'step/percentComplete',
+ SERVER_NS),
+ failure_reason=findtext(
+ element,
+ 'failureReason',
+ SERVER_NS))
+ return s
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/compute/providers.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/providers.py b/libcloud/compute/providers.py
index 8ce4162..09387fb 100644
--- a/libcloud/compute/providers.py
+++ b/libcloud/compute/providers.py
@@ -113,6 +113,8 @@ DRIVERS = {
('libcloud.compute.drivers.gandi', 'GandiNodeDriver'),
Provider.OPSOURCE:
('libcloud.compute.drivers.opsource', 'OpsourceNodeDriver'),
+ Provider.DIMENSIONDATA:
+ ('libcloud.compute.drivers.dimensiondata', 'DimensionDataNodeDriver'),
Provider.OPENSTACK:
('libcloud.compute.drivers.openstack', 'OpenStackNodeDriver'),
Provider.NINEFOLD:
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/compute/types.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/types.py b/libcloud/compute/types.py
index 216d46e..c65339b 100644
--- a/libcloud/compute/types.py
+++ b/libcloud/compute/types.py
@@ -60,6 +60,7 @@ class Provider(object):
:cvar NIMBUS: Nimbus
:cvar BLUEBOX: Bluebox
:cvar OPSOURCE: Opsource Cloud
+ :cvar DIMENSIONDATA: Dimension Data Cloud
:cvar NINEFOLD: Ninefold
:cvar TERREMARK: Terremark
:cvar EC2_US_WEST_OREGON: Amazon AWS US West 2 (Oregon)
@@ -105,6 +106,7 @@ class Provider(object):
BLUEBOX = 'bluebox'
GANDI = 'gandi'
OPSOURCE = 'opsource'
+ DIMENSIONDATA = 'dimensiondata'
OPENSTACK = 'openstack'
SKALICLOUD = 'skalicloud'
SERVERLOVE = 'serverlove'
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/_oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/_oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server.xml b/libcloud/test/compute/fixtures/dimensiondata/_oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server.xml
new file mode 100644
index 0000000..191c7ae
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/_oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server.xml
@@ -0,0 +1,6 @@
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Deploy Server</ns12:operation>
+ <ns12:result>SUCCESS</ns12:result>
+ <ns12:resultDetail>Server "Deploy" issued</ns12:resultDetail>
+ <ns12:resultCode>REASON_0</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_datacenter.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_datacenter.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_datacenter.xml
new file mode 100644
index 0000000..4870ee1
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_datacenter.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns8:Datacenters xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns8:datacenter>
+ <ns8:location>NA1</ns8:location>
+ <ns8:displayName>US - East</ns8:displayName>
+ <ns8:city>Ashburn</ns8:city>
+ <ns8:state>Virginia</ns8:state>
+ <ns8:country>US</ns8:country>
+ <ns8:vpnUrl>https://opsource-na1.cloud-vpn.net/</ns8:vpnUrl>
+ <ns8:default>true</ns8:default>
+ </ns8:datacenter>
+</ns8:Datacenters>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_networkWithLocation.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_networkWithLocation.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_networkWithLocation.xml
new file mode 100644
index 0000000..ca27554
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_networkWithLocation.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns4:NetworkWithLocations xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns4:network>
+ <ns4:id>53b4c05b-341e-4ac3-b688-bdd74e53ca9b</ns4:id>
+ <ns4:name>test-net1</ns4:name>
+ <ns4:description>test-net1 description</ns4:description>
+ <ns4:location>NA1</ns4:location>
+ <ns4:privateNet>10.162.1.0</ns4:privateNet>
+ <ns4:multicast>false</ns4:multicast>
+ </ns4:network>
+</ns4:NetworkWithLocations>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_delete.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_delete.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_delete.xml
new file mode 100644
index 0000000..90686b9
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_delete.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Delete Server</ns12:operation>
+ <ns12:result>SUCCESS</ns12:result>
+ <ns12:resultDetail>Server "Delete" issued</ns12:resultDetail>
+ <ns12:resultCode>REASON_0</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_delete_INPROGRESS.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_delete_INPROGRESS.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_delete_INPROGRESS.xml
new file mode 100644
index 0000000..df55852
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_delete_INPROGRESS.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Delete Server</ns12:operation>
+ <ns12:result>ERROR</ns12:result>
+ <ns12:resultDetail>Operation in progress on Server with Id 11</ns12:resultDetail>
+ <ns12:resultCode>REASON_392</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_poweroff.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_poweroff.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_poweroff.xml
new file mode 100644
index 0000000..03c0f3d
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_poweroff.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Power Off Server</ns12:operation>
+ <ns12:result>SUCCESS</ns12:result>
+ <ns12:resultDetail>Server "Power Off" issued</ns12:resultDetail>
+ <ns12:resultCode>REASON_0</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_poweroff_INPROGRESS.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_poweroff_INPROGRESS.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_poweroff_INPROGRESS.xml
new file mode 100644
index 0000000..7b9a9d7
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_poweroff_INPROGRESS.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Power Off Server</ns12:operation>
+ <ns12:result>ERROR</ns12:result>
+ <ns12:resultDetail>Operation in progress on Server with Id 11</ns12:resultDetail>
+ <ns12:resultCode>REASON_392</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_restart.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_restart.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_restart.xml
new file mode 100644
index 0000000..0638feb
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_restart.xml
@@ -0,0 +1,6 @@
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Restart Server</ns12:operation>
+ <ns12:result>SUCCESS</ns12:result>
+ <ns12:resultDetail>Server "Restart" issued</ns12:resultDetail>
+ <ns12:resultCode>REASON_0</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_restart_INPROGRESS.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_restart_INPROGRESS.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_restart_INPROGRESS.xml
new file mode 100644
index 0000000..ab9e31f
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_restart_INPROGRESS.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Restart Server</ns12:operation>
+ <ns12:result>ERROR</ns12:result>
+ <ns12:resultDetail>Operation in progress on Server with Id 11</ns12:resultDetail>
+ <ns12:resultCode>REASON_392</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_shutdown.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_shutdown.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_shutdown.xml
new file mode 100644
index 0000000..b0937c8
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_shutdown.xml
@@ -0,0 +1,6 @@
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Graceful Shutdown Server</ns12:operation>
+ <ns12:result>SUCCESS</ns12:result>
+ <ns12:resultDetail>Server "Graceful Shutdown" issued</ns12:resultDetail>
+ <ns12:resultCode>REASON_0</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_shutdown_INPROGRESS.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_shutdown_INPROGRESS.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_shutdown_INPROGRESS.xml
new file mode 100644
index 0000000..eb3cbb5
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_shutdown_INPROGRESS.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Graceful Shutdown Server</ns12:operation>
+ <ns12:result>ERROR</ns12:result>
+ <ns12:resultDetail>Operation in progress on Server with Id 11</ns12:resultDetail>
+ <ns12:resultCode>REASON_392</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_start.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_start.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_start.xml
new file mode 100644
index 0000000..274e05f
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_start.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Start Server</ns12:operation>
+ <ns12:result>SUCCESS</ns12:result>
+ <ns12:resultDetail>Server "Start" issued</ns12:resultDetail>
+ <ns12:resultCode>REASON_0</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_start_INPROGRESS.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_start_INPROGRESS.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_start_INPROGRESS.xml
new file mode 100644
index 0000000..6d1714f
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_11_start_INPROGRESS.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns12:Status xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns12:operation>Start Server</ns12:operation>
+ <ns12:result>ERROR</ns12:result>
+ <ns12:resultDetail>Operation in progress on Server with Id 11</ns12:resultDetail>
+ <ns12:resultCode>REASON_392</ns12:resultCode>
+</ns12:Status>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_deployed.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_deployed.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_deployed.xml
new file mode 100644
index 0000000..a11d6c2
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_deployed.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<DeployedServers xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <DeployedServer>
+ <id>abadbc7e-9e10-46ca-9d4a-194bcc6b6c16</id>
+ <name>testnode01</name>
+ <description>this is testnode01 description</description>
+ <machineSpecification>
+ <cpuCount>2</cpuCount>
+ <memoryMb>2048</memoryMb>
+ <osStorageGb>10</osStorageGb>
+ <additionalLocalStorageGb>20</additionalLocalStorageGb>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>REDHAT5/64</displayName>
+ </operatingSystem>
+ </machineSpecification>
+ <sourceImageId>44ed8b72-ebea-11df-bdc1-001517c46384</sourceImageId>
+ <networkId>53b4c05b-341e-4ac3-b688-bdd78e43ca9e</networkId>
+ <privateIpAddress>10.162.1.1</privateIpAddress>
+ <publicIpAddress>200.16.132.7</publicIpAddress>
+ <machineName>10-162-1-1</machineName>
+ <isStarted>true</isStarted>
+ <deployedTime>2011-03-02T17:16:09.882Z</deployedTime>
+ </DeployedServer>
+ <DeployedServer>
+ <id>dbadbc8e-9e10-56ca-5d4a-155bcc5b5c15</id>
+ <name>testnode02</name>
+ <description>this is testnode02 description</description>
+ <machineSpecification>
+ <cpuCount>4</cpuCount>
+ <memoryMb>4096</memoryMb>
+ <osStorageGb>10</osStorageGb>
+ <additionalLocalStorageGb>20</additionalLocalStorageGb>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>REDHAT5/64</displayName>
+ </operatingSystem>
+ </machineSpecification>
+ <sourceImageId>44ed8b72-ebea-11df-bdc1-001517c46384</sourceImageId>
+ <networkId>53b4c05b-341e-4ac3-b688-bdd78e43ca9e</networkId>
+ <privateIpAddress>10.162.1.2</privateIpAddress>
+ <machineName>10-162-1-2</machineName>
+ <isStarted>true</isStarted>
+ <deployedTime>2011-03-02T17:16:10.882Z</deployedTime>
+ </DeployedServer>
+</DeployedServers>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_pendingDeploy.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_pendingDeploy.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_pendingDeploy.xml
new file mode 100644
index 0000000..f24073f
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_server_pendingDeploy.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<PendingDeployServers xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <PendingDeployServer>
+ <id>e75ead52-692f-4314-8725-c8a4f4d13a87</id>
+ <name>test2</name>
+ <description>test2 node</description>
+ <machineSpecification>
+ <cpuCount>1</cpuCount>
+ <memoryMb>2048</memoryMb>
+ <osStorageGb>10</osStorageGb>
+ <additionalLocalStorageGb>0</additionalLocalStorageGb>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>REDHAT5/64</displayName>
+ </operatingSystem>
+ </machineSpecification>
+ <sourceImageId>52ed8b72-ebea-11df-bdc1-001517c46384</sourceImageId>
+ <networkId>52f4c05b-341e-4ac3-b688-bdd78e43ca9e</networkId>
+ <privateIpAddress>10.162.151.11</privateIpAddress>
+ <status>
+ <action>DEPLOY_SERVER</action>
+ <requestTime>2011-03-20T22:32:23.000Z</requestTime>
+ <userName>copia</userName>
+ </status>
+ </PendingDeployServer>
+</PendingDeployServers>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_base_image.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_base_image.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_base_image.xml
new file mode 100644
index 0000000..3be14f0
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_base_image.xml
@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ServerImages xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ServerImage>
+ <id>52ed8b72-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed8b72-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>RedHat 5.5 64-bit 1 CPU</name>
+ <description>RedHat 5.5 Enterprise (Tikanga), 64-bit</description>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>REDHAT5/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>1</cpuCount>
+ <memory>2048</memory>
+ <osStorage>10</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed8dca-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed8dca-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>RedHat 5.5 64-bit 2 CPU</name>
+ <description>RedHat 5.5 Enterprise (Tikanga), 64-bit</description>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>REDHAT5/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>2</cpuCount>
+ <memory>4096</memory>
+ <osStorage>10</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed8ed8-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed8ed8-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>RedHat 5.5 64-bit 4 CPU</name>
+ <description>RedHat 5.5 Enterprise (Tikanga), 64-bit</description>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>REDHAT5/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>4</cpuCount>
+ <memory>6144</memory>
+ <osStorage>10</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>6fc040ae-3605-11e0-bfb5-001517c46384</id>
+ <resourcePath>/oec/base/image/6fc040ae-3605-11e0-bfb5-001517c46384</resourcePath>
+ <name>RedHat 5.5 32-bit 1 CPU</name>
+ <description>RedHat 5.5 Enterprise (Tikanga), 32-bit</description>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>REDHAT5/32</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>1</cpuCount>
+ <memory>2048</memory>
+ <osStorage>10</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>2011-02-11T17:36:19.000Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed92d4-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed92d4-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Ubuntu 8.04.4 2 CPU</name>
+ <description>Ubuntu 8.04.4 LTS, 64-bit</description>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>UBUNTU8/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>2</cpuCount>
+ <memory>4096</memory>
+ <osStorage>10</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed876c-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed876c-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2008 Ent 64-bit R2 2 CPU</name>
+ <description>Windows 2008 Enterprise R2 64-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2008R2E/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>2</cpuCount>
+ <memory>4096</memory>
+ <osStorage>50</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed8a5a-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed8a5a-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2008 Ent 64-bit R2 4 CPU</name>
+ <description>Windows 2008 Enterprise R2 64-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2008R2E/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>4</cpuCount>
+ <memory>8192</memory>
+ <osStorage>50</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed865e-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed865e-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2008 Std 64-bit R2 2 CPU</name>
+ <description>Windows 2008 Standard R2 64-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2008R2S/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>2</cpuCount>
+ <memory>4096</memory>
+ <osStorage>50</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed7b96-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed7b96-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2008 Std 32-bit 1 CPU</name>
+ <description>Windows 2008 Standard SP2 32-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2008S/32</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>1</cpuCount>
+ <memory>2048</memory>
+ <osStorage>50</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed7cb8-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed7cb8-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2008 Std 32-bit 2 CPU</name>
+ <description>Windows 2008 Standard SP2 32-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2008S/32</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>2</cpuCount>
+ <memory>4096</memory>
+ <osStorage>50</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed7da8-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed7da8-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2008 Std 32-bit 4 CPU</name>
+ <description>Windows 2008 Standard SP2 32-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2008S/32</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>4</cpuCount>
+ <memory>4096</memory>
+ <osStorage>50</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed7ea2-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed7ea2-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2008 Ent 32-bit 2 CPU</name>
+ <description>Windows 2008 Enterprise SP2 32-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2008E/32</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>2</cpuCount>
+ <memory>4096</memory>
+ <osStorage>50</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed8fd2-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed8fd2-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Red Hat 4.8 32-bit 1 CPU</name>
+ <description>Red Hat ES 4.8 (Nahant), 32-bit</description>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>REDHAT4/32</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>1</cpuCount>
+ <memory>2048</memory>
+ <osStorage>10</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed90cc-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed90cc-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>CentOS 5.5 32-bit 1 CPU</name>
+ <description>CentOS release 5.5, 32-bit</description>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>CENTOS5/32</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>1</cpuCount>
+ <memory>2048</memory>
+ <osStorage>10</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed91da-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed91da-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>CentOS 5.5 64-bit 1 CPU</name>
+ <description>CentOS release 5.5, 64-bit</description>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>CENTOS5/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>1</cpuCount>
+ <memory>2048</memory>
+ <osStorage>10</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed766e-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed766e-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2003 Ent 32-bit 1 CPU</name>
+ <description>Windows 2003 Enterprise SP2 32-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2003E/32</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>1</cpuCount>
+ <memory>2048</memory>
+ <osStorage>16</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed7876-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed7876-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2003 Ent 32-bit 2 CPU</name>
+ <description>Windows 2003 Enterprise SP2 32-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2003E/32</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>2</cpuCount>
+ <memory>4096</memory>
+ <osStorage>16</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed7984-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed7984-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2003 Ent 32-bit 4 CPU</name>
+ <description>Windows 2003 Enterprise SP2 32-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2003E/32</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>4</cpuCount>
+ <memory>4096</memory>
+ <osStorage>16</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>52ed7a88-ebea-11df-bdc1-001517c46384</id>
+ <resourcePath>/oec/base/image/52ed7a88-ebea-11df-bdc1-001517c46384</resourcePath>
+ <name>Win2003 Std 64-bit 2 CPU</name>
+ <description>Windows 2003 Standard x64 SP2, 64-bit</description>
+ <operatingSystem>
+ <type>WINDOWS</type>
+ <displayName>WIN2003S/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>2</cpuCount>
+ <memory>4096</memory>
+ <osStorage>16</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>1970-01-01T00:00:02.010Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>0c231ef0-2a42-11e0-bfb5-001517c46384</id>
+ <resourcePath>/oec/base/image/0c231ef0-2a42-11e0-bfb5-001517c46384</resourcePath>
+ <name>RedHat 64-bit 2 CPU with MySQL</name>
+ <description>RedHat 5.5 Enterprise with MySQL 5.5 installed</description>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>REDHAT5/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>2</cpuCount>
+ <memory>8192</memory>
+ <osStorage>10</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>2011-01-27T18:19:58.000Z</created>
+ </ServerImage>
+ <ServerImage>
+ <id>2fb5261a-2a42-11e0-bfb5-001517c46384</id>
+ <resourcePath>/oec/base/image/2fb5261a-2a42-11e0-bfb5-001517c46384</resourcePath>
+ <name>RedHat 64-bit 2 CPU with PostgreSQL</name>
+ <description>RedHat 5.5 Enterprise with PostgreSQL 9.0 installed</description>
+ <operatingSystem>
+ <type>UNIX</type>
+ <displayName>REDHAT5/64</displayName>
+ </operatingSystem>
+ <location>NA1</location>
+ <cpuCount>2</cpuCount>
+ <memory>8192</memory>
+ <osStorage>10</osStorage>
+ <additionalLocalStorage>0</additionalLocalStorage>
+ <created>2011-01-27T18:20:57.000Z</created>
+ </ServerImage>
+</ServerImages>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/119c1903/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_myaccount.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_myaccount.xml b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_myaccount.xml
new file mode 100644
index 0000000..4f3b132
--- /dev/null
+++ b/libcloud/test/compute/fixtures/dimensiondata/oec_0_9_myaccount.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns3:Account xmlns="http://oec.api.opsource.net/schemas/server" xmlns:ns9="http://oec.api.opsource.net/schemas/reset" xmlns:ns5="http://oec.api.opsource.net/schemas/vip" xmlns:ns12="http://oec.api.opsource.net/schemas/general" xmlns:ns6="http://oec.api.opsource.net/schemas/imageimportexport" xmlns:ns13="http://oec.api.opsource.net/schemas/support" xmlns:ns7="http://oec.api.opsource.net/schemas/whitelabel" xmlns:ns10="http://oec.api.opsource.net/schemas/ipplan" xmlns:ns8="http://oec.api.opsource.net/schemas/datacenter" xmlns:ns11="http://oec.api.opsource.net/schemas/storage" xmlns:ns2="http://oec.api.opsource.net/schemas/organization" xmlns:ns4="http://oec.api.opsource.net/schemas/network" xmlns:ns3="http://oec.api.opsource.net/schemas/directory">
+ <ns3:userName>testuser</ns3:userName>
+ <ns3:fullName>Test User</ns3:fullName>
+ <ns3:firstName>Test</ns3:firstName>
+ <ns3:lastName>User</ns3:lastName>
+ <ns3:emailAddress>test@example.com</ns3:emailAddress>
+ <ns3:orgId>8a8f6abc-2745-4d8a-9cbc-8dabe5a7d0e4</ns3:orgId>
+ <ns3:roles>
+ <ns3:role>
+ <ns3:name>create image</ns3:name>
+ </ns3:role>
+ <ns3:role>
+ <ns3:name>reports</ns3:name>
+ </ns3:role>
+ <ns3:role>
+ <ns3:name>server</ns3:name>
+ </ns3:role>
+ <ns3:role>
+ <ns3:name>primary administrator</ns3:name>
+ </ns3:role>
+ <ns3:role>
+ <ns3:name>network</ns3:name>
+ </ns3:role>
+ </ns3:roles>
+</ns3:Account>
[4/4] libcloud git commit: Fix a typo.
Posted by to...@apache.org.
Fix a typo.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/cfd815eb
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/cfd815eb
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/cfd815eb
Branch: refs/heads/trunk
Commit: cfd815eb824c9f23fa906ecedafd56ef5c7ce03a
Parents: bfec2c4
Author: Tomaz Muraus <to...@apache.org>
Authored: Wed May 6 15:01:56 2015 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Wed May 6 15:01:56 2015 +0200
----------------------------------------------------------------------
docs/compute/drivers/dimensiondata.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/cfd815eb/docs/compute/drivers/dimensiondata.rst
----------------------------------------------------------------------
diff --git a/docs/compute/drivers/dimensiondata.rst b/docs/compute/drivers/dimensiondata.rst
index 7b71211..384b481 100644
--- a/docs/compute/drivers/dimensiondata.rst
+++ b/docs/compute/drivers/dimensiondata.rst
@@ -14,7 +14,7 @@ one of the public cloud instances or as a private instance on premises.
CaaS has its own non-standard `API`_ , `libcloud` provides a Python
wrapper on top of this `API`_ with common methods with other IaaS solutions and
Public cloud providers. Therefore, you can use use the Dimension Data libcloud
-driver to communicate with both the public and private M
+driver to communicate with both the public and private clouds.
Instantiating a driver
----------------------
@@ -51,4 +51,4 @@ API Docs
:members:
:inherited-members:
-.. _`API`: http://cloud.dimensiondata.com/au/en/services/public-cloud/api
\ No newline at end of file
+.. _`API`: http://cloud.dimensiondata.com/au/en/services/public-cloud/api