summaryrefslogtreecommitdiff
path: root/neutron/agent/ovn/metadata/agent.py
diff options
context:
space:
mode:
Diffstat (limited to 'neutron/agent/ovn/metadata/agent.py')
-rw-r--r--neutron/agent/ovn/metadata/agent.py46
1 files changed, 23 insertions, 23 deletions
diff --git a/neutron/agent/ovn/metadata/agent.py b/neutron/agent/ovn/metadata/agent.py
index 22d8ee78ab..182f137962 100644
--- a/neutron/agent/ovn/metadata/agent.py
+++ b/neutron/agent/ovn/metadata/agent.py
@@ -320,6 +320,12 @@ class MetadataAgent(object):
"br-int instead.")
return 'br-int'
+ def get_networks(self):
+ ports = self.sb_idl.get_ports_on_chassis(self.chassis)
+ return {(str(p.datapath.uuid),
+ ovn_utils.get_network_name_from_datapath(p.datapath))
+ for p in self._vif_ports(ports)}
+
@_sync_lock
def sync(self):
"""Agent sync.
@@ -328,16 +334,26 @@ class MetadataAgent(object):
chassis are serving metadata. Also, it will tear down those namespaces
which were serving metadata but are no longer needed.
"""
- metadata_namespaces = self.ensure_all_networks_provisioned()
+
+ # first, clean up namespaces that should no longer deploy
system_namespaces = tuple(
ns.decode('utf-8') if isinstance(ns, bytes) else ns
for ns in ip_lib.list_network_namespaces())
+ nets = self.get_networks()
+ metadata_namespaces = [
+ self._get_namespace_name(net[1])
+ for net in nets
+ ]
unused_namespaces = [ns for ns in system_namespaces if
ns.startswith(NS_PREFIX) and
ns not in metadata_namespaces]
for ns in unused_namespaces:
self.teardown_datapath(self._get_datapath_name(ns))
+ # now that all obsolete namespaces are cleaned up, deploy required
+ # networks
+ self.ensure_all_networks_provisioned(nets)
+
@staticmethod
def _get_veth_name(datapath):
return ['{}{}{}'.format(n_const.TAP_DEVICE_PREFIX,
@@ -431,8 +447,6 @@ class MetadataAgent(object):
and assign the IP addresses to the interface corresponding to the
metadata port of the network. It will also remove existing IP
addresses that are no longer needed.
-
- :return: The metadata namespace name of this datapath
"""
LOG.debug("Provisioning metadata for network %s", net_name)
port = self.sb_idl.get_metadata_port_network(datapath)
@@ -541,31 +555,17 @@ class MetadataAgent(object):
network_id=net_name)
self.update_chassis_metadata_networks(net_name)
- return namespace
- def ensure_all_networks_provisioned(self):
- """Ensure that all datapaths are provisioned.
+ def ensure_all_networks_provisioned(self, nets):
+ """Ensure that all requested datapaths are provisioned.
- This function will make sure that all datapaths with ports bound to
- our chassis have its namespace, VETH pair and OVS port created and
- metadata proxy is up and running.
-
- :return: A list with the namespaces that are currently serving
- metadata
+ This function will make sure that requested datapaths have their
+ namespaces, VETH pair and OVS ports created and metadata proxies are up
+ and running.
"""
- # Retrieve all VIF ports in our Chassis
- ports = self.sb_idl.get_ports_on_chassis(self.chassis)
- nets = {(str(p.datapath.uuid),
- ovn_utils.get_network_name_from_datapath(p.datapath))
- for p in self._vif_ports(ports)}
- namespaces = []
# Make sure that all those datapaths are serving metadata
for datapath, net_name in nets:
- netns = self.provision_datapath(datapath, net_name)
- if netns:
- namespaces.append(netns)
-
- return namespaces
+ self.provision_datapath(datapath, net_name)
# NOTE(lucasagomes): Even tho the metadata agent is a multi-process
# application, there's only one Southbound database IDL instance in