From c62c67f413865c4fa5a8d07fb8033d587e730a85 Mon Sep 17 00:00:00 2001 From: Adrian Chiris Date: Wed, 19 Jun 2019 14:54:54 +0300 Subject: [PATCH] Add RPC method to get networks for L3 and DHCP agents - Added get_networks() RPC call for DHCP agent - Added get_networks() RPC call for L3 agent This change is required in order to support out of tree MultiInterfaceDriver and IPoIBInterfaceDriver interface drivers as they require information on the network a port is being plugged to. These RPCs will be passed as kwargs when loading the relevant interface driver. get_networks() keyword args map to the keyword arguments of: neutron.neutron_plugin_base_v2.NeutronPluginBaseV2.get_networks() Change-Id: I11d82380aad8655a4fdc9656737b912b16e2859b Partial-Bug: #1834176 --- neutron/agent/dhcp/agent.py | 15 +++++++++++++++ neutron/agent/l3/agent.py | 15 +++++++++++++++ neutron/api/rpc/handlers/dhcp_rpc.py | 12 +++++++++++- neutron/api/rpc/handlers/l3_rpc.py | 11 ++++++++++- 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/neutron/agent/dhcp/agent.py b/neutron/agent/dhcp/agent.py index 0ec9052ed7b..7ded9ed4b9d 100644 --- a/neutron/agent/dhcp/agent.py +++ b/neutron/agent/dhcp/agent.py @@ -717,6 +717,7 @@ class DhcpPluginApi(object): 1.1 - Added get_active_networks_info, create_dhcp_port, and update_dhcp_port methods. 1.5 - Added dhcp_ready_on_ports + 1.7 - Added get_networks """ @@ -781,6 +782,20 @@ class DhcpPluginApi(object): return cctxt.call(self.context, 'dhcp_ready_on_ports', port_ids=port_ids) + def get_networks(self, filters=None, fields=None): + """Get networks. + + :param filters: The filters to apply. + E.g {"id" : ["", ...]} + :param fields: A list of fields to collect, e.g ["id", "subnets"]. + :return: A list of NetModel where each object represent a network. + """ + + cctxt = self.client.prepare(version='1.7') + nets = cctxt.call(self.context, 'get_networks', filters=filters, + fields=fields) + return [dhcp.NetModel(net) for net in nets] + class NetworkCache(object): """Agent cache of the current network state.""" diff --git a/neutron/agent/l3/agent.py b/neutron/agent/l3/agent.py index f0e54ec00f7..6ebd9879aa4 100644 --- a/neutron/agent/l3/agent.py +++ b/neutron/agent/l3/agent.py @@ -112,6 +112,7 @@ class L3PluginApi(object): 1.9 - Added get_router_ids 1.10 Added update_all_ha_network_port_statuses 1.11 Added get_host_ha_router_count + 1.12 Added get_networks """ def __init__(self, topic, host): @@ -204,6 +205,20 @@ class L3PluginApi(object): cctxt = self.client.prepare(version='1.11') return cctxt.call(context, 'get_host_ha_router_count', host=self.host) + def get_networks(self, context, filters=None, fields=None): + """Get networks. + + :param context: Security context + :param filters: The filters to apply. + E.g {"id" : ["", ...]} + :param fields: A list of fields to collect, e.g ["id", "subnets"]. + :return: A list of dicts where each dict represent a network object. + """ + + cctxt = self.client.prepare(version='1.12') + return cctxt.call( + context, 'get_networks', filters=filters, fields=fields) + class RouterFactory(object): diff --git a/neutron/api/rpc/handlers/dhcp_rpc.py b/neutron/api/rpc/handlers/dhcp_rpc.py index 7f372039081..c109d44cbb4 100644 --- a/neutron/api/rpc/handlers/dhcp_rpc.py +++ b/neutron/api/rpc/handlers/dhcp_rpc.py @@ -70,10 +70,11 @@ class DhcpRpcCallback(object): # 1.6 - Removed get_active_networks. It's not used by reference # DHCP agent since Havana, so similar rationale for not bumping # the major version as above applies here too. + # 1.7 - Add get_networks target = oslo_messaging.Target( namespace=constants.RPC_NAMESPACE_DHCP_PLUGIN, - version='1.6') + version='1.7') def _get_active_networks(self, context, **kwargs): """Retrieve and return a list of the active networks.""" @@ -318,3 +319,12 @@ class DhcpRpcCallback(object): provisioning_blocks.provisioning_complete( context, port_id, resources.PORT, provisioning_blocks.DHCP_ENTITY) + + def get_networks(self, context, filters=None, fields=None): + """Retrieve and return a list of networks.""" + # NOTE(adrianc): This RPC is being used by out of tree interface + # drivers, MultiInterfaceDriver and IPoIBInterfaceDriver, located in + # networking-mlnx. + plugin = directory.get_plugin() + return plugin.get_networks( + context, filters=filters, fields=fields) diff --git a/neutron/api/rpc/handlers/l3_rpc.py b/neutron/api/rpc/handlers/l3_rpc.py index 8902acb45f6..fc79d7657e1 100644 --- a/neutron/api/rpc/handlers/l3_rpc.py +++ b/neutron/api/rpc/handlers/l3_rpc.py @@ -46,7 +46,8 @@ class L3RpcCallback(object): # 1.9 Added get_router_ids # 1.10 Added update_all_ha_network_port_statuses # 1.11 Added get_host_ha_router_count - target = oslo_messaging.Target(version='1.11') + # 1.12 Added get_networks + target = oslo_messaging.Target(version='1.12') @property def plugin(self): @@ -348,3 +349,11 @@ class L3RpcCallback(object): admin_ctx = neutron_context.get_admin_context() self.l3plugin.delete_floatingip_agent_gateway_port( admin_ctx, host, network_id) + + def get_networks(self, context, filters=None, fields=None): + """Retrieve and return a list of networks.""" + # NOTE(adrianc): This RPC is being used by out of tree interface + # drivers, MultiInterfaceDriver and IPoIBInterfaceDriver, located in + # networking-mlnx. + return self.plugin.get_networks( + context, filters=filters, fields=fields)