diff --git a/oslo_vmware/rw_handles.py b/oslo_vmware/rw_handles.py index e0dfc7c940069d5b26ebebf33cd6fc36bee1cbc8..e3769ecd467d9376084b5c7f78e014dd0b88b093 100644 --- a/oslo_vmware/rw_handles.py +++ b/oslo_vmware/rw_handles.py @@ -492,7 +492,7 @@ class VmdkWriteHandle(VmdkHandle): url, thumbprint = self._find_vmdk_url(lease_info, host, port) self._vm_ref = lease_info.entity - cookies = session.vim.client.options.transport.cookiejar + cookies = session.vim.client.cookiejar # Create HTTP connection to write to VMDK URL if http_method == 'PUT': overwrite = 't' @@ -600,7 +600,7 @@ class VmdkReadHandle(VmdkHandle): # find URL of the VMDK file to be read and open connection url, thumbprint = self._find_vmdk_url(lease_info, host, port) - cookies = session.vim.client.options.transport.cookiejar + cookies = session.vim.client.cookiejar self._conn = self._create_read_connection(url, cookies=cookies, ssl_thumbprint=thumbprint) diff --git a/oslo_vmware/service.py b/oslo_vmware/service.py index 09702f43e525852d8e8bba87369f1fdf4854c39f..89ed2219a1a3cdca3d408488c97ae06bb1567bf2 100644 --- a/oslo_vmware/service.py +++ b/oslo_vmware/service.py @@ -209,6 +209,25 @@ class MemoryCache(cache.ObjectCache): _CACHE = MemoryCache() +class CompatibilitySudsClient(client.Client): + """suds client with added cookiejar attribute + + The cookiejar properties allow reading/setting the cookiejar used by the + underlying transport. + """ + def __init__(self, *args, **kwargs): + super(CompatibilitySudsClient, self).__init__(*args, **kwargs) + + @property + def cookiejar(self): + return self.options.transport.cookiejar + + @cookiejar.setter + def cookiejar(self, cookies): + self.options.transport.session.cookies = cookies + self.options.transport.cookiejar = cookies + + class Service(object): """Base class containing common functionality for invoking vSphere services @@ -226,11 +245,11 @@ class Service(object): insecure=insecure, pool_maxsize=pool_maxsize, connection_timeout=connection_timeout) - self.client = client.Client(self.wsdl_url, - transport=transport, - location=self.soap_url, - plugins=[ServiceMessagePlugin()], - cache=_CACHE) + self.client = CompatibilitySudsClient(self.wsdl_url, + transport=transport, + location=self.soap_url, + plugins=[ServiceMessagePlugin()], + cache=_CACHE) self._service_content = None self._vc_session_cookie = None @@ -312,7 +331,7 @@ class Service(object): def get_http_cookie(self): """Return the vCenter session cookie.""" - cookies = self.client.options.transport.cookiejar + cookies = self.client.cookiejar for cookie in cookies: if cookie.name.lower() == 'vmware_soap_session': return cookie.value diff --git a/oslo_vmware/tests/test_rw_handles.py b/oslo_vmware/tests/test_rw_handles.py index d6ef43dbe73b07b0489115d9697abbe712c0f163..6f7d4c104f8bd3f69d3c3e5740495262655dbe9d 100644 --- a/oslo_vmware/tests/test_rw_handles.py +++ b/oslo_vmware/tests/test_rw_handles.py @@ -217,7 +217,7 @@ class VmdkWriteHandleTest(base.TestCase): vim_cookie = mock.Mock() vim_cookie.name = 'name' vim_cookie.value = 'value' - session.vim.client.options.transport.cookiejar = [vim_cookie] + session.vim.client.cookiejar = [vim_cookie] return session def test_init_failure(self): @@ -344,7 +344,7 @@ class VmdkReadHandleTest(base.TestCase): vim_cookie = mock.Mock() vim_cookie.name = 'name' vim_cookie.value = 'value' - session.vim.client.options.transport.cookiejar = [vim_cookie] + session.vim.client.cookiejar = [vim_cookie] return session def test_init_failure(self): diff --git a/oslo_vmware/tests/test_service.py b/oslo_vmware/tests/test_service.py index 8fc99458f78c8a3afcccb42dfa569b511ba1672c..b03c3ffd64fc9b856d78b51864b7d1a57d19e6b2 100644 --- a/oslo_vmware/tests/test_service.py +++ b/oslo_vmware/tests/test_service.py @@ -60,7 +60,7 @@ class ServiceTest(base.TestCase): def setUp(self): super(ServiceTest, self).setUp() - patcher = mock.patch('suds.client.Client') + patcher = mock.patch('oslo_vmware.service.CompatibilitySudsClient') self.addCleanup(patcher.stop) self.SudsClientMock = patcher.start() @@ -377,7 +377,7 @@ class ServiceTest(base.TestCase): cookie = mock.Mock() cookie.name = 'vmware_soap_session' cookie.value = cookie_value - svc_obj.client.options.transport.cookiejar = [cookie] + svc_obj.client.cookiejar = [cookie] self.assertEqual(cookie_value, svc_obj.get_http_cookie()) def test_get_session_cookie_with_no_cookie(self): @@ -385,7 +385,7 @@ class ServiceTest(base.TestCase): cookie = mock.Mock() cookie.name = 'cookie' cookie.value = 'xyz' - svc_obj.client.options.transport.cookiejar = [cookie] + svc_obj.client.cookiejar = [cookie] self.assertIsNone(svc_obj.get_http_cookie()) def test_set_soap_headers(self): diff --git a/oslo_vmware/tests/test_vim.py b/oslo_vmware/tests/test_vim.py index 0887a05a8e56457e8df34af657887efba5e68c9b..ca0fb9e67126fe2e936424abcde59e26f685462e 100644 --- a/oslo_vmware/tests/test_vim.py +++ b/oslo_vmware/tests/test_vim.py @@ -31,7 +31,7 @@ class VimTest(base.TestCase): def setUp(self): super(VimTest, self).setUp() - patcher = mock.patch('suds.client.Client') + patcher = mock.patch('oslo_vmware.service.CompatibilitySudsClient') self.addCleanup(patcher.stop) self.SudsClientMock = patcher.start() self.useFixture(i18n_fixture.ToggleLazy(True)) diff --git a/releasenotes/notes/bp-oslo-vmware-soap-library-switch-cookiejar-access-d7efcc23d0eaee98.yaml b/releasenotes/notes/bp-oslo-vmware-soap-library-switch-cookiejar-access-d7efcc23d0eaee98.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3927e83204ca7650709170fcfeaf4d328af84862 --- /dev/null +++ b/releasenotes/notes/bp-oslo-vmware-soap-library-switch-cookiejar-access-d7efcc23d0eaee98.yaml @@ -0,0 +1,8 @@ +--- +upgrade: + - Code accessing the ``cookiejar`` must use ``session.client.cookiejar`` + instead of the previous ``session.client.options.transport.cookiejar``, + because with `this spec + `_ + we switch the backing SOAP library and different libraries have different + locations for their transport and cookiejar objects.