diff --git a/zun/api/controllers/v1/containers.py b/zun/api/controllers/v1/containers.py index a932dd509..71a3b00fe 100644 --- a/zun/api/controllers/v1/containers.py +++ b/zun/api/controllers/v1/containers.py @@ -314,6 +314,8 @@ class ContainersController(rest.RestController): raise exception.InvalidValue(msg) if not force: utils.validate_container_state(container, 'delete') + else: + utils.validate_container_state(container, 'delete_force') context = pecan.request.context compute_api = pecan.request.compute_api compute_api.container_delete(context, container, force) diff --git a/zun/common/utils.py b/zun/common/utils.py index 821b13e57..3d7b3197c 100644 --- a/zun/common/utils.py +++ b/zun/common/utils.py @@ -36,6 +36,8 @@ LOG = logging.getLogger(__name__) VALID_STATES = { 'delete': ['Stopped', 'Error', 'Created'], + 'delete_force': ['Running', 'Stopped', 'Error', 'Created', + 'Unknown', 'Creating'], 'start': ['Stopped', 'Created'], 'stop': ['Running'], 'reboot': ['Running', 'Stopped', 'Created'], diff --git a/zun/tests/unit/api/controllers/v1/test_containers.py b/zun/tests/unit/api/controllers/v1/test_containers.py index 74ec07f74..b4ea54972 100644 --- a/zun/tests/unit/api/controllers/v1/test_containers.py +++ b/zun/tests/unit/api/controllers/v1/test_containers.py @@ -847,6 +847,15 @@ class TestContainerController(api_base.FunctionalTest): "Cannot delete container %s in Running state" % uuid): self.app.delete('/v1/containers/%s' % (test_object.uuid)) + def test_delete_force_by_uuid_invalid_state(self): + uuid = uuidutils.generate_uuid() + test_object = utils.create_test_container(context=self.context, + uuid=uuid, status='Paused') + with self.assertRaisesRegexp( + AppError, + "Cannot delete_force container %s in Paused state" % uuid): + self.app.delete('/v1/containers/%s?force=True' % test_object.uuid) + @patch('zun.compute.api.API.container_delete') def test_delete_by_uuid_invalid_state_force_true(self, mock_delete): uuid = uuidutils.generate_uuid()