Only create the default network if at least one service needs it.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
This commit is contained in:
Daniel Nephin 2015-11-06 13:56:25 -05:00
parent 0a96f86f74
commit 73ebd7e560
3 changed files with 49 additions and 2 deletions

View File

@ -300,7 +300,7 @@ class Project(object):
plans = self._get_convergence_plans(services, strategy) plans = self._get_convergence_plans(services, strategy)
if self.use_networking: if self.use_networking and self.uses_default_network():
self.ensure_network_exists() self.ensure_network_exists()
return [ return [
@ -383,7 +383,10 @@ class Project(object):
def remove_network(self): def remove_network(self):
network = self.get_network() network = self.get_network()
if network: if network:
self.client.remove_network(network['id']) self.client.remove_network(network['Id'])
def uses_default_network(self):
return any(service.net.mode == self.name for service in self.services)
def _inject_deps(self, acc, service): def _inject_deps(self, acc, service):
dep_names = service.get_dependency_names() dep_names = service.get_dependency_names()

View File

@ -7,6 +7,7 @@ from compose.const import LABEL_PROJECT
from compose.container import Container from compose.container import Container
from compose.project import Project from compose.project import Project
from compose.service import ConvergenceStrategy from compose.service import ConvergenceStrategy
from compose.service import Net
from compose.service import VolumeFromSpec from compose.service import VolumeFromSpec
@ -111,6 +112,7 @@ class ProjectTest(DockerClientTestCase):
network_name = 'network_does_exist' network_name = 'network_does_exist'
project = Project(network_name, [], client) project = Project(network_name, [], client)
client.create_network(network_name) client.create_network(network_name)
self.addCleanup(client.remove_network, network_name)
assert project.get_network()['Name'] == network_name assert project.get_network()['Name'] == network_name
def test_net_from_service(self): def test_net_from_service(self):
@ -398,6 +400,20 @@ class ProjectTest(DockerClientTestCase):
self.assertEqual(len(project.get_service('data').containers(stopped=True)), 1) self.assertEqual(len(project.get_service('data').containers(stopped=True)), 1)
self.assertEqual(len(project.get_service('console').containers()), 0) self.assertEqual(len(project.get_service('console').containers()), 0)
def test_project_up_with_custom_network(self):
self.require_api_version('1.21')
client = docker_client(version='1.21')
network_name = 'composetest-custom'
client.create_network(network_name)
self.addCleanup(client.remove_network, network_name)
web = self.create_service('web', net=Net(network_name))
project = Project('composetest', [web], client, use_networking=True)
project.up()
assert project.get_network() is None
def test_unscale_after_restart(self): def test_unscale_after_restart(self):
web = self.create_service('web') web = self.create_service('web')
project = Project('composetest', [web], self.client) project = Project('composetest', [web], self.client)

View File

@ -7,6 +7,8 @@ from .. import unittest
from compose.const import LABEL_SERVICE from compose.const import LABEL_SERVICE
from compose.container import Container from compose.container import Container
from compose.project import Project from compose.project import Project
from compose.service import ContainerNet
from compose.service import Net
from compose.service import Service from compose.service import Service
@ -263,6 +265,32 @@ class ProjectTest(unittest.TestCase):
service = project.get_service('test') service = project.get_service('test')
self.assertEqual(service.net.mode, 'container:' + container_name) self.assertEqual(service.net.mode, 'container:' + container_name)
def test_uses_default_network_true(self):
web = Service('web', project='test', image="alpine", net=Net('test'))
db = Service('web', project='test', image="alpine", net=Net('other'))
project = Project('test', [web, db], None)
assert project.uses_default_network()
def test_uses_default_network_custom_name(self):
web = Service('web', project='test', image="alpine", net=Net('other'))
project = Project('test', [web], None)
assert not project.uses_default_network()
def test_uses_default_network_host(self):
web = Service('web', project='test', image="alpine", net=Net('host'))
project = Project('test', [web], None)
assert not project.uses_default_network()
def test_uses_default_network_container(self):
container = mock.Mock(id='test')
web = Service(
'web',
project='test',
image="alpine",
net=ContainerNet(container))
project = Project('test', [web], None)
assert not project.uses_default_network()
def test_container_without_name(self): def test_container_without_name(self):
self.mock_client.containers.return_value = [ self.mock_client.containers.return_value = [
{'Image': 'busybox:latest', 'Id': '1', 'Name': '1'}, {'Image': 'busybox:latest', 'Id': '1', 'Name': '1'},