浏览代码

Make down idempotent, continue to remove resources if one is missing.

Signed-off-by: Daniel Nephin <[email protected]>
Daniel Nephin 9 年之前
父节点
当前提交
e5529a89e1
共有 3 个文件被更改,包括 30 次插入2 次删除
  1. 4 1
      compose/network.py
  2. 4 1
      compose/volume.py
  3. 22 0
      tests/unit/project_test.py

+ 4 - 1
compose/network.py

@@ -149,7 +149,10 @@ class ProjectNetworks(object):
         if not self.use_networking:
             return
         for network in self.networks.values():
-            network.remove()
+            try:
+                network.remove()
+            except NotFound:
+                log.warn("Network %s not found.", network.full_name)
 
     def initialize(self):
         if not self.use_networking:

+ 4 - 1
compose/volume.py

@@ -76,7 +76,10 @@ class ProjectVolumes(object):
 
     def remove(self):
         for volume in self.volumes.values():
-            volume.remove()
+            try:
+                volume.remove()
+            except NotFound:
+                log.warn("Volume %s not found.", volume.full_name)
 
     def initialize(self):
         try:

+ 22 - 0
tests/unit/project_test.py

@@ -4,6 +4,7 @@ from __future__ import unicode_literals
 import datetime
 
 import docker
+from docker.errors import NotFound
 
 from .. import mock
 from .. import unittest
@@ -12,6 +13,7 @@ from compose.config.types import VolumeFromSpec
 from compose.const import LABEL_SERVICE
 from compose.container import Container
 from compose.project import Project
+from compose.service import ImageType
 from compose.service import Service
 
 
@@ -476,3 +478,23 @@ class ProjectTest(unittest.TestCase):
             ),
         )
         self.assertEqual([c.id for c in project.containers()], ['1'])
+
+    def test_down_with_no_resources(self):
+        project = Project.from_config(
+            name='test',
+            client=self.mock_client,
+            config_data=Config(
+                version='2',
+                services=[{
+                    'name': 'web',
+                    'image': 'busybox:latest',
+                }],
+                networks={'default': {}},
+                volumes={'data': {}},
+            ),
+        )
+        self.mock_client.remove_network.side_effect = NotFound(None, None, 'oops')
+        self.mock_client.remove_volume.side_effect = NotFound(None, None, 'oops')
+
+        project.down(ImageType.all, True)
+        self.mock_client.remove_image.assert_called_once_with("busybox:latest")