make pending create deletable

Change-Id: Ibfdbb20d5fb43a8001ca5c3dc5783cbcf879e3ca
This commit is contained in:
Isaku Yamahata 2015-05-12 17:33:31 -07:00
parent f87c953c60
commit 64a2ae44e5
2 changed files with 34 additions and 21 deletions

View File

@ -40,8 +40,9 @@ from tacker.plugins.common import constants
LOG = logging.getLogger(__name__)
_ACTIVE_UPDATE = (constants.ACTIVE, constants.PENDING_UPDATE)
_ACTIVE_UPDATE_DEAD = (
constants.ACTIVE, constants.PENDING_UPDATE, constants.DEAD)
_ACTIVE_UPDATE_ERROR_DEAD = (
constants.PENDING_CREATE, constants.ACTIVE, constants.PENDING_UPDATE,
constants.ERROR, constants.DEAD)
###########################################################################
@ -617,7 +618,7 @@ class ServiceResourcePluginDb(servicevm.ServiceVMPluginBase,
if binding_db is not None:
raise servicevm.DeviceInUse(device_id=device_id)
device_db = self._get_device_db(
context, device_id, _ACTIVE_UPDATE_DEAD,
context, device_id, _ACTIVE_UPDATE_ERROR_DEAD,
constants.PENDING_DELETE)
return self._make_device_dict(device_db)
@ -676,28 +677,36 @@ class ServiceResourcePluginDb(servicevm.ServiceVMPluginBase,
return self._get_collection(context, Device, self._make_device_dict,
filters=filters, fields=fields)
def _mark_device_dead(self, device_id):
def _mark_device_status(self, device_id, exclude_status, new_status):
context = t_context.get_admin_context()
EXCLUDE_STATUS = [
with context.session.begin(subtransactions=True):
try:
device_db = (
self._model_query(context, Device).
filter(Device.id == device_id).
filter(~Device.status.in_(exclude_status)).
with_lockmode('update').one())
except orm_exc.NoResultFound:
LOG.warn(_('no device found %s'), device_id)
return False
device_db.update({'status': new_status})
return True
def _mark_device_error(self, device_id):
return self._mark_device_status(
device_id, [constants.DEAD], constants.ERROR)
def _mark_device_dead(self, device_id):
exclude_status = [
constants.DOWN,
constants.PENDING_CREATE,
constants.PENDING_UPDATE,
constants.PENDING_DELETE,
constants.INACTIVE,
constants.ERROR]
with context.session.begin(subtransactions=True):
try:
device_db = (
self._model_query(context, Device).
filter(Device.id == device_id).
filter(~Device.status.in_(EXCLUDE_STATUS)).
with_lockmode('update').one())
except orm_exc.NoResultFound:
LOG.warn(_('no device found %s'), device_id)
return False
device_db.update({'status': constants.DEAD})
return True
return self._mark_device_status(
device_id, exclude_status, constants.DEAD)
# used by failure policy
def update_dead_device(self, device_id, dead_device_dict):

View File

@ -281,9 +281,13 @@ class ServiceVMPlugin(vm_db.ServiceResourcePluginDb, ServiceVMMgmtMixin):
driver_name = self._infra_driver_name(device_dict)
LOG.debug(_('device_dict %s'), device_dict)
self.mgmt_create_pre(context, device_dict)
instance_id = self._device_manager.invoke(
driver_name, 'create', plugin=self,
context=context, device=device_dict)
try:
instance_id = self._device_manager.invoke(
driver_name, 'create', plugin=self,
context=context, device=device_dict)
except Exception:
with excutils.save_and_reraise_exception():
self._mark_device_error(device_id)
if instance_id is None:
self._create_device_post(context, device_id, None, None)