diff options
author | Christian Poessinger <christian@poessinger.com> | 2020-06-26 22:42:28 +0200 |
---|---|---|
committer | Christian Poessinger <christian@poessinger.com> | 2020-06-26 23:58:31 +0200 |
commit | 2f96eee421df9580b112bd1485624e7c9fbceca9 (patch) | |
tree | 4d5aaeb887263ccdd0a17324097759db035e6831 | |
parent | 323445d7f11abb0e7c2b3c88ca631a732e62c369 (diff) | |
download | vyos-1x-2f96eee421df9580b112bd1485624e7c9fbceca9.tar.gz vyos-1x-2f96eee421df9580b112bd1485624e7c9fbceca9.zip |
ifconfig: T2653: add common vyos.configverify helpers
While moving towards a general interface abstraction based on get_config_dict()
and the use of vyos.ifconfig.Interfaces().update() it also makes sense, to
split out common verification code to a common util file - instead of
duplicating the code, which is infact one of the main forces drivind this
transition.
vyos.configverify will hold common functions called via verify() from our
src/conf_mode scripts so we do not need to copy/paste general verifications
methods.
-rw-r--r-- | python/vyos/configverify.py | 67 | ||||
-rwxr-xr-x | src/conf_mode/interfaces-dummy.py | 29 |
2 files changed, 75 insertions, 21 deletions
diff --git a/python/vyos/configverify.py b/python/vyos/configverify.py new file mode 100644 index 000000000..64eb80728 --- /dev/null +++ b/python/vyos/configverify.py @@ -0,0 +1,67 @@ +# Copyright 2020 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 +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# 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/>. + +# The sole purpose of this module is to hold common functions used in +# all kinds of implementations to verify the CLI configuration. +# It is started by migrating the interfaces to the new get_config_dict() +# approach which will lead to a lot of code that can be reused. + +# NOTE: imports should be as local as possible to the function which +# makes use of it! + +def verify_bridge_vrf(config): + """ + Common helper function used by interface implementations to + perform recurring validation of VRF configuration + """ + from netifaces import interfaces + from vyos import ConfigError + + if 'vrf' in config.keys(): + if config['vrf'] not in interfaces(): + raise ConfigError('VRF "{vrf}" does not exist'.format(**config)) + + if 'is_bridge_member' in config.keys(): + raise ConfigError( + 'Interface "{ifname}" cannot be both a member of VRF "{vrf}" ' + 'and bridge "{is_bridge_member}"!'.format(**config)) + + +def verify_bridge_address(config): + """ + Common helper function used by interface implementations to + perform recurring validation of IP address assignmenr + when interface also is part of a bridge. + """ + from vyos import ConfigError + + if {'is_bridge_member', 'address'} <= set(config): + raise ConfigError( + f'Cannot assign address to interface "{ifname}" as it is a ' + f'member of bridge "{is_bridge_member}"!'.format(**config)) + + +def verify_bridge_delete(config): + """ + Common helper function used by interface implementations to + perform recurring validation of IP address assignmenr + when interface also is part of a bridge. + """ + from vyos import ConfigError + + if 'is_bridge_member' in config.keys(): + raise ConfigError( + 'Interface "{ifname}" cannot be deleted as it is a ' + 'member of bridge "{is_bridge_member}"!'.format(**config)) diff --git a/src/conf_mode/interfaces-dummy.py b/src/conf_mode/interfaces-dummy.py index e95635835..676211428 100755 --- a/src/conf_mode/interfaces-dummy.py +++ b/src/conf_mode/interfaces-dummy.py @@ -16,13 +16,16 @@ import os -from netifaces import interfaces from sys import exit from vyos.config import Config +from vyos.configverify import verify_bridge_vrf +from vyos.configverify import verify_bridge_address +from vyos.configverify import verify_bridge_delete from vyos.ifconfig import DummyIf from vyos.validate import is_member -from vyos import ConfigError, airbag +from vyos import ConfigError +from vyos import airbag airbag.enable() def get_config(): @@ -55,27 +58,11 @@ def get_config(): def verify(dummy): if dummy['deleted']: - if 'is_bridge_member' in dummy.keys(): - raise ConfigError( - 'Interface "{ifname}" cannot be deleted as it is a ' - 'member of bridge "{is_bridge_member}"!'.format(**dummy)) - + verify_bridge_delete(dummy) return None - if 'vrf' in dummy.keys(): - if dummy['vrf'] not in interfaces(): - raise ConfigError('VRF "{vrf}" does not exist'.format(**dummy)) - - if 'is_bridge_member' in dummy.keys(): - raise ConfigError( - 'Interface "{ifname}" cannot be both a member of VRF "{vrf}" ' - 'and bridge "{is_bridge_member}"!'.format(**dummy)) - - # check if both keys are part of the dictionary - if {'is_bridge_member', 'address'} <= set(dummy): - raise ConfigError( - f'Cannot assign address to interface "{ifname}" as it is a ' - f'member of bridge "{is_bridge_member}"!'.format(**dummy)) + verify_bridge_vrf(dummy) + verify_bridge_address(dummy) return None |