From bb2a0326b55d8cac5cd5132ec5391d551b796e1f Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Thu, 8 May 2014 16:33:06 -0700 Subject: [PATCH] Big Switch: Check source_address attribute exists Check that the source_address attribute exists on HTTPSConnection objects before referencing it since it's not present on python 2.6 deployments. If it does not exist, create a socket connection without specifying the source. Closes-Bug: #1316382 Conflicts: neutron/tests/unit/bigswitch/test_servermanager.py Change-Id: Ica10d23cc6de81ae56f711937f208c7321c77f36 (cherry picked from commit f5e4cf8e3edd1ce0ebb8c0c7256be07d094896de) --- neutron/plugins/bigswitch/servermanager.py | 9 +++++++-- .../tests/unit/bigswitch/test_servermanager.py | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/neutron/plugins/bigswitch/servermanager.py b/neutron/plugins/bigswitch/servermanager.py index 8792290af..2ab629797 100644 --- a/neutron/plugins/bigswitch/servermanager.py +++ b/neutron/plugins/bigswitch/servermanager.py @@ -566,8 +566,13 @@ class HTTPSConnectionWithValidation(httplib.HTTPSConnection): combined_cert = None def connect(self): - sock = socket.create_connection((self.host, self.port), - self.timeout, self.source_address) + try: + sock = socket.create_connection((self.host, self.port), + self.timeout, self.source_address) + except AttributeError: + # python 2.6 doesn't have the source_address attribute + sock = socket.create_connection((self.host, self.port), + self.timeout) if self._tunnel_host: self.sock = sock self._tunnel() diff --git a/neutron/tests/unit/bigswitch/test_servermanager.py b/neutron/tests/unit/bigswitch/test_servermanager.py index ddc863dd1..69f0b4a19 100644 --- a/neutron/tests/unit/bigswitch/test_servermanager.py +++ b/neutron/tests/unit/bigswitch/test_servermanager.py @@ -22,6 +22,7 @@ import mock from oslo.config import cfg from neutron.manager import NeutronManager +from neutron.openstack.common import importutils from neutron.plugins.bigswitch import servermanager from neutron.tests.unit.bigswitch import test_restproxy_plugin as test_rp @@ -147,3 +148,20 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase): conmock.return_value.request.side_effect = socket.timeout() resp = sp.servers[0].rest_call('GET', '/') self.assertEqual(resp, (0, None, None, None)) + + +class TestSockets(test_rp.BigSwitchProxyPluginV2TestCase): + + def setUp(self): + super(TestSockets, self).setUp() + # http patch must not be running or it will mangle the servermanager + # import where the https connection classes are defined + self.httpPatch.stop() + self.sm = importutils.import_module(SERVERMANAGER) + + def test_socket_create_attempt(self): + # exercise the socket creation to make sure it works on both python + # versions + con = self.sm.HTTPSConnectionWithValidation('127.0.0.1', 0, timeout=1) + # if httpcon was created, a connect attempt should raise a socket error + self.assertRaises(socket.error, con.connect) -- 2.45.2