summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2022-02-22 07:53:43 +0100
committerChristian Poessinger <christian@poessinger.com>2022-02-22 07:53:43 +0100
commitf73362462ea097757b7b8ed3a7338ef950160edc (patch)
tree4dacb68b1144479e621ad6adaaaad579a527850e
parent055841e88ea43012d6017a4c9341dce6c17f887e (diff)
downloadvyos-1x-f73362462ea097757b7b8ed3a7338ef950160edc.tar.gz
vyos-1x-f73362462ea097757b7b8ed3a7338ef950160edc.zip
Revert "backport: policy: T4151: remove all previous rules on edit"
This reverts commit b71a04811bd61e1faf2bc4eaceaaae8bdbf97dc6.
-rwxr-xr-xsmoketest/scripts/cli/test_policy.py37
-rwxr-xr-xsrc/conf_mode/policy-local-route.py47
2 files changed, 9 insertions, 75 deletions
diff --git a/smoketest/scripts/cli/test_policy.py b/smoketest/scripts/cli/test_policy.py
index c9d178554..8d6a69a77 100755
--- a/smoketest/scripts/cli/test_policy.py
+++ b/smoketest/scripts/cli/test_policy.py
@@ -981,43 +981,6 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.assertEqual(sort_ip(tmp), original)
self.assertEqual(sort_ip(tmp_v6), original_v6)
- # Test multiple commits ipv4
- def test_multiple_commit_ipv4_table_id(self):
- path = base_path + ['local-route']
-
- sources = ['192.0.2.1', '192.0.2.2']
- destination = '203.0.113.25'
- rule = '105'
- table = '151'
- self.cli_set(path + ['rule', rule, 'set', 'table', table])
- for src in sources:
- self.cli_set(path + ['rule', rule, 'source', src])
-
- self.cli_commit()
-
- # Check generated configuration
- # Expected values
- original_first = """
- 105: from 192.0.2.1 lookup 151
- 105: from 192.0.2.2 lookup 151
- """
- tmp = cmd('ip rule show prio 105')
-
- self.assertEqual(sort_ip(tmp), sort_ip(original_first))
-
- # Create second commit with added destination
- self.cli_set(path + ['rule', rule, 'destination', destination])
- self.cli_commit()
-
- original_second = """
- 105: from 192.0.2.1 to 203.0.113.25 lookup 151
- 105: from 192.0.2.2 to 203.0.113.25 lookup 151
- """
- tmp = cmd('ip rule show prio 105')
-
- self.assertEqual(sort_ip(tmp), sort_ip(original_second))
-
-
def sort_ip(output):
return output.splitlines().sort()
diff --git a/src/conf_mode/policy-local-route.py b/src/conf_mode/policy-local-route.py
index c4bef3414..1fcd3db2e 100755
--- a/src/conf_mode/policy-local-route.py
+++ b/src/conf_mode/policy-local-route.py
@@ -69,47 +69,20 @@ def get_config(config=None):
# delete policy local-route rule x fwmark x
# delete policy local-route rule x destination x.x.x.x
if 'rule' in pbr[route]:
- for rule, rule_config in pbr[route]['rule'].items():
+ for rule in pbr[route]['rule']:
src = leaf_node_changed(conf, base_rule + [rule, 'source'])
fwmk = leaf_node_changed(conf, base_rule + [rule, 'fwmark'])
dst = leaf_node_changed(conf, base_rule + [rule, 'destination'])
- # keep track of changes in configuration
- # otherwise we might remove an existing node although nothing else has changed
- changed = False
rule_def = {}
- # src is None if there are no changes to src
- if src is None:
- # if src hasn't changed, include it in the removal selector
- # if a new selector is added, we have to remove all previous rules without this selector
- # to make sure we remove all previous rules with this source(s), it will be included
- if 'source' in rule_config:
- rule_def = dict_merge({'source': rule_config['source']}, rule_def)
- else:
- # if src is not None, it's previous content will be returned
- # this can be an empty array if it's just being set, or the previous value
- # either way, something has to be changed and we only want to remove previous values
- changed = True
- # set the old value for removal if it's not empty
- if len(src) > 0:
- rule_def = dict_merge({'source' : src}, rule_def)
- if fwmk is None:
- if 'fwmark' in rule_config:
- rule_def = dict_merge({'fwmark': rule_config['fwmark']}, rule_def)
- else:
- changed = True
- if len(fwmk) > 0:
- rule_def = dict_merge({'fwmark' : fwmk}, rule_def)
- if dst is None:
- if 'destination' in rule_config:
- rule_def = dict_merge({'destination': rule_config['destination']}, rule_def)
- else:
- changed = True
- if len(dst) > 0:
- rule_def = dict_merge({'destination' : dst}, rule_def)
- if changed:
- dict = dict_merge({dict_id : {rule : rule_def}}, dict)
- pbr.update(dict)
+ if src:
+ rule_def = dict_merge({'source' : src}, rule_def)
+ if fwmk:
+ rule_def = dict_merge({'fwmark' : fwmk}, rule_def)
+ if dst:
+ rule_def = dict_merge({'destination' : dst}, rule_def)
+ dict = dict_merge({dict_id : {rule : rule_def}}, dict)
+ pbr.update(dict)
return pbr
@@ -143,8 +116,6 @@ def apply(pbr):
if not pbr:
return None
- print(pbr)
-
# Delete old rule if needed
for rule_rm in ['rule_remove', 'rule6_remove']:
if rule_rm in pbr: