Config option to disable the DHCP functions

This patch adds a new config option ``enable_traditional_dhcp``,
if set False, neutron-server will disable:
* DHCP provisioning block
* DHCP scheduler API extension
* Network scheduling mechanism
* DHCP RPC/notification

Partially-Implements: bp/distributed-dhcp-for-ml2-ovs
Related-Bug: #1900934

Change-Id: Icfbfc9691c5cf837406ff4291b3e3ed4970b26ee
This commit is contained in:
LIU Yulong 2021-01-15 14:24:44 +08:00
parent cb64e3a19f
commit 8e3a83c213
6 changed files with 55 additions and 5 deletions

View File

@ -220,7 +220,7 @@ class DhcpAgentNotifyAPI(object):
enabled_agents = self._get_enabled_agents( enabled_agents = self._get_enabled_agents(
context, network, agents, method, payload) context, network, agents, method, payload)
if method == 'port_create_end': if method == 'port_create_end' and enabled_agents:
high_agent = enabled_agents.pop( high_agent = enabled_agents.pop(
random.randint(0, len(enabled_agents) - 1)) random.randint(0, len(enabled_agents) - 1))
self._notify_high_priority_agent( self._notify_high_priority_agent(

View File

@ -23,6 +23,7 @@ from neutron_lib.callbacks import resources
from neutron_lib import constants from neutron_lib import constants
from neutron_lib.db import api as db_api from neutron_lib.db import api as db_api
from neutron_lib import exceptions from neutron_lib import exceptions
from neutron_lib.exceptions import agent as agent_exc
from neutron_lib.plugins import directory from neutron_lib.plugins import directory
from neutron_lib.plugins import utils as p_utils from neutron_lib.plugins import utils as p_utils
from oslo_config import cfg from oslo_config import cfg
@ -88,6 +89,20 @@ class DhcpRpcCallback(object):
nets = plugin.list_active_networks_on_active_dhcp_agent( nets = plugin.list_active_networks_on_active_dhcp_agent(
context, host) context, host)
else: else:
# If no active DHCP agent or agent admin state is DOWN,
# return empty network list for RPC to avoid unexpected
# resource creation on remote host when the DHCP agent
# scheduler extension is not supported.
try:
agent = plugin._get_agent_by_type_and_host(
context, constants.AGENT_TYPE_DHCP, host)
except agent_exc.AgentNotFoundByTypeHost:
LOG.debug("DHCP Agent not found on host %s", host)
return []
if not agent.admin_state_up:
LOG.debug("DHCP Agent admin state is down on host %s", host)
return []
filters = dict(admin_state_up=[True]) filters = dict(admin_state_up=[True])
nets = plugin.get_networks(context, filters=filters) nets = plugin.get_networks(context, filters=filters)
return nets return nets

View File

@ -145,7 +145,14 @@ core_opts = [
"Setting to any positive integer means that on failure " "Setting to any positive integer means that on failure "
"the connection is retried that many times. " "the connection is retried that many times. "
"For example, setting to 3 means total attempts to " "For example, setting to 3 means total attempts to "
"connect will be 4.")) "connect will be 4.")),
cfg.BoolOpt('enable_traditional_dhcp', default=True,
help=_('If False, neutron-server will disable the following '
'DHCP-agent related functions:'
'1. DHCP provisioning block '
'2. DHCP scheduler API extension '
'3. Network scheduling mechanism '
'4. DHCP RPC/notification')),
] ]
core_cli_opts = [ core_cli_opts = [

View File

@ -22,12 +22,16 @@ from neutron_lib.api import extensions as api_extensions
from neutron_lib.api import faults from neutron_lib.api import faults
from neutron_lib.plugins import directory from neutron_lib.plugins import directory
from neutron_lib import rpc as n_rpc from neutron_lib import rpc as n_rpc
from oslo_config import cfg
from oslo_log import log as logging
from neutron.api import extensions from neutron.api import extensions
from neutron.api.v2 import resource from neutron.api.v2 import resource
from neutron import policy from neutron import policy
from neutron import wsgi from neutron import wsgi
LOG = logging.getLogger(__name__)
class NetworkSchedulerController(wsgi.Controller): class NetworkSchedulerController(wsgi.Controller):
def index(self, request, **kwargs): def index(self, request, **kwargs):
@ -126,3 +130,10 @@ def notify(context, action, network_id, agent_id):
info = {'id': agent_id, 'network_id': network_id} info = {'id': agent_id, 'network_id': network_id}
notifier = n_rpc.get_notifier('network') notifier = n_rpc.get_notifier('network')
notifier.info(context, action, {'agent': info}) notifier.info(context, action, {'agent': info})
def disable_extension_by_config(aliases):
if not cfg.CONF.enable_traditional_dhcp:
if 'dhcp_agent_scheduler' in aliases:
aliases.remove('dhcp_agent_scheduler')
LOG.info('Disabled dhcp_agent_scheduler extension.')

View File

@ -119,6 +119,7 @@ from neutron.db import securitygroups_rpc_base as sg_db_rpc
from neutron.db import segments_db from neutron.db import segments_db
from neutron.db import subnet_service_type_mixin from neutron.db import subnet_service_type_mixin
from neutron.db import vlantransparent_db from neutron.db import vlantransparent_db
from neutron.extensions import dhcpagentscheduler as dhcp_ext
from neutron.extensions import filter_validation from neutron.extensions import filter_validation
from neutron.extensions import vlantransparent from neutron.extensions import vlantransparent
from neutron.ipam import exceptions as ipam_exc from neutron.ipam import exceptions as ipam_exc
@ -239,6 +240,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
sg_rpc.disable_security_group_extension_by_config(aliases) sg_rpc.disable_security_group_extension_by_config(aliases)
vlantransparent._disable_extension_by_config(aliases) vlantransparent._disable_extension_by_config(aliases)
filter_validation._disable_extension_by_config(aliases) filter_validation._disable_extension_by_config(aliases)
dhcp_ext.disable_extension_by_config(aliases)
self._aliases = self._filter_extensions_by_mech_driver(aliases) self._aliases = self._filter_extensions_by_mech_driver(aliases)
return self._aliases return self._aliases
@ -288,6 +290,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
def _setup_dhcp(self): def _setup_dhcp(self):
"""Initialize components to support DHCP.""" """Initialize components to support DHCP."""
if not cfg.CONF.enable_traditional_dhcp:
return
self.network_scheduler = importutils.import_object( self.network_scheduler = importutils.import_object(
cfg.CONF.network_scheduler_driver cfg.CONF.network_scheduler_driver
) )
@ -366,9 +370,10 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
"""Initialize RPC notifiers for agents.""" """Initialize RPC notifiers for agents."""
self.ovo_notifier = ovo_rpc.OVOServerRpcInterface() self.ovo_notifier = ovo_rpc.OVOServerRpcInterface()
self.notifier = rpc.AgentNotifierApi(topics.AGENT) self.notifier = rpc.AgentNotifierApi(topics.AGENT)
self.agent_notifiers[const.AGENT_TYPE_DHCP] = ( if cfg.CONF.enable_traditional_dhcp:
dhcp_rpc_agent_api.DhcpAgentNotifyAPI() self.agent_notifiers[const.AGENT_TYPE_DHCP] = (
) dhcp_rpc_agent_api.DhcpAgentNotifyAPI()
)
@log_helpers.log_method_call @log_helpers.log_method_call
def start_rpc_listeners(self): def start_rpc_listeners(self):
@ -1375,6 +1380,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
raise psec_exc.PortSecurityAndIPRequiredForSecurityGroups() raise psec_exc.PortSecurityAndIPRequiredForSecurityGroups()
def _setup_dhcp_agent_provisioning_component(self, context, port): def _setup_dhcp_agent_provisioning_component(self, context, port):
if not cfg.CONF.enable_traditional_dhcp:
return
subnet_ids = [f['subnet_id'] for f in port['fixed_ips']] subnet_ids = [f['subnet_id'] for f in port['fixed_ips']]
if (db.is_dhcp_active_on_any_subnet(context, subnet_ids) and if (db.is_dhcp_active_on_any_subnet(context, subnet_ids) and
len(self.get_dhcp_agents_hosting_networks(context, len(self.get_dhcp_agents_hosting_networks(context,

View File

@ -0,0 +1,10 @@
---
other:
- |
Added a new config option ``enable_traditional_dhcp`` for neutron server,
if it is set to False, neutron server will disable DHCP provisioning
block, DHCP scheduler API extension, network scheduling mechanism and
DHCP RPC/notification. This option can be used with the
``dhcp`` extension of the OVS agent to enable distributed DHCP, or
for a deployment which needs
to disable the DHCP agent related functions permanently.