diff options
| author | Daniil Baturin <daniil@vyos.io> | 2023-10-12 15:35:54 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-12 15:35:54 +0100 | 
| commit | e55f0793234975e0fb69f6121945e9556556ea44 (patch) | |
| tree | a801faafdfec6e284be72a049d8bb174c3938b65 /python | |
| parent | 227e3f2876e504a4e3dc52b009d378b675e5ce51 (diff) | |
| parent | aa0282ceb379df1ab3cc93e4bd019134d37f0d89 (diff) | |
| download | vyos-1x-e55f0793234975e0fb69f6121945e9556556ea44.tar.gz vyos-1x-e55f0793234975e0fb69f6121945e9556556ea44.zip | |
Merge pull request #2277 from aapostoliuk/T5254-1-sagitta
bonding: T5254: Fixed changing ethernet when it is a bond member
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/ifconfig/bond.py | 13 | ||||
| -rw-r--r-- | python/vyos/ifconfig/ethernet.py | 34 | ||||
| -rw-r--r-- | python/vyos/utils/dict.py | 59 | 
3 files changed, 106 insertions, 0 deletions
| diff --git a/python/vyos/ifconfig/bond.py b/python/vyos/ifconfig/bond.py index d1d7d48c4..45e6e4c16 100644 --- a/python/vyos/ifconfig/bond.py +++ b/python/vyos/ifconfig/bond.py @@ -92,6 +92,19 @@ class BondIf(Interface):          }      }} +    @staticmethod +    def get_inherit_bond_options() -> list: +        """ +        Returns list of option +        which are inherited from bond interface to member interfaces +        :return: List of interface options +        :rtype: list +        """ +        options = [ +            'mtu' +        ] +        return options +      def remove(self):          """          Remove interface from operating system. Removing the interface diff --git a/python/vyos/ifconfig/ethernet.py b/python/vyos/ifconfig/ethernet.py index 285542057..aa1e87744 100644 --- a/python/vyos/ifconfig/ethernet.py +++ b/python/vyos/ifconfig/ethernet.py @@ -75,6 +75,40 @@ class EthernetIf(Interface):          },      }} +    @staticmethod +    def get_bond_member_allowed_options() -> list: +        """ +        Return list of options which are allowed for changing, +        when interface is a bond member +        :return: List of interface options +        :rtype: list +        """ +        bond_allowed_sections = [ +            'description', +            'disable', +            'disable_flow_control', +            'disable_link_detect', +            'duplex', +            'eapol.ca_certificate', +            'eapol.certificate', +            'eapol.passphrase', +            'mirror.egress', +            'mirror.ingress', +            'offload.gro', +            'offload.gso', +            'offload.lro', +            'offload.rfs', +            'offload.rps', +            'offload.sg', +            'offload.tso', +            'redirect', +            'ring_buffer.rx', +            'ring_buffer.tx', +            'speed', +            'hw_id' +        ] +        return bond_allowed_sections +      def __init__(self, ifname, **kargs):          super().__init__(ifname, **kargs)          self.ethtool = Ethtool(ifname) diff --git a/python/vyos/utils/dict.py b/python/vyos/utils/dict.py index 9484eacdd..d36b6fcfb 100644 --- a/python/vyos/utils/dict.py +++ b/python/vyos/utils/dict.py @@ -199,6 +199,31 @@ def dict_search_recursive(dict_object, key, path=[]):              for x in dict_search_recursive(j, key, new_path):                  yield x + +def dict_set(key_path, value, dict_object): +    """ Set value to Python dictionary (dict_object) using path to key delimited by dot (.). +        The key will be added if it does not exist. +    """ +    path_list = key_path.split(".") +    dynamic_dict = dict_object +    if len(path_list) > 0: +        for i in range(0, len(path_list)-1): +            dynamic_dict = dynamic_dict[path_list[i]] +        dynamic_dict[path_list[len(path_list)-1]] = value + +def dict_delete(key_path, dict_object): +    """ Delete key in Python dictionary (dict_object) using path to key delimited by dot (.). +    """ +    path_dict = dict_object +    path_list = key_path.split('.') +    inside = path_list[:-1] +    if not inside: +        del dict_object[path_list] +    else: +        for key in path_list[:-1]: +            path_dict = path_dict[key] +        del path_dict[path_list[len(path_list)-1]] +  def dict_to_list(d, save_key_to=None):      """ Convert a dict to a list of dicts. @@ -228,6 +253,39 @@ def dict_to_list(d, save_key_to=None):      return collect +def dict_to_paths_values(conf: dict) -> dict: +    """ +    Convert nested dictionary to simple dictionary, where key is a path is delimited by dot (.). +    """ +    list_of_paths = [] +    dict_of_options ={} +    for path in dict_to_key_paths(conf): +        str_path = '.'.join(path) +        list_of_paths.append(str_path) + +    for path in list_of_paths: +        dict_of_options[path] = dict_search(path,conf) + +    return dict_of_options +def dict_to_key_paths(d: dict) -> list: +    """ Generator to return list of key paths from dict of list[str]|str +    """ +    def func(d, path): +        if isinstance(d, dict): +            if not d: +                yield path +            for k, v in d.items(): +                for r in func(v, path + [k]): +                    yield r +        elif isinstance(d, list): +            yield path +        elif isinstance(d, str): +            yield path +        else: +            raise ValueError('object is not a dict of strings/list of strings') +    for r in func(d, []): +        yield r +  def dict_to_paths(d: dict) -> list:      """ Generator to return list of paths from dict of list[str]|str      """ @@ -305,3 +363,4 @@ class FixedDict(dict):          if k not in self._allowed:              raise ConfigError(f'Option "{k}" has no defined default')          super().__setitem__(k, v) + | 
