Repository: libcloud
Updated Branches:
  refs/heads/trunk e27ad982b -> 9fe6643a1


Add support for Abiquo API v3.x, remove support for now obsolete API v2.x.

Closes #433

Signed-off-by: Tomaz Muraus <[email protected]>


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

Branch: refs/heads/trunk
Commit: 9fe6643a13bb3645288f0cbab04dffc0c1e1566d
Parents: e27ad98
Author: Lochii Connectivity <[email protected]>
Authored: Sun Jan 11 20:08:15 2015 +0000
Committer: Tomaz Muraus <[email protected]>
Committed: Thu Jan 29 15:28:36 2015 +0100

----------------------------------------------------------------------
 CHANGES.rst                                     |   4 +
 libcloud/__init__.py                            |   2 +-
 libcloud/common/abiquo.py                       |  17 ++-
 libcloud/compute/drivers/abiquo.py              | 130 ++++++++++++-------
 libcloud/httplib_ssl.py                         |   1 +
 libcloud/test/compute/fixtures/abiquo/vdc_4.xml |   2 +-
 .../abiquo/vdc_4_vapp_5_vm_3_not_allocated.xml  |   6 +-
 .../fixtures/abiquo/vdc_4_vapp_5_vms.xml        |   8 +-
 .../fixtures/abiquo/vdc_4_vapp_6_vm_3.xml       |   4 +-
 .../abiquo/vdc_4_vapp_6_vm_3_allocated.xml      |   4 +-
 .../abiquo/vdc_4_vapp_6_vm_3_deployed.xml       |   4 +-
 .../fixtures/abiquo/vdc_4_vapp_6_vms.xml        |   8 +-
 .../abiquo/vdc_4_vapp_6_vms_allocated.xml       |   8 +-
 libcloud/test/compute/fixtures/abiquo/vdcs.xml  |   2 +-
 libcloud/test/compute/test_abiquo.py            |   7 +
 15 files changed, 132 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index ee24dfd..8433211 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -149,6 +149,10 @@ Compute
   (GITHUB-433)
   [quilombo]
 
+- Add support for Abiquo API v3.x, remove support for now obsolete API v2.x.
+  (GUTHUB-433, LIBCLOUD-652)
+  [David Freedman]
+
 Storage
 ~~~~~~~
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/__init__.py
----------------------------------------------------------------------
diff --git a/libcloud/__init__.py b/libcloud/__init__.py
index 9a1c180..5f7d027 100644
--- a/libcloud/__init__.py
+++ b/libcloud/__init__.py
@@ -20,7 +20,7 @@ libcloud provides a unified interface to the cloud computing 
resources.
 """
 
 __all__ = ['__version__', 'enable_debug']
-__version__ = '0.16.0'
+__version__ = '0.17.0'
 
 import os
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/common/abiquo.py
----------------------------------------------------------------------
diff --git a/libcloud/common/abiquo.py b/libcloud/common/abiquo.py
index 69bf3c7..0d52fd7 100644
--- a/libcloud/common/abiquo.py
+++ b/libcloud/common/abiquo.py
@@ -125,10 +125,16 @@ class AbiquoResponse(XmlResponse):
             raise InvalidCredsError(driver=self.connection.driver)
         elif self.status == httplib.FORBIDDEN:
             raise ForbiddenError(self.connection.driver)
+        elif self.status == httplib.NOT_ACCEPTABLE:
+            raise LibcloudError('Not Acceptable')
         else:
-            errors = self.parse_body().findall('error')
-            # Most of the exceptions only have one error
-            raise LibcloudError(errors[0].findtext('message'))
+            parsebody = self.parse_body()
+            if parsebody is not None and hasattr(parsebody, 'findall'):
+                errors = self.parse_body().findall('error')
+                # Most of the exceptions only have one error
+                raise LibcloudError(errors[0].findtext('message'))
+            else:
+                raise LibcloudError(self.body)
 
     def success(self):
         """
@@ -230,10 +236,13 @@ class AbiquoConnection(ConnectionUserAndKey, 
PollingConnection):
         """
         accepted_request_obj = response.object
         link_poll = get_href(accepted_request_obj, 'status')
+        hdr_poll = {'Accept': 'application/vnd.abiquo.task+xml'}
 
-        # Override just the 'action' and 'method' keys of the previous dict
+        # Override the 'action', 'method' and 'headers'
+        # keys of the previous dict
         request_kwargs['action'] = link_poll
         request_kwargs['method'] = 'GET'
+        request_kwargs['headers'] = hdr_poll
         return request_kwargs
 
     def has_completed(self, response):

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/compute/drivers/abiquo.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/abiquo.py 
b/libcloud/compute/drivers/abiquo.py
index cccd5cf..f8afdfd 100644
--- a/libcloud/compute/drivers/abiquo.py
+++ b/libcloud/compute/drivers/abiquo.py
@@ -18,8 +18,7 @@ Abiquo Compute Driver
 The driver implements the compute Abiquo functionality for the Abiquo API.
 This version is compatible with the following versions of Abiquo:
 
-    * Abiquo 2.0 (http://wiki.abiquo.com/display/ABI20/The+Abiquo+API)
-    * Abiquo 2.2 (http://wiki.abiquo.com/display/ABI22/The+Abiquo+API)
+    * Abiquo 3.1 (http://wiki.abiquo.com/display/ABI31/The+Abiquo+API)
 """
 import xml.etree.ElementTree as ET
 
@@ -43,10 +42,22 @@ class AbiquoNodeDriver(NodeDriver):
     timeout = 2000  # some images take a lot of time!
 
     # Media Types
-    NODES_MIME_TYPE = 'application/vnd.abiquo.virtualmachineswithnode+xml'
-    NODE_MIME_TYPE = 'application/vnd.abiquo.virtualmachinewithnode+xml'
+    NODES_MIME_TYPE = 'application/vnd.abiquo.virtualmachines+xml'
+    NODE_MIME_TYPE = 'application/vnd.abiquo.virtualmachine+xml'
+    VAPPS_MIME_TYPE = 'application/vnd.abiquo.virtualappliances+xml'
     VAPP_MIME_TYPE = 'application/vnd.abiquo.virtualappliance+xml'
     VM_TASK_MIME_TYPE = 'application/vnd.abiquo.virtualmachinetask+xml'
+    USER_MIME_TYPE = 'application/vnd.abiquo.user+xml'
+    ENT_MIME_TYPE = 'application/vnd.abiquo.enterprise+xml'
+    VDCS_MIME_TYPE = 'application/vnd.abiquo.virtualdatacenters+xml'
+    VDC_MIME_TYPE = 'application/vnd.abiquo.virtualdatacenter+xml'
+    DCS_MIME_TYPE = 'application/vnd.abiquo.datacenters+xml'
+    VMTPLS_MIME_TYPE = 'application/vnd.abiquo.virtualmachinetemplates+xml'
+    VMTPL_MIME_TYPE = 'application/vnd.abiquo.virtualmachinetemplate+xml'
+    NICS_MIME_TYPE = 'application/vnd.abiquo.nics+xml'
+    DCRS_MIME_TYPE = 'application/vnd.abiquo.datacenterrepositories+xml'
+    DCR_MIME_TYPE = 'application/vnd.abiquo.datacenterrepository+xml'
+    AR_MIME_TYPE = 'application/vnd.abiquo.acceptedrequest+xml'
 
     # Others constants
     GIGABYTE = 1073741824
@@ -149,7 +160,10 @@ class AbiquoNodeDriver(NodeDriver):
         """
 
         # Refresh node state
-        e_vm = self.connection.request(node.extra['uri_id']).object
+        headers = {'Accept': self.NODE_MIME_TYPE}
+        e_vm = self.connection.request(node.extra['uri_id'],
+                                       headers=headers).object
+
         state = e_vm.findtext('state')
 
         if state in ['ALLOCATED', 'CONFIGURED', 'LOCKED', 'UNKNOWN']:
@@ -163,7 +177,8 @@ class AbiquoNodeDriver(NodeDriver):
             # Set the URI
             destroy_uri = node.extra['uri_id'] + '/action/undeploy'
             # Prepare the headers
-            headers = {'Content-type': self.VM_TASK_MIME_TYPE}
+            headers = {'Accept': self.AR_MIME_TYPE,
+                       'Content-type': self.VM_TASK_MIME_TYPE}
             res = self.connection.async_request(action=destroy_uri,
                                                 method='POST',
                                                 data=tostring(vm_task),
@@ -236,37 +251,38 @@ class AbiquoNodeDriver(NodeDriver):
         connection. However, this method is public and you are able to
         refresh the list of locations any time.
         """
-        user = self.connection.request('/login').object
+
+        user_headers = {'Accept': self.USER_MIME_TYPE}
+        user = self.connection.request('/login', headers=user_headers).object
         self.connection.cache['user'] = user
         e_ent = get_href(self.connection.cache['user'],
                          'enterprise')
-        ent = self.connection.request(e_ent).object
+        ent_headers = {'Accept': self.ENT_MIME_TYPE}
+        ent = self.connection.request(e_ent, headers=ent_headers).object
         self.connection.cache['enterprise'] = ent
 
+        vdcs_headers = {'Accept': self.VDCS_MIME_TYPE}
         uri_vdcs = '/cloud/virtualdatacenters'
-        e_vdcs = self.connection.request(uri_vdcs).object
+        e_vdcs = self.connection.request(uri_vdcs, headers=vdcs_headers).object
 
-        # Set a dict for the datacenter and its href for a further search
         params = {"idEnterprise": self._get_enterprise_id()}
+
+        dcs_headers = {'Accept': self.DCS_MIME_TYPE}
         e_dcs = self.connection.request('/admin/datacenters',
+                                        headers=dcs_headers,
                                         params=params).object
         dc_dict = {}
         for dc in e_dcs.findall('datacenter'):
-            key = get_href(dc, 'edit')
+            key = get_href(dc, 'self')
             dc_dict[key] = dc
 
-        # Populate locations cache
+        # Populate locations name cache
         self.connection.cache['locations'] = {}
         for e_vdc in e_vdcs.findall('virtualDatacenter'):
-            dc_link = get_href(e_vdc, 'datacenter')
-            loc = self._to_location(e_vdc, dc_dict[dc_link], self)
-
-            # Save into cache the link to the itself because we will need
-            # it in the future, but we save here to don't extend the class
-            # :class:`NodeLocation`.
-            # So here we have the dict: :class:`NodeLocation` ->
-            # link_datacenter
-            self.connection.cache['locations'][loc] = get_href(e_vdc, 'edit')
+            loc = get_href(e_vdc, 'location')
+            if loc is not None:
+                self.connection.cache['locations'][loc] = get_href(e_vdc,
+                                                                   'edit')
 
     def ex_create_group(self, name, location=None):
         """
@@ -294,10 +310,12 @@ class AbiquoNodeDriver(NodeDriver):
             raise LibcloudError('Location does not exist')
 
         link_vdc = self.connection.cache['locations'][location]
-        e_vdc = self.connection.request(link_vdc).object
+        hdr_vdc = {'Accept': self.VDC_MIME_TYPE}
+        e_vdc = self.connection.request(link_vdc, headers=hdr_vdc).object
 
         creation_link = get_href(e_vdc, 'virtualappliances')
-        headers = {'Content-type': self.VAPP_MIME_TYPE}
+        headers = {'Accept': self.VAPP_MIME_TYPE,
+                   'Content-type': self.VAPP_MIME_TYPE}
         vapp = self.connection.request(creation_link, data=tostring(vapp),
                                        headers=headers, method='POST').object
 
@@ -340,7 +358,8 @@ class AbiquoNodeDriver(NodeDriver):
             undeploy_uri = group.uri + '/action/undeploy'
 
             # Prepare the headers
-            headers = {'Content-type': self.VM_TASK_MIME_TYPE}
+            headers = {'Accept': self.AR_MIME_TYPE,
+                       'Content-type': self.VM_TASK_MIME_TYPE}
             res = self.connection.async_request(action=undeploy_uri,
                                                 method='POST',
                                                 data=tostring(vm_task),
@@ -366,17 +385,19 @@ class AbiquoNodeDriver(NodeDriver):
         groups = []
         for vdc in self._get_locations(location):
             link_vdc = self.connection.cache['locations'][vdc]
-            e_vdc = self.connection.request(link_vdc).object
+            hdr_vdc = {'Accept': self.VDC_MIME_TYPE}
+            e_vdc = self.connection.request(link_vdc, headers=hdr_vdc).object
             apps_link = get_href(e_vdc, 'virtualappliances')
-            vapps = self.connection.request(apps_link).object
+            hdr_vapps = {'Accept': self.VAPPS_MIME_TYPE}
+            vapps = self.connection.request(apps_link,
+                                            headers=hdr_vapps).object
             for vapp in vapps.findall('virtualAppliance'):
                 nodes = []
                 vms_link = get_href(vapp, 'virtualmachines')
                 headers = {'Accept': self.NODES_MIME_TYPE}
                 vms = self.connection.request(vms_link, headers=headers).object
-                for vm in vms.findall('virtualmachinewithnode'):
+                for vm in vms.findall('virtualMachine'):
                     nodes.append(self._to_node(vm, self))
-
                 group = NodeGroup(self, vapp.findtext('name'),
                                   nodes, get_href(vapp, 'edit'))
                 groups.append(group)
@@ -395,7 +416,8 @@ class AbiquoNodeDriver(NodeDriver):
         """
         enterprise_id = self._get_enterprise_id()
         uri = '/admin/enterprises/%s/datacenterrepositories/' % (enterprise_id)
-        repos = self.connection.request(uri).object
+        repos_hdr = {'Accept': self.DCRS_MIME_TYPE}
+        repos = self.connection.request(uri, headers=repos_hdr).object
 
         images = []
         for repo in repos.findall('datacenterRepository'):
@@ -404,17 +426,20 @@ class AbiquoNodeDriver(NodeDriver):
             for vdc in self._get_locations(location):
                 # Check if the virtual datacenter belongs to this repo
                 link_vdc = self.connection.cache['locations'][vdc]
-                e_vdc = self.connection.request(link_vdc).object
-                dc_link_vdc = get_href(e_vdc, 'datacenter')
+                hdr_vdc = {'Accept': self.VDC_MIME_TYPE}
+                e_vdc = self.connection.request(link_vdc,
+                                                headers=hdr_vdc).object
+                dc_link_vdc = get_href(e_vdc, 'location')
                 dc_link_repo = get_href(repo, 'datacenter')
 
-                if dc_link_vdc == dc_link_repo:
+                if dc_link_vdc.split("/")[-1] == dc_link_repo.split("/")[-1]:
                     # Filter the template in case we don't have it yet
                     url_templates = get_href(repo, 'virtualmachinetemplates')
                     hypervisor_type = e_vdc.findtext('hypervisorType')
                     params = {'hypervisorTypeName': hypervisor_type}
-                    templates = self.connection.request(url_templates,
-                                                        params).object
+                    headers = {'Accept': self.VMTPLS_MIME_TYPE}
+                    templates = self.connection.request(url_templates, params,
+                                                        headers=headers).object
                     for templ in templates.findall('virtualMachineTemplate'):
                         # Avoid duplicated templates
                         id_template = templ.findtext('id')
@@ -511,7 +536,9 @@ class AbiquoNodeDriver(NodeDriver):
         :rtype: ``bool``
         """
         reboot_uri = node.extra['uri_id'] + '/action/reset'
-        res = self.connection.async_request(action=reboot_uri, method='POST')
+        reboot_hdr = {'Accept': self.AR_MIME_TYPE}
+        res = self.connection.async_request(action=reboot_uri,
+                                            method='POST', headers=reboot_hdr)
         return res.async_success()
 
     # -------------------------
@@ -543,7 +570,8 @@ class AbiquoNodeDriver(NodeDriver):
         force_deploy.text = 'True'
 
         # Prepare the headers
-        headers = {'Content-type': self.VM_TASK_MIME_TYPE}
+        headers = {'Accept': self.AR_MIME_TYPE,
+                   'Content-type': self.VM_TASK_MIME_TYPE}
         link_deploy = get_href(e_vm, 'deploy')
         res = self.connection.async_request(action=link_deploy, method='POST',
                                             data=tostring(vm_task),
@@ -565,18 +593,22 @@ class AbiquoNodeDriver(NodeDriver):
         Generates the :class:`Node` class.
         """
         identifier = vm.findtext('id')
-        name = vm.findtext('nodeName')
+        name = vm.findtext('label')
         state = AbiquoResponse.NODE_STATE_MAP[vm.findtext('state')]
 
         link_image = get_href(vm, 'virtualmachinetemplate')
-        image_element = self.connection.request(link_image).object
+        link_hdr = {'Accept': self.VMTPL_MIME_TYPE}
+        image_element = self.connection.request(link_image,
+                                                headers=link_hdr).object
         repo_link = get_href(image_element, 'datacenterrepository')
         image = self._to_nodeimage(image_element, self, repo_link)
 
         # Fill the 'ips' data
         private_ips = []
         public_ips = []
-        nics_element = self.connection.request(get_href(vm, 'nics')).object
+        nics_hdr = {'Accept': self.NICS_MIME_TYPE}
+        nics_element = self.connection.request(get_href(vm, 'nics'),
+                                               headers=nics_hdr).object
         for nic in nics_element.findall('nic'):
             ip = nic.findtext('ip')
             for link in nic.findall('link'):
@@ -603,7 +635,8 @@ class AbiquoNodeDriver(NodeDriver):
         identifier = template.findtext('id')
         name = template.findtext('name')
         url = get_href(template, 'edit')
-        extra = {'repo': repo, 'url': url}
+        hdreqd = template.findtext('hdRequired')
+        extra = {'repo': repo, 'url': url, 'hdrequired': hdreqd}
         return NodeImage(identifier, name, driver, extra)
 
     def _get_locations(self, location=None):
@@ -649,8 +682,8 @@ class AbiquoNodeDriver(NodeDriver):
         target_loc = None
         for candidate_loc in self._get_locations(location):
             link_vdc = self.connection.cache['locations'][candidate_loc]
-            e_vdc = self.connection.request(link_vdc).object
-            # url_location = get_href(e_vdc, 'datacenter')
+            hdr_vdc = {'Accept': self.VDC_MIME_TYPE}
+            e_vdc = self.connection.request(link_vdc, headers=hdr_vdc).object
             for img in self.list_images(candidate_loc):
                 if img.id == image.id:
                     loc = e_vdc
@@ -676,7 +709,9 @@ class AbiquoNodeDriver(NodeDriver):
 
         # We search if the group is already defined into the location
         groups_link = get_href(xml_loc, 'virtualappliances')
-        vapps_element = self.connection.request(groups_link).object
+        groups_hdr = {'Accept': self.VAPPS_MIME_TYPE}
+        vapps_element = self.connection.request(groups_link,
+                                                headers=groups_hdr).object
         target_group = None
         for vapp in vapps_element.findall('virtualAppliance'):
             if vapp.findtext('name') == group_name:
@@ -696,15 +731,16 @@ class AbiquoNodeDriver(NodeDriver):
         In Abiquo, you first need to 'register' or 'define' the node in
         the API before to create it into the target hypervisor.
         """
-        vm = ET.Element('virtualmachinewithnode')
+        vm = ET.Element('virtualMachine')
         if 'name' in kwargs:
-            vmname = ET.SubElement(vm, 'nodeName')
+            vmname = ET.SubElement(vm, 'label')
             vmname.text = kwargs['name']
-        attrib = {'type': 'application/vnd.abiquo/virtualmachinetemplate+xml',
+        attrib = {'type': self.VMTPL_MIME_TYPE,
                   'rel': 'virtualmachinetemplate',
                   'href': kwargs['image'].extra['url']}
         ET.SubElement(vm, 'link', attrib=attrib)
-        headers = {'Content-type': self.NODE_MIME_TYPE}
+        headers = {'Accept': self.NODE_MIME_TYPE,
+                   'Content-type': self.NODE_MIME_TYPE}
 
         if 'size' in kwargs:
             # Override the 'NodeSize' data

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/httplib_ssl.py
----------------------------------------------------------------------
diff --git a/libcloud/httplib_ssl.py b/libcloud/httplib_ssl.py
index bb569fb..bd138a7 100644
--- a/libcloud/httplib_ssl.py
+++ b/libcloud/httplib_ssl.py
@@ -31,6 +31,7 @@ from libcloud.utils.py3 import httplib
 from libcloud.utils.py3 import urlparse
 from libcloud.utils.py3 import urlunquote
 
+
 __all__ = [
     'LibcloudBaseConnection',
     'LibcloudHTTPConnection',

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/test/compute/fixtures/abiquo/vdc_4.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/abiquo/vdc_4.xml 
b/libcloud/test/compute/fixtures/abiquo/vdc_4.xml
index 54f2957..c311929 100644
--- a/libcloud/test/compute/fixtures/abiquo/vdc_4.xml
+++ b/libcloud/test/compute/fixtures/abiquo/vdc_4.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <virtualDatacenter>
-    <link href="http://10.60.12.7:80/api/admin/datacenters/2"; 
type="application/vnd.abiquo.datacenter+xml" rel="datacenter"/>
+    <link href="http://10.60.12.7:80/api/cloud/locations/2"; 
type="application/vnd.abiquo.datacenter+xml" rel="location"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/privatenetworks/2"; 
type="application/vnd.abiquo.vlan+xml" rel="defaultnetwork"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/action/dhcpinfo"; 
type="text/plain" rel="dhcpinfo"/>
     <link href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/disks"; 
type="application/vnd.abiquo.harddisks+xml" rel="disks"/>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_5_vm_3_not_allocated.xml
----------------------------------------------------------------------
diff --git 
a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_5_vm_3_not_allocated.xml 
b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_5_vm_3_not_allocated.xml
index 6b70396..dc28342 100644
--- a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_5_vm_3_not_allocated.xml
+++ b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_5_vm_3_not_allocated.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<virtualmachinewithnode>
+<virtualMachine>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/network/configurations";
 type="application/vnd.abiquo.virtualmachinenetworkconfigurations+xml" 
rel="configurations"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/action/deploy";
 type="application/vnd.abiquo.acceptedrequest+xml" rel="deploy"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/disks";
 type="application/vnd.abiquo.harddisks+xml" rel="disks"/>
@@ -32,7 +32,7 @@
     <uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid>
     <vdrpPort>0</vdrpPort>
     <nodeId>3</nodeId>
-    <nodeName>node-name</nodeName>
+    <label>node-name</label>
     <x>0</x>
     <y>0</y>
-</virtualmachinewithnode>
+</virtualMachine>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_5_vms.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_5_vms.xml 
b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_5_vms.xml
index 5a4eefd..ecb7303 100644
--- a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_5_vms.xml
+++ b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_5_vms.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<virtualmachineswithnode>
-    <virtualmachinewithnode>
+<virtualMachines>
+    <virtualMachine>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/network/configurations";
 type="application/vnd.abiquo.virtualmachinenetworkconfigurations+xml" 
rel="configurations"/><link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/action/deploy";
 type="application/vnd.abiquo.acceptedrequest+xml" rel="deploy"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/disks";
 type="application/vnd.abiquo.harddisks+xml" rel="disks"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="edit"/>
@@ -19,5 +19,5 @@
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="virtualmachine"/>
         <link 
href="http://10.60.12.7:80/api/admin/enterprises/1/datacenterrepositories/2/virtualmachinetemplates/11";
 type="application/vnd.abiquo.virtualmachinetemplate+xml" 
rel="virtualmachinetemplate"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/volumes";
 type="application/vnd.abiquo.iscsivolumes+xml" rel="volumes"/>
-    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>NOT_ALLOCATED</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>0</vdrpPort><nodeId>3</nodeId><nodeName>node-name</nodeName><x>0</x><y>0</y></virtualmachinewithnode>
-</virtualmachineswithnode>
+    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>NOT_ALLOCATED</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>0</vdrpPort><nodeId>3</nodeId><label>node-name</label><x>0</x><y>0</y></virtualMachine>
+</virtualMachines>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3.xml 
b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3.xml
index 17efdc4..75b1e68 100644
--- a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3.xml
+++ b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<virtualmachinewithnode>
+<virtualMachine>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/network/configurations";
 type="application/vnd.abiquo.virtualmachinenetworkconfigurations+xml" 
rel="configurations"/><link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/action/deploy";
 type="application/vnd.abiquo.acceptedrequest+xml" rel="deploy"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/disks";
 type="application/vnd.abiquo.harddisks+xml" rel="disks"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="edit"/>
@@ -19,4 +19,4 @@
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="virtualmachine"/>
     <link 
href="http://10.60.12.7:80/api/admin/enterprises/1/datacenterrepositories/2/virtualmachinetemplates/11";
 type="application/vnd.abiquo.virtualmachinetemplate+xml" 
rel="virtualmachinetemplate"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/volumes";
 type="application/vnd.abiquo.iscsivolumes+xml" rel="volumes"/>
-    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>NOT_ALLOCATED</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>5901</vdrpPort><nodeId>3</nodeId><nodeName>node-name</nodeName><x>0</x><y>0</y><vdrpIp>80.12.23.43</vdrpIp></virtualmachinewithnode>
+    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>NOT_ALLOCATED</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>5901</vdrpPort><nodeId>3</nodeId><label>node-name</label><x>0</x><y>0</y><vdrpIp>80.12.23.43</vdrpIp></virtualMachine>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3_allocated.xml
----------------------------------------------------------------------
diff --git 
a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3_allocated.xml 
b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3_allocated.xml
index 2135a00..4c8d4d6 100644
--- a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3_allocated.xml
+++ b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3_allocated.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<virtualmachinewithnode>
+<virtualMachine>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/network/configurations";
 type="application/vnd.abiquo.virtualmachinenetworkconfigurations+xml" 
rel="configurations"/><link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/action/deploy";
 type="application/vnd.abiquo.acceptedrequest+xml" rel="deploy"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/disks";
 type="application/vnd.abiquo.harddisks+xml" rel="disks"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="edit"/>
@@ -19,4 +19,4 @@
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="virtualmachine"/>
     <link 
href="http://10.60.12.7:80/api/admin/enterprises/1/datacenterrepositories/2/virtualmachinetemplates/11";
 type="application/vnd.abiquo.virtualmachinetemplate+xml" 
rel="virtualmachinetemplate"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/volumes";
 type="application/vnd.abiquo.iscsivolumes+xml" rel="volumes"/>
-    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>ALLOCATED</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>5901</vdrpPort><nodeId>3</nodeId><nodeName>node-name</nodeName><x>0</x><y>0</y><vdrpIp>80.12.23.43</vdrpIp></virtualmachinewithnode>
+    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>ALLOCATED</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>5901</vdrpPort><nodeId>3</nodeId><label>node-name</label><x>0</x><y>0</y><vdrpIp>80.12.23.43</vdrpIp></virtualMachine>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3_deployed.xml
----------------------------------------------------------------------
diff --git 
a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3_deployed.xml 
b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3_deployed.xml
index 648da69..fb94d0c 100644
--- a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3_deployed.xml
+++ b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vm_3_deployed.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<virtualmachinewithnode>
+<virtualMachine>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/network/configurations";
 type="application/vnd.abiquo.virtualmachinenetworkconfigurations+xml" 
rel="configurations"/><link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/action/deploy";
 type="application/vnd.abiquo.acceptedrequest+xml" rel="deploy"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/disks";
 type="application/vnd.abiquo.harddisks+xml" rel="disks"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="edit"/>
@@ -19,4 +19,4 @@
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="virtualmachine"/>
     <link 
href="http://10.60.12.7:80/api/admin/enterprises/1/datacenterrepositories/2/virtualmachinetemplates/11";
 type="application/vnd.abiquo.virtualmachinetemplate+xml" 
rel="virtualmachinetemplate"/>
     <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/volumes";
 type="application/vnd.abiquo.iscsivolumes+xml" rel="volumes"/>
-    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>ON</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>5901</vdrpPort><nodeId>3</nodeId><nodeName>node-name</nodeName><x>0</x><y>0</y><vdrpIp>80.12.23.43</vdrpIp></virtualmachinewithnode>
+    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>ON</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>5901</vdrpPort><nodeId>3</nodeId><label>node-name</label><x>0</x><y>0</y><vdrpIp>80.12.23.43</vdrpIp></virtualMachine>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vms.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vms.xml 
b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vms.xml
index 5a4eefd..ecb7303 100644
--- a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vms.xml
+++ b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vms.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<virtualmachineswithnode>
-    <virtualmachinewithnode>
+<virtualMachines>
+    <virtualMachine>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/network/configurations";
 type="application/vnd.abiquo.virtualmachinenetworkconfigurations+xml" 
rel="configurations"/><link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/action/deploy";
 type="application/vnd.abiquo.acceptedrequest+xml" rel="deploy"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/disks";
 type="application/vnd.abiquo.harddisks+xml" rel="disks"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="edit"/>
@@ -19,5 +19,5 @@
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="virtualmachine"/>
         <link 
href="http://10.60.12.7:80/api/admin/enterprises/1/datacenterrepositories/2/virtualmachinetemplates/11";
 type="application/vnd.abiquo.virtualmachinetemplate+xml" 
rel="virtualmachinetemplate"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/volumes";
 type="application/vnd.abiquo.iscsivolumes+xml" rel="volumes"/>
-    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>NOT_ALLOCATED</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>0</vdrpPort><nodeId>3</nodeId><nodeName>node-name</nodeName><x>0</x><y>0</y></virtualmachinewithnode>
-</virtualmachineswithnode>
+    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>NOT_ALLOCATED</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>0</vdrpPort><nodeId>3</nodeId><label>node-name</label><x>0</x><y>0</y></virtualMachine>
+</virtualMachines>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vms_allocated.xml
----------------------------------------------------------------------
diff --git 
a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vms_allocated.xml 
b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vms_allocated.xml
index a1658f0..c5d9589 100644
--- a/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vms_allocated.xml
+++ b/libcloud/test/compute/fixtures/abiquo/vdc_4_vapp_6_vms_allocated.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<virtualmachineswithnode>
-    <virtualmachinewithnode>
+<virtualMachines>
+    <virtualMachine>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/network/configurations";
 type="application/vnd.abiquo.virtualmachinenetworkconfigurations+xml" 
rel="configurations"/><link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/action/deploy";
 type="application/vnd.abiquo.acceptedrequest+xml" rel="deploy"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/disks";
 type="application/vnd.abiquo.harddisks+xml" rel="disks"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="edit"/>
@@ -19,5 +19,5 @@
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3";
 type="application/vnd.abiquo.virtualmachine+xml" rel="virtualmachine"/>
         <link 
href="http://10.60.12.7:80/api/admin/enterprises/1/datacenterrepositories/2/virtualmachinetemplates/11";
 type="application/vnd.abiquo.virtualmachinetemplate+xml" 
rel="virtualmachinetemplate"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/virtualappliances/6/virtualmachines/3/storage/volumes";
 type="application/vnd.abiquo.iscsivolumes+xml" rel="volumes"/>
-    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>ALLOCATED</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>0</vdrpPort><nodeId>3</nodeId><nodeName>node-name</nodeName><x>0</x><y>0</y></virtualmachinewithnode>
-</virtualmachineswithnode>
+    
<cpu>1</cpu><hdInBytes>27262976</hdInBytes><highDisponibility>0</highDisponibility><id>3</id><idState>1</idState><idType>1</idType><name>ABQ_914f8125-33d3-4fe3-a162-5d6f5bf32614</name><ram>128</ram><state>ALLOCATED</state><uuid>914f8125-33d3-4fe3-a162-5d6f5bf32614</uuid><vdrpPort>0</vdrpPort><nodeId>3</nodeId><label>node-name</label><x>0</x><y>0</y></virtualMachine>
+</virtualMachines>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/test/compute/fixtures/abiquo/vdcs.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/abiquo/vdcs.xml 
b/libcloud/test/compute/fixtures/abiquo/vdcs.xml
index 726b99e..34fdfff 100644
--- a/libcloud/test/compute/fixtures/abiquo/vdcs.xml
+++ b/libcloud/test/compute/fixtures/abiquo/vdcs.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <virtualDatacenters>
     <virtualDatacenter>
-        <link href="http://10.60.12.7:80/api/admin/datacenters/2"; 
type="application/vnd.abiquo.datacenter+xml" rel="datacenter"/>
+        <link href="http://10.60.12.7:80/api/cloud/locations/2"; 
type="application/vnd.abiquo.datacenter+xml" rel="location"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/privatenetworks/2"; 
type="application/vnd.abiquo.vlan+xml" rel="defaultnetwork"/>
         <link 
href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/action/dhcpinfo"; 
type="text/plain" rel="dhcpinfo"/>
         <link href="http://10.60.12.7:80/api/cloud/virtualdatacenters/4/disks"; 
type="application/vnd.abiquo.harddisks+xml" rel="disks"/>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/9fe6643a/libcloud/test/compute/test_abiquo.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_abiquo.py 
b/libcloud/test/compute/test_abiquo.py
index 2c5cc5c..55c82d4 100644
--- a/libcloud/test/compute/test_abiquo.py
+++ b/libcloud/test/compute/test_abiquo.py
@@ -97,6 +97,13 @@ class AbiquoNodeDriverTest(unittest.TestCase, TestCaseMixin):
         """
         self.assertRaises(LibcloudError, self.driver.create_node)
 
+    def test_list_locations_response(self):
+        if not self.should_list_locations:
+            return None
+
+        locations = self.driver.list_locations()
+        self.assertTrue(isinstance(locations, list))
+
     def test_create_node_specify_location(self):
         """
         Test you can create a node specifying the location.

Reply via email to