Merge "Improve docker resource deletion"

This commit is contained in:
Jenkins 2014-09-04 18:48:57 +00:00 committed by Gerrit Code Review
commit eca7ad1c21
2 changed files with 49 additions and 2 deletions

View File

@ -295,11 +295,22 @@ class DockerContainer(resource.Resource):
if self.resource_id is None: if self.resource_id is None:
return return
client = self.get_client() client = self.get_client()
client.kill(self.resource_id) try:
client.kill(self.resource_id)
except docker.errors.APIError as ex:
if ex.response.status_code != 404:
raise
return self.resource_id return self.resource_id
def check_delete_complete(self, container_id): def check_delete_complete(self, container_id):
status = self._get_container_status(container_id) if container_id is None:
return True
try:
status = self._get_container_status(container_id)
except docker.errors.APIError as ex:
if ex.response.status_code == 404:
return True
raise
return (not status['Running']) return (not status['Running'])
def handle_suspend(self): def handle_suspend(self):

View File

@ -14,16 +14,23 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import mock
from heat.common import exception from heat.common import exception
from heat.common import template_format from heat.common import template_format
from heat.engine import resource from heat.engine import resource
from heat.engine import scheduler from heat.engine import scheduler
from heat.openstack.common.importutils import try_import
from heat.tests.common import HeatTestCase from heat.tests.common import HeatTestCase
from heat.tests import utils from heat.tests import utils
from testtools import skipIf
from ..resources import docker_container # noqa from ..resources import docker_container # noqa
from .fake_docker_client import FakeDockerClient # noqa from .fake_docker_client import FakeDockerClient # noqa
docker = try_import('docker')
template = ''' template = '''
{ {
@ -144,6 +151,35 @@ class DockerContainerTest(HeatTestCase):
running = self.get_container_state(container)['Running'] running = self.get_container_state(container)['Running']
self.assertIs(False, running) self.assertIs(False, running)
def test_resource_already_deleted(self):
container = self.create_container('Blog')
scheduler.TaskRunner(container.delete)()
running = self.get_container_state(container)['Running']
self.assertIs(False, running)
scheduler.TaskRunner(container.delete)()
self.m.VerifyAll()
@skipIf(docker is None, 'docker-py not available')
def test_resource_delete_exception(self):
response = mock.MagicMock()
response.status_code = 404
response.content = 'some content'
container = self.create_container('Blog')
self.m.StubOutWithMock(container.get_client(), 'kill')
container.get_client().kill(container.resource_id).AndRaise(
docker.errors.APIError('Not found', response))
self.m.StubOutWithMock(container, '_get_container_status')
container._get_container_status(container.resource_id).AndRaise(
docker.errors.APIError('Not found', response))
self.m.ReplayAll()
scheduler.TaskRunner(container.delete)()
self.m.VerifyAll()
def test_resource_suspend_resume(self): def test_resource_suspend_resume(self):
container = self.create_container('Blog') container = self.create_container('Blog')
# Test suspend # Test suspend