From fc9fbd4461e0955de47b04cc68ef48e2b9501b6b Mon Sep 17 00:00:00 2001 From: Juan Antonio Osorio Robles Date: Tue, 12 Feb 2019 14:34:11 +0200 Subject: [PATCH] Enable setting domain parameter for interfaces This enables the setting of a static domain that will be used to aid DNS queries. Change-Id: I284691444b2f10cc831d4b3148d41100f6c7796d --- os_net_config/impl_ifcfg.py | 2 + os_net_config/objects.py | 181 ++++++++++-------- os_net_config/schema.yaml | 46 +++++ os_net_config/tests/test_impl_ifcfg.py | 15 ++ os_net_config/tests/test_objects.py | 11 ++ os_net_config/tests/test_validator.py | 30 +++ ...nable-setting-domain-5557e2441c23a5a5.yaml | 5 + 7 files changed, 211 insertions(+), 79 deletions(-) create mode 100644 releasenotes/notes/enable-setting-domain-5557e2441c23a5a5.yaml diff --git a/os_net_config/impl_ifcfg.py b/os_net_config/impl_ifcfg.py index 48472142..2c69c31a 100644 --- a/os_net_config/impl_ifcfg.py +++ b/os_net_config/impl_ifcfg.py @@ -605,6 +605,8 @@ class IfcfgNetConfig(os_net_config.NetConfig): data += "DNS2=%s\n" % base_opt.dns_servers[1] if len(base_opt.dns_servers) > 2: logger.warning('ifcfg format supports max 2 resolvers.') + if base_opt.domain: + data += "DOMAIN=%s\n" % base_opt.domain return data def _add_routes(self, interface_name, routes=[]): diff --git a/os_net_config/objects.py b/os_net_config/objects.py index 6c208157..a976ee37 100644 --- a/os_net_config/objects.py +++ b/os_net_config/objects.py @@ -322,7 +322,7 @@ class _BaseOpts(object): routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True): + onboot=True, domain=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -360,6 +360,7 @@ class _BaseOpts(object): self.defroute = defroute self.dhclient_args = dhclient_args self.dns_servers = dns_servers + self.domain = domain self.nm_controlled = nm_controlled self.onboot = onboot self.bridge_name = None # internal @@ -397,6 +398,7 @@ class _BaseOpts(object): mtu = json.get('mtu', None) dhclient_args = json.get('dhclient_args') dns_servers = json.get('dns_servers') + domain = json.get('domain') nm_controlled = strutils.bool_from_string(str(json.get('nm_controlled', False))) onboot = strutils.bool_from_string(str(json.get('onboot', @@ -442,11 +444,11 @@ class _BaseOpts(object): if include_primary: return (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, - dhclient_args, dns_servers, nm_controlled, onboot) + dhclient_args, dns_servers, nm_controlled, onboot, domain) else: return (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, persist_mapping, defroute, dhclient_args, - dns_servers, nm_controlled, onboot) + dns_servers, nm_controlled, onboot, domain) class Interface(_BaseOpts): @@ -456,7 +458,7 @@ class Interface(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True, ethtool_opts=None, hotplug=False): + onboot=True, domain=None, ethtool_opts=None, hotplug=False): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -465,7 +467,7 @@ class Interface(_BaseOpts): routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.ethtool_opts = ethtool_opts self.hotplug = hotplug @@ -490,7 +492,7 @@ class Vlan(_BaseOpts): addresses=None, routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, - nm_controlled=False, onboot=True): + nm_controlled=False, onboot=True, domain=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -499,7 +501,7 @@ class Vlan(_BaseOpts): super(Vlan, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, - dns_servers, nm_controlled, onboot) + dns_servers, nm_controlled, onboot, domain) self.vlan_id = int(vlan_id) mapped_nic_names = mapped_nics(nic_mapping) if device in mapped_nic_names: @@ -523,7 +525,7 @@ class IvsInterface(_BaseOpts): addresses=None, routes=None, rules=None, mtu=1500, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, - nm_controlled=False, onboot=True): + nm_controlled=False, onboot=True, domain=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -534,7 +536,7 @@ class IvsInterface(_BaseOpts): primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.vlan_id = int(vlan_id) @staticmethod @@ -552,7 +554,8 @@ class NfvswitchInternal(_BaseOpts): use_dhcpv6=False, addresses=None, routes=None, rules=None, mtu=1500, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, - dns_servers=None, nm_controlled=False, onboot=True): + dns_servers=None, nm_controlled=False, onboot=True, + domain=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -564,7 +567,7 @@ class NfvswitchInternal(_BaseOpts): nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, nm_controlled, - onboot) + onboot, domain) self.vlan_id = int(vlan_id) @staticmethod @@ -583,7 +586,7 @@ class OvsBridge(_BaseOpts): ovs_options=None, ovs_extra=None, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, onboot=True, - fail_mode=None): + domain=None, fail_mode=None): check_ovs_installed(self.__class__.__name__) @@ -596,7 +599,7 @@ class OvsBridge(_BaseOpts): routes, rules, mtu, False, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.members = members self.ovs_options = ovs_options ovs_extra = ovs_extra or [] @@ -643,7 +646,7 @@ class OvsBridge(_BaseOpts): name = _get_required_field(json, 'name', 'OvsBridge') (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) = _BaseOpts.base_opts_from_json( + nm_controlled, onboot, domain) = _BaseOpts.base_opts_from_json( json, include_primary=False) ovs_options = json.get('ovs_options') ovs_extra = json.get('ovs_extra', []) @@ -660,7 +663,7 @@ class OvsBridge(_BaseOpts): persist_mapping=persist_mapping, defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, nm_controlled=nm_controlled, onboot=onboot, - fail_mode=fail_mode) + domain=domain, fail_mode=fail_mode) class OvsUserBridge(_BaseOpts): @@ -671,7 +674,7 @@ class OvsUserBridge(_BaseOpts): ovs_options=None, ovs_extra=None, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, onboot=True, - fail_mode=None): + domain=None, fail_mode=None): check_ovs_installed(self.__class__.__name__) @@ -680,7 +683,7 @@ class OvsUserBridge(_BaseOpts): False, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.members = members or [] self.ovs_options = ovs_options ovs_extra = ovs_extra or [] @@ -707,7 +710,7 @@ class OvsUserBridge(_BaseOpts): name = _get_required_field(json, 'name', 'OvsUserBridge') (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) = _BaseOpts.base_opts_from_json( + nm_controlled, onboot, domain) = _BaseOpts.base_opts_from_json( json, include_primary=False) ovs_options = json.get('ovs_options') ovs_extra = json.get('ovs_extra', []) @@ -725,7 +728,7 @@ class OvsUserBridge(_BaseOpts): defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, nm_controlled=nm_controlled, onboot=onboot, - fail_mode=fail_mode) + domain=domain, fail_mode=fail_mode) class LinuxBridge(_BaseOpts): @@ -735,7 +738,7 @@ class LinuxBridge(_BaseOpts): routes=None, rules=None, mtu=None, members=None, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True): + onboot=True, domain=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -745,7 +748,7 @@ class LinuxBridge(_BaseOpts): addresses, routes, rules, mtu, False, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.members = members for member in self.members: member.linux_bridge_name = name @@ -764,7 +767,8 @@ class LinuxBridge(_BaseOpts): name = _get_required_field(json, 'name', 'LinuxBridge') (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, nm_controlled, - onboot) = _BaseOpts.base_opts_from_json(json, include_primary=False) + onboot, domain) = _BaseOpts.base_opts_from_json(json, + include_primary=False) members = _update_members(json, nic_mapping, persist_mapping) @@ -774,7 +778,8 @@ class LinuxBridge(_BaseOpts): persist_mapping=persist_mapping, defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, - nm_controlled=nm_controlled, onboot=onboot) + nm_controlled=nm_controlled, onboot=onboot, + domain=domain) class IvsBridge(_BaseOpts): @@ -794,7 +799,8 @@ class IvsBridge(_BaseOpts): addresses=None, rules=None, routes=None, mtu=1500, members=None, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, - dns_servers=None, nm_controlled=False, onboot=True): + dns_servers=None, nm_controlled=False, onboot=True, + domain=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -804,7 +810,7 @@ class IvsBridge(_BaseOpts): addresses, routes, rules, mtu, False, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.members = members for member in self.members: if isinstance(member, OvsBond) or isinstance(member, LinuxBond): @@ -819,7 +825,8 @@ class IvsBridge(_BaseOpts): name = 'ivs' (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, nm_controlled, - onboot) = _BaseOpts.base_opts_from_json(json, include_primary=False) + onboot, domain) = _BaseOpts.base_opts_from_json(json, + include_primary=False) members = _update_members(json, nic_mapping, persist_mapping) @@ -829,7 +836,7 @@ class IvsBridge(_BaseOpts): persist_mapping=persist_mapping, defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, nm_controlled=nm_controlled, - onboot=onboot) + onboot=onboot, domain=domain) class NfvswitchBridge(_BaseOpts): @@ -844,7 +851,7 @@ class NfvswitchBridge(_BaseOpts): addresses=None, routes=None, rules=None, mtu=1500, members=None, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, - nm_controlled=False, onboot=True, options=""): + nm_controlled=False, onboot=True, domain=None, options=""): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -855,7 +862,7 @@ class NfvswitchBridge(_BaseOpts): False, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.options = options self.members = members for member in self.members: @@ -871,7 +878,8 @@ class NfvswitchBridge(_BaseOpts): name = 'nfvswitch' (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, nm_controlled, - onboot) = _BaseOpts.base_opts_from_json(json, include_primary=False) + onboot, domain) = _BaseOpts.base_opts_from_json(json, + include_primary=False) members = _update_members(json, nic_mapping, persist_mapping) @@ -888,7 +896,7 @@ class NfvswitchBridge(_BaseOpts): defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, nm_controlled=nm_controlled, onboot=onboot, - options=options) + domain=domain, options=options) class LinuxTeam(_BaseOpts): @@ -898,7 +906,8 @@ class LinuxTeam(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, members=None, bonding_options=None, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, - dns_servers=None, nm_controlled=False, onboot=True): + dns_servers=None, nm_controlled=False, onboot=True, + domain=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -908,7 +917,7 @@ class LinuxTeam(_BaseOpts): routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.members = members self.bonding_options = bonding_options for member in self.members: @@ -927,7 +936,8 @@ class LinuxTeam(_BaseOpts): name = _get_required_field(json, 'name', 'LinuxTeam') (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, nm_controlled, - onboot) = _BaseOpts.base_opts_from_json(json, include_primary=False) + onboot, domain) = _BaseOpts.base_opts_from_json(json, + include_primary=False) bonding_options = json.get('bonding_options') members = _update_members(json, nic_mapping, persist_mapping) @@ -939,7 +949,8 @@ class LinuxTeam(_BaseOpts): nic_mapping=nic_mapping, persist_mapping=persist_mapping, defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, - nm_controlled=nm_controlled, onboot=onboot) + nm_controlled=nm_controlled, onboot=onboot, + domain=domain) class LinuxBond(_BaseOpts): @@ -949,7 +960,8 @@ class LinuxBond(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, members=None, bonding_options=None, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, - dns_servers=None, nm_controlled=False, onboot=True): + dns_servers=None, nm_controlled=False, onboot=True, + domain=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -959,7 +971,7 @@ class LinuxBond(_BaseOpts): routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.members = members self.bonding_options = bonding_options for member in self.members: @@ -999,8 +1011,8 @@ class LinuxBond(_BaseOpts): def from_json(json): name = _get_required_field(json, 'name', 'LinuxBond') (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, - persist_mapping, defroute, dhclient_args, - dns_servers, nm_controlled, onboot) = _BaseOpts.base_opts_from_json( + persist_mapping, defroute, dhclient_args, dns_servers, nm_controlled, + onboot, domain) = _BaseOpts.base_opts_from_json( json, include_primary=False) bonding_options = json.get('bonding_options') @@ -1013,7 +1025,8 @@ class LinuxBond(_BaseOpts): nic_mapping=nic_mapping, persist_mapping=persist_mapping, defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, - nm_controlled=nm_controlled, onboot=onboot) + nm_controlled=nm_controlled, onboot=onboot, + domain=domain) class OvsBond(_BaseOpts): @@ -1024,7 +1037,7 @@ class OvsBond(_BaseOpts): members=None, ovs_options=None, ovs_extra=None, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True): + onboot=True, domain=None): check_ovs_installed(self.__class__.__name__) @@ -1036,7 +1049,8 @@ class OvsBond(_BaseOpts): super(OvsBond, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, - dns_servers, nm_controlled, onboot) + dns_servers, nm_controlled, onboot, + domain) self.members = members self.ovs_options = ovs_options self.ovs_extra = format_ovs_extra(self, ovs_extra) @@ -1080,8 +1094,8 @@ class OvsBond(_BaseOpts): def from_json(json): name = _get_required_field(json, 'name', 'OvsBond') (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, - persist_mapping, defroute, dhclient_args, - dns_servers, nm_controlled, onboot) = _BaseOpts.base_opts_from_json( + persist_mapping, defroute, dhclient_args, dns_servers, nm_controlled, + onboot, domain) = _BaseOpts.base_opts_from_json( json, include_primary=False) ovs_options = json.get('ovs_options') ovs_extra = json.get('ovs_extra', []) @@ -1096,7 +1110,8 @@ class OvsBond(_BaseOpts): ovs_extra=ovs_extra, nic_mapping=nic_mapping, persist_mapping=persist_mapping, defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, - nm_controlled=nm_controlled, onboot=onboot) + nm_controlled=nm_controlled, onboot=onboot, + domain=domain) class OvsTunnel(_BaseOpts): @@ -1106,7 +1121,7 @@ class OvsTunnel(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True, tunnel_type=None, ovs_options=None, + onboot=True, domain=None, tunnel_type=None, ovs_options=None, ovs_extra=None): check_ovs_installed(self.__class__.__name__) @@ -1119,7 +1134,7 @@ class OvsTunnel(_BaseOpts): routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.tunnel_type = tunnel_type self.ovs_options = ovs_options or [] self.ovs_extra = format_ovs_extra(self, ovs_extra) @@ -1145,8 +1160,8 @@ class OvsPatchPort(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True, bridge_name=None, peer=None, ovs_options=None, - ovs_extra=None): + onboot=True, domain=None, bridge_name=None, peer=None, + ovs_options=None, ovs_extra=None): check_ovs_installed(self.__class__.__name__) @@ -1159,7 +1174,7 @@ class OvsPatchPort(_BaseOpts): primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.bridge_name = bridge_name self.peer = peer self.ovs_options = ovs_options or [] @@ -1187,7 +1202,7 @@ class IbInterface(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True, ethtool_opts=None): + onboot=True, domain=None, ethtool_opts=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -1197,7 +1212,7 @@ class IbInterface(_BaseOpts): primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.ethtool_opts = ethtool_opts @staticmethod @@ -1215,7 +1230,7 @@ class OvsDpdkPort(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True, members=None, driver='vfio-pci', + onboot=True, domain=None, members=None, driver='vfio-pci', ovs_options=None, ovs_extra=None, rx_queue=None): check_ovs_installed(self.__class__.__name__) @@ -1225,7 +1240,7 @@ class OvsDpdkPort(_BaseOpts): primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.members = members or [] self.ovs_options = ovs_options or [] self.ovs_extra = format_ovs_extra(self, ovs_extra) @@ -1258,7 +1273,7 @@ class OvsDpdkPort(_BaseOpts): (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, nm_controlled, - onboot) = _BaseOpts.base_opts_from_json(json) + onboot, domain) = _BaseOpts.base_opts_from_json(json) driver = json.get('driver') if not driver: @@ -1309,7 +1324,7 @@ class OvsDpdkPort(_BaseOpts): dhclient_args=dhclient_args, dns_servers=dns_servers, nm_controlled=nm_controlled, onboot=onboot, - members=members, driver=driver, + domain=domain, members=members, driver=driver, ovs_options=ovs_options, ovs_extra=ovs_extra, rx_queue=rx_queue) @@ -1321,8 +1336,8 @@ class SriovVF(_BaseOpts): addresses=None, routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, - nm_controlled=False, onboot=True, vlan_id=0, qos=0, - spoofcheck=None, trust=None, state=None, macaddr=None, + nm_controlled=False, onboot=True, domain=None, vlan_id=0, + qos=0, spoofcheck=None, trust=None, state=None, macaddr=None, promisc=None): addresses = addresses or [] routes = routes or [] @@ -1339,7 +1354,7 @@ class SriovVF(_BaseOpts): routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.vfid = int(vfid) self.device = device self.vlan_id = int(vlan_id) @@ -1399,7 +1414,8 @@ class SriovPF(_BaseOpts): addresses=None, routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, - nm_controlled=False, onboot=True, members=None, promisc=None): + nm_controlled=False, onboot=True, domain=None, members=None, + promisc=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -1408,7 +1424,7 @@ class SriovPF(_BaseOpts): routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.numvfs = int(numvfs) mapped_nic_names = mapped_nics(nic_mapping) if name in mapped_nic_names: @@ -1445,7 +1461,7 @@ class OvsDpdkBond(_BaseOpts): members=None, ovs_options=None, ovs_extra=None, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True, rx_queue=None): + onboot=True, domain=None, rx_queue=None): check_ovs_installed(self.__class__.__name__) @@ -1454,7 +1470,7 @@ class OvsDpdkBond(_BaseOpts): primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.members = members or [] self.ovs_options = ovs_options self.ovs_extra = format_ovs_extra(self, ovs_extra) @@ -1478,8 +1494,8 @@ class OvsDpdkBond(_BaseOpts): def from_json(json): name = _get_required_field(json, 'name', 'OvsDpdkBond') (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, - persist_mapping, defroute, dhclient_args, - dns_servers, nm_controlled, onboot) = _BaseOpts.base_opts_from_json( + persist_mapping, defroute, dhclient_args, dns_servers, nm_controlled, + onboot, domain) = _BaseOpts.base_opts_from_json( json, include_primary=False) rx_queue = json.get('rx_queue', None) ovs_options = json.get('ovs_options') @@ -1514,7 +1530,7 @@ class OvsDpdkBond(_BaseOpts): defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, nm_controlled=nm_controlled, onboot=onboot, - rx_queue=rx_queue) + domain=domain, rx_queue=rx_queue) class VppInterface(_BaseOpts): @@ -1545,7 +1561,8 @@ class VppInterface(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True, uio_driver='vfio-pci', options=None): + onboot=True, domain=None, uio_driver='vfio-pci', + options=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -1555,7 +1572,7 @@ class VppInterface(_BaseOpts): primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.uio_driver = uio_driver self.options = options # pci_dev contains pci address for the interface, it will be populated @@ -1580,7 +1597,7 @@ class VppBond(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True, members=None, bonding_options=None): + onboot=True, domain=None, members=None, bonding_options=None): addresses = addresses or [] members = members or [] routes = routes or [] @@ -1590,7 +1607,8 @@ class VppBond(_BaseOpts): addresses, routes, rules, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, - dns_servers, nm_controlled, onboot) + dns_servers, nm_controlled, onboot, + domain) self.members = members self.bonding_options = bonding_options @@ -1601,7 +1619,8 @@ class VppBond(_BaseOpts): (use_dhcp, use_dhcpv6, addresses, routes, rules, mtu, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, nm_controlled, - onboot) = _BaseOpts.base_opts_from_json(json, include_primary=False) + onboot, domain) = _BaseOpts.base_opts_from_json(json, + include_primary=False) members = [] members_json = json.get('members', None) @@ -1627,7 +1646,8 @@ class VppBond(_BaseOpts): persist_mapping=persist_mapping, defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, nm_controlled=nm_controlled, - onboot=onboot, bonding_options=bonding_options) + onboot=onboot, domain=domain, + bonding_options=bonding_options) class ContrailVrouter(_BaseOpts): @@ -1643,7 +1663,7 @@ class ContrailVrouter(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True, members=None): + onboot=True, domain=None, members=None): addresses = addresses or [] super(ContrailVrouter, self).__init__(name, use_dhcp, use_dhcpv6, @@ -1651,7 +1671,7 @@ class ContrailVrouter(_BaseOpts): primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, domain) self.members = members or [] @staticmethod @@ -1660,7 +1680,8 @@ class ContrailVrouter(_BaseOpts): (_use_dhcp, _use_dhcpv6, _addresses, _routes, _rules, _mtu, _primary, nic_mapping, persist_mapping, _defroute, _dhclient_args, _dns_servers, - _nm_controlled, _onboot) = opts = _BaseOpts.base_opts_from_json(json) + _nm_controlled, _onboot, + _domain) = opts = _BaseOpts.base_opts_from_json(json) members = _update_members(json, nic_mapping, persist_mapping) return ContrailVrouter(name, *opts, members=members) @@ -1683,8 +1704,8 @@ class ContrailVrouterDpdk(_BaseOpts): routes=None, rules=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, - onboot=True, members=None, bond_mode=None, bond_policy=None, - driver=None, cpu_list='0-31', vlan_id=None): + onboot=True, domain=None, members=None, bond_mode=None, + bond_policy=None, driver=None, cpu_list='0-31', vlan_id=None): addresses = addresses or [] super(ContrailVrouterDpdk, self).__init__(name, use_dhcp, use_dhcpv6, @@ -1692,7 +1713,8 @@ class ContrailVrouterDpdk(_BaseOpts): mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers, - nm_controlled, onboot) + nm_controlled, onboot, + domain) self.members = members or [] self.bond_mode = bond_mode @@ -1712,7 +1734,8 @@ class ContrailVrouterDpdk(_BaseOpts): (_use_dhcp, _use_dhcpv6, _addresses, _routes, _rules, _mtu, _primary, nic_mapping, persist_mapping, _defroute, _dhclient_args, _dns_servers, - _nm_controlled, _onboot) = opts = _BaseOpts.base_opts_from_json(json) + _nm_controlled, _onboot, + _domain) = opts = _BaseOpts.base_opts_from_json(json) members = _update_members(json, nic_mapping, persist_mapping) return ContrailVrouterDpdk(name, *opts, members=members, diff --git a/os_net_config/schema.yaml b/os_net_config/schema.yaml index 5c5da7b3..285c3fc7 100644 --- a/os_net_config/schema.yaml +++ b/os_net_config/schema.yaml @@ -107,6 +107,10 @@ definitions: required: - list_join additionalProperties: False + domain_name_string: + type: string + pattern: >- + ^(?=^.{1,255}$)(?!.*\.\..*)(.{1,63}\.)+(.{0,63}\.?)|(?!\.)(?!.*\.\..*)(^.{1,63}$)|(^\.$)$ # os-net-config derived types address: @@ -272,6 +276,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -336,6 +342,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -396,6 +404,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - device @@ -440,6 +450,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - vlan_id @@ -496,6 +508,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -553,6 +567,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -605,6 +621,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -655,6 +673,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -704,6 +724,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -754,6 +776,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -812,6 +836,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -856,6 +882,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -899,6 +927,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" members: type: array items: @@ -1058,6 +1088,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -1107,6 +1139,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -1155,6 +1189,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name @@ -1199,6 +1235,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - members @@ -1242,6 +1280,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - vlan_id @@ -1288,6 +1328,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - options @@ -1332,6 +1374,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - vlan_id @@ -1375,6 +1419,8 @@ definitions: $ref: "#/definitions/bool_or_param" onboot: $ref: "#/definitions/bool_or_param" + domain: + $ref: "#/definitions/domain_name_string" required: - type - name diff --git a/os_net_config/tests/test_impl_ifcfg.py b/os_net_config/tests/test_impl_ifcfg.py index 8cc35c28..318c6544 100644 --- a/os_net_config/tests/test_impl_ifcfg.py +++ b/os_net_config/tests/test_impl_ifcfg.py @@ -1220,6 +1220,21 @@ NM_CONTROLLED=no BOOTPROTO=none DNS1=1.2.3.4 DNS2=5.6.7.8 +""" + self.assertEqual(em1_config, self.get_interface_config('em1')) + + def test_interface_domain(self): + interface1 = objects.Interface('em1', dns_servers=['1.2.3.4'], + domain='openstack.local') + 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 +DNS1=1.2.3.4 +DOMAIN=openstack.local """ self.assertEqual(em1_config, self.get_interface_config('em1')) diff --git a/os_net_config/tests/test_objects.py b/os_net_config/tests/test_objects.py index aa1acbcd..31b883bc 100644 --- a/os_net_config/tests/test_objects.py +++ b/os_net_config/tests/test_objects.py @@ -306,6 +306,17 @@ class TestInterface(base.TestCase): interface1 = objects.object_from_json(json.loads(data)) self.assertEqual(["1.2.3.4"], interface1.dns_servers) + def test_from_json_domain(self): + data = """{ +"type": "interface", +"name": "em1", +"use_dhcp": true, +"domain": "openstack.local" +} +""" + interface1 = objects.object_from_json(json.loads(data)) + self.assertEqual("openstack.local", interface1.domain) + def test_from_json_dhcp_nic1(self): def dummy_mapped_nics(nic_mapping=None): return {"nic1": "em3"} diff --git a/os_net_config/tests/test_validator.py b/os_net_config/tests/test_validator.py index 6fe0b291..e95affc9 100644 --- a/os_net_config/tests/test_validator.py +++ b/os_net_config/tests/test_validator.py @@ -144,6 +144,35 @@ class TestBaseTypes(base.TestCase): self.assertTrue(v.is_valid("fe80::1/64")) self.assertFalse(v.is_valid("193.168.0.1")) + def test_domain_name_string(self): + schema = validator.get_schema_for_defined_type("domain_name_string") + v = jsonschema.Draft4Validator(schema) + self.assertTrue(v.is_valid('localdomain')) + self.assertTrue(v.is_valid('openstack.local')) + self.assertTrue(v.is_valid('999.local')) + self.assertTrue(v.is_valid('_foo.bar')) + self.assertTrue(v.is_valid('_foo.bar.domain')) + self.assertTrue(v.is_valid('trailing.dot.domain.')) + self.assertTrue(v.is_valid('.')) + self.assertFalse(v.is_valid('.com')) + self.assertFalse(v.is_valid('..')) + self.assertFalse(v.is_valid('foo..bar')) + # Label too long + domain = ('123456789-123456789-123456789-123456789-123456789-' + '123456789-1234.com') + self.assertFalse(v.is_valid(domain)) + domain = ('123456789-123456789-123456789-123456789-123456789-' + '123456789-12345678') + self.assertFalse(v.is_valid(domain)) + domain = ('123456789.123456789.123456789.123456789.123456789.' + '123456789.123456789.123456789.123456789.123456789.' + '123456789.123456789.123456789.123456789.123456789.' + '123456789.123456789.123456789.123456789.123456789.' + '123456789.123456789.123456789.123456789.123456789.' + 'aa.com') + self.assertEqual(len(domain), 256) + self.assertFalse(v.is_valid(domain)) + class TestDerivedTypes(base.TestCase): @@ -238,6 +267,7 @@ class TestDeviceTypes(base.TestCase): "defroute": False, "dhclient_args": "--foobar", "dns_servers": ["1.2.3.4"], + "domain": "openstack.local", "mtu": 1501, "ethtool_opts": "speed 1000 duplex full", "hotplug": True, diff --git a/releasenotes/notes/enable-setting-domain-5557e2441c23a5a5.yaml b/releasenotes/notes/enable-setting-domain-5557e2441c23a5a5.yaml new file mode 100644 index 00000000..394953ad --- /dev/null +++ b/releasenotes/notes/enable-setting-domain-5557e2441c23a5a5.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + A key called "domain" is now available for interfaces. This allows the + setting of a domain for an ifcfg configuration, which will aide DNS search.