]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Be smarter when figuring out broadcast address
authorAnte Karamatic <ante.karamatic@canonical.com>
Mon, 4 Feb 2013 13:02:25 +0000 (14:02 +0100)
committerAnte Karamatic <ante.karamatic@canonical.com>
Tue, 5 Feb 2013 15:29:00 +0000 (16:29 +0100)
In most cases, broadcast is set when IP is set, but sometimes
it can be ommitted. In those cases we should figure it out based
on CIDR, and not assume it.

Change-Id: Ia8c07898ddf0eb19f5d552a304d8f38915fc3560
Fixes: bug #1090621
quantum/agent/linux/ip_lib.py
quantum/tests/unit/test_linux_ip_lib.py

index 78157d39eecd364fe566d1b4a28a87d3cabfac69..4065b44fffd5054ec70719ab3012f982ff2e8593 100644 (file)
@@ -14,6 +14,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import netaddr
+
 from quantum.agent.linux import utils
 from quantum.common import exceptions
 
@@ -273,8 +275,15 @@ class IpAddrCommand(IpDeviceCommandBase):
                 broadcast = '::'
             else:
                 version = 4
-                broadcast = parts[3]
-                scope = parts[5]
+                if parts[2] == 'brd':
+                    broadcast = parts[3]
+                    scope = parts[5]
+                else:
+                    # sometimes output of 'ip a' might look like:
+                    # inet 192.168.100.100/24 scope global eth0
+                    # and broadcast needs to be calculated from CIDR
+                    broadcast = str(netaddr.IPNetwork(parts[1]).broadcast)
+                    scope = parts[3]
 
             retval.append(dict(cidr=parts[1],
                                broadcast=broadcast,
index 5b6710f07d61410f5d02644de9afbeb7c9fded4c..d622e808699550e5e0d3cbc3cdcbfb4204f73f1e 100644 (file)
@@ -54,6 +54,24 @@ ADDR_SAMPLE = ("""
        valid_lft forever preferred_lft forever
 """)
 
+ADDR_SAMPLE2 = ("""
+2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
+    link/ether dd:cc:aa:b9:76:ce brd ff:ff:ff:ff:ff:ff
+    inet 172.16.77.240/24 scope global eth0
+    inet6 2001:470:9:1224:5595:dd51:6ba2:e788/64 scope global temporary dynamic
+       valid_lft 14187sec preferred_lft 3387sec
+    inet6 2001:470:9:1224:fd91:272:581e:3a32/64 scope global temporary """
+                """deprecated dynamic
+       valid_lft 14187sec preferred_lft 0sec
+    inet6 2001:470:9:1224:4508:b885:5fb:740b/64 scope global temporary """
+                """deprecated dynamic
+       valid_lft 14187sec preferred_lft 0sec
+    inet6 2001:470:9:1224:dfcc:aaff:feb9:76ce/64 scope global dynamic
+       valid_lft 14187sec preferred_lft 3387sec
+    inet6 fe80::dfcc:aaff:feb9:76ce/64 scope link
+       valid_lft forever preferred_lft forever
+""")
+
 GATEWAY_SAMPLE1 = ("""
 default via 10.35.19.254  metric 100
 10.35.16.0/22  proto kernel  scope link  src 10.35.17.97
@@ -493,9 +511,12 @@ class TestIpAddrCommand(TestIPCmdBase):
                  dynamic=False, cidr='fe80::dfcc:aaff:feb9:76ce/64',
                  broadcast='::')]
 
-        self.parent._run = mock.Mock(return_value=ADDR_SAMPLE)
-        self.assertEqual(self.addr_cmd.list(), expected)
-        self._assert_call([], ('show', 'tap0'))
+        test_cases = [ADDR_SAMPLE, ADDR_SAMPLE2]
+
+        for test_case in test_cases:
+            self.parent._run = mock.Mock(return_value=test_case)
+            self.assertEqual(self.addr_cmd.list(), expected)
+            self._assert_call([], ('show', 'tap0'))
 
     def test_list_filtered(self):
         expected = [
@@ -503,11 +524,15 @@ class TestIpAddrCommand(TestIPCmdBase):
                  dynamic=False, cidr='172.16.77.240/24',
                  broadcast='172.16.77.255')]
 
-        output = '\n'.join(ADDR_SAMPLE.split('\n')[0:4])
-        self.parent._run.return_value = output
-        self.assertEqual(self.addr_cmd.list('global', filters=['permanent']),
-                         expected)
-        self._assert_call([], ('show', 'tap0', 'permanent', 'scope', 'global'))
+        test_cases = [ADDR_SAMPLE, ADDR_SAMPLE2]
+
+        for test_case in test_cases:
+            output = '\n'.join(test_case.split('\n')[0:4])
+            self.parent._run.return_value = output
+            self.assertEqual(self.addr_cmd.list('global',
+                             filters=['permanent']), expected)
+            self._assert_call([], ('show', 'tap0', 'permanent', 'scope',
+                              'global'))
 
 
 class TestIpRouteCommand(TestIPCmdBase):