summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etc/os-net-config/samples/interface.json13
-rw-r--r--etc/os-net-config/samples/interface.yaml10
-rw-r--r--os_net_config/impl_ifcfg.py6
-rw-r--r--os_net_config/objects.py34
-rw-r--r--os_net_config/tests/test_impl_ifcfg.py43
-rw-r--r--os_net_config/tests/test_objects.py14
-rw-r--r--os_net_config/utils.py3
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)