diff --git a/cinder/tests/unit/volume/drivers/vmware/test_vmware_vmdk.py b/cinder/tests/unit/volume/drivers/vmware/test_vmware_vmdk.py index 19be00f132b..fed15caf9f8 100644 --- a/cinder/tests/unit/volume/drivers/vmware/test_vmware_vmdk.py +++ b/cinder/tests/unit/volume/drivers/vmware/test_vmware_vmdk.py @@ -1696,6 +1696,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): @mock.patch.object(VMDK_DRIVER, '_validate_params') @mock.patch('re.compile') + @mock.patch.object(VMDK_DRIVER, '_create_session') @mock.patch.object(VMDK_DRIVER, '_get_vc_version') @mock.patch.object(VMDK_DRIVER, '_validate_vcenter_version') @mock.patch('oslo_vmware.pbm.get_pbm_wsdl_location') @@ -1706,9 +1707,12 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): @mock.patch.object(VMDK_DRIVER, 'session') def _test_do_setup( self, session, vops, ds_sel_cls, vops_cls, register_extension, - get_pbm_wsdl_loc, validate_vc_version, get_vc_version, re_compile, - validate_params, enable_pbm=True, ds_regex_pat=None, - invalid_regex=False): + get_pbm_wsdl_loc, validate_vc_version, get_vc_version, + create_session, re_compile, validate_params, enable_pbm=True, + ds_regex_pat=None, invalid_regex=False): + mock_session = mock.Mock() + create_session.return_value = mock_session + if enable_pbm: ver_str = '5.5' pbm_wsdl = mock.sentinel.pbm_wsdl @@ -1740,11 +1744,12 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): self._driver.do_setup(mock.ANY) validate_params.assert_called_once_with() + create_session.assert_called_once_with() get_vc_version.assert_called_once_with() validate_vc_version.assert_called_once_with(ver_str) if enable_pbm: get_pbm_wsdl_loc.assert_called_once_with(ver_str) - self.assertEqual(pbm_wsdl, self._driver.pbm_wsdl) + mock_session.pbm_wsdl_loc_set.assert_called_once_with(pbm_wsdl) self.assertEqual(enable_pbm, self._driver._storage_policy_enabled) register_extension.assert_called_once() vops_cls.assert_called_once_with( @@ -1775,12 +1780,13 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): self._test_do_setup(enable_pbm=False) @mock.patch.object(VMDK_DRIVER, '_validate_params') + @mock.patch.object(VMDK_DRIVER, '_create_session') @mock.patch.object(VMDK_DRIVER, '_get_vc_version') @mock.patch.object(VMDK_DRIVER, '_validate_vcenter_version') @mock.patch('oslo_vmware.pbm.get_pbm_wsdl_location') def test_do_setup_with_invalid_pbm_wsdl( self, get_pbm_wsdl_loc, validate_vc_version, get_vc_version, - validate_params): + create_session, validate_params): ver_str = '5.5' get_vc_version.return_value = ver_str @@ -1791,6 +1797,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): mock.ANY) validate_params.assert_called_once_with() + create_session.assert_called_once_with() get_vc_version.assert_called_once_with() validate_vc_version.assert_called_once_with(ver_str) get_pbm_wsdl_loc.assert_called_once_with(ver_str) @@ -3095,11 +3102,13 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): volumeops.BACKING_UUID_KEY: ''}) @mock.patch('oslo_vmware.api.VMwareAPISession') - def test_session(self, apiSession): - self._driver._session = None + def test_create_session(self, apiSession): + session = mock.sentinel.session + apiSession.return_value = session - self._driver.session() + ret = self._driver._create_session() + self.assertEqual(session, ret) config = self._driver.configuration apiSession.assert_called_once_with( config.vmware_host_ip, @@ -3108,7 +3117,6 @@ class VMwareVcVmdkDriverTestCase(test.TestCase): config.vmware_api_retry_count, config.vmware_task_poll_interval, wsdl_loc=config.safe_get('vmware_wsdl_location'), - pbm_wsdl_loc=None, port=config.vmware_host_port, cacert=config.vmware_ca_file, insecure=config.vmware_insecure, diff --git a/cinder/volume/drivers/vmware/vmdk.py b/cinder/volume/drivers/vmware/vmdk.py index 1b4761726d8..6947d0b6049 100644 --- a/cinder/volume/drivers/vmware/vmdk.py +++ b/cinder/volume/drivers/vmware/vmdk.py @@ -291,19 +291,10 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): @property def volumeops(self): - if not self._volumeops: - max_objects = self.configuration.vmware_max_objects_retrieval - self._volumeops = volumeops.VMwareVolumeOps(self.session, - max_objects) return self._volumeops @property def ds_sel(self): - if not self._ds_sel: - max_objects = self.configuration.vmware_max_objects_retrieval - self._ds_sel = hub.DatastoreSelector(self.volumeops, - self.session, - max_objects) return self._ds_sel def _validate_params(self): @@ -1761,30 +1752,32 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): @property 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 - task_poll_interval = self.configuration.vmware_task_poll_interval - wsdl_loc = self.configuration.safe_get('vmware_wsdl_location') - pbm_wsdl = self.pbm_wsdl if hasattr(self, 'pbm_wsdl') else None - ca_file = self.configuration.vmware_ca_file - insecure = self.configuration.vmware_insecure - pool_size = self.configuration.vmware_connection_pool_size - self._session = api.VMwareAPISession(ip, username, - password, api_retry_count, - task_poll_interval, - wsdl_loc=wsdl_loc, - pbm_wsdl_loc=pbm_wsdl, - port=port, - cacert=ca_file, - insecure=insecure, - pool_size=pool_size, - op_id_prefix='c-vol') return self._session + def _create_session(self): + 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 + task_poll_interval = self.configuration.vmware_task_poll_interval + wsdl_loc = self.configuration.safe_get('vmware_wsdl_location') + ca_file = self.configuration.vmware_ca_file + insecure = self.configuration.vmware_insecure + pool_size = self.configuration.vmware_connection_pool_size + session = api.VMwareAPISession(ip, + username, + password, + api_retry_count, + task_poll_interval, + wsdl_loc=wsdl_loc, + port=port, + cacert=ca_file, + insecure=insecure, + pool_size=pool_size, + op_id_prefix='c-vol') + return session + def _get_vc_version(self): """Connect to vCenter server and fetch version. @@ -1846,6 +1839,8 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): raise exception.InvalidInput(reason=_( "Invalid regular expression: %s.") % regex_pattern) + self._session = self._create_session() + # Validate vCenter version. self._vc_version = self._get_vc_version() self._validate_vcenter_version(self._vc_version) @@ -1855,19 +1850,16 @@ class VMwareVcVmdkDriver(driver.VolumeDriver): versionutils.is_compatible(self.PBM_ENABLED_VC_VERSION, self._vc_version, same_major=False)): - self.pbm_wsdl = pbm.get_pbm_wsdl_location(self._vc_version) - if not self.pbm_wsdl: + pbm_wsdl_loc = pbm.get_pbm_wsdl_location(self._vc_version) + if not pbm_wsdl_loc: LOG.error("Not able to configure PBM for vCenter server: %s", self._vc_version) raise exceptions.VMwareDriverException() self._storage_policy_enabled = True - # Destroy current session so that it is recreated with pbm enabled - self._session = None + self._session.pbm_wsdl_loc_set(pbm_wsdl_loc) self._register_extension() - # recreate session and initialize volumeops and ds_sel - # TODO(vbala) remove properties: session, volumeops and ds_sel max_objects = self.configuration.vmware_max_objects_retrieval self._volumeops = volumeops.VMwareVolumeOps( self.session, max_objects, EXTENSION_KEY, EXTENSION_TYPE)