Blob Blame History Raw
From 69bed0e79bd951b4e5496cae6b3738649030b5ae Mon Sep 17 00:00:00 2001
From: Gris Ge <fge@redhat.com>
Date: Tue, 23 Jun 2020 20:28:30 +0800
Subject: [PATCH] ovs: Eliminate the repeat call of is_ovs_running()

The `validate_interface_capabilities()` is invoking `is_ovs_running()`
on every interface. Fixed by using `set()` for interface types for
duplicate types and also caching ovs daemon status.

The `NetworkManagerPlugin.get_interfaces()` is invoking
`is_ovs_running()` on every interface. Fixed by caching ovs daemon
status.

Signed-off-by: Gris Ge <fge@redhat.com>
---
 libnmstate/nm/plugin.py | 3 ++-
 libnmstate/validator.py | 5 +++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/libnmstate/nm/plugin.py b/libnmstate/nm/plugin.py
index 20fa77e..4032359 100644
--- a/libnmstate/nm/plugin.py
+++ b/libnmstate/nm/plugin.py
@@ -97,6 +97,7 @@ class NetworkManagerPlugin(NmstatePlugin):
 
     def get_interfaces(self):
         info = []
+        capabilities = self.capabilities
 
         devices_info = [
             (dev, nm_device.get_device_common_info(dev))
@@ -122,7 +123,7 @@ class NetworkManagerPlugin(NmstatePlugin):
             if nm_bond.is_bond_type_id(type_id):
                 bondinfo = nm_bond.get_bond_info(dev)
                 iface_info.update(_ifaceinfo_bond(bondinfo))
-            elif NmstatePlugin.OVS_CAPABILITY in self.capabilities:
+            elif NmstatePlugin.OVS_CAPABILITY in capabilities:
                 if nm_ovs.is_ovs_bridge_type_id(type_id):
                     iface_info["bridge"] = nm_ovs.get_ovs_info(
                         self.context, dev, devices_info
diff --git a/libnmstate/validator.py b/libnmstate/validator.py
index ee30166..02890b4 100644
--- a/libnmstate/validator.py
+++ b/libnmstate/validator.py
@@ -47,9 +47,10 @@ def validate_capabilities(state, capabilities):
 
 
 def validate_interface_capabilities(ifaces_state, capabilities):
-    ifaces_types = [iface_state.get("type") for iface_state in ifaces_state]
+    ifaces_types = {iface_state.get("type") for iface_state in ifaces_state}
     has_ovs_capability = NmstatePlugin.OVS_CAPABILITY in capabilities
     has_team_capability = NmstatePlugin.TEAM_CAPABILITY in capabilities
+    ovs_is_running = is_ovs_running()
     for iface_type in ifaces_types:
         is_ovs_type = iface_type in (
             InterfaceType.OVS_BRIDGE,
@@ -57,7 +58,7 @@ def validate_interface_capabilities(ifaces_state, capabilities):
             InterfaceType.OVS_PORT,
         )
         if is_ovs_type and not has_ovs_capability:
-            if not is_ovs_running():
+            if not ovs_is_running:
                 raise NmstateDependencyError(
                     "openvswitch service is not started."
                 )
-- 
2.27.0