From 9d21329ea21d2b874bf111a0089d9a3f812f78b3 Mon Sep 17 00:00:00 2001 From: Kobi Samoray Date: Tue, 2 Aug 2016 15:49:13 +0300 Subject: [PATCH] NSXv: eliminate task use from NAT update Make NAT update calls synchronous Change-Id: Iacd363e6336b54563480ce11ccfe4c73d92c4f81 --- .../nsx_v/vshield/edge_appliance_driver.py | 56 +++++-------------- .../plugins/nsx_v/vshield/edge_utils.py | 7 +-- .../unit/nsx_v/vshield/test_vcns_driver.py | 11 +--- 3 files changed, 17 insertions(+), 57 deletions(-) diff --git a/vmware_nsx/plugins/nsx_v/vshield/edge_appliance_driver.py b/vmware_nsx/plugins/nsx_v/vshield/edge_appliance_driver.py index f2f60170d1..0ac32f0e71 100644 --- a/vmware_nsx/plugins/nsx_v/vshield/edge_appliance_driver.py +++ b/vmware_nsx/plugins/nsx_v/vshield/edge_appliance_driver.py @@ -598,37 +598,7 @@ class EdgeApplianceDriver(object): e.response) raise e - def _update_nat_rule(self, task): - # TODO(fank): use POST for optimization - # return rule_id for future reference - edge_id = task.userdata['edge_id'] - if task != self.updated_task['nat'][edge_id]: - # this task does not have the latest config, abort now - # for speedup - return task_constants.TaskStatus.ABORT - - rules = task.userdata['rules'] - LOG.debug("VCNS: start updating nat rules: %s", rules) - - nat = { - 'featureType': 'nat', - 'rules': { - 'natRulesDtos': rules - } - } - - try: - self.vcns.update_nat_config(edge_id, nat) - status = task_constants.TaskStatus.COMPLETED - except exceptions.VcnsApiException as e: - LOG.exception(_LE("VCNS: Failed to create snat rule:\n%s"), - e.response) - status = task_constants.TaskStatus.ERROR - - return status - - def update_nat_rules(self, router_id, edge_id, snats, dnats, - jobdata=None): + def update_nat_rules(self, edge_id, snats, dnats): LOG.debug("VCNS: update nat rule\n" "SNAT:%(snat)s\n" "DNAT:%(dnat)s\n", { @@ -654,18 +624,20 @@ class EdgeApplianceDriver(object): 'snat', snat['src'], snat['translated'], vnic_index=vnic_index )) - userdata = { - 'edge_id': edge_id, - 'rules': nat_rules, - 'jobdata': jobdata, + nat = { + 'featureType': 'nat', + 'rules': { + 'natRulesDtos': nat_rules + } } - task_name = "update-nat-%s" % edge_id - task = tasks.Task(task_name, router_id, self._update_nat_rule, - userdata=userdata) - task.add_result_monitor(self.callbacks.nat_update_result) - self.updated_task['nat'][edge_id] = task - self.task_manager.add(task) - return task + + try: + self.vcns.update_nat_config(edge_id, nat) + return True + except exceptions.VcnsApiException as e: + LOG.exception(_LE("VCNS: Failed to create snat rule:\n%s"), + e.response) + return False def update_routes(self, edge_id, gateway, routes): if gateway: diff --git a/vmware_nsx/plugins/nsx_v/vshield/edge_utils.py b/vmware_nsx/plugins/nsx_v/vshield/edge_utils.py index 381f1f48f0..43f9db11d6 100644 --- a/vmware_nsx/plugins/nsx_v/vshield/edge_utils.py +++ b/vmware_nsx/plugins/nsx_v/vshield/edge_utils.py @@ -2198,9 +2198,7 @@ def _delete_interface(nsxv_manager, context, router_id, network_id, def update_nat_rules(nsxv_manager, context, router_id, snat, dnat): binding = nsxv_db.get_nsxv_router_binding(context.session, router_id) if binding: - task = nsxv_manager.update_nat_rules( - router_id, binding['edge_id'], snat, dnat) - task.wait(task_const.TaskState.RESULT) + nsxv_manager.update_nat_rules(binding['edge_id'], snat, dnat) else: LOG.warning(_LW("Bindings do not exists for %s"), router_id) @@ -2319,6 +2317,3 @@ class NsxVCallbacks(object): def interface_update_result(self, task): LOG.debug("interface_update_result %d", task.status) - - def nat_update_result(self, task): - LOG.debug("nat_update_result %d", task.status) diff --git a/vmware_nsx/tests/unit/nsx_v/vshield/test_vcns_driver.py b/vmware_nsx/tests/unit/nsx_v/vshield/test_vcns_driver.py index 7a2b707227..d8d0a6841b 100644 --- a/vmware_nsx/tests/unit/nsx_v/vshield/test_vcns_driver.py +++ b/vmware_nsx/tests/unit/nsx_v/vshield/test_vcns_driver.py @@ -360,10 +360,6 @@ class VcnsDriverTestCase(base.BaseTestCase): if task.status == ts_const.TaskStatus.COMPLETED: task.userdata['jobdata']['edge_delete_result'] = True - def nat_update_result(self, task): - if task.status == ts_const.TaskStatus.COMPLETED: - task.userdata['jobdata']['nat_update_result'] = True - def interface_update_result(self, task): if task.status == ts_const.TaskStatus.COMPLETED: task.userdata['jobdata']['interface_update_result'] = True @@ -404,7 +400,6 @@ class VcnsDriverTestCase(base.BaseTestCase): def test_update_nat_rules(self): self._deploy_edge() - jobdata = {} snats = [{ 'src': '192.168.1.0/24', 'translated': '10.0.0.1' @@ -424,10 +419,8 @@ class VcnsDriverTestCase(base.BaseTestCase): 'translated': '192.168.2.1' } ] - task = self.vcns_driver.update_nat_rules( - 'router-id', self.edge_id, snats, dnats, jobdata=jobdata) - task.wait(ts_const.TaskState.RESULT) - self.assertTrue(jobdata.get('nat_update_result')) + result = self.vcns_driver.update_nat_rules(self.edge_id, snats, dnats) + self.assertTrue(result) natcfg = self.vcns_driver.get_nat_config(self.edge_id) rules = natcfg['rules']['natRulesDtos']