Merge "NSXv: eliminate task use from edge deletion"
This commit is contained in:
commit
9f3bdbb46d
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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 = [{
|
||||
|
Loading…
x
Reference in New Issue
Block a user