]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Big Switch: Check source_address attribute exists
authorKevin Benton <blak111@gmail.com>
Thu, 8 May 2014 23:33:06 +0000 (16:33 -0700)
committerKevin Benton <blak111@gmail.com>
Thu, 8 May 2014 23:34:23 +0000 (16:34 -0700)
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
Change-Id: Ica10d23cc6de81ae56f711937f208c7321c77f36

neutron/plugins/bigswitch/servermanager.py
neutron/tests/unit/bigswitch/test_servermanager.py

index 8792290af6cf8582184f805031a8fe634e6cfe63..2ab629797e4cb3fbd73925a7e95e620d72d363f2 100644 (file)
@@ -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()
index 47db82ec67e9dd0ad3f458a1d80b00c0f794a9dc..914a8874431d0fd73acd603926019fe8dd4cbedb 100644 (file)
@@ -402,3 +402,20 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase):
         self.assertEqual(con._tunnel_host, 'myproxy.local')
         self.assertEqual(con._tunnel_port, 3128)
         self.assertEqual(con.sock, self.wrap_mock())
+
+
+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)