Merge "NSXv: eliminate task use from edge deletion"

This commit is contained in:
Jenkins 2016-08-14 06:42:42 +00:00 committed by Gerrit Code Review
commit 9f3bdbb46d
4 changed files with 56 additions and 92 deletions

View File

@ -21,6 +21,7 @@ from oslo_config import cfg
from oslo_log import log as logging
from oslo_serialization import jsonutils
from oslo_utils import excutils
from sqlalchemy.orm import exc as sa_exc
from vmware_nsx._i18n import _, _LE, _LI, _LW
from vmware_nsx.common import exceptions as nsxv_exc
@ -376,26 +377,6 @@ class EdgeApplianceDriver(object):
LOG.debug("Deletion complete vnic %(vnic_index)s: on edge %(edge_id)s",
{'vnic_index': index, 'edge_id': edge_id})
def _delete_edge(self, task):
edge_id = task.userdata['edge_id']
LOG.debug("VCNS: start destroying edge %s", edge_id)
status = task_constants.TaskStatus.COMPLETED
if edge_id:
try:
self.vcns.delete_edge(edge_id)
except exceptions.ResourceNotFound:
pass
except exceptions.VcnsApiException as e:
LOG.exception(_LE("VCNS: Failed to delete %(edge_id)s:\n"
"%(response)s"),
{'edge_id': edge_id, 'response': e.response})
status = task_constants.TaskStatus.ERROR
except Exception:
LOG.exception(_LE("VCNS: Failed to delete %s"), edge_id)
status = task_constants.TaskStatus.ERROR
return status
def _get_edges(self):
try:
return self.vcns.get_edges()[1]
@ -541,19 +522,28 @@ class EdgeApplianceDriver(object):
LOG.error(_LE("Failed to rename edge: %s"),
e.response)
def delete_edge(self, resource_id, edge_id, jobdata=None, dist=False):
task_name = 'delete-%s' % edge_id
userdata = {
'router_id': resource_id,
'dist': dist,
'edge_id': edge_id,
'jobdata': jobdata
}
task = tasks.Task(task_name, resource_id, self._delete_edge,
userdata=userdata)
task.add_result_monitor(self.callbacks.edge_delete_result)
self.task_manager.add(task)
return task
def delete_edge(self, context, router_id, edge_id, dist=False):
try:
nsxv_db.delete_nsxv_router_binding(context.session, router_id)
if not dist:
nsxv_db.clean_edge_vnic_binding(context.session, edge_id)
except sa_exc.NoResultFound:
LOG.warning(_LW("Router Binding for %s not found"), router_id)
if edge_id:
try:
self.vcns.delete_edge(edge_id)
return True
except exceptions.ResourceNotFound:
return True
except exceptions.VcnsApiException as e:
LOG.exception(_LE("VCNS: Failed to delete %(edge_id)s:\n"
"%(response)s"),
{'edge_id': edge_id, 'response': e.response})
return False
except Exception:
LOG.exception(_LE("VCNS: Failed to delete %s"), edge_id)
return False
def _assemble_nat_rule(self, action, original_address,
translated_address,

View File

@ -27,7 +27,6 @@ from oslo_serialization import jsonutils
from oslo_utils import excutils
from oslo_utils import uuidutils
from six import moves
from sqlalchemy.orm import exc as sa_exc
from neutron import context as q_context
from neutron.extensions import l3
@ -46,8 +45,6 @@ from vmware_nsx.plugins.nsx_v import availability_zones as nsx_az
from vmware_nsx.plugins.nsx_v.vshield.common import (
constants as vcns_const)
from vmware_nsx.plugins.nsx_v.vshield.common import exceptions as nsxapi_exc
from vmware_nsx.plugins.nsx_v.vshield.tasks import (
constants as task_const)
from vmware_nsx.plugins.nsx_v.vshield import vcns
WORKER_POOL_SIZE = 8
@ -193,15 +190,14 @@ class EdgeManager(object):
def _pool_creator(self, context, router_ids, appliance_size,
edge_type, availability_zone):
pool = self.worker_pool
for router_id in router_ids:
fake_router = {
'id': router_id,
'name': router_id}
pool.spawn_n(self._deploy_edge, context, fake_router,
appliance_size=appliance_size,
edge_type=edge_type,
availability_zone=availability_zone)
self.worker_pool.spawn_n(self._deploy_edge, context, fake_router,
appliance_size=appliance_size,
edge_type=edge_type,
availability_zone=availability_zone)
def _delete_edge(self, context, router_binding):
if router_binding['status'] == plugin_const.ERROR:
@ -209,13 +205,12 @@ class EdgeManager(object):
"edge: %(edge_id)s due to status error"),
{'router_id': router_binding['router_id'],
'edge_id': router_binding['edge_id']})
jobdata = {'context': context}
nsxv_db.update_nsxv_router_binding(
context.session, router_binding['router_id'],
status=plugin_const.PENDING_DELETE)
self.nsxv_manager.delete_edge(
self.worker_pool.spawn_n(
self.nsxv_manager.delete_edge, q_context.get_admin_context(),
router_binding['router_id'], router_binding['edge_id'],
jobdata=jobdata,
dist=(router_binding['edge_type'] == nsxv_constants.VDR_EDGE))
def _delete_backup_edges_on_db(self, context, backup_router_bindings):
@ -229,11 +224,9 @@ class EdgeManager(object):
# delete edge
LOG.debug("Start deleting extra edge: %s in pool",
binding['edge_id'])
jobdata = {
'context': context
}
self.nsxv_manager.delete_edge(
binding['router_id'], binding['edge_id'], jobdata=jobdata,
self.worker_pool.spawn_n(
self.nsxv_manager.delete_edge, q_context.get_admin_context(),
binding['router_id'], binding['edge_id'],
dist=(binding['edge_type'] == nsxv_constants.VDR_EDGE))
def _clean_all_error_edge_bindings(self, context, availability_zone):
@ -668,12 +661,9 @@ class EdgeManager(object):
context.session, router_id,
status=plugin_const.PENDING_DELETE)
# delete edge
jobdata = {
'context': context,
'router_id': router_id
}
self.nsxv_manager.delete_edge(
router_id, edge_id, jobdata=jobdata, dist=dist)
self.worker_pool.spawn_n(
self.nsxv_manager.delete_edge, q_context.get_admin_context(),
router_id, edge_id, dist=dist)
return
availability_zone = self._availability_zones.get_availability_zone(
@ -710,12 +700,9 @@ class EdgeManager(object):
context.session, router_id,
status=plugin_const.PENDING_DELETE)
# delete edge
jobdata = {
'context': context,
'router_id': router_id
}
self.nsxv_manager.delete_edge(
router_id, edge_id, jobdata=jobdata, dist=dist)
self.worker_pool.spawn_n(
self.nsxv_manager.delete_edge, q_context.get_admin_context(),
router_id, edge_id, dist=dist)
def _allocate_dhcp_edge_appliance(self, context, resource_id,
availability_zone):
@ -1765,12 +1752,7 @@ def delete_lrouter(nsxv_manager, context, router_id, dist=False):
status=plugin_const.PENDING_DELETE)
edge_id = binding['edge_id']
# delete edge
jobdata = {
'context': context
}
task = nsxv_manager.delete_edge(router_id, edge_id,
jobdata=jobdata, dist=dist)
task.wait(task_const.TaskState.RESULT)
nsxv_manager.delete_edge(context, router_id, edge_id, dist=dist)
else:
LOG.warning(_LW("router binding for router: %s not found"), router_id)
@ -2276,18 +2258,5 @@ class NsxVCallbacks(object):
# Router might have been deleted before deploy finished
LOG.warning(_LW("Router %s not found"), router_id)
def edge_delete_result(self, task):
jobdata = task.userdata['jobdata']
router_id = task.userdata['router_id']
dist = task.userdata.get('dist')
edge_id = task.userdata['edge_id']
context = jobdata['context']
try:
nsxv_db.delete_nsxv_router_binding(context.session, router_id)
if not dist:
nsxv_db.clean_edge_vnic_binding(context.session, edge_id)
except sa_exc.NoResultFound:
LOG.warning(_LW("Router Binding for %s not found"), router_id)
def interface_update_result(self, task):
LOG.debug("interface_update_result %d", task.status)

View File

@ -760,6 +760,9 @@ class EdgeManagerTestCase(EdgeUtilsTestCaseMixin):
availability_zone=mock.ANY)])
def test_free_edge_appliance_with_default_with_full(self):
def _fake_spawn(method, *args, **kwargs):
method(*args, **kwargs)
self.edge_pool_dicts = {
nsxv_constants.SERVICE_EDGE: {
nsxv_constants.LARGE: {'minimum_pooled_edges': 1,
@ -767,10 +770,14 @@ class EdgeManagerTestCase(EdgeUtilsTestCaseMixin):
nsxv_constants.COMPACT: {'minimum_pooled_edges': 1,
'maximum_pooled_edges': 3}},
nsxv_constants.VDR_EDGE: {}}
self.edge_manager._allocate_edge_appliance(
self.ctx, 'fake_id', 'fake_name',
availability_zone=self.az)
self.edge_manager._free_edge_appliance(
self.ctx, 'fake_id')
assert self.nsxv_manager.delete_edge.called
assert not self.nsxv_manager.update_edge.called
# Avoid use of eventlet greenpool as this breaks the UT
with mock.patch.object(self.edge_manager.worker_pool,
'spawn_n',
side_effect=_fake_spawn):
self.edge_manager._allocate_edge_appliance(
self.ctx, 'fake_id', 'fake_name',
availability_zone=self.az)
self.edge_manager._free_edge_appliance(
self.ctx, 'fake_id')
assert self.nsxv_manager.delete_edge.called
assert not self.nsxv_manager.update_edge.called

View File

@ -472,11 +472,9 @@ class VcnsDriverTestCase(base.BaseTestCase):
def test_delete_edge(self):
self._deploy_edge()
jobdata = {}
task = self.vcns_driver.delete_edge(
'router-id', self.edge_id, jobdata=jobdata)
task.wait(ts_const.TaskState.RESULT)
self.assertTrue(jobdata.get('edge_delete_result'))
result = self.vcns_driver.delete_edge(
self.ctx, 'router-id', self.edge_id)
self.assertTrue(result)
def test_create_lswitch(self):
tz_config = [{