Add ability to specify multiple search domains

Especially when deploying in an environment where we are deploying
into a subdomain, we need the ability to specify multiple search
domains to be added to /etc/resolv.conf.

Related-Bug: #1828854
Change-Id: I45231fc53c24e1aad3f4a0026696954096430586
(cherry picked from commit 98e561a4d2)
This commit is contained in:
Ade Lee 2019-04-09 13:37:40 -04:00
parent 14690ffc1b
commit 580cce3cd8
4 changed files with 79 additions and 23 deletions

View File

@ -589,7 +589,10 @@ class IfcfgNetConfig(os_net_config.NetConfig):
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
if type(base_opt.domain) == list:
data += "DOMAIN=\"%s\"\n" % ' '.join(base_opt.domain)
else:
data += "DOMAIN=%s\n" % base_opt.domain
return data
def _add_routes(self, interface_name, routes=[]):

View File

@ -117,6 +117,14 @@ definitions:
pattern: >-
^(?=^.{1,255}$)(?!.*\.\..*)(.{1,63}\.)+(.{0,63}\.?)|(?!\.)(?!.*\.\..*)(^.{1,63}$)|(^\.$)$
list_of_domain_name_string_or_domain_name_string:
oneOf:
- type: array
items:
$ref: "#/definitions/domain_name_string"
minItems: 0
- $ref: "#/definitions/domain_name_string"
# os-net-config derived types
address:
type: object
@ -243,7 +251,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -292,7 +300,7 @@ definitions:
link_mode:
$ref: "#/definitions/sriov_link_mode_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -352,7 +360,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- device
@ -400,7 +408,7 @@ definitions:
ovs_extra:
$ref: "#/definitions/ovs_extra_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- vlan_id
@ -457,7 +465,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -514,7 +522,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -567,7 +575,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -617,7 +625,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -666,7 +674,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -716,7 +724,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -774,7 +782,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -818,7 +826,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -861,7 +869,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
members:
type: array
items:
@ -1013,7 +1021,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -1063,7 +1071,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -1111,7 +1119,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name
@ -1155,7 +1163,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- members
@ -1198,7 +1206,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- vlan_id
@ -1244,7 +1252,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- options
@ -1288,7 +1296,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- vlan_id
@ -1331,7 +1339,7 @@ definitions:
onboot:
$ref: "#/definitions/bool_or_param"
domain:
$ref: "#/definitions/domain_name_string"
$ref: "#/definitions/list_of_domain_name_string_or_domain_name_string"
required:
- type
- name

View File

@ -1143,7 +1143,7 @@ DNS2=5.6.7.8
"""
self.assertEqual(em1_config, self.get_interface_config('em1'))
def test_interface_domain(self):
def test_interface_single_domain(self):
interface1 = objects.Interface('em1', dns_servers=['1.2.3.4'],
domain='openstack.local')
self.provider.add_interface(interface1)
@ -1155,6 +1155,38 @@ NM_CONTROLLED=no
BOOTPROTO=none
DNS1=1.2.3.4
DOMAIN=openstack.local
"""
self.assertEqual(em1_config, self.get_interface_config('em1'))
def test_interface_single_domain_in_list(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'))
def test_interface_multiple_domains(self):
interface1 = objects.Interface(
'em1',
dns_servers=['1.2.3.4'],
domain=['openstack.local', 'subdomain.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 subdomain.openstack.local"
"""
self.assertEqual(em1_config, self.get_interface_config('em1'))

View File

@ -259,6 +259,19 @@ class TestInterface(base.TestCase):
interface1 = objects.object_from_json(json.loads(data))
self.assertEqual("openstack.local", interface1.domain)
def test_from_json_domain_list(self):
data = """{
"type": "interface",
"name": "em1",
"use_dhcp": true,
"domain": ["openstack.local", "subdomain.openstack.local"]
}
"""
interface1 = objects.object_from_json(json.loads(data))
self.assertEqual(
["openstack.local", "subdomain.openstack.local"],
interface1.domain)
def test_from_json_dhcp_nic1(self):
def dummy_mapped_nics(nic_mapping=None):
return {"nic1": "em3"}