summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2020-08-23 14:22:41 +0200
committerChristian Poessinger <christian@poessinger.com>2020-08-23 14:22:41 +0200
commitaa25690c83c4812c92490d29b564dd0330b24d34 (patch)
tree15c5f45b5f82fd5b788c842caeba06d3d81d96f9 /python
parent20ef1aab793504cf4956dedeeadaf528933b7ccf (diff)
downloadvyos-1x-aa25690c83c4812c92490d29b564dd0330b24d34.tar.gz
vyos-1x-aa25690c83c4812c92490d29b564dd0330b24d34.zip
T2755: convert jmespath.search() to vyos_dict_search() for performance
Diffstat (limited to 'python')
-rw-r--r--python/vyos/configdict.py6
-rw-r--r--python/vyos/configverify.py9
-rw-r--r--python/vyos/ifconfig/bond.py6
-rw-r--r--python/vyos/ifconfig/bridge.py9
-rw-r--r--python/vyos/ifconfig/ethernet.py12
-rw-r--r--python/vyos/ifconfig/interface.py33
-rw-r--r--python/vyos/util.py2
7 files changed, 39 insertions, 38 deletions
diff --git a/python/vyos/configdict.py b/python/vyos/configdict.py
index c1e93955e..bd8624ced 100644
--- a/python/vyos/configdict.py
+++ b/python/vyos/configdict.py
@@ -17,7 +17,6 @@
A library for retrieving value dicts from VyOS configs in a declarative fashion.
"""
import os
-import jmespath
from enum import Enum
from copy import deepcopy
@@ -226,8 +225,9 @@ def get_interface_dict(config, base, ifname=''):
Will return a dictionary with the necessary interface configuration
"""
- from vyos.xml import defaults
+ from vyos.util import vyos_dict_search
from vyos.validate import is_member
+ from vyos.xml import defaults
if not ifname:
# determine tagNode instance
@@ -273,7 +273,7 @@ def get_interface_dict(config, base, ifname=''):
# XXX: T2636 workaround: convert string to a list with one element
if isinstance(eui64, str):
eui64 = [eui64]
- tmp = jmespath.search('ipv6.address', dict)
+ tmp = vyos_dict_search('ipv6.address', dict)
if not tmp:
dict.update({'ipv6': {'address': {'eui64_old': eui64}}})
else:
diff --git a/python/vyos/configverify.py b/python/vyos/configverify.py
index 264dd1c30..7e1930878 100644
--- a/python/vyos/configverify.py
+++ b/python/vyos/configverify.py
@@ -93,17 +93,18 @@ def verify_dhcpv6(config):
"""
if 'dhcpv6_options' in config:
from vyos.util import vyos_dict_search
+
if {'parameters_only', 'temporary'} <= set(config['dhcpv6_options']):
raise ConfigError('DHCPv6 temporary and parameters-only options '
'are mutually exclusive!')
# It is not allowed to have duplicate SLA-IDs as those identify an
# assigned IPv6 subnet from a delegated prefix
- for pd in vyos_dict_search(config, 'dhcpv6_options.pd'):
+ for pd in vyos_dict_search('dhcpv6_options.pd', config):
sla_ids = []
- for interface in vyos_dict_search(config, f'dhcpv6_options.pd.{pd}.interface'):
- sla_id = vyos_dict_search(config,
- f'dhcpv6_options.pd.{pd}.interface.{interface}.sla_id')
+ for interface in vyos_dict_search(f'dhcpv6_options.pd.{pd}.interface', config):
+ sla_id = vyos_dict_search(
+ f'dhcpv6_options.pd.{pd}.interface.{interface}.sla_id', config)
sla_ids.append(sla_id)
# Check for duplicates
diff --git a/python/vyos/ifconfig/bond.py b/python/vyos/ifconfig/bond.py
index 193cea321..64407401b 100644
--- a/python/vyos/ifconfig/bond.py
+++ b/python/vyos/ifconfig/bond.py
@@ -14,12 +14,12 @@
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
import os
-import jmespath
from vyos.ifconfig.interface import Interface
from vyos.ifconfig.vlan import VLAN
from vyos.util import cmd
+from vyos.util import vyos_dict_search
from vyos.validate import assert_list
from vyos.validate import assert_positive
@@ -336,7 +336,7 @@ class BondIf(Interface):
self.set_arp_ip_target('-' + addr)
# Add configured ARP target addresses
- value = jmespath.search('arp_monitor.target', config)
+ value = vyos_dict_search('arp_monitor.target', config)
if isinstance(value, str):
value = [value]
if value:
@@ -359,7 +359,7 @@ class BondIf(Interface):
if value: self.set_mode(value)
# Add (enslave) interfaces to bond
- value = jmespath.search('member.interface', config)
+ value = vyos_dict_search('member.interface', config)
if value:
for interface in value:
# if we've come here we already verified the interface
diff --git a/python/vyos/ifconfig/bridge.py b/python/vyos/ifconfig/bridge.py
index 466e6b682..4c76fe996 100644
--- a/python/vyos/ifconfig/bridge.py
+++ b/python/vyos/ifconfig/bridge.py
@@ -13,13 +13,12 @@
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
-import jmespath
-
from vyos.ifconfig.interface import Interface
from vyos.ifconfig.stp import STP
from vyos.validate import assert_boolean
from vyos.validate import assert_positive
from vyos.util import cmd
+from vyos.util import vyos_dict_search
@Interface.register
class BridgeIf(Interface):
@@ -223,18 +222,18 @@ class BridgeIf(Interface):
self.set_stp(value)
# enable or disable IGMP querier
- tmp = jmespath.search('igmp.querier', config)
+ tmp = vyos_dict_search('igmp.querier', config)
value = '1' if (tmp != None) else '0'
self.set_multicast_querier(value)
# remove interface from bridge
- tmp = jmespath.search('member.interface_remove', config)
+ tmp = vyos_dict_search('member.interface_remove', config)
if tmp:
for member in tmp:
self.del_port(member)
STPBridgeIf = STP.enable(BridgeIf)
- tmp = jmespath.search('member.interface', config)
+ tmp = vyos_dict_search('member.interface', config)
if tmp:
for interface, interface_config in tmp.items():
# if we've come here we already verified the interface
diff --git a/python/vyos/ifconfig/ethernet.py b/python/vyos/ifconfig/ethernet.py
index b2f701e00..17c1bd64d 100644
--- a/python/vyos/ifconfig/ethernet.py
+++ b/python/vyos/ifconfig/ethernet.py
@@ -15,12 +15,12 @@
import os
import re
-import jmespath
from vyos.ifconfig.interface import Interface
from vyos.ifconfig.vlan import VLAN
from vyos.validate import assert_list
from vyos.util import run
+from vyos.util import vyos_dict_search
@Interface.register
@VLAN.enable
@@ -268,27 +268,27 @@ class EthernetIf(Interface):
self.set_flow_control(value)
# GRO (generic receive offload)
- tmp = jmespath.search('offload_options.generic_receive', config)
+ tmp = vyos_dict_search('offload_options.generic_receive', config)
value = tmp if (tmp != None) else 'off'
self.set_gro(value)
# GSO (generic segmentation offload)
- tmp = jmespath.search('offload_options.generic_segmentation', config)
+ tmp = vyos_dict_search('offload_options.generic_segmentation', config)
value = tmp if (tmp != None) else 'off'
self.set_gso(value)
# scatter-gather option
- tmp = jmespath.search('offload_options.scatter_gather', config)
+ tmp = vyos_dict_search('offload_options.scatter_gather', config)
value = tmp if (tmp != None) else 'off'
self.set_sg(value)
# TSO (TCP segmentation offloading)
- tmp = jmespath.search('offload_options.udp_fragmentation', config)
+ tmp = vyos_dict_search('offload_options.udp_fragmentation', config)
value = tmp if (tmp != None) else 'off'
self.set_tso(value)
# UDP fragmentation offloading
- tmp = jmespath.search('offload_options.udp_fragmentation', config)
+ tmp = vyos_dict_search('offload_options.udp_fragmentation', config)
value = tmp if (tmp != None) else 'off'
self.set_ufo(value)
diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py
index 537c4bc2d..67ba973c4 100644
--- a/python/vyos/ifconfig/interface.py
+++ b/python/vyos/ifconfig/interface.py
@@ -34,6 +34,7 @@ from vyos.configdict import list_diff
from vyos.configdict import dict_merge
from vyos.template import render
from vyos.util import mac2eui64
+from vyos.util import vyos_dict_search
from vyos.validate import is_ipv4
from vyos.validate import is_ipv6
from vyos.validate import is_intf_addr_assigned
@@ -824,7 +825,7 @@ class Interface(Control):
lease_file = f'{config_base}_{ifname}.leases'
if enable and 'disable' not in self._config:
- if jmespath.search('dhcp_options.host_name', self._config) == None:
+ if vyos_dict_search('dhcp_options.host_name', self._config) == None:
# read configured system hostname.
# maybe change to vyos hostd client ???
hostname = 'vyos'
@@ -907,7 +908,7 @@ class Interface(Control):
# always ensure DHCPv6 client is stopped (when not configured as client
# for IPv6 address or prefix delegation
- dhcpv6pd = jmespath.search('dhcpv6_options.pd', config)
+ dhcpv6pd = vyos_dict_search('dhcpv6_options.pd', config)
if 'dhcpv6' not in new_addr or dhcpv6pd == None:
self.del_addr('dhcpv6')
@@ -935,59 +936,59 @@ class Interface(Control):
self.set_vrf(config.get('vrf', ''))
# Configure ARP cache timeout in milliseconds - has default value
- tmp = jmespath.search('ip.arp_cache_timeout', config)
+ tmp = vyos_dict_search('ip.arp_cache_timeout', config)
value = tmp if (tmp != None) else '30'
self.set_arp_cache_tmo(value)
# Configure ARP filter configuration
- tmp = jmespath.search('ip.disable_arp_filter', config)
+ tmp = vyos_dict_search('ip.disable_arp_filter', config)
value = '0' if (tmp != None) else '1'
self.set_arp_filter(value)
# Configure ARP accept
- tmp = jmespath.search('ip.enable_arp_accept', config)
+ tmp = vyos_dict_search('ip.enable_arp_accept', config)
value = '1' if (tmp != None) else '0'
self.set_arp_accept(value)
# Configure ARP announce
- tmp = jmespath.search('ip.enable_arp_announce', config)
+ tmp = vyos_dict_search('ip.enable_arp_announce', config)
value = '1' if (tmp != None) else '0'
self.set_arp_announce(value)
# Configure ARP ignore
- tmp = jmespath.search('ip.enable_arp_ignore', config)
+ tmp = vyos_dict_search('ip.enable_arp_ignore', config)
value = '1' if (tmp != None) else '0'
self.set_arp_ignore(value)
# Enable proxy-arp on this interface
- tmp = jmespath.search('ip.enable_proxy_arp', config)
+ tmp = vyos_dict_search('ip.enable_proxy_arp', config)
value = '1' if (tmp != None) else '0'
self.set_proxy_arp(value)
# Enable private VLAN proxy ARP on this interface
- tmp = jmespath.search('ip.proxy_arp_pvlan', config)
+ tmp = vyos_dict_search('ip.proxy_arp_pvlan', config)
value = '1' if (tmp != None) else '0'
self.set_proxy_arp_pvlan(value)
# IPv6 forwarding
- tmp = jmespath.search('ipv6.disable_forwarding', config)
+ tmp = vyos_dict_search('ipv6.disable_forwarding', config)
value = '0' if (tmp != None) else '1'
self.set_ipv6_forwarding(value)
# IPv6 router advertisements
- tmp = jmespath.search('ipv6.address.autoconf', config)
+ tmp = vyos_dict_search('ipv6.address.autoconf', config)
value = '2' if (tmp != None) else '1'
if 'dhcpv6' in new_addr:
value = '2'
self.set_ipv6_accept_ra(value)
# IPv6 address autoconfiguration
- tmp = jmespath.search('ipv6.address.autoconf', config)
+ tmp = vyos_dict_search('ipv6.address.autoconf', config)
value = '1' if (tmp != None) else '0'
self.set_ipv6_autoconf(value)
# IPv6 Duplicate Address Detection (DAD) tries
- tmp = jmespath.search('ipv6.dup_addr_detect_transmits', config)
+ tmp = vyos_dict_search('ipv6.dup_addr_detect_transmits', config)
value = tmp if (tmp != None) else '1'
self.set_ipv6_dad_messages(value)
@@ -996,7 +997,7 @@ class Interface(Control):
self.set_mtu(config.get('mtu'))
# Delete old IPv6 EUI64 addresses before changing MAC
- tmp = jmespath.search('ipv6.address.eui64_old', config)
+ tmp = vyos_dict_search('ipv6.address.eui64_old', config)
if tmp:
for addr in tmp:
self.del_ipv6_eui64_address(addr)
@@ -1011,7 +1012,7 @@ class Interface(Control):
self.set_mac(mac)
# Manage IPv6 link-local addresses
- tmp = jmespath.search('ipv6.address.no_default_link_local', config)
+ tmp = vyos_dict_search('ipv6.address.no_default_link_local', config)
# we must check explicitly for None type as if the key is set we will
# get an empty dict (<class 'dict'>)
if tmp is not None:
@@ -1020,7 +1021,7 @@ class Interface(Control):
self.add_ipv6_eui64_address('fe80::/64')
# Add IPv6 EUI-based addresses
- tmp = jmespath.search('ipv6.address.eui64', config)
+ tmp = vyos_dict_search('ipv6.address.eui64', config)
if tmp:
# XXX: T2636 workaround: convert string to a list with one element
if isinstance(tmp, str):
diff --git a/python/vyos/util.py b/python/vyos/util.py
index 4cc25764b..84aa16791 100644
--- a/python/vyos/util.py
+++ b/python/vyos/util.py
@@ -673,7 +673,7 @@ def find_device_file(device):
return None
-def vyos_dict_search(dict, path):
+def vyos_dict_search(path, dict):
""" Traverse Python dictionary (dict) delimited by dot (.).
Return value of key if found, None otherwise.