aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Prince <dprince@redhat.com>2015-07-01 17:18:49 -0400
committerDan Prince <dprince@redhat.com>2015-07-01 17:18:49 -0400
commitcb578ed9b94ff9a34b41d91ada94e3375436b60c (patch)
tree528009ce2c83c07e6b5f75511e9a90d10249e75f
parent9355a535e71407911332c228a382ee592452f5e7 (diff)
Add support for dhclient_args
This patch adds an optional flag that can be used to pass in args for dhclient when using DHCP. This use case for this is to be able to control which DHCP options dhclient listens for and we can thus disable specific options (like routing) for some network configurations. Change-Id: Ic21de0615ea0ef304843c55cc5abe43cb1771169
-rw-r--r--os_net_config/impl_ifcfg.py2
-rw-r--r--os_net_config/objects.py39
-rw-r--r--os_net_config/tests/test_impl_ifcfg.py13
-rw-r--r--os_net_config/tests/test_objects.py11
4 files changed, 50 insertions, 15 deletions
diff --git a/os_net_config/impl_ifcfg.py b/os_net_config/impl_ifcfg.py
index daadd52..0fe8cc5 100644
--- a/os_net_config/impl_ifcfg.py
+++ b/os_net_config/impl_ifcfg.py
@@ -155,6 +155,8 @@ class IfcfgNetConfig(os_net_config.NetConfig):
data += "OVS_EXTRA=\"%s\"\n" % " -- ".join(ovs_extra)
if not base_opt.defroute:
data += "DEFROUTE=no\n"
+ if base_opt.dhclient_args:
+ data += "DHCLIENTARGS=%s\n" % base_opt.dhclient_args
return data
def _add_routes(self, interface_name, routes=[]):
diff --git a/os_net_config/objects.py b/os_net_config/objects.py
index ea9c11c..8899164 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, defroute=True):
+ persist_mapping=False, defroute=True, dhclient_args=None):
numbered_nic_names = _numbered_nics(nic_mapping)
self.hwaddr = None
self.hwname = None
@@ -153,6 +153,7 @@ class _BaseOpts(object):
self.routes = routes
self.primary = primary
self.defroute = defroute
+ self.dhclient_args = dhclient_args
self.bridge_name = None # internal
self.ovs_port = False # internal
self.primary_interface_name = None # internal
@@ -181,6 +182,7 @@ class _BaseOpts(object):
defroute = strutils.bool_from_string(str(json.get('defroute',
True)))
mtu = json.get('mtu', 1500)
+ dhclient_args = json.get('dhclient_args')
primary = strutils.bool_from_string(str(json.get('primary', False)))
addresses = []
routes = []
@@ -210,10 +212,10 @@ class _BaseOpts(object):
if include_primary:
return (use_dhcp, use_dhcpv6, addresses, routes, mtu, primary,
- nic_mapping, persist_mapping, defroute)
+ nic_mapping, persist_mapping, defroute, dhclient_args)
else:
return (use_dhcp, use_dhcpv6, addresses, routes, mtu,
- nic_mapping, persist_mapping, defroute)
+ nic_mapping, persist_mapping, defroute, dhclient_args)
class Interface(_BaseOpts):
@@ -221,10 +223,11 @@ 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, defroute=True):
+ persist_mapping=False, defroute=True, dhclient_args=None):
super(Interface, self).__init__(name, use_dhcp, use_dhcpv6, addresses,
routes, mtu, primary, nic_mapping,
- persist_mapping, defroute)
+ persist_mapping, defroute,
+ dhclient_args)
@staticmethod
def from_json(json):
@@ -242,11 +245,12 @@ 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, defroute=True):
+ nic_mapping=None, persist_mapping=False, defroute=True,
+ dhclient_args=None):
name = 'vlan%i' % vlan_id
super(Vlan, self).__init__(name, use_dhcp, use_dhcpv6, addresses,
routes, mtu, primary, nic_mapping,
- persist_mapping, defroute)
+ persist_mapping, defroute, dhclient_args)
self.vlan_id = int(vlan_id)
numbered_nic_names = _numbered_nics(nic_mapping)
@@ -270,10 +274,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,
- defroute=True):
+ defroute=True, dhclient_args=None):
super(OvsBridge, self).__init__(name, use_dhcp, use_dhcpv6, addresses,
routes, mtu, False, nic_mapping,
- persist_mapping, defroute)
+ persist_mapping, defroute,
+ dhclient_args)
self.members = members
self.ovs_options = ovs_options
self.ovs_extra = ovs_extra
@@ -293,7 +298,8 @@ 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, defroute) = _BaseOpts.base_opts_from_json(
+ persist_mapping, defroute,
+ dhclient_args) = _BaseOpts.base_opts_from_json(
json, include_primary=False)
ovs_options = json.get('ovs_options')
ovs_extra = json.get('ovs_extra', [])
@@ -313,7 +319,8 @@ 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, defroute=defroute)
+ persist_mapping=persist_mapping, defroute=defroute,
+ dhclient_args=dhclient_args)
class OvsBond(_BaseOpts):
@@ -322,10 +329,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, defroute=True):
+ persist_mapping=False, defroute=True, dhclient_args=None):
super(OvsBond, self).__init__(name, use_dhcp, use_dhcpv6, addresses,
routes, mtu, primary, nic_mapping,
- persist_mapping, defroute)
+ persist_mapping, defroute, dhclient_args)
self.members = members
self.ovs_options = ovs_options
self.ovs_extra = ovs_extra
@@ -347,7 +354,8 @@ 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, defroute) = _BaseOpts.base_opts_from_json(
+ persist_mapping, defroute,
+ dhclient_args) = _BaseOpts.base_opts_from_json(
json, include_primary=False)
ovs_options = json.get('ovs_options')
ovs_extra = json.get('ovs_extra', [])
@@ -367,4 +375,5 @@ 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, defroute=defroute)
+ persist_mapping=persist_mapping, defroute=defroute,
+ dhclient_args=dhclient_args)
diff --git a/os_net_config/tests/test_impl_ifcfg.py b/os_net_config/tests/test_impl_ifcfg.py
index 92ce828..e32aff2 100644
--- a/os_net_config/tests/test_impl_ifcfg.py
+++ b/os_net_config/tests/test_impl_ifcfg.py
@@ -318,6 +318,19 @@ DEFROUTE=no
self.assertEqual(em1_config, self.get_interface_config('em1'))
self.assertEqual(em2_config, self.get_interface_config('em2'))
+ def test_interface_dhclient_opts(self):
+ interface1 = objects.Interface('em1', dhclient_args='--foobar')
+ self.provider.add_interface(interface1)
+ em1_config = """# This file is autogenerated by os-net-config
+DEVICE=em1
+ONBOOT=yes
+HOTPLUG=no
+NM_CONTROLLED=no
+BOOTPROTO=none
+DHCLIENTARGS=--foobar
+"""
+ self.assertEqual(em1_config, self.get_interface_config('em1'))
+
class TestIfcfgNetConfigApply(base.TestCase):
diff --git a/os_net_config/tests/test_objects.py b/os_net_config/tests/test_objects.py
index 2e545d0..c824ba8 100644
--- a/os_net_config/tests/test_objects.py
+++ b/os_net_config/tests/test_objects.py
@@ -108,6 +108,17 @@ class TestInterface(base.TestCase):
self.assertEqual(True, interface1.defroute)
self.assertEqual(False, interface2.defroute)
+ def test_from_json_dhclient_args(self):
+ data = """{
+"type": "interface",
+"name": "em1",
+"use_dhcp": true,
+"dhclient_args": "--foobar"
+}
+"""
+ interface1 = objects.object_from_json(json.loads(data))
+ self.assertEqual("--foobar", interface1.dhclient_args)
+
def test_from_json_dhcp_nic1(self):
def dummy_numbered_nics(nic_mapping=None):
return {"nic1": "em3"}