libcloud-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From to...@apache.org
Subject [2/4] libcloud git commit: LIBCLOUD-698 rename OpSource Dimension Data. Added Dimension Data driver.
Date Wed, 06 May 2015 13:10:50 GMT
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 <tomaz@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 <anthony.p.shaw@gmail.com>
Authored: Tue Apr 21 14:04:09 2015 +1000
Committer: Tomaz Muraus <tomaz@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>


Mime
View raw message