Skip to content

Commit 1d5782f

Browse files
edarzinscaphrim007
authored andcommitted
Handle rule descriptions according to BIG-IP version (#1308)
* Handle rule descriptions according to BIG-IP version Issues: Fixes #1307 Problem: The 'description' parameter does not exist in policy rules prior to BIG-IP v12.1.0. Attempting to set the rule description for these earlier BIG-IP versions results in an error response. Analysis: If the BIG-IP version is earlier than v12.1.0, strip the description from policy rule. Tests: test_rules_description (f5/bigip/tm/ltm/test/functional/test_policy.py) * Resolve code-review issues Created a metadata entry to denote the optional policy parameters and created a helper function to filter out these version-specific optionals.
1 parent 694d0a7 commit 1d5782f

2 files changed

Lines changed: 73 additions & 0 deletions

File tree

f5/bigip/tm/ltm/policy.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636
from f5.sdk_exception import OperationNotSupportedOnPublishedPolicy
3737

3838
from distutils.version import LooseVersion
39+
import logging
40+
41+
logger = logging.getLogger(__name__)
3942

4043

4144
class Policys(Collection):
@@ -56,6 +59,24 @@ def __init__(self, policy_s):
5659
self._meta_data['required_creation_parameters'].update(('strategy',))
5760
temp = {'tm:ltm:policy:rules:rulescollectionstate': Rules_s}
5861
self._meta_data['attribute_registry'] = temp
62+
self._meta_data['optional_parameters'] = {'rules': ['description']}
63+
64+
def _filter_version_specific_options(self, tmos_ver, **kwargs):
65+
'''Filter version-specific optional parameters
66+
67+
Some optional parameters only exist in v12.1.0 and greater,
68+
filter these out for earlier versions to allow backward comatibility.
69+
'''
70+
71+
if LooseVersion(tmos_ver) < LooseVersion('12.1.0'):
72+
for k, parms in self._meta_data['optional_parameters'].items():
73+
for r in kwargs.get(k, []):
74+
for parm in parms:
75+
value = r.pop(parm, None)
76+
if value is not None:
77+
logger.info(
78+
"Policy parameter %s:%s is invalid for v%s",
79+
k, parm, tmos_ver)
5980

6081
def _create(self, **kwargs):
6182
'''Allow creation of draft policy and ability to publish a draft
@@ -69,6 +90,7 @@ def _create(self, **kwargs):
6990
tmos_ver = self._meta_data['bigip']._meta_data['tmos_version']
7091
legacy = kwargs.pop('legacy', False)
7192
publish = kwargs.pop('publish', False)
93+
self._filter_version_specific_options(tmos_ver, **kwargs)
7294
if LooseVersion(tmos_ver) < LooseVersion('12.1.0'):
7395
return super(Policy, self)._create(**kwargs)
7496
else:
@@ -94,6 +116,7 @@ def _modify(self, **patch):
94116

95117
legacy = patch.pop('legacy', False)
96118
tmos_ver = self._meta_data['bigip']._meta_data['tmos_version']
119+
self._filter_version_specific_options(tmos_ver, **patch)
97120
if 'Drafts' not in self._meta_data['uri'] and \
98121
LooseVersion(tmos_ver) >= LooseVersion('12.1.0') and \
99122
not legacy:
@@ -110,6 +133,7 @@ def _update(self, **kwargs):
110133

111134
legacy = kwargs.pop('legacy', False)
112135
tmos_ver = self._meta_data['bigip']._meta_data['tmos_version']
136+
self._filter_version_specific_options(tmos_ver, **kwargs)
113137
if 'Drafts' not in self._meta_data['uri'] and \
114138
LooseVersion(tmos_ver) >= LooseVersion('12.1.0') and \
115139
not legacy:

f5/bigip/tm/ltm/test/functional/test_policy.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ def teardown_policy():
3838
kw = copy.deepcopy(kwargs)
3939
kw.pop('legacy', None)
4040
kw.pop('publish', None)
41+
kw.pop('rules', None)
4142
if mgmt_root.tm.ltm.policys.policy.exists(
4243
name=name, partition=partition, **kw):
4344
pol = mgmt_root.tm.ltm.policys.policy.load(
@@ -139,6 +140,30 @@ def test_policy_update_modify_update(self, setup, request, mgmt_root):
139140
pol1.modify(legacy=True, rules=[])
140141
pol1.modify(legacy=False, rules=[])
141142

143+
def test_rules_description(self, setup, request, mgmt_root):
144+
rules = [
145+
dict(
146+
name='rule1',
147+
ordinal=0,
148+
actions=[],
149+
conditions=[],
150+
description='This is a rule description')
151+
]
152+
pol, pc = setup_policy_test(request, mgmt_root, 'Common', 'desctest',
153+
rules=rules, legacy=True)
154+
rule = pol.rules_s.rules.load(name='rule1')
155+
hasattr(rule, 'description') is False
156+
157+
rules[0]['description'] = 'Updated description'
158+
pol.update(legacy=True, rules=rules)
159+
rule = pol.rules_s.rules.load(name='rule1')
160+
hasattr(rule, 'description') is False
161+
162+
rules[0]['description'] = 'Modified description'
163+
pol.modify(legacy=True, rules=rules)
164+
rule = pol.rules_s.rules.load(name='rule1')
165+
hasattr(rule, 'description') is False
166+
142167
def test_policy_update_race(self, setup, request, mgmt_root):
143168
full_pol_dict = json.load(
144169
open(os.path.join(CURDIR, 'full_policy.json')))
@@ -317,6 +342,30 @@ def test_policy_update_race(self, setup, request, mgmt_root):
317342
pol.update(**empty_pol_dict)
318343
assert pol.rules_s.rules.exists(name='test_rule') is False
319344

345+
def test_rules_description(self, setup, request, mgmt_root):
346+
rules = [
347+
dict(
348+
name='rule1',
349+
ordinal=0,
350+
actions=[],
351+
conditions=[],
352+
description='This is a rule description')
353+
]
354+
pol, pc = setup_policy_test(request, mgmt_root, 'Common', 'desctest',
355+
rules=rules, legacy=True)
356+
rule = pol.rules_s.rules.load(name='rule1')
357+
assert rule.description == 'This is a rule description'
358+
359+
rules[0]['description'] = 'Updated description'
360+
pol.update(legacy=True, rules=rules)
361+
rule = pol.rules_s.rules.load(name='rule1')
362+
assert rule.description == 'Updated description'
363+
364+
rules[0]['description'] = 'Modified description'
365+
pol.modify(legacy=True, rules=rules)
366+
rule = pol.rules_s.rules.load(name='rule1')
367+
assert rule.description == 'Modified description'
368+
320369
def test_rules_nonextant_on_load(self, setup, request, mgmt_root):
321370
pol, pc = setup_policy_test(request, mgmt_root, 'Common', 'racetest',
322371
subPath='Drafts')

0 commit comments

Comments
 (0)