Support the 'external' option for networks

Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com>
This commit is contained in:
Aanand Prasad 2016-01-14 13:39:44 +00:00
parent ca68c9faa4
commit 73fbd01cfe
4 changed files with 65 additions and 3 deletions

View File

@ -11,16 +11,35 @@ from .config import ConfigurationError
log = logging.getLogger(__name__)
# TODO: support external networks
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.project = project
self.name = name
self.driver = driver
self.driver_opts = driver_opts
self.external_name = external_name
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:
data = self.inspect()
if self.driver and data['Driver'] != self.driver:
@ -55,4 +74,6 @@ class Network(object):
@property
def full_name(self):
if self.external_name:
return self.external_name
return '{0}_{1}'.format(self.project, self.name)

View File

@ -64,7 +64,9 @@ class Project(object):
custom_networks.append(
Network(
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'),
)
)

View File

@ -456,6 +456,29 @@ class CLITestCase(DockerClientTestCase):
assert container.get('NetworkSettings.Networks').keys() == [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):
self.base_dir = 'tests/fixtures/no-services'
self.dispatch(['up', '-d'], None)

View 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