From 55b442ce192e93a26d12064645aa95fd3661babb Mon Sep 17 00:00:00 2001 From: Vipin Balachandran Date: Thu, 14 Jan 2016 00:05:28 -0800 Subject: [PATCH] VMware: Support for non-default port Currently the VMDK driver fails to connect to vCenter server if vCenter is configured to listen to any port other than the default port 443. This patch fixes it by adding support for a new config option 'vmware_host_port' which specifies the port number to connect to vCenter server. DocImpact Added config option 'vmware_host_port' which specifies the port number to connect to vCenter server. Change-Id: I71846cdc09bc1ff2a7e35d45aa7c639c468f1418 Co-Authored-By: Johnson koil raj Closes-Bug: #1387074 --- cinder/tests/unit/test_vmware_vmdk.py | 32 +++++++++++++------ cinder/volume/drivers/vmware/vmdk.py | 23 +++++++++---- .../vmware-vmdk-config-eb70892e4ccf8f3c.yaml | 4 +++ 3 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 releasenotes/notes/vmware-vmdk-config-eb70892e4ccf8f3c.yaml diff --git a/cinder/tests/unit/test_vmware_vmdk.py b/cinder/tests/unit/test_vmware_vmdk.py index 363a32fda..c1e760f98 100644 --- a/cinder/tests/unit/test_vmware_vmdk.py +++ b/cinder/tests/unit/test_vmware_vmdk.py @@ -54,7 +54,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): """Unit tests for VMwareVcVmdkDriver.""" IP = 'localhost' - PORT = 443 + PORT = 2321 USERNAME = 'username' PASSWORD = 'password' VOLUME_FOLDER = 'cinder-volumes' @@ -84,6 +84,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): self._config = mock.Mock(spec=configuration.Configuration) self._config.vmware_host_ip = self.IP + self._config.vmware_host_port = self.PORT self._config.vmware_host_username = self.USERNAME self._config.vmware_host_password = self.PASSWORD self._config.vmware_wsdl_location = None @@ -790,7 +791,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): image_id, session=session, host=self._config.vmware_host_ip, - port=443, + port=self._config.vmware_host_port, resource_pool=rp, vm_folder=folder, vm_import_spec=import_spec, @@ -849,7 +850,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): volume['project_id'], session=session, host=self._config.vmware_host_ip, - port=443, + port=self._config.vmware_host_port, vm=backing, vmdk_file_path=vmdk_file_path, vmdk_size=volume['size'] * units.Gi, @@ -1362,9 +1363,11 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): extra_config=extra_config) file_open.assert_called_once_with(tmp_file_path, "rb") download_data.assert_called_once_with( - context, self.IMG_TX_TIMEOUT, tmp_file, session=session, - host=self.IP, port=self.PORT, resource_pool=rp, vm_folder=folder, - vm_import_spec=import_spec, image_size=file_size_bytes) + context, self._config.vmware_image_transfer_timeout_secs, tmp_file, + session=session, host=self._config.vmware_host_ip, + port=self._config.vmware_host_port, resource_pool=rp, + vm_folder=folder, vm_import_spec=import_spec, + image_size=file_size_bytes) download_data.side_effect = exceptions.VimException("error") backing = mock.sentinel.backing @@ -2028,10 +2031,18 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): vops.get_entity_name.assert_called_once_with(dc_ref) cookies = session.vim.client.options.transport.cookiejar download_flat_image.assert_called_once_with( - context, self.IMG_TX_TIMEOUT, image_service, image_id, - image_size=image_size_in_bytes, host=self.IP, port=self.PORT, - data_center_name=dc_name, datastore_name=ds_name, cookies=cookies, - file_path=upload_file_path, cacerts=expected_cacerts) + context, + self._config.vmware_image_transfer_timeout_secs, + image_service, + image_id, + image_size=image_size_in_bytes, + host=self._config.vmware_host_ip, + port=self._config.vmware_host_port, + data_center_name=dc_name, + datastore_name=ds_name, + cookies=cookies, + file_path=upload_file_path, + cacerts=expected_cacerts) @mock.patch.object(VMDK_DRIVER, 'volumeops') @mock.patch.object(VMDK_DRIVER, 'session') @@ -2481,6 +2492,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): self._config.vmware_task_poll_interval, wsdl_loc=self._config.safe_get('vmware_wsdl_location'), pbm_wsdl_loc=None, + port=self._config.vmware_host_port, cacert=self._config.vmware_ca_file, insecure=self._config.vmware_insecure) diff --git a/cinder/volume/drivers/vmware/vmdk.py b/cinder/volume/drivers/vmware/vmdk.py index 98f57050a..44ae339b8 100644 --- a/cinder/volume/drivers/vmware/vmdk.py +++ b/cinder/volume/drivers/vmware/vmdk.py @@ -67,6 +67,9 @@ EXTRA_CONFIG_VOLUME_ID_KEY = "cinder.volume.id" vmdk_opts = [ cfg.StrOpt('vmware_host_ip', help='IP address for connecting to VMware vCenter server.'), + cfg.PortOpt('vmware_host_port', + default=443, + help='Port number for connecting to VMware vCenter server.'), cfg.StrOpt('vmware_host_username', help='Username for authenticating with VMware vCenter ' 'server.'), @@ -255,7 +258,8 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): 'vmware_host_password'] for param in required_params: if not getattr(self.configuration, param, None): - raise exception.InvalidInput(_("%s not set.") % param) + reason = _("%s not set.") % param + raise exception.InvalidInput(reason=reason) def check_for_setup_error(self): pass @@ -665,6 +669,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): timeout = self.configuration.vmware_image_transfer_timeout_secs host_ip = self.configuration.vmware_host_ip + port = self.configuration.vmware_host_port ca_file = self.configuration.vmware_ca_file insecure = self.configuration.vmware_insecure cookies = self.session.vim.client.options.transport.cookiejar @@ -687,7 +692,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): image_id, image_size=image_size_in_bytes, host=host_ip, - port=443, + port=port, data_center_name=dc_name, datastore_name=ds_name, cookies=cookies, @@ -1016,6 +1021,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): # fetching image from glance will also create the backing timeout = self.configuration.vmware_image_transfer_timeout_secs host_ip = self.configuration.vmware_host_ip + port = self.configuration.vmware_host_port LOG.debug("Fetching glance image: %(id)s to server: %(host)s.", {'id': image_id, 'host': host_ip}) backing = image_transfer.download_stream_optimized_image( @@ -1025,7 +1031,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): image_id, session=self.session, host=host_ip, - port=443, + port=port, resource_pool=rp, vm_folder=folder, vm_import_spec=vm_import_spec, @@ -1169,6 +1175,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): # Upload image from vmdk timeout = self.configuration.vmware_image_transfer_timeout_secs host_ip = self.configuration.vmware_host_ip + port = self.configuration.vmware_host_port image_transfer.upload_image(context, timeout, @@ -1177,7 +1184,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): volume['project_id'], session=self.session, host=host_ip, - port=443, + port=port, vm=backing, vmdk_file_path=vmdk_file_path, vmdk_size=volume['size'] * units.Gi, @@ -1432,6 +1439,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): """Download virtual disk in streamOptimized format.""" timeout = self.configuration.vmware_image_transfer_timeout_secs host_ip = self.configuration.vmware_host_ip + port = self.configuration.vmware_host_port vmdk_ds_file_path = self.volumeops.get_vmdk_path(backing) with open(tmp_file_path, "wb") as tmp_file: @@ -1441,7 +1449,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): tmp_file, session=self.session, host=host_ip, - port=443, + port=port, vm=backing, vmdk_file_path=vmdk_ds_file_path, vmdk_size=volume['size'] * units.Gi) @@ -1506,6 +1514,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): timeout = self.configuration.vmware_image_transfer_timeout_secs host_ip = self.configuration.vmware_host_ip + port = self.configuration.vmware_host_port try: with open(tmp_file_path, "rb") as tmp_file: vm_ref = image_transfer.download_stream_optimized_data( @@ -1514,7 +1523,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): tmp_file, session=self.session, host=host_ip, - port=443, + port=port, resource_pool=rp, vm_folder=folder, vm_import_spec=vm_import_spec, @@ -1740,6 +1749,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): def session(self): if not self._session: ip = self.configuration.vmware_host_ip + port = self.configuration.vmware_host_port username = self.configuration.vmware_host_username password = self.configuration.vmware_host_password api_retry_count = self.configuration.vmware_api_retry_count @@ -1753,6 +1763,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): task_poll_interval, wsdl_loc=wsdl_loc, pbm_wsdl_loc=pbm_wsdl, + port=port, cacert=ca_file, insecure=insecure) return self._session diff --git a/releasenotes/notes/vmware-vmdk-config-eb70892e4ccf8f3c.yaml b/releasenotes/notes/vmware-vmdk-config-eb70892e4ccf8f3c.yaml new file mode 100644 index 000000000..49e3a5767 --- /dev/null +++ b/releasenotes/notes/vmware-vmdk-config-eb70892e4ccf8f3c.yaml @@ -0,0 +1,4 @@ +--- +upgrade: + - The VMware VMDK driver supports a new config option 'vmware_host_port' + to specify the port number to connect to vCenter server. \ No newline at end of file