diff options
| author | Christian Poessinger <christian@poessinger.com> | 2022-03-03 18:15:32 +0100 | 
|---|---|---|
| committer | Christian Poessinger <christian@poessinger.com> | 2022-03-03 18:15:32 +0100 | 
| commit | 0e23fc10581cde7b31101990566f59eded826233 (patch) | |
| tree | b1fa32fb8c1e06039a92a29e472c358e6def9da8 | |
| parent | 0a67d4421e9e1de3995a934f7a41c66cd30ecb52 (diff) | |
| download | vyos-1x-0e23fc10581cde7b31101990566f59eded826233.tar.gz vyos-1x-0e23fc10581cde7b31101990566f59eded826233.zip | |
interface: T4203: switch to new recursive node_changed() implementation
| -rw-r--r-- | python/vyos/configdict.py | 42 | ||||
| -rwxr-xr-x | python/vyos/ifconfig/interface.py | 4 | 
2 files changed, 13 insertions, 33 deletions
| diff --git a/python/vyos/configdict.py b/python/vyos/configdict.py index aea22c0c9..b8f428c1c 100644 --- a/python/vyos/configdict.py +++ b/python/vyos/configdict.py @@ -136,7 +136,7 @@ def leaf_node_changed(conf, path):      return None -def node_changed(conf, path, key_mangling=None): +def node_changed(conf, path, key_mangling=None, recursive=False):      """      Check if a leaf node was altered. If it has been altered - values has been      changed, or it was added/removed, we will return the old value. If nothing @@ -146,7 +146,7 @@ def node_changed(conf, path, key_mangling=None):      D = get_config_diff(conf, key_mangling)      D.set_level(conf.get_level())      # get_child_nodes() will return dict_keys(), mangle this into a list with PEP448 -    keys = D.get_child_nodes_diff(path, expand_nodes=Diff.DELETE)['delete'].keys() +    keys = D.get_child_nodes_diff(path, expand_nodes=Diff.DELETE, recursive=recursive)['delete'].keys()      return list(keys)  def get_removed_vlans(conf, dict): @@ -444,13 +444,8 @@ def get_interface_dict(config, base, ifname=''):      if bond: dict.update({'is_bond_member' : bond})      # Check if any DHCP options changed which require a client restat -    for leaf_node in ['client-id', 'default-route-distance', 'host-name', -                 'no-default-route', 'vendor-class-id']: -        dhcp = leaf_node_changed(config, ['dhcp-options', leaf_node]) -        if dhcp: -            dict.update({'dhcp_options_old' : dhcp}) -            # one option is suffiecient to set 'dhcp_options_old' key -            break +    dhcp = node_changed(config, ['dhcp-options'], recursive=True) +    if dhcp: dict.update({'dhcp_options_changed' : ''})      # Some interfaces come with a source_interface which must also not be part      # of any other bond or bridge interface as it is exclusivly assigned as the @@ -506,13 +501,8 @@ def get_interface_dict(config, base, ifname=''):          if bridge: dict['vif'][vif].update({'is_bridge_member' : bridge})          # Check if any DHCP options changed which require a client restat -        for leaf_node in ['client-id', 'default-route-distance', 'host-name', -                     'no-default-route', 'vendor-class-id']: -            dhcp = leaf_node_changed(config, ['vif', vif, 'dhcp-options', leaf_node]) -            if dhcp: -                dict['vif'][vif].update({'dhcp_options_old' : dhcp}) -                # one option is suffiecient to set 'dhcp_options_old' key -                break +        dhcp = node_changed(config, ['vif', vif, 'dhcp-options'], recursive=True) +        if dhcp: dict['vif'][vif].update({'dhcp_options_changed' : ''})      for vif_s, vif_s_config in dict.get('vif_s', {}).items():          default_vif_s_values = defaults(base + ['vif-s']) @@ -547,13 +537,8 @@ def get_interface_dict(config, base, ifname=''):          if bridge: dict['vif_s'][vif_s].update({'is_bridge_member' : bridge})          # Check if any DHCP options changed which require a client restat -        for leaf_node in ['client-id', 'default-route-distance', 'host-name', -                     'no-default-route', 'vendor-class-id']: -            dhcp = leaf_node_changed(config, ['vif-s', vif_s, 'dhcp-options', leaf_node]) -            if dhcp: -                dict['vif_s'][vif_s].update({'dhcp_options_old' : dhcp}) -                # one option is suffiecient to set 'dhcp_options_old' key -                break +        dhcp = node_changed(config, ['vif-s', vif_s, 'dhcp-options'], recursive=True) +        if dhcp: dict['vif_s'][vif_s].update({'dhcp_options_changed' : ''})          for vif_c, vif_c_config in vif_s_config.get('vif_c', {}).items():              default_vif_c_values = defaults(base + ['vif-s', 'vif-c']) @@ -589,14 +574,9 @@ def get_interface_dict(config, base, ifname=''):                  {'is_bridge_member' : bridge})              # Check if any DHCP options changed which require a client restat -            for leaf_node in ['client-id', 'default-route-distance', 'host-name', -                         'no-default-route', 'vendor-class-id']: -                dhcp = leaf_node_changed(config, ['vif-s', vif_s, 'vif-c', vif_c, -                                                  'dhcp-options', leaf_node]) -                if dhcp: -                    dict['vif_s'][vif_s]['vif_c'][vif_c].update({'dhcp_options_old' : dhcp}) -                    # one option is suffiecient to set 'dhcp_options_old' key -                    break +            dhcp = leaf_node_changed(config, ['vif-s', vif_s, 'vif-c', vif_c, +                                              'dhcp-options'], recursive=True) +            if dhcp: dict['vif_s'][vif_s]['vif_c'][vif_c].update({'dhcp_options_changed' : ''})      # Check vif, vif-s/vif-c VLAN interfaces for removal      dict = get_removed_vlans(config, dict) diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py index cf1887bf6..8c5ff576e 100755 --- a/python/vyos/ifconfig/interface.py +++ b/python/vyos/ifconfig/interface.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 VyOS maintainers and contributors <maintainers@vyos.io> +# Copyright 2019-2022 VyOS maintainers and contributors <maintainers@vyos.io>  #  # This library is free software; you can redistribute it and/or  # modify it under the terms of the GNU Lesser General Public @@ -1250,7 +1250,7 @@ class Interface(Control):              # the old lease is released a new one is acquired (T4203). We will              # only restart DHCP client if it's option changed, or if it's not              # running, but it should be running (e.g. on system startup) -            if 'dhcp_options_old' in self._config or not is_systemd_service_active(systemd_service): +            if 'dhcp_options_changed' in self._config or not is_systemd_service_active(systemd_service):                  return self._cmd(f'systemctl restart {systemd_service}')              return None          else: | 
