diff --git a/trove/instance/models.py b/trove/instance/models.py index 5e6323d405..46dd1da6a8 100644 --- a/trove/instance/models.py +++ b/trove/instance/models.py @@ -302,12 +302,17 @@ class SimpleInstance(object): if self.db_info.task_status.is_error: return InstanceStatus.ERROR - # If we've reset the status, show it as an error - if tr_instance.ServiceStatuses.UNKNOWN == self.datastore_status.status: + action = self.db_info.task_status.action + + # Check if we are resetting status or force deleting + if (tr_instance.ServiceStatuses.UNKNOWN == self.datastore_status.status + and action == InstanceTasks.DELETING.action): + return InstanceStatus.SHUTDOWN + elif (tr_instance.ServiceStatuses.UNKNOWN == + self.datastore_status.status): return InstanceStatus.ERROR # Check for taskmanager status. - action = self.db_info.task_status.action if 'BUILDING' == action: if 'ERROR' == self.db_info.server_status: return InstanceStatus.ERROR @@ -753,18 +758,13 @@ class BaseInstance(SimpleInstance): return files def reset_status(self): - if self.is_building or self.is_error: - LOG.info(_LI("Resetting the status to ERROR on instance %s."), - self.id) - self.reset_task_status() + LOG.info(_LI("Resetting the status to ERROR on instance %s."), + self.id) + self.reset_task_status() - reset_instance = InstanceServiceStatus.find_by(instance_id=self.id) - reset_instance.set_status(tr_instance.ServiceStatuses.UNKNOWN) - reset_instance.save() - else: - raise exception.UnprocessableEntity( - "Instance %s status can only be reset in BUILD or ERROR " - "state." % self.id) + reset_instance = InstanceServiceStatus.find_by(instance_id=self.id) + reset_instance.set_status(tr_instance.ServiceStatuses.UNKNOWN) + reset_instance.save() class FreshInstance(BaseInstance): diff --git a/trove/tests/unittests/instance/test_instance_status.py b/trove/tests/unittests/instance/test_instance_status.py index fb3ff41763..0efb34eec1 100644 --- a/trove/tests/unittests/instance/test_instance_status.py +++ b/trove/tests/unittests/instance/test_instance_status.py @@ -18,6 +18,7 @@ from trove.datastore import models from trove.instance.models import InstanceServiceStatus from trove.instance.models import InstanceStatus from trove.instance.models import SimpleInstance +from trove.instance.tasks import InstanceTasks from trove.tests.unittests import trove_testtools from trove.tests.unittests.util import util import uuid @@ -135,3 +136,14 @@ class InstanceStatusTest(BaseInstanceStatusTestCase): self.status.set_status(ServiceStatuses.RUNNING) instance = SimpleInstance('dummy context', self.db_info, self.status) self.assertEqual(InstanceStatus.ACTIVE, instance.status) + + def test_service_status_reset_status(self): + self.status.set_status(ServiceStatuses.UNKNOWN) + instance = SimpleInstance('dummy context', self.db_info, self.status) + self.assertEqual(InstanceStatus.ERROR, instance.status) + + def test_service_status_force_deleteing(self): + self.status.set_status(ServiceStatuses.UNKNOWN) + self.db_info.task_status = InstanceTasks.DELETING + instance = SimpleInstance('dummy context', self.db_info, self.status) + self.assertEqual(InstanceStatus.SHUTDOWN, instance.status)