Add a single option to override the default hypervisor name
Currently neutron uses socket.gethostname() to determine hypervisor
names, but this implementation is not fully compatible with libvirt
driver which uses canonical name for hypervisor name.
This incompatibility causes an issue with root resource provider
detection if a deployment uses FQDNs as canonicanl names.
This change introduces the resource_provider_default_hypervisor option,
so that users can override the hypervisor name by the single option(*1)
instead of setting two list options(*2). This is especially useful if
the deployment has multiple bridges or interfaces.
(*1)
[OVS]
resource_provider_bandwidths=br-data1:1024:1024,br-data2:1024:1024,\
br-data3:1024,1024,br-data4,1024:1024
resource_provider_default_hypervisor=compute0.mydomain
(*2)
[OVS]
resource_provider_bandwidths=br-data1:1024:1024,br-data2:1024:1024,\
br-data3:1024,1024,br-data4,1024:1024
resource_provider_hypervisors=br-data1:compute0.mydomain,br-data2:\
compute0.mydomain,br-data3:compute0.mydomain,br-data4:compute0.mydomain
Conflicts:
neutron/agent/common/utils.py
Related-Bug: #1926693
Change-Id: I692219200535df3af1265248e88c96947e4d8f9d
(cherry picked from commit ddf0fef28b
)
This commit is contained in:
parent
9a70d334cb
commit
83f7b3bdfd
@ -70,24 +70,27 @@ def is_agent_down(heart_beat_time):
|
||||
cfg.CONF.agent_down_time)
|
||||
|
||||
|
||||
def default_rp_hypervisors(hypervisors, device_mappings):
|
||||
def default_rp_hypervisors(hypervisors, device_mappings,
|
||||
default_hypervisor=None):
|
||||
"""Fill config option 'resource_provider_hypervisors' with defaults.
|
||||
|
||||
Default hypervisor names to socket.gethostname(). Since libvirt knows
|
||||
itself by the same name, the default is good for libvirt.
|
||||
Default hypervisor names to socket.gethostname() unless default_hypervisor
|
||||
is set.
|
||||
|
||||
:param hypervisors: Config option 'resource_provider_hypervisors'
|
||||
as parsed by oslo.config, that is a dict with keys of physical devices
|
||||
and values of hypervisor names.
|
||||
:param device_mappings: Device mappings standardized to the list-valued
|
||||
format.
|
||||
:param default_hypervisor: Default hypervisor hostname.
|
||||
"""
|
||||
default_hypervisor = socket.gethostname()
|
||||
_default_hypervisor = default_hypervisor or socket.gethostname()
|
||||
|
||||
rv = {}
|
||||
for _physnet, devices in device_mappings.items():
|
||||
for device in devices:
|
||||
if device in hypervisors:
|
||||
rv[device] = hypervisors[device]
|
||||
else:
|
||||
rv[device] = default_hypervisor
|
||||
rv[device] = _default_hypervisor
|
||||
return rv
|
||||
|
@ -65,8 +65,13 @@ sriov_nic_opts = [
|
||||
"hypervisor name is used to locate the parent of the "
|
||||
"resource provider tree. Only needs to be set in the "
|
||||
"rare case when the hypervisor name is different from "
|
||||
"the DEFAULT.host config option value as known by the "
|
||||
"nova-compute managing that hypervisor.")),
|
||||
"the resource_provider_default_hypervisor config "
|
||||
"option value as known by the nova-compute managing "
|
||||
"that hypervisor.")),
|
||||
cfg.StrOpt('resource_provider_default_hypervisor',
|
||||
help=_("The default hypervisor name used to locate the parent "
|
||||
"of the resource provider. If this option is not set, "
|
||||
"socket.gethostname() is used")),
|
||||
cfg.DictOpt('resource_provider_inventory_defaults',
|
||||
default={'allocation_ratio': 1.0,
|
||||
'min_unit': 1,
|
||||
|
@ -83,8 +83,13 @@ ovs_opts = [
|
||||
"hypervisor name is used to locate the parent of the "
|
||||
"resource provider tree. Only needs to be set in the "
|
||||
"rare case when the hypervisor name is different from "
|
||||
"the DEFAULT.host config option value as known by the "
|
||||
"nova-compute managing that hypervisor.")),
|
||||
"the resource_provider_default_hypervisor config "
|
||||
"option value as known by the nova-compute managing "
|
||||
"that hypervisor.")),
|
||||
cfg.StrOpt('resource_provider_default_hypervisor',
|
||||
help=_("The default hypervisor name used to locate the parent "
|
||||
"of the resource provider. If this option is not set, "
|
||||
"socket.gethostname() is used")),
|
||||
cfg.DictOpt('resource_provider_inventory_defaults',
|
||||
default={'allocation_ratio': 1.0,
|
||||
'min_unit': 1,
|
||||
|
@ -522,7 +522,8 @@ class SriovNicAgentConfigParser(object):
|
||||
cfg.CONF.SRIOV_NIC.resource_provider_inventory_defaults)
|
||||
self.rp_hypervisors = utils.default_rp_hypervisors(
|
||||
cfg.CONF.SRIOV_NIC.resource_provider_hypervisors,
|
||||
self.device_mappings
|
||||
self.device_mappings,
|
||||
cfg.CONF.SRIOV_NIC.resource_provider_default_hypervisor,
|
||||
)
|
||||
self._validate()
|
||||
|
||||
|
@ -233,7 +233,8 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin,
|
||||
ovs_conf.resource_provider_inventory_defaults)
|
||||
self.rp_hypervisors = utils.default_rp_hypervisors(
|
||||
ovs_conf.resource_provider_hypervisors,
|
||||
{k: [v] for k, v in self.bridge_mappings.items()}
|
||||
{k: [v] for k, v in self.bridge_mappings.items()},
|
||||
ovs_conf.resource_provider_default_hypervisor
|
||||
)
|
||||
|
||||
self.setup_physical_bridges(self.bridge_mappings)
|
||||
|
@ -89,6 +89,7 @@ class TestDefaultRpHypervisors(base.BaseTestCase):
|
||||
utils.default_rp_hypervisors(
|
||||
hypervisors={},
|
||||
device_mappings={'physnet0': ['eth0', 'eth1']},
|
||||
default_hypervisor=None,
|
||||
)
|
||||
)
|
||||
|
||||
@ -97,5 +98,24 @@ class TestDefaultRpHypervisors(base.BaseTestCase):
|
||||
utils.default_rp_hypervisors(
|
||||
hypervisors={'eth0': 'thathost'},
|
||||
device_mappings={'physnet0': ['eth0', 'eth1']},
|
||||
default_hypervisor=None,
|
||||
)
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
{'eth0': 'defaulthost', 'eth1': 'defaulthost'},
|
||||
utils.default_rp_hypervisors(
|
||||
hypervisors={},
|
||||
device_mappings={'physnet0': ['eth0', 'eth1']},
|
||||
default_hypervisor='defaulthost',
|
||||
)
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
{'eth0': 'thathost', 'eth1': 'defaulthost'},
|
||||
utils.default_rp_hypervisors(
|
||||
hypervisors={'eth0': 'thathost'},
|
||||
device_mappings={'physnet0': ['eth0', 'eth1']},
|
||||
default_hypervisor='defaulthost',
|
||||
)
|
||||
)
|
||||
|
@ -0,0 +1,9 @@
|
||||
---
|
||||
fixes:
|
||||
- |
|
||||
The new ``resource_provider_defualt_hypervisor`` option has been added,
|
||||
to replace the default hypervisor name to locates the root resource
|
||||
provider without giving a complete list of interfaces or bridges in
|
||||
the ``resource_provider_hypervisors`` option. This option is located in
|
||||
the ``[ovs]`` ini-section for ``ovs-agent`` and ``[sriov_nic]`` ini-section
|
||||
for ``sriov-agent``.
|
Loading…
Reference in New Issue
Block a user