Specify networks in Compose file
There's not yet a proper way for services to join networks Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com>
This commit is contained in:
parent
8fca4f1628
commit
69ed5f9c48
10 changed files with 400 additions and 239 deletions
|
|
@ -354,7 +354,7 @@ class CLITestCase(DockerClientTestCase):
|
|||
self.base_dir = 'tests/fixtures/links-composefile'
|
||||
self.dispatch(['up', '-d'], None)
|
||||
|
||||
networks = self.client.networks(names=[self.project.default_network_name])
|
||||
networks = self.client.networks(names=[self.project.default_network.full_name])
|
||||
self.assertEqual(len(networks), 0)
|
||||
|
||||
for service in self.project.get_services():
|
||||
|
|
@ -371,7 +371,7 @@ class CLITestCase(DockerClientTestCase):
|
|||
|
||||
services = self.project.get_services()
|
||||
|
||||
networks = self.client.networks(names=[self.project.default_network_name])
|
||||
networks = self.client.networks(names=[self.project.default_network.full_name])
|
||||
for n in networks:
|
||||
self.addCleanup(self.client.remove_network, n['Id'])
|
||||
self.assertEqual(len(networks), 1)
|
||||
|
|
@ -388,6 +388,19 @@ class CLITestCase(DockerClientTestCase):
|
|||
web_container = self.project.get_service('simple').containers()[0]
|
||||
self.assertFalse(web_container.get('HostConfig.Links'))
|
||||
|
||||
def test_up_with_networks(self):
|
||||
self.base_dir = 'tests/fixtures/networks'
|
||||
self.dispatch(['up', '-d'], None)
|
||||
|
||||
networks = self.client.networks(names=[
|
||||
'{}_{}'.format(self.project.name, n)
|
||||
for n in ['foo', 'bar']])
|
||||
|
||||
self.assertEqual(len(networks), 2)
|
||||
|
||||
for net in networks:
|
||||
self.assertEqual(net['Driver'], 'bridge')
|
||||
|
||||
def test_up_with_links_is_invalid(self):
|
||||
self.base_dir = 'tests/fixtures/v2-simple'
|
||||
|
||||
|
|
@ -698,7 +711,7 @@ class CLITestCase(DockerClientTestCase):
|
|||
self.dispatch(['run', 'simple', 'true'], None)
|
||||
service = self.project.get_service('simple')
|
||||
container, = service.containers(stopped=True, one_off=True)
|
||||
networks = self.client.networks(names=[self.project.default_network_name])
|
||||
networks = self.client.networks(names=[self.project.default_network.full_name])
|
||||
for n in networks:
|
||||
self.addCleanup(self.client.remove_network, n['Id'])
|
||||
self.assertEqual(len(networks), 1)
|
||||
|
|
|
|||
7
tests/fixtures/networks/docker-compose.yml
vendored
Normal file
7
tests/fixtures/networks/docker-compose.yml
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
version: 2
|
||||
|
||||
networks:
|
||||
foo:
|
||||
driver:
|
||||
|
||||
bar: {}
|
||||
9
tests/fixtures/no-links-composefile/docker-compose.yml
vendored
Normal file
9
tests/fixtures/no-links-composefile/docker-compose.yml
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
db:
|
||||
image: busybox:latest
|
||||
command: top
|
||||
web:
|
||||
image: busybox:latest
|
||||
command: top
|
||||
console:
|
||||
image: busybox:latest
|
||||
command: top
|
||||
|
|
@ -14,7 +14,6 @@ from compose.const import LABEL_PROJECT
|
|||
from compose.container import Container
|
||||
from compose.project import Project
|
||||
from compose.service import ConvergenceStrategy
|
||||
from compose.service import Net
|
||||
|
||||
|
||||
def build_service_dicts(service_config):
|
||||
|
|
@ -104,21 +103,6 @@ class ProjectTest(DockerClientTestCase):
|
|||
db = project.get_service('db')
|
||||
self.assertEqual(db._get_volumes_from(), [data_container.id + ':rw'])
|
||||
|
||||
def test_get_network_does_not_exist(self):
|
||||
project = Project('composetest', [], self.client)
|
||||
assert project.get_network() is None
|
||||
|
||||
def test_get_network(self):
|
||||
project_name = 'network_does_exist'
|
||||
network_name = '{}_default'.format(project_name)
|
||||
|
||||
project = Project(project_name, [], self.client)
|
||||
self.client.create_network(network_name)
|
||||
self.addCleanup(self.client.remove_network, network_name)
|
||||
|
||||
assert isinstance(project.get_network(), dict)
|
||||
assert project.get_network()['Name'] == network_name
|
||||
|
||||
def test_net_from_service(self):
|
||||
project = Project.from_config(
|
||||
name='composetest',
|
||||
|
|
@ -473,18 +457,6 @@ class ProjectTest(DockerClientTestCase):
|
|||
self.assertEqual(len(project.get_service('data').containers(stopped=True)), 1)
|
||||
self.assertEqual(len(project.get_service('console').containers()), 0)
|
||||
|
||||
def test_project_up_with_custom_network(self):
|
||||
network_name = 'composetest-custom'
|
||||
|
||||
self.client.create_network(network_name)
|
||||
self.addCleanup(self.client.remove_network, network_name)
|
||||
|
||||
web = self.create_service('web', net=Net(network_name))
|
||||
project = Project('composetest', [web], self.client, use_networking=True)
|
||||
project.up()
|
||||
|
||||
assert project.get_network() is None
|
||||
|
||||
def test_unscale_after_restart(self):
|
||||
web = self.create_service('web')
|
||||
project = Project('composetest', [web], self.client)
|
||||
|
|
@ -510,15 +482,50 @@ class ProjectTest(DockerClientTestCase):
|
|||
service = project.get_service('web')
|
||||
self.assertEqual(len(service.containers()), 1)
|
||||
|
||||
def test_project_up_networks(self):
|
||||
config_data = config.Config(
|
||||
version=2,
|
||||
services=[{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
'command': 'top',
|
||||
}],
|
||||
volumes={},
|
||||
networks={
|
||||
'foo': {'driver': 'bridge'},
|
||||
'bar': {'driver': None},
|
||||
'baz': {},
|
||||
},
|
||||
)
|
||||
|
||||
project = Project.from_config(
|
||||
client=self.client,
|
||||
name='composetest',
|
||||
config_data=config_data,
|
||||
)
|
||||
project.up()
|
||||
self.assertEqual(len(project.containers()), 1)
|
||||
|
||||
for net_name in ['foo', 'bar', 'baz']:
|
||||
full_net_name = 'composetest_{}'.format(net_name)
|
||||
network_data = self.client.inspect_network(full_net_name)
|
||||
self.assertEqual(network_data['Name'], full_net_name)
|
||||
|
||||
foo_data = self.client.inspect_network('composetest_foo')
|
||||
self.assertEqual(foo_data['Driver'], 'bridge')
|
||||
|
||||
def test_project_up_volumes(self):
|
||||
vol_name = '{0:x}'.format(random.getrandbits(32))
|
||||
full_vol_name = 'composetest_{0}'.format(vol_name)
|
||||
config_data = config.Config(
|
||||
version=2, services=[{
|
||||
version=2,
|
||||
services=[{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
'command': 'top'
|
||||
}], volumes={vol_name: {'driver': 'local'}}
|
||||
}],
|
||||
volumes={vol_name: {'driver': 'local'}},
|
||||
networks={},
|
||||
)
|
||||
|
||||
project = Project.from_config(
|
||||
|
|
@ -587,11 +594,14 @@ class ProjectTest(DockerClientTestCase):
|
|||
vol_name = '{0:x}'.format(random.getrandbits(32))
|
||||
full_vol_name = 'composetest_{0}'.format(vol_name)
|
||||
config_data = config.Config(
|
||||
version=2, services=[{
|
||||
version=2,
|
||||
services=[{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
'command': 'top'
|
||||
}], volumes={vol_name: {}}
|
||||
}],
|
||||
volumes={vol_name: {}},
|
||||
networks={},
|
||||
)
|
||||
|
||||
project = Project.from_config(
|
||||
|
|
@ -608,11 +618,14 @@ class ProjectTest(DockerClientTestCase):
|
|||
vol_name = '{0:x}'.format(random.getrandbits(32))
|
||||
full_vol_name = 'composetest_{0}'.format(vol_name)
|
||||
config_data = config.Config(
|
||||
version=2, services=[{
|
||||
version=2,
|
||||
services=[{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
'command': 'top'
|
||||
}], volumes={vol_name: {}}
|
||||
}],
|
||||
volumes={vol_name: {}},
|
||||
networks={},
|
||||
)
|
||||
|
||||
project = Project.from_config(
|
||||
|
|
@ -629,11 +642,14 @@ class ProjectTest(DockerClientTestCase):
|
|||
vol_name = '{0:x}'.format(random.getrandbits(32))
|
||||
|
||||
config_data = config.Config(
|
||||
version=2, services=[{
|
||||
version=2,
|
||||
services=[{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
'command': 'top'
|
||||
}], volumes={vol_name: {'driver': 'foobar'}}
|
||||
}],
|
||||
volumes={vol_name: {'driver': 'foobar'}},
|
||||
networks={},
|
||||
)
|
||||
|
||||
project = Project.from_config(
|
||||
|
|
@ -648,11 +664,14 @@ class ProjectTest(DockerClientTestCase):
|
|||
full_vol_name = 'composetest_{0}'.format(vol_name)
|
||||
|
||||
config_data = config.Config(
|
||||
version=2, services=[{
|
||||
version=2,
|
||||
services=[{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
'command': 'top'
|
||||
}], volumes={vol_name: {'driver': 'local'}}
|
||||
}],
|
||||
volumes={vol_name: {'driver': 'local'}},
|
||||
networks={},
|
||||
)
|
||||
project = Project.from_config(
|
||||
name='composetest',
|
||||
|
|
@ -683,13 +702,16 @@ class ProjectTest(DockerClientTestCase):
|
|||
full_vol_name = 'composetest_{0}'.format(vol_name)
|
||||
self.client.create_volume(vol_name)
|
||||
config_data = config.Config(
|
||||
version=2, services=[{
|
||||
version=2,
|
||||
services=[{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
'command': 'top'
|
||||
}], volumes={
|
||||
}],
|
||||
volumes={
|
||||
vol_name: {'external': True, 'external_name': vol_name}
|
||||
}
|
||||
},
|
||||
networks=None,
|
||||
)
|
||||
project = Project.from_config(
|
||||
name='composetest',
|
||||
|
|
@ -704,13 +726,16 @@ class ProjectTest(DockerClientTestCase):
|
|||
vol_name = '{0:x}'.format(random.getrandbits(32))
|
||||
|
||||
config_data = config.Config(
|
||||
version=2, services=[{
|
||||
version=2,
|
||||
services=[{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
'command': 'top'
|
||||
}], volumes={
|
||||
}],
|
||||
volumes={
|
||||
vol_name: {'external': True, 'external_name': vol_name}
|
||||
}
|
||||
},
|
||||
networks=None,
|
||||
)
|
||||
project = Project.from_config(
|
||||
name='composetest',
|
||||
|
|
|
|||
|
|
@ -21,35 +21,27 @@ class ProjectTest(unittest.TestCase):
|
|||
def setUp(self):
|
||||
self.mock_client = mock.create_autospec(docker.Client)
|
||||
|
||||
def test_from_dict(self):
|
||||
project = Project.from_config('composetest', Config(None, [
|
||||
{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest'
|
||||
},
|
||||
{
|
||||
'name': 'db',
|
||||
'image': 'busybox:latest'
|
||||
},
|
||||
], None), None)
|
||||
self.assertEqual(len(project.services), 2)
|
||||
self.assertEqual(project.get_service('web').name, 'web')
|
||||
self.assertEqual(project.get_service('web').options['image'], 'busybox:latest')
|
||||
self.assertEqual(project.get_service('db').name, 'db')
|
||||
self.assertEqual(project.get_service('db').options['image'], 'busybox:latest')
|
||||
|
||||
def test_from_config(self):
|
||||
config = Config(None, [
|
||||
{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
},
|
||||
{
|
||||
'name': 'db',
|
||||
'image': 'busybox:latest',
|
||||
},
|
||||
], None)
|
||||
project = Project.from_config('composetest', config, None)
|
||||
config = Config(
|
||||
version=None,
|
||||
services=[
|
||||
{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
},
|
||||
{
|
||||
'name': 'db',
|
||||
'image': 'busybox:latest',
|
||||
},
|
||||
],
|
||||
networks=None,
|
||||
volumes=None,
|
||||
)
|
||||
project = Project.from_config(
|
||||
name='composetest',
|
||||
config_data=config,
|
||||
client=None,
|
||||
)
|
||||
self.assertEqual(len(project.services), 2)
|
||||
self.assertEqual(project.get_service('web').name, 'web')
|
||||
self.assertEqual(project.get_service('web').options['image'], 'busybox:latest')
|
||||
|
|
@ -58,16 +50,21 @@ class ProjectTest(unittest.TestCase):
|
|||
self.assertFalse(project.use_networking)
|
||||
|
||||
def test_from_config_v2(self):
|
||||
config = Config(2, [
|
||||
{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
},
|
||||
{
|
||||
'name': 'db',
|
||||
'image': 'busybox:latest',
|
||||
},
|
||||
], None)
|
||||
config = Config(
|
||||
version=2,
|
||||
services=[
|
||||
{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
},
|
||||
{
|
||||
'name': 'db',
|
||||
'image': 'busybox:latest',
|
||||
},
|
||||
],
|
||||
networks=None,
|
||||
volumes=None,
|
||||
)
|
||||
project = Project.from_config('composetest', config, None)
|
||||
self.assertEqual(len(project.services), 2)
|
||||
self.assertTrue(project.use_networking)
|
||||
|
|
@ -161,13 +158,20 @@ class ProjectTest(unittest.TestCase):
|
|||
container_id = 'aabbccddee'
|
||||
container_dict = dict(Name='aaa', Id=container_id)
|
||||
self.mock_client.inspect_container.return_value = container_dict
|
||||
project = Project.from_config('test', Config(None, [
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
'volumes_from': [VolumeFromSpec('aaa', 'rw', 'container')]
|
||||
}
|
||||
], None), self.mock_client)
|
||||
project = Project.from_config(
|
||||
name='test',
|
||||
client=self.mock_client,
|
||||
config_data=Config(
|
||||
version=None,
|
||||
services=[{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
'volumes_from': [VolumeFromSpec('aaa', 'rw', 'container')]
|
||||
}],
|
||||
networks=None,
|
||||
volumes=None,
|
||||
),
|
||||
)
|
||||
assert project.get_service('test')._get_volumes_from() == [container_id + ":rw"]
|
||||
|
||||
def test_use_volumes_from_service_no_container(self):
|
||||
|
|
@ -180,33 +184,51 @@ class ProjectTest(unittest.TestCase):
|
|||
"Image": 'busybox:latest'
|
||||
}
|
||||
]
|
||||
project = Project.from_config('test', Config(None, [
|
||||
{
|
||||
'name': 'vol',
|
||||
'image': 'busybox:latest'
|
||||
},
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
'volumes_from': [VolumeFromSpec('vol', 'rw', 'service')]
|
||||
}
|
||||
], None), self.mock_client)
|
||||
project = Project.from_config(
|
||||
name='test',
|
||||
client=self.mock_client,
|
||||
config_data=Config(
|
||||
version=None,
|
||||
services=[
|
||||
{
|
||||
'name': 'vol',
|
||||
'image': 'busybox:latest'
|
||||
},
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
'volumes_from': [VolumeFromSpec('vol', 'rw', 'service')]
|
||||
}
|
||||
],
|
||||
networks=None,
|
||||
volumes=None,
|
||||
),
|
||||
)
|
||||
assert project.get_service('test')._get_volumes_from() == [container_name + ":rw"]
|
||||
|
||||
def test_use_volumes_from_service_container(self):
|
||||
container_ids = ['aabbccddee', '12345']
|
||||
|
||||
project = Project.from_config('test', Config(None, [
|
||||
{
|
||||
'name': 'vol',
|
||||
'image': 'busybox:latest'
|
||||
},
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
'volumes_from': [VolumeFromSpec('vol', 'rw', 'service')]
|
||||
}
|
||||
], None), None)
|
||||
project = Project.from_config(
|
||||
name='test',
|
||||
client=None,
|
||||
config_data=Config(
|
||||
version=None,
|
||||
services=[
|
||||
{
|
||||
'name': 'vol',
|
||||
'image': 'busybox:latest'
|
||||
},
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
'volumes_from': [VolumeFromSpec('vol', 'rw', 'service')]
|
||||
}
|
||||
],
|
||||
networks=None,
|
||||
volumes=None,
|
||||
),
|
||||
)
|
||||
with mock.patch.object(Service, 'containers') as mock_return:
|
||||
mock_return.return_value = [
|
||||
mock.Mock(id=container_id, spec=Container)
|
||||
|
|
@ -313,12 +335,21 @@ class ProjectTest(unittest.TestCase):
|
|||
]
|
||||
|
||||
def test_net_unset(self):
|
||||
project = Project.from_config('test', Config(None, [
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
}
|
||||
], None), self.mock_client)
|
||||
project = Project.from_config(
|
||||
name='test',
|
||||
client=self.mock_client,
|
||||
config_data=Config(
|
||||
version=None,
|
||||
services=[
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
}
|
||||
],
|
||||
networks=None,
|
||||
volumes=None,
|
||||
),
|
||||
)
|
||||
service = project.get_service('test')
|
||||
self.assertEqual(service.net.id, None)
|
||||
self.assertNotIn('NetworkMode', service._get_container_host_config({}))
|
||||
|
|
@ -327,13 +358,22 @@ class ProjectTest(unittest.TestCase):
|
|||
container_id = 'aabbccddee'
|
||||
container_dict = dict(Name='aaa', Id=container_id)
|
||||
self.mock_client.inspect_container.return_value = container_dict
|
||||
project = Project.from_config('test', Config(None, [
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
'net': 'container:aaa'
|
||||
}
|
||||
], None), self.mock_client)
|
||||
project = Project.from_config(
|
||||
name='test',
|
||||
client=self.mock_client,
|
||||
config_data=Config(
|
||||
version=None,
|
||||
services=[
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
'net': 'container:aaa'
|
||||
},
|
||||
],
|
||||
networks=None,
|
||||
volumes=None,
|
||||
),
|
||||
)
|
||||
service = project.get_service('test')
|
||||
self.assertEqual(service.net.mode, 'container:' + container_id)
|
||||
|
||||
|
|
@ -347,17 +387,26 @@ class ProjectTest(unittest.TestCase):
|
|||
"Image": 'busybox:latest'
|
||||
}
|
||||
]
|
||||
project = Project.from_config('test', Config(None, [
|
||||
{
|
||||
'name': 'aaa',
|
||||
'image': 'busybox:latest'
|
||||
},
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
'net': 'container:aaa'
|
||||
}
|
||||
], None), self.mock_client)
|
||||
project = Project.from_config(
|
||||
name='test',
|
||||
client=self.mock_client,
|
||||
config_data=Config(
|
||||
version=None,
|
||||
services=[
|
||||
{
|
||||
'name': 'aaa',
|
||||
'image': 'busybox:latest'
|
||||
},
|
||||
{
|
||||
'name': 'test',
|
||||
'image': 'busybox:latest',
|
||||
'net': 'container:aaa'
|
||||
},
|
||||
],
|
||||
networks=None,
|
||||
volumes=None,
|
||||
),
|
||||
)
|
||||
|
||||
service = project.get_service('test')
|
||||
self.assertEqual(service.net.mode, 'container:' + container_name)
|
||||
|
|
@ -403,11 +452,16 @@ class ProjectTest(unittest.TestCase):
|
|||
},
|
||||
}
|
||||
project = Project.from_config(
|
||||
'test',
|
||||
Config(None, [{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
}], None),
|
||||
self.mock_client,
|
||||
name='test',
|
||||
client=self.mock_client,
|
||||
config_data=Config(
|
||||
version=None,
|
||||
services=[{
|
||||
'name': 'web',
|
||||
'image': 'busybox:latest',
|
||||
}],
|
||||
networks=None,
|
||||
volumes=None,
|
||||
),
|
||||
)
|
||||
self.assertEqual([c.id for c in project.containers()], ['1'])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue