From 0b130b6b3b4a9e0768e99b1496d2852f2ca47bb7 Mon Sep 17 00:00:00 2001 From: Tomoki Sekiyama Date: Mon, 17 Aug 2015 19:36:16 +0000 Subject: Support multiple addresses assignment with ifcfg Currently only the first IPv4/v6 address is assigned to a NIC even if multiple addresses are specified in config file. With this change, ifcfg implementation can configure multiple IPv4/v6 addresses for a NIC. Also this enables os-net-config to configure IPv6 netmasks. Change-Id: I31b39abae36e0620dbbcb1001fa51f5ca2bd9ea2 --- os_net_config/impl_ifcfg.py | 15 ++++++++++----- os_net_config/tests/test_impl_ifcfg.py | 28 +++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/os_net_config/impl_ifcfg.py b/os_net_config/impl_ifcfg.py index 99273bc..b964819 100644 --- a/os_net_config/impl_ifcfg.py +++ b/os_net_config/impl_ifcfg.py @@ -136,19 +136,24 @@ class IfcfgNetConfig(os_net_config.NetConfig): if base_opt.use_dhcpv6: data += "DHCPV6C=yes\n" elif base_opt.addresses: - #TODO(dprince): Do we want to support multiple addresses? v4_addresses = base_opt.v4_addresses() if v4_addresses: - first_v4 = v4_addresses[0] data += "BOOTPROTO=static\n" - data += "IPADDR=%s\n" % first_v4.ip - data += "NETMASK=%s\n" % first_v4.netmask + for i, address in enumerate(v4_addresses): + num = '%s' % i if i else '' + data += "IPADDR%s=%s\n" % (num, address.ip) + data += "NETMASK%s=%s\n" % (num, address.netmask) v6_addresses = base_opt.v6_addresses() if v6_addresses: first_v6 = v6_addresses[0] data += "IPV6_AUTOCONF=no\n" - data += "IPV6ADDR=%s\n" % first_v6.ip + data += "IPV6ADDR=%s\n" % first_v6.ip_netmask + if len(v6_addresses) > 1: + secondaries_v6 = " ".join(map(lambda a: a.ip_netmask, + v6_addresses[1:])) + data += "IPV6ADDR_SECONDARIES=\"%s\"\n" % secondaries_v6 + if base_opt.hwaddr: data += "HWADDR=%s\n" % base_opt.hwaddr if ovs_extra: diff --git a/os_net_config/tests/test_impl_ifcfg.py b/os_net_config/tests/test_impl_ifcfg.py index e32aff2..73271e8 100644 --- a/os_net_config/tests/test_impl_ifcfg.py +++ b/os_net_config/tests/test_impl_ifcfg.py @@ -41,11 +41,20 @@ NETMASK=255.255.255.0 _V4_IFCFG_MAPPED = _V4_IFCFG.replace('em1', 'nic1') + "HWADDR=a1:b2:c3:d4:e5\n" +_V4_IFCFG_MULTIPLE = _V4_IFCFG + """IPADDR1=192.168.1.3 +NETMASK1=255.255.255.255 +IPADDR2=10.0.0.2 +NETMASK2=255.0.0.0 +""" + _V6_IFCFG = _BASE_IFCFG + """IPV6INIT=yes IPV6_AUTOCONF=no -IPV6ADDR=2001:abc:a:: +IPV6ADDR=2001:abc:a::/64 """ +_V6_IFCFG_MULTIPLE = (_V6_IFCFG + "IPV6ADDR_SECONDARIES=\"2001:abc:b::1/64 " + + "2001:abc:c::2/96\"\n") + _OVS_IFCFG = _BASE_IFCFG + "DEVICETYPE=ovs\nBOOTPROTO=none\n" @@ -171,6 +180,15 @@ class TestIfcfgNetConfig(base.TestCase): self.assertEqual(_V4_IFCFG, self.get_interface_config()) self.assertEqual('', self.get_route_config()) + def test_add_interface_with_v4_multiple(self): + addresses = [objects.Address('192.168.1.2/24'), + objects.Address('192.168.1.3/32'), + objects.Address('10.0.0.2/8')] + interface = objects.Interface('em1', addresses=addresses) + self.provider.add_interface(interface) + self.assertEqual(_V4_IFCFG_MULTIPLE, self.get_interface_config()) + self.assertEqual('', self.get_route_config()) + def test_add_interface_map_persisted(self): def test_interface_mac(name): macs = {'em1': 'a1:b2:c3:d4:e5'} @@ -194,6 +212,14 @@ class TestIfcfgNetConfig(base.TestCase): self.provider.add_interface(interface) self.assertEqual(_V6_IFCFG, self.get_interface_config()) + def test_add_interface_with_v6_multiple(self): + addresses = [objects.Address('2001:abc:a::/64'), + objects.Address('2001:abc:b::1/64'), + objects.Address('2001:abc:c::2/96')] + interface = objects.Interface('em1', addresses=addresses) + self.provider.add_interface(interface) + self.assertEqual(_V6_IFCFG_MULTIPLE, self.get_interface_config()) + def test_network_with_routes(self): route1 = objects.Route('192.168.1.1', default=True) route2 = objects.Route('192.168.1.1', '172.19.0.0/24') -- cgit 1.2.3-korg