From 2009eab057d9cb1f1036dbbaed9ab6ff89aa6799 Mon Sep 17 00:00:00 2001 From: Johnson koil raj Date: Wed, 29 Oct 2014 19:30:54 +0530 Subject: [PATCH] VMware: driver not handling port other than 443 During the image download/upload from a vCenter datastore the driver is failing to connect to vCenter if it configured to listen to any port other than default 443. Closes-Bug: #1387074 Change-Id: Iebfd90bda2b9a3eb20ca146e4cc9ae8e4cf464f3 --- nova/tests/unit/virt/vmwareapi/fake.py | 4 ++-- nova/tests/unit/virt/vmwareapi/test_images.py | 7 ++++--- .../virt/vmwareapi/test_read_write_util.py | 5 ++++- nova/tests/unit/virt/vmwareapi/test_vmops.py | 2 ++ nova/virt/vmwareapi/images.py | 6 ++++-- nova/virt/vmwareapi/read_write_util.py | 18 +++++++++--------- nova/virt/vmwareapi/vmops.py | 3 +++ 7 files changed, 28 insertions(+), 17 deletions(-) diff --git a/nova/tests/unit/virt/vmwareapi/fake.py b/nova/tests/unit/virt/vmwareapi/fake.py index 2ec02c5cd9..1dd550a425 100644 --- a/nova/tests/unit/virt/vmwareapi/fake.py +++ b/nova/tests/unit/virt/vmwareapi/fake.py @@ -1062,8 +1062,8 @@ def fake_upload_image(context, image, instance, **kwargs): pass -def fake_fetch_image(context, instance, host, dc_name, ds_name, file_path, - cookies=None): +def fake_fetch_image(context, instance, host, port, dc_name, ds_name, + file_path, cookies=None): """Fakes the fetch of an image.""" ds_file_path = "[" + ds_name + "] " + file_path _add_file(ds_file_path) diff --git a/nova/tests/unit/virt/vmwareapi/test_images.py b/nova/tests/unit/virt/vmwareapi/test_images.py index c3ffd1ee3c..de72be62c4 100644 --- a/nova/tests/unit/virt/vmwareapi/test_images.py +++ b/nova/tests/unit/virt/vmwareapi/test_images.py @@ -38,6 +38,7 @@ class VMwareImagesTestCase(test.NoDBTestCase): file_path = 'fake_file' ds_name = 'ds1' host = mock.MagicMock() + port = 7443 context = mock.MagicMock() image_data = { @@ -55,7 +56,7 @@ class VMwareImagesTestCase(test.NoDBTestCase): def fake_read_handle(read_iter): return read_file_handle - def fake_write_handle(host, dc_name, ds_name, cookies, + def fake_write_handle(host, port, dc_name, ds_name, cookies, file_path, file_size): return write_file_handle @@ -72,11 +73,11 @@ class VMwareImagesTestCase(test.NoDBTestCase): ) as (glance_read, http_write, start_transfer, image_show, image_download): images.fetch_image(context, instance, - host, dc_name, + host, port, dc_name, ds_name, file_path) glance_read.assert_called_once_with(read_iter) - http_write.assert_called_once_with(host, dc_name, ds_name, None, + http_write.assert_called_once_with(host, port, dc_name, ds_name, None, file_path, image_data['size']) start_transfer.assert_called_once_with( context, read_file_handle, diff --git a/nova/tests/unit/virt/vmwareapi/test_read_write_util.py b/nova/tests/unit/virt/vmwareapi/test_read_write_util.py index 28cd6a95ec..1c5cd641a7 100644 --- a/nova/tests/unit/virt/vmwareapi/test_read_write_util.py +++ b/nova/tests/unit/virt/vmwareapi/test_read_write_util.py @@ -32,6 +32,7 @@ class ReadWriteUtilTestCase(test.NoDBTestCase): httplib.HTTPConnection.endheaders() self.mox.ReplayAll() file = read_write_util.VMwareHTTPWriteFile(ipv6_host, + 443, 'fake_dc', 'fake_ds', dict(), @@ -45,13 +46,15 @@ class ReadWriteUtilTestCase(test.NoDBTestCase): @mock.patch.object(urllib2, 'urlopen') def test_ipv6_host_read(self, mock_open, mock_request): ipv6_host = 'fd8c:215d:178e:c51e:200:c9ff:fed1:584c' + port = 7443 folder = 'tmp/fake.txt' read_write_util.VMwareHTTPReadFile(ipv6_host, + port, 'fake_dc', 'fake_ds', dict(), folder) - base_url = 'https://[%s]/folder/%s' % (ipv6_host, folder) + base_url = 'https://[%s]:%s/folder/%s' % (ipv6_host, port, folder) base_url += '?dsName=fake_ds&dcPath=fake_dc' headers = {'Cookie': '', 'User-Agent': 'OpenStack-ESX-Adapter'} mock_request.assert_called_with(base_url, diff --git a/nova/tests/unit/virt/vmwareapi/test_vmops.py b/nova/tests/unit/virt/vmwareapi/test_vmops.py index 7a54fc11a1..9d810c585c 100644 --- a/nova/tests/unit/virt/vmwareapi/test_vmops.py +++ b/nova/tests/unit/virt/vmwareapi/test_vmops.py @@ -874,6 +874,7 @@ class VMwareVMOpsTestCase(test.NoDBTestCase): self._context, self._instance, self._session._host, + self._session._port, self._dc_info.name, self._ds.name, upload_file_name, @@ -1274,6 +1275,7 @@ class VMwareVMOpsTestCase(test.NoDBTestCase): self._context, vi.instance, self._session._host, + self._session._port, self._dc_info.name, self._ds.name, image_ds_loc.rel_path, diff --git a/nova/virt/vmwareapi/images.py b/nova/virt/vmwareapi/images.py index d9e6a6c095..639ea98388 100644 --- a/nova/virt/vmwareapi/images.py +++ b/nova/virt/vmwareapi/images.py @@ -205,6 +205,7 @@ def upload_iso_to_datastore(iso_path, instance, **kwargs): with open(iso_path, 'r') as iso_file: write_file_handle = read_write_util.VMwareHTTPWriteFile( kwargs.get("host"), + kwargs.get("port"), kwargs.get("data_center_name"), kwargs.get("datastore_name"), kwargs.get("cookies"), @@ -224,7 +225,7 @@ def upload_iso_to_datastore(iso_path, instance, **kwargs): instance=instance) -def fetch_image(context, instance, host, dc_name, ds_name, file_path, +def fetch_image(context, instance, host, port, dc_name, ds_name, file_path, cookies=None): """Download image from the glance image server.""" image_ref = instance['image_ref'] @@ -239,7 +240,7 @@ def fetch_image(context, instance, host, dc_name, ds_name, file_path, read_iter = IMAGE_API.download(context, image_ref) read_file_handle = read_write_util.GlanceFileRead(read_iter) write_file_handle = read_write_util.VMwareHTTPWriteFile( - host, dc_name, ds_name, cookies, file_path, file_size) + host, port, dc_name, ds_name, cookies, file_path, file_size) start_transfer(context, read_file_handle, file_size, write_file_handle=write_file_handle) LOG.debug("Downloaded image file data %(image_ref)s to " @@ -360,6 +361,7 @@ def upload_image(context, image, instance, **kwargs): instance=instance) read_file_handle = read_write_util.VMwareHTTPReadFile( kwargs.get("host"), + kwargs.get("port"), kwargs.get("data_center_name"), kwargs.get("datastore_name"), kwargs.get("cookies"), diff --git a/nova/virt/vmwareapi/read_write_util.py b/nova/virt/vmwareapi/read_write_util.py index 0a6d381f11..876a3e72d4 100644 --- a/nova/virt/vmwareapi/read_write_util.py +++ b/nova/virt/vmwareapi/read_write_util.py @@ -106,22 +106,22 @@ class VMwareHTTPFile(object): """Get size of the file to be read.""" raise NotImplementedError() - def _get_base_url(self, scheme, host, file_path): + def _get_base_url(self, scheme, host, port, file_path): if netutils.is_valid_ipv6(host): - base_url = "%s://[%s]/folder/%s" % (scheme, host, - urllib.pathname2url(file_path)) + base_url = ("%s://[%s]:%s/folder/%s" + % (scheme, host, port, urllib.pathname2url(file_path))) else: - base_url = "%s://%s/folder/%s" % (scheme, host, - urllib.pathname2url(file_path)) + base_url = ("%s://%s:%s/folder/%s" + % (scheme, host, port, urllib.pathname2url(file_path))) return base_url class VMwareHTTPWriteFile(VMwareHTTPFile): """VMware file write handler class.""" - def __init__(self, host, data_center_name, datastore_name, cookies, + def __init__(self, host, port, data_center_name, datastore_name, cookies, file_path, file_size, scheme="https"): - base_url = self._get_base_url(scheme, host, file_path) + base_url = self._get_base_url(scheme, host, port, file_path) param_list = {"dcPath": data_center_name, "dsName": datastore_name} base_url = base_url + "?" + urllib.urlencode(param_list) _urlparse = urlparse.urlparse(base_url) @@ -155,9 +155,9 @@ class VMwareHTTPWriteFile(VMwareHTTPFile): class VMwareHTTPReadFile(VMwareHTTPFile): """VMware file read handler class.""" - def __init__(self, host, data_center_name, datastore_name, cookies, + def __init__(self, host, port, data_center_name, datastore_name, cookies, file_path, scheme="https"): - base_url = self._get_base_url(scheme, host, file_path) + base_url = self._get_base_url(scheme, host, port, file_path) param_list = {"dcPath": data_center_name, "dsName": datastore_name} base_url = base_url + "?" + urllib.urlencode(param_list) headers = {'User-Agent': USER_AGENT, diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index 9d538bc020..25c0232bf9 100644 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -292,6 +292,7 @@ class VMwareVMOps(object): context, vi.instance, session._host, + session._port, vi.dc_info.name, vi.datastore.name, image_ds_loc.rel_path, @@ -631,6 +632,7 @@ class VMwareVMOps(object): images.upload_iso_to_datastore( tmp_file, instance, host=self._session._host, + port=self._session._port, data_center_name=dc_name, datastore_name=data_store_name, cookies=cookies, @@ -797,6 +799,7 @@ class VMwareVMOps(object): adapter_type=adapter_type, image_version=1, host=self._session._host, + port=self._session._port, data_center_name=dc_info.name, datastore_name=datastore_name, cookies=cookies,