mirror of
https://github.com/docker/compose.git
synced 2025-07-26 07:04:32 +02:00
Support the 'external' option for networks
Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com>
This commit is contained in:
parent
ca68c9faa4
commit
73fbd01cfe
@ -11,16 +11,35 @@ from .config import ConfigurationError
|
|||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
# TODO: support external networks
|
|
||||||
class Network(object):
|
class Network(object):
|
||||||
def __init__(self, client, project, name, driver=None, driver_opts=None):
|
def __init__(self, client, project, name, driver=None, driver_opts=None,
|
||||||
|
external_name=None):
|
||||||
self.client = client
|
self.client = client
|
||||||
self.project = project
|
self.project = project
|
||||||
self.name = name
|
self.name = name
|
||||||
self.driver = driver
|
self.driver = driver
|
||||||
self.driver_opts = driver_opts
|
self.driver_opts = driver_opts
|
||||||
|
self.external_name = external_name
|
||||||
|
|
||||||
def ensure(self):
|
def ensure(self):
|
||||||
|
if self.external_name:
|
||||||
|
try:
|
||||||
|
self.inspect()
|
||||||
|
log.debug(
|
||||||
|
'Network {0} declared as external. No new '
|
||||||
|
'network will be created.'.format(self.name)
|
||||||
|
)
|
||||||
|
except NotFound:
|
||||||
|
raise ConfigurationError(
|
||||||
|
'Network {name} declared as external, but could'
|
||||||
|
' not be found. Please create the network manually'
|
||||||
|
' using `{command} {name}` and try again.'.format(
|
||||||
|
name=self.external_name,
|
||||||
|
command='docker network create'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
data = self.inspect()
|
data = self.inspect()
|
||||||
if self.driver and data['Driver'] != self.driver:
|
if self.driver and data['Driver'] != self.driver:
|
||||||
@ -55,4 +74,6 @@ class Network(object):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def full_name(self):
|
def full_name(self):
|
||||||
|
if self.external_name:
|
||||||
|
return self.external_name
|
||||||
return '{0}_{1}'.format(self.project, self.name)
|
return '{0}_{1}'.format(self.project, self.name)
|
||||||
|
@ -64,7 +64,9 @@ class Project(object):
|
|||||||
custom_networks.append(
|
custom_networks.append(
|
||||||
Network(
|
Network(
|
||||||
client=client, project=name, name=network_name,
|
client=client, project=name, name=network_name,
|
||||||
driver=data.get('driver'), driver_opts=data.get('driver_opts')
|
driver=data.get('driver'),
|
||||||
|
driver_opts=data.get('driver_opts'),
|
||||||
|
external_name=data.get('external_name'),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -456,6 +456,29 @@ class CLITestCase(DockerClientTestCase):
|
|||||||
assert container.get('NetworkSettings.Networks').keys() == [name]
|
assert container.get('NetworkSettings.Networks').keys() == [name]
|
||||||
assert container.get('HostConfig.NetworkMode') == name
|
assert container.get('HostConfig.NetworkMode') == name
|
||||||
|
|
||||||
|
def test_up_external_networks(self):
|
||||||
|
filename = 'external-networks.yml'
|
||||||
|
|
||||||
|
self.base_dir = 'tests/fixtures/networks'
|
||||||
|
self._project = get_project(self.base_dir, [filename])
|
||||||
|
|
||||||
|
result = self.dispatch(['-f', filename, 'up', '-d'], returncode=1)
|
||||||
|
assert 'declared as external, but could not be found' in result.stderr
|
||||||
|
|
||||||
|
networks = [
|
||||||
|
n['Name'] for n in self.client.networks()
|
||||||
|
if n['Name'].startswith('{}_'.format(self.project.name))
|
||||||
|
]
|
||||||
|
assert not networks
|
||||||
|
|
||||||
|
network_names = ['{}_{}'.format(self.project.name, n) for n in ['foo', 'bar']]
|
||||||
|
for name in network_names:
|
||||||
|
self.client.create_network(name)
|
||||||
|
|
||||||
|
self.dispatch(['-f', filename, 'up', '-d'])
|
||||||
|
container = self.project.containers()[0]
|
||||||
|
assert sorted(container.get('NetworkSettings.Networks').keys()) == sorted(network_names)
|
||||||
|
|
||||||
def test_up_no_services(self):
|
def test_up_no_services(self):
|
||||||
self.base_dir = 'tests/fixtures/no-services'
|
self.base_dir = 'tests/fixtures/no-services'
|
||||||
self.dispatch(['up', '-d'], None)
|
self.dispatch(['up', '-d'], None)
|
||||||
|
16
tests/fixtures/networks/external-networks.yml
vendored
Normal file
16
tests/fixtures/networks/external-networks.yml
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
version: 2
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: busybox
|
||||||
|
command: top
|
||||||
|
networks:
|
||||||
|
- networks_foo
|
||||||
|
- bar
|
||||||
|
|
||||||
|
networks:
|
||||||
|
networks_foo:
|
||||||
|
external: true
|
||||||
|
bar:
|
||||||
|
external:
|
||||||
|
name: networks_bar
|
Loading…
x
Reference in New Issue
Block a user