From c0fff0b7e7d670787662e683a96acf673ec5f6ec Mon Sep 17 00:00:00 2001 From: asarfaty Date: Wed, 27 May 2020 15:55:51 +0200 Subject: [PATCH] Support LB rule changes by name suffix In some cases the full name is unknown but a significant suffix is know and can be used to identify the correct rule. Change-Id: Id1ce82e0dd4c91f56f83c1976e3ce3e528d685da --- .../tests/unit/v3/policy/test_lb_resources.py | 61 +++++++++++++++++++ vmware_nsxlib/v3/policy/lb_resources.py | 40 ++++++++++-- 2 files changed, 97 insertions(+), 4 deletions(-) diff --git a/vmware_nsxlib/tests/unit/v3/policy/test_lb_resources.py b/vmware_nsxlib/tests/unit/v3/policy/test_lb_resources.py index ee16e875..d34da03f 100644 --- a/vmware_nsxlib/tests/unit/v3/policy/test_lb_resources.py +++ b/vmware_nsxlib/tests/unit/v3/policy/test_lb_resources.py @@ -1143,6 +1143,36 @@ class TestPolicyLBVirtualServer(test_resources.NsxPolicyLibTestCase): {'display_name': 'xx', 'actions': '22'}]) self.assert_called_with_def(update_call, expected_def) + def test_update_lb_rule_suffix(self): + vs_obj_id = '111' + vs_name = 'name-name' + with self.mock_get( + vs_obj_id, vs_name, + rules=[{'display_name': 'xx_with_suffix', 'actions': '11'}, + {'display_name': 'yy'}]), \ + self.mock_create_update() as update_call: + self.resourceApi.update_lb_rule( + vs_obj_id, 'xx', actions='22', + compare_name_suffix='suffix') + + expected_def = lb_defs.LBVirtualServerDef( + virtual_server_id=vs_obj_id, + rules=[{'display_name': 'xx', 'actions': '22'}, + {'display_name': 'yy'}]) + self.assert_called_with_def(update_call, expected_def) + + def test_update_lb_rule_wrong_suffix(self): + vs_obj_id = '111' + vs_name = 'name-name' + with self.mock_get( + vs_obj_id, vs_name, + rules=[{'display_name': 'xx_with_suffix', 'actions': '11'}, + {'display_name': 'yy'}]): + self.assertRaises(nsxlib_exc.ResourceNotFound, + self.resourceApi.update_lb_rule, + vs_obj_id, 'xx', actions='22', + compare_name_suffix='bad') + def test_remove_lb_rule(self): vs_obj_id = '111' vs_name = 'name-name' @@ -1157,6 +1187,37 @@ class TestPolicyLBVirtualServer(test_resources.NsxPolicyLibTestCase): rules=[{'display_name': 'yy'}]) self.assert_called_with_def(update_call, expected_def) + def test_remove_lb_rule_by_suffix(self): + vs_obj_id = '111' + vs_name = 'name-name' + with self.mock_get(vs_obj_id, vs_name, + rules=[{'display_name': 'xx_with_suffix'}, + {'display_name': 'yy'}]), \ + self.mock_create_update() as update_call: + self.resourceApi.remove_lb_rule(vs_obj_id, 'with_suffix', + check_name_suffix=True) + + expected_def = lb_defs.LBVirtualServerDef( + virtual_server_id=vs_obj_id, + rules=[{'display_name': 'yy'}]) + self.assert_called_with_def(update_call, expected_def) + + def test_remove_lb_rule_wrong_suffix(self): + vs_obj_id = '111' + vs_name = 'name-name' + with self.mock_get(vs_obj_id, vs_name, + rules=[{'display_name': 'xx_with_suffix'}, + {'display_name': 'yy'}]),\ + self.mock_create_update() as update_call: + self.resourceApi.remove_lb_rule(vs_obj_id, 'wrong_suffiX', + check_name_suffix=True) + + expected_def = lb_defs.LBVirtualServerDef( + virtual_server_id=vs_obj_id, + rules=[{'display_name': 'xx_with_suffix'}, + {'display_name': 'yy'}]) + self.assert_called_with_def(update_call, expected_def) + def test_wait_until_realized_fail(self): vs_id = 'test_vs' info = {'state': constants.STATE_UNREALIZED, diff --git a/vmware_nsxlib/v3/policy/lb_resources.py b/vmware_nsxlib/v3/policy/lb_resources.py index e7e3d19a..41885eb7 100644 --- a/vmware_nsxlib/v3/policy/lb_resources.py +++ b/vmware_nsxlib/v3/policy/lb_resources.py @@ -15,6 +15,7 @@ # import abc +import copy from oslo_log import log as logging import six @@ -892,9 +893,29 @@ class NsxPolicyLoadBalancerVirtualServerAPI(NsxPolicyResourceBase): vs_data=body, rules=lb_rules, tenant=tenant) + def update_lb_rules(self, virtual_server_id, rules, + tenant=constants.POLICY_INFRA_TENANT): + lbvs_def = self.entry_def( + virtual_server_id=virtual_server_id, + tenant=tenant) + lbvs_path = lbvs_def.get_resource_path() + + @utils.retry_upon_exception( + nsxlib_exc.StaleRevision, + max_attempts=self.policy_api.client.max_attempts) + def _update(): + # Get the current data of vs + lbvs_body = self.policy_api.get(lbvs_def) + lbvs_body['rules'] = copy.deepcopy(rules) + # Update the backend using PUT + self.policy_api.client.update(lbvs_path, lbvs_body) + + _update() + def update_lb_rule(self, virtual_server_id, lb_rule_name, actions=None, match_conditions=None, match_strategy=None, phase=None, position=-1, + compare_name_suffix=None, tenant=constants.POLICY_INFRA_TENANT): lb_rule = lb_defs.LBRuleDef( actions, match_conditions, lb_rule_name, match_strategy, phase) @@ -906,8 +927,13 @@ class NsxPolicyLoadBalancerVirtualServerAPI(NsxPolicyResourceBase): # Remove existing rule try: - rule_index = next(lb_rules.index(r) for r in lb_rules - if r.get('display_name') == lb_rule_name) + if compare_name_suffix: + rule_index = next(lb_rules.index(r) for r in lb_rules + if r.get('display_name', + '').endswith(compare_name_suffix)) + else: + rule_index = next(lb_rules.index(r) for r in lb_rules + if r.get('display_name') == lb_rule_name) except Exception: err_msg = (_("No resource in rules matched for values: " "%(values)s") % {'values': lb_rule_name}) @@ -926,13 +952,19 @@ class NsxPolicyLoadBalancerVirtualServerAPI(NsxPolicyResourceBase): rules=lb_rules, vs_data=body, tenant=tenant) def remove_lb_rule(self, virtual_server_id, lb_rule_name, + check_name_suffix=False, tenant=constants.POLICY_INFRA_TENANT): lbvs_def = self.entry_def(virtual_server_id=virtual_server_id, tenant=tenant) body = self.policy_api.get(lbvs_def) lb_rules = body.get('rules', []) - lb_rules = [r for r in lb_rules if (r.get('display_name') != - lb_rule_name)] + if check_name_suffix: + lb_rules = [r for r in lb_rules + if not r.get('display_name', '').endswith( + lb_rule_name)] + else: + lb_rules = [r for r in lb_rules + if r.get('display_name') != lb_rule_name] return self._update( virtual_server_id=virtual_server_id, vs_data=body, rules=lb_rules, tenant=tenant)