diff options
-rw-r--r-- | etc/os-net-config/samples/interface.json | 13 | ||||
-rw-r--r-- | etc/os-net-config/samples/interface.yaml | 10 | ||||
-rw-r--r-- | os_net_config/impl_ifcfg.py | 6 | ||||
-rw-r--r-- | os_net_config/objects.py | 34 | ||||
-rw-r--r-- | os_net_config/tests/test_impl_ifcfg.py | 43 | ||||
-rw-r--r-- | os_net_config/tests/test_objects.py | 14 | ||||
-rw-r--r-- | os_net_config/utils.py | 3 |
7 files changed, 101 insertions, 22 deletions
diff --git a/etc/os-net-config/samples/interface.json b/etc/os-net-config/samples/interface.json index 9fd5cf3..8a942b5 100644 --- a/etc/os-net-config/samples/interface.json +++ b/etc/os-net-config/samples/interface.json @@ -7,7 +7,20 @@ { "ip_netmask": "192.0.2.1/24" } + ], + "routes": [ + { + "ip_netmask": "0.0.0.0/0", + "next_hop": "192.0.2.254", + "default": "true" + } ] + }, + { + "type": "interface", + "name": "em2", + "use_dhcp": true, + "defroute": no } ] } diff --git a/etc/os-net-config/samples/interface.yaml b/etc/os-net-config/samples/interface.yaml index 2e24ccc..4f76e07 100644 --- a/etc/os-net-config/samples/interface.yaml +++ b/etc/os-net-config/samples/interface.yaml @@ -6,3 +6,13 @@ network_config: addresses: - ip_netmask: 192.0.2.1/24 + routes: + - + ip_netmask: 0.0.0.0/0 + next_hop: 192.0.2.254 + default: true + - + type: interface + name: em2 + use_dhcp: true + defroute: no
\ No newline at end of file diff --git a/os_net_config/impl_ifcfg.py b/os_net_config/impl_ifcfg.py index 47f32a6..097552a 100644 --- a/os_net_config/impl_ifcfg.py +++ b/os_net_config/impl_ifcfg.py @@ -68,9 +68,11 @@ class IfcfgNetConfig(os_net_config.NetConfig): ovs_extra = [] - data = "DEVICE=%s\n" % base_opt.name + data = "# This file is autogenerated by os-net-config\n" + data += "DEVICE=%s\n" % base_opt.name data += "ONBOOT=yes\n" data += "HOTPLUG=no\n" + data += "NM_CONTROLLED=no\n" if isinstance(base_opt, objects.Vlan): data += "VLAN=yes\n" if base_opt.device: @@ -144,6 +146,8 @@ class IfcfgNetConfig(os_net_config.NetConfig): data += "HWADDR=%s\n" % base_opt.hwaddr if ovs_extra: data += "OVS_EXTRA=\"%s\"\n" % " -- ".join(ovs_extra) + if not base_opt.defroute: + data += "DEFROUTE=no\n" return data def _add_routes(self, interface_name, routes=[]): diff --git a/os_net_config/objects.py b/os_net_config/objects.py index bb50f18..65bdd3b 100644 --- a/os_net_config/objects.py +++ b/os_net_config/objects.py @@ -130,7 +130,7 @@ class _BaseOpts(object): def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=[], routes=[], mtu=1500, primary=False, nic_mapping=None, - persist_mapping=False): + persist_mapping=False, defroute=True): numbered_nic_names = _numbered_nics(nic_mapping) self.hwaddr = None self.hwname = None @@ -152,6 +152,7 @@ class _BaseOpts(object): self.addresses = addresses self.routes = routes self.primary = primary + self.defroute = defroute self.bridge_name = None # internal self.ovs_port = False # internal self.primary_interface_name = None # internal @@ -177,6 +178,8 @@ class _BaseOpts(object): use_dhcp = strutils.bool_from_string(str(json.get('use_dhcp', False))) use_dhcpv6 = strutils.bool_from_string(str(json.get('use_dhcpv6', False))) + defroute = strutils.bool_from_string(str(json.get('defroute', + True))) mtu = json.get('mtu', 1500) primary = strutils.bool_from_string(str(json.get('primary', False))) addresses = [] @@ -207,10 +210,10 @@ class _BaseOpts(object): if include_primary: return (use_dhcp, use_dhcpv6, addresses, routes, mtu, primary, - nic_mapping, persist_mapping) + nic_mapping, persist_mapping, defroute) else: return (use_dhcp, use_dhcpv6, addresses, routes, mtu, - nic_mapping, persist_mapping) + nic_mapping, persist_mapping, defroute) class Interface(_BaseOpts): @@ -218,10 +221,10 @@ class Interface(_BaseOpts): def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=[], routes=[], mtu=1500, primary=False, nic_mapping=None, - persist_mapping=False): + persist_mapping=False, defroute=True): super(Interface, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, primary, nic_mapping, - persist_mapping) + persist_mapping, defroute) @staticmethod def from_json(json): @@ -239,11 +242,11 @@ class Vlan(_BaseOpts): def __init__(self, device, vlan_id, use_dhcp=False, use_dhcpv6=False, addresses=[], routes=[], mtu=1500, primary=False, - nic_mapping=None, persist_mapping=False): + nic_mapping=None, persist_mapping=False, defroute=True): name = 'vlan%i' % vlan_id super(Vlan, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, primary, nic_mapping, - persist_mapping) + persist_mapping, defroute) self.vlan_id = int(vlan_id) numbered_nic_names = _numbered_nics(nic_mapping) @@ -266,10 +269,11 @@ class OvsBridge(_BaseOpts): def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=[], routes=[], mtu=1500, members=[], ovs_options=None, - ovs_extra=[], nic_mapping=None, persist_mapping=False): + ovs_extra=[], nic_mapping=None, persist_mapping=False, + defroute=True): super(OvsBridge, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, False, nic_mapping, - persist_mapping) + persist_mapping, defroute) self.members = members self.ovs_options = ovs_options self.ovs_extra = ovs_extra @@ -289,7 +293,7 @@ class OvsBridge(_BaseOpts): def from_json(json): name = _get_required_field(json, 'name', 'OvsBridge') (use_dhcp, use_dhcpv6, addresses, routes, mtu, nic_mapping, - persist_mapping) = _BaseOpts.base_opts_from_json( + persist_mapping, defroute) = _BaseOpts.base_opts_from_json( json, include_primary=False) ovs_options = json.get('ovs_options') ovs_extra = json.get('ovs_extra', []) @@ -309,7 +313,7 @@ class OvsBridge(_BaseOpts): addresses=addresses, routes=routes, mtu=mtu, members=members, ovs_options=ovs_options, ovs_extra=ovs_extra, nic_mapping=nic_mapping, - persist_mapping=persist_mapping) + persist_mapping=persist_mapping, defroute=defroute) class OvsBond(_BaseOpts): @@ -318,10 +322,10 @@ class OvsBond(_BaseOpts): def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=[], routes=[], mtu=1500, primary=False, members=[], ovs_options=None, ovs_extra=[], nic_mapping=None, - persist_mapping=False): + persist_mapping=False, defroute=True): super(OvsBond, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, primary, nic_mapping, - persist_mapping) + persist_mapping, defroute) self.members = members self.ovs_options = ovs_options self.ovs_extra = ovs_extra @@ -339,7 +343,7 @@ class OvsBond(_BaseOpts): def from_json(json): name = _get_required_field(json, 'name', 'OvsBond') (use_dhcp, use_dhcpv6, addresses, routes, mtu, nic_mapping, - persist_mapping) = _BaseOpts.base_opts_from_json( + persist_mapping, defroute) = _BaseOpts.base_opts_from_json( json, include_primary=False) ovs_options = json.get('ovs_options') ovs_extra = json.get('ovs_extra', []) @@ -359,4 +363,4 @@ class OvsBond(_BaseOpts): addresses=addresses, routes=routes, mtu=mtu, members=members, ovs_options=ovs_options, ovs_extra=ovs_extra, nic_mapping=nic_mapping, - persist_mapping=persist_mapping) + persist_mapping=persist_mapping, defroute=defroute) diff --git a/os_net_config/tests/test_impl_ifcfg.py b/os_net_config/tests/test_impl_ifcfg.py index 3930709..f43faed 100644 --- a/os_net_config/tests/test_impl_ifcfg.py +++ b/os_net_config/tests/test_impl_ifcfg.py @@ -25,9 +25,11 @@ from os_net_config.tests import base from os_net_config import utils -_BASE_IFCFG = """DEVICE=em1 +_BASE_IFCFG = """# This file is autogenerated by os-net-config +DEVICE=em1 ONBOOT=yes HOTPLUG=no +NM_CONTROLLED=no """ _NO_IP = _BASE_IFCFG + "BOOTPROTO=none\n" @@ -60,9 +62,11 @@ OVS_BRIDGE=br-ctlplane BOOTPROTO=none """ -_OVS_BRIDGE_DHCP = """DEVICE=br-ctlplane +_OVS_BRIDGE_DHCP = """# This file is autogenerated by os-net-config +DEVICE=br-ctlplane ONBOOT=yes HOTPLUG=no +NM_CONTROLLED=no DEVICETYPE=ovs TYPE=OVSBridge OVSBOOTPROTO=dhcp @@ -78,9 +82,11 @@ _OVS_BRIDGE_DHCP_OVS_EXTRA = _OVS_BRIDGE_DHCP + \ " -- br-set-external-id br-ctlplane bridge-id br-ctlplane\"\n" -_BASE_VLAN = """DEVICE=vlan5 +_BASE_VLAN = """# This file is autogenerated by os-net-config +DEVICE=vlan5 ONBOOT=yes HOTPLUG=no +NM_CONTROLLED=no VLAN=yes PHYSDEV=em1 """ @@ -100,9 +106,11 @@ BOOTPROTO=none """ -_OVS_BOND_DHCP = """DEVICE=bond0 +_OVS_BOND_DHCP = """# This file is autogenerated by os-net-config +DEVICE=bond0 ONBOOT=yes HOTPLUG=no +NM_CONTROLLED=no DEVICETYPE=ovs TYPE=OVSBond OVSBOOTPROTO=dhcp @@ -246,15 +254,40 @@ class TestIfcfgNetConfig(base.TestCase): self.provider.add_bond(bond) self.assertEqual(_NO_IP, self.get_interface_config('em1')) - em2_config = """DEVICE=em2 + em2_config = """# This file is autogenerated by os-net-config +DEVICE=em2 ONBOOT=yes HOTPLUG=no +NM_CONTROLLED=no BOOTPROTO=none """ self.assertEqual(em2_config, self.get_interface_config('em2')) self.assertEqual(_OVS_BOND_DHCP, self.get_interface_config('bond0')) + def test_interface_defroute(self): + interface1 = objects.Interface('em1') + interface2 = objects.Interface('em2', defroute=False) + self.provider.add_interface(interface1) + self.provider.add_interface(interface2) + em1_config = """# This file is autogenerated by os-net-config +DEVICE=em1 +ONBOOT=yes +HOTPLUG=no +NM_CONTROLLED=no +BOOTPROTO=none +""" + em2_config = """# This file is autogenerated by os-net-config +DEVICE=em2 +ONBOOT=yes +HOTPLUG=no +NM_CONTROLLED=no +BOOTPROTO=none +DEFROUTE=no +""" + self.assertEqual(em1_config, self.get_interface_config('em1')) + self.assertEqual(em2_config, self.get_interface_config('em2')) + class TestIfcfgNetConfigApply(base.TestCase): diff --git a/os_net_config/tests/test_objects.py b/os_net_config/tests/test_objects.py index 268a48b..2e545d0 100644 --- a/os_net_config/tests/test_objects.py +++ b/os_net_config/tests/test_objects.py @@ -94,6 +94,20 @@ class TestInterface(base.TestCase): self.assertEqual("em1", interface.name) self.assertEqual(True, interface.use_dhcp) + def test_from_json_defroute(self): + data = '{"type": "interface", "name": "em1", "use_dhcp": true}' + interface1 = objects.object_from_json(json.loads(data)) + data = """{ +"type": "interface", +"name": "em1", +"use_dhcp": true, +"defroute": false +} +""" + interface2 = objects.object_from_json(json.loads(data)) + self.assertEqual(True, interface1.defroute) + self.assertEqual(False, interface2.defroute) + def test_from_json_dhcp_nic1(self): def dummy_numbered_nics(nic_mapping=None): return {"nic1": "em3"} diff --git a/os_net_config/utils.py b/os_net_config/utils.py index cd202f6..f0ab307 100644 --- a/os_net_config/utils.py +++ b/os_net_config/utils.py @@ -81,7 +81,8 @@ def ordered_active_nics(): for name in glob.iglob(_SYS_CLASS_NET + '/*'): nic = name[(len(_SYS_CLASS_NET) + 1):] if _is_active_nic(nic): - if nic.startswith('em') or nic.startswith('eth'): + if nic.startswith('em') or nic.startswith('eth') or \ + nic.startswith('eno'): embedded_nics.append(nic) else: nics.append(nic) |