Author: tomaz
Date: Thu Jul 12 06:46:08 2012
New Revision: 1360543
URL: http://svn.apache.org/viewvc?rev=1360543&view=rev
Log:
Fix a bug with dobule quotes URLs in the vCloud driver. Contributed by Michal
Galet, part of LIBCLOUD-222.
Modified:
libcloud/trunk/CHANGES
libcloud/trunk/libcloud/compute/drivers/vcloud.py
libcloud/trunk/libcloud/test/compute/test_vcloud.py
Modified: libcloud/trunk/CHANGES
URL:
http://svn.apache.org/viewvc/libcloud/trunk/CHANGES?rev=1360543&r1=1360542&r2=1360543&view=diff
==============================================================================
--- libcloud/trunk/CHANGES (original)
+++ libcloud/trunk/CHANGES Thu Jul 12 06:46:08 2012
@@ -73,6 +73,9 @@ Changes with Apache Libcloud in developm
- Add 'auth_user_variable' to the OpenStackAuthConnection class.
[Mark Everett]
+ - Fix a bug with double quoted URLs in the vCloud driver. ; LIBCLOUD-22
+ [Michal Galet]
+
*) DNS
- Add support for GEO RecordType to Zerigo driver. ; LIBCLOUD-203
Modified: libcloud/trunk/libcloud/compute/drivers/vcloud.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/vcloud.py?rev=1360543&r1=1360542&r2=1360543&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/vcloud.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/vcloud.py Thu Jul 12 06:46:08 2012
@@ -360,7 +360,7 @@ class VCloudNodeDriver(NodeDriver):
def networks(self):
networks = []
for vdc in self.vdcs:
- res = self.connection.request(vdc.id).object
+ res = self.connection.request(get_url_path(vdc.id)).object
networks.extend(
[network
for network in res.findall(
@@ -412,7 +412,7 @@ class VCloudNodeDriver(NodeDriver):
def _get_catalog_hrefs(self):
res = self.connection.request(self.org)
catalogs = [
- get_url_path(i.get('href'))
+ i.get('href')
for i in res.object.findall(fixxpath(res.object, "Link"))
if i.get('type') == 'application/vnd.vmware.vcloud.catalog+xml'
]
@@ -422,7 +422,7 @@ class VCloudNodeDriver(NodeDriver):
def _wait_for_task_completion(self, task_href,
timeout=DEFAULT_TASK_COMPLETION_TIMEOUT):
start_time = time.time()
- res = self.connection.request(task_href)
+ res = self.connection.request(get_url_path(task_href))
status = res.object.get('status')
while status != 'success':
if status == 'error':
@@ -440,7 +440,7 @@ class VCloudNodeDriver(NodeDriver):
raise Exception("Timeout while waiting for task %s."
% task_href)
time.sleep(5)
- res = self.connection.request(task_href)
+ res = self.connection.request(get_url_path(task_href))
status = res.object.get('status')
def destroy_node(self, node):
@@ -479,12 +479,12 @@ class VCloudNodeDriver(NodeDriver):
def list_nodes(self):
nodes = []
for vdc in self.vdcs:
- res = self.connection.request(vdc.id)
+ res = self.connection.request(get_url_path(vdc.id))
elms = res.object.findall(fixxpath(
res.object, "ResourceEntities/ResourceEntity")
)
vapps = [
- (i.get('name'), get_url_path(i.get('href')))
+ (i.get('name'), i.get('href'))
for i in elms
if i.get('type')
== 'application/vnd.vmware.vcloud.vApp+xml'
@@ -494,7 +494,7 @@ class VCloudNodeDriver(NodeDriver):
for vapp_name, vapp_href in vapps:
try:
res = self.connection.request(
- vapp_href,
+ get_url_path(vapp_href),
headers={'Content-Type':
'application/vnd.vmware.vcloud.vApp+xml'}
)
nodes.append(self._to_node(res.object))
@@ -527,7 +527,7 @@ class VCloudNodeDriver(NodeDriver):
def _get_catalogitems_hrefs(self, catalog):
"""Given a catalog href returns contained catalog item hrefs"""
res = self.connection.request(
- catalog,
+ get_url_path(catalog),
headers={
'Content-Type':
'application/vnd.vmware.vcloud.catalog+xml'
@@ -545,7 +545,7 @@ class VCloudNodeDriver(NodeDriver):
def _get_catalogitem(self, catalog_item):
"""Given a catalog item href returns elementree"""
res = self.connection.request(
- catalog_item,
+ get_url_path(catalog_item),
headers={
'Content-Type':
'application/vnd.vmware.vcloud.catalogItem+xml'
@@ -557,7 +557,7 @@ class VCloudNodeDriver(NodeDriver):
def list_images(self, location=None):
images = []
for vdc in self.vdcs:
- res = self.connection.request(vdc.id).object
+ res = self.connection.request(get_url_path(vdc.id)).object
res_ents = res.findall(fixxpath(
res, "ResourceEntities/ResourceEntity")
)
@@ -651,7 +651,7 @@ class VCloudNodeDriver(NodeDriver):
vdc = self._get_vdc(kwargs.get('ex_vdc', None))
# Instantiate VM and get identifier.
res = self.connection.request(
- '%s/action/instantiateVAppTemplate' % vdc.id,
+ '%s/action/instantiateVAppTemplate' % get_url_path(vdc.id),
data=instantiate_xml.tostring(),
method='POST',
headers={
@@ -659,19 +659,19 @@ class VCloudNodeDriver(NodeDriver):
'application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml'
}
)
- vapp_href = get_url_path(res.object.get('href'))
+ vapp_path = get_url_path(res.object.get('href'))
# Deploy the VM from the identifier.
- res = self.connection.request('%s/action/deploy' % vapp_href,
+ res = self.connection.request('%s/action/deploy' % vapp_path,
method='POST')
self._wait_for_task_completion(res.object.get('href'))
# Power on the VM.
- res = self.connection.request('%s/power/action/powerOn' % vapp_href,
+ res = self.connection.request('%s/power/action/powerOn' % vapp_path,
method='POST')
- res = self.connection.request(vapp_href)
+ res = self.connection.request(vapp_path)
node = self._to_node(res.object)
return node
@@ -859,11 +859,11 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
if not getattr(vdcs, '__iter__', False):
vdcs = [vdcs]
for vdc in vdcs:
- res = self.connection.request(vdc.id)
+ res = self.connection.request(get_url_path(vdc.id))
entity_elems = res.object.findall(fixxpath(res.object,
"ResourceEntities/ResourceEntity"))
for entity_elem in entity_elems:
if entity_elem.get('type') ==
'application/vnd.vmware.vcloud.vApp+xml' and entity_elem.get('name') ==
node_name:
- res = self.connection.request(entity_elem.get('href'),
+ res =
self.connection.request(get_url_path(entity_elem.get('href')),
headers={'Content-Type':
'application/vnd.vmware.vcloud.vApp+xml'})
return self._to_node(res.object)
return None
@@ -1015,7 +1015,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
# Some providers don't require a network link
if ex_network:
network_href = self._get_network_href(ex_network)
- network_elem = self.connection.request(network_href).object
+ network_elem =
self.connection.request(get_url_path(network_href)).object
else:
network_elem = None
@@ -1039,7 +1039,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
retry = 3
while True:
try:
- res = self.connection.request('%s/power/action/powerOn' %
vapp_href,
+ res = self.connection.request('%s/power/action/powerOn' %
get_url_path(vapp_href),
method='POST')
self._wait_for_task_completion(res.object.get('href'))
break
@@ -1049,7 +1049,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
retry -= 1
time.sleep(10)
- res = self.connection.request(vapp_href)
+ res = self.connection.request(get_url_path(vapp_href))
node = self._to_node(res.object)
return node
@@ -1064,7 +1064,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
# Instantiate VM and get identifier.
res = self.connection.request(
- '%s/action/instantiateVAppTemplate' % vdc.id,
+ '%s/action/instantiateVAppTemplate' % get_url_path(vdc.id),
data=instantiate_xml.tostring(),
method='POST',
headers={
@@ -1073,7 +1073,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
}
)
vapp_name = res.object.get('name')
- vapp_href = get_url_path(res.object.get('href'))
+ vapp_href = res.object.get('href')
task_href = res.object.find(fixxpath(res.object,
"Tasks/Task")).get('href')
self._wait_for_task_completion(task_href)
@@ -1090,7 +1090,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
ET.SubElement(clone_xml, 'Source', {'href': sourceNode.id})
res = self.connection.request(
- '%s/action/cloneVApp' % vdc.id,
+ '%s/action/cloneVApp' % get_url_path(vdc.id),
data=ET.tostring(clone_xml),
method='POST',
headers={
@@ -1099,12 +1099,12 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
}
)
vapp_name = res.object.get('name')
- vapp_href = get_url_path(res.object.get('href'))
+ vapp_href = res.object.get('href')
task_href = res.object.find(fixxpath(res.object,
"Tasks/Task")).get('href')
self._wait_for_task_completion(task_href)
- res = self.connection.request(vapp_href)
+ res = self.connection.request(get_url_path(vapp_href))
vms = res.object.findall(fixxpath(res.object, "Children/Vm"))
@@ -1340,7 +1340,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
vms = self._get_vm_elements(vapp_or_vm_id)
for vm in vms:
# Get virtualHardwareSection/disks section
- res = self.connection.request('%s/virtualHardwareSection/disks' %
vm.get('href'))
+ res = self.connection.request('%s/virtualHardwareSection/disks' %
get_url_path(vm.get('href')))
existing_ids = []
new_disk = None
@@ -1361,7 +1361,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
new_disk.find('%sHostResource' % rasd_ns).set(fixxpath(new_disk,
'capacity'), str(int(vm_disk) * 1024))
res.object.append(new_disk)
- res = self.connection.request('%s/virtualHardwareSection/disks' %
vm.get('href'),
+ res = self.connection.request('%s/virtualHardwareSection/disks' %
get_url_path(vm.get('href')),
data=ET.tostring(res.object),
method='PUT',
headers={'Content-Type':
'application/vnd.vmware.vcloud.rasditemslist+xml'}
@@ -1448,7 +1448,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDr
return network_href
def _get_vm_elements(self, vapp_or_vm_id):
- res = self.connection.request(vapp_or_vm_id)
+ res = self.connection.request(get_url_path(vapp_or_vm_id))
if res.object.tag.endswith('VApp'):
vms = res.object.findall(fixxpath(res.object, 'Children/Vm'))
elif res.object.tag.endswith('Vm'):
Modified: libcloud/trunk/libcloud/test/compute/test_vcloud.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/test/compute/test_vcloud.py?rev=1360543&r1=1360542&r2=1360543&view=diff
==============================================================================
--- libcloud/trunk/libcloud/test/compute/test_vcloud.py (original)
+++ libcloud/trunk/libcloud/test/compute/test_vcloud.py Thu Jul 12 06:46:08 2012
@@ -284,6 +284,12 @@ class VCloud_1_5_MockHttp(MockHttp):
fixtures = ComputeFileFixtures('vcloud_1_5')
+ def request(self, method, url, body=None, headers=None, raw=False):
+ assert url.startswith('/api/'), '"{0}" is invalid. Needs to start with
"/api". ' \
+ 'The passed URL should be just the path, not full URL.'.format(url)
+ super(VCloud_1_5_MockHttp, self).request(method, url, body, headers,
+ raw)
+
def _api_sessions(self, method, url, body, headers):
headers['x-vcloud-authorization'] = 'testtoken'
body = self.fixtures.load('api_sessions.xml')