diff --git a/octavia/amphorae/backends/agent/api_server/osutils.py b/octavia/amphorae/backends/agent/api_server/osutils.py index 64d0d4d253..b95a531dc5 100644 --- a/octavia/amphorae/backends/agent/api_server/osutils.py +++ b/octavia/amphorae/backends/agent/api_server/osutils.py @@ -158,11 +158,6 @@ class BaseOS(object): text = template_port.render(interface=netns_interface) else: for index, fixed_ip in enumerate(fixed_ips, -1): - if index == -1: - netns_ip_interface = netns_interface - else: - netns_ip_interface = "{int}:{ip}".format( - int=netns_interface, ip=index) try: ip_addr = fixed_ip['ip_address'] cidr = fixed_ip['subnet_cidr'] @@ -179,7 +174,7 @@ class BaseOS(object): except ValueError: return webob.Response( json=dict(message="Invalid network IP"), status=400) - new_text = template_port.render(interface=netns_ip_interface, + new_text = template_port.render(interface=netns_interface, ipv6=ip.version == 6, ip_address=ip.exploded, broadcast=broadcast, diff --git a/octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py b/octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py index 7fdf11fc15..3ca248c2ab 100644 --- a/octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py +++ b/octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py @@ -183,11 +183,8 @@ class TestPlugNetwork(base.TestCase): def setUp(self): super(TestPlugNetwork, self).setUp() self.mock_platform = mock.patch("distro.id").start() - self.mock_platform.return_value = "ubuntu" - self.osutil = osutils.BaseOS.get_os_util() - self.test_plug = plug.Plug(self.osutil) - def test__generate_network_file_text_static_ip_ubuntu(self): + def __generate_network_file_text_static_ip(self): netns_interface = 'eth1234' FIXED_IP = '192.0.2.2' BROADCAST = '192.0.2.255' @@ -232,3 +229,92 @@ class TestPlugNetwork(base.TestCase): dest2=DEST2, nexthop=NEXTHOP) self.assertEqual(expected_text, text) + + def __generate_network_file_text_two_static_ips(self): + netns_interface = 'eth1234' + FIXED_IP = '192.0.2.2' + BROADCAST = '192.0.2.255' + SUBNET_CIDR = '192.0.2.0/24' + NETMASK = '255.255.255.0' + DEST1 = '198.51.100.0/24' + DEST2 = '203.0.113.0/24' + NEXTHOP = '192.0.2.1' + MTU = 1450 + FIXED_IP_IPV6 = '2001:0db8:0000:0000:0000:0000:0000:0001' + BROADCAST_IPV6 = '2001:0db8:ffff:ffff:ffff:ffff:ffff:ffff' + SUBNET_CIDR_IPV6 = '2001:db8::/32' + NETMASK_IPV6 = '32' + fixed_ips = [{'ip_address': FIXED_IP, + 'subnet_cidr': SUBNET_CIDR, + 'host_routes': [ + {'destination': DEST1, 'nexthop': NEXTHOP}, + {'destination': DEST2, 'nexthop': NEXTHOP} + ]}, + {'ip_address': FIXED_IP_IPV6, + 'subnet_cidr': SUBNET_CIDR_IPV6, + 'host_routes': []} + ] + format_text = ( + '\n\n# Generated by Octavia agent\n' + 'auto {netns_interface}\n' + 'iface {netns_interface} inet static\n' + 'address {fixed_ip}\n' + 'broadcast {broadcast}\n' + 'netmask {netmask}\n' + 'mtu {mtu}\n' + 'up route add -net {dest1} gw {nexthop} dev {netns_interface}\n' + 'down route del -net {dest1} gw {nexthop} dev {netns_interface}\n' + 'up route add -net {dest2} gw {nexthop} dev {netns_interface}\n' + 'down route del -net {dest2} gw {nexthop} dev {netns_interface}\n' + 'post-up /sbin/iptables -t nat -A POSTROUTING -p udp -o ' + '{netns_interface} -j MASQUERADE\n' + 'post-down /sbin/iptables -t nat -D POSTROUTING -p udp -o ' + '{netns_interface} -j MASQUERADE\n' + '\n\n# Generated by Octavia agent\n' + 'auto {netns_interface}\n' + 'iface {netns_interface} inet6 static\n' + 'address {fixed_ip_ipv6}\n' + 'broadcast {broadcast_ipv6}\n' + 'netmask {netmask_ipv6}\n' + 'mtu {mtu}\n' + 'post-up /sbin/ip6tables -t nat -A POSTROUTING -p udp -o ' + '{netns_interface} -j MASQUERADE\n' + 'post-down /sbin/ip6tables -t nat -D POSTROUTING -p udp -o ' + '{netns_interface} -j MASQUERADE\n') + + template_port = osutils.j2_env.get_template('plug_port_ethX.conf.j2') + text = self.test_plug._osutils._generate_network_file_text( + netns_interface, fixed_ips, MTU, template_port) + expected_text = format_text.format(netns_interface=netns_interface, + fixed_ip=FIXED_IP, + broadcast=BROADCAST, + netmask=NETMASK, + mtu=MTU, + dest1=DEST1, + dest2=DEST2, + nexthop=NEXTHOP, + fixed_ip_ipv6=FIXED_IP_IPV6, + broadcast_ipv6=BROADCAST_IPV6, + netmask_ipv6=NETMASK_IPV6) + self.assertEqual(expected_text, text) + + def _setup(self, os): + self.mock_platform.return_value = os + self.osutil = osutils.BaseOS.get_os_util() + self.test_plug = plug.Plug(self.osutil) + + def test__generate_network_file_text_static_ip_ubuntu(self): + self._setup("ubuntu") + self.__generate_network_file_text_static_ip() + + def test__generate_network_file_text_static_ip_centos(self): + self._setup("centos") + self.__generate_network_file_text_static_ip() + + def test__generate_network_file_text_two_static_ips_ubuntu(self): + self._setup("ubuntu") + self.__generate_network_file_text_two_static_ips() + + def test__generate_network_file_text_two_static_ips_centos(self): + self._setup("centos") + self.__generate_network_file_text_two_static_ips()