Use networking for version 2 Compose files

- Remove --x-networking and --x-network-driver
- There's now no way to set a network driver - this will be added back
  with the 'networks' key

Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com>
This commit is contained in:
Aanand Prasad 2016-01-12 16:26:20 +00:00
parent 1a66543461
commit a027a0079c
9 changed files with 49 additions and 36 deletions

View File

@ -49,8 +49,6 @@ def project_from_options(base_dir, options):
get_config_path_from_options(options), get_config_path_from_options(options),
project_name=options.get('--project-name'), project_name=options.get('--project-name'),
verbose=options.get('--verbose'), verbose=options.get('--verbose'),
use_networking=options.get('--x-networking'),
network_driver=options.get('--x-network-driver'),
) )
@ -75,18 +73,14 @@ def get_client(verbose=False, version=None):
return client return client
def get_project(base_dir, config_path=None, project_name=None, verbose=False, def get_project(base_dir, config_path=None, project_name=None, verbose=False):
use_networking=False, network_driver=None):
config_details = config.find(base_dir, config_path) config_details = config.find(base_dir, config_path)
project_name = get_project_name(config_details.working_dir, project_name)
config_data = config.load(config_details)
api_version = '1.21' if config_data.version < 2 else None
client = get_client(verbose=verbose, version=api_version)
api_version = '1.21' if use_networking else None return Project.from_config(project_name, config_data, client)
return Project.from_config(
get_project_name(config_details.working_dir, project_name),
config.load(config_details),
get_client(verbose=verbose, version=api_version),
use_networking=use_networking,
network_driver=network_driver
)
def get_project_name(working_dir, project_name=None): def get_project_name(working_dir, project_name=None):

View File

@ -122,10 +122,6 @@ class TopLevelCommand(DocoptCommand):
Options: Options:
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml) -f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name) -p, --project-name NAME Specify an alternate project name (default: directory name)
--x-networking (EXPERIMENTAL) Use new Docker networking functionality.
Requires Docker 1.9 or later.
--x-network-driver DRIVER (EXPERIMENTAL) Specify a network driver (default: "bridge").
Requires Docker 1.9 or later.
--verbose Show more output --verbose Show more output
-v, --version Print version and exit -v, --version Print version and exit

View File

@ -48,11 +48,12 @@ class Project(object):
] ]
@classmethod @classmethod
def from_config(cls, name, config_data, client, use_networking=False, network_driver=None): def from_config(cls, name, config_data, client):
""" """
Construct a Project from a config.Config object. Construct a Project from a config.Config object.
""" """
project = cls(name, [], client, use_networking=use_networking, network_driver=network_driver) use_networking = (config_data.version and config_data.version >= 2)
project = cls(name, [], client, use_networking=use_networking)
if use_networking: if use_networking:
remove_links(config_data.services) remove_links(config_data.services)

View File

@ -116,15 +116,11 @@ _docker_compose_docker_compose() {
--project-name|-p) --project-name|-p)
return return
;; ;;
--x-network-driver)
COMPREPLY=( $( compgen -W "bridge host none overlay" -- "$cur" ) )
return
;;
esac esac
case "$cur" in case "$cur" in
-*) -*)
COMPREPLY=( $( compgen -W "--file -f --help -h --project-name -p --verbose --version -v --x-networking --x-network-driver" -- "$cur" ) ) COMPREPLY=( $( compgen -W "--file -f --help -h --project-name -p --verbose --version -v" -- "$cur" ) )
;; ;;
*) *)
COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) ) COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
@ -416,9 +412,6 @@ _docker_compose() {
(( counter++ )) (( counter++ ))
compose_project="${words[$counter]}" compose_project="${words[$counter]}"
;; ;;
--x-network-driver)
(( counter++ ))
;;
-*) -*)
;; ;;
*) *)

View File

@ -332,8 +332,6 @@ _docker-compose() {
'(- :)'{-v,--version}'[Print version and exit]' \ '(- :)'{-v,--version}'[Print version and exit]' \
'(-f --file)'{-f,--file}'[Specify an alternate docker-compose file (default: docker-compose.yml)]:file:_files -g "*.yml"' \ '(-f --file)'{-f,--file}'[Specify an alternate docker-compose file (default: docker-compose.yml)]:file:_files -g "*.yml"' \
'(-p --project-name)'{-p,--project-name}'[Specify an alternate project name (default: directory name)]:project name:' \ '(-p --project-name)'{-p,--project-name}'[Specify an alternate project name (default: directory name)]:project name:' \
'--x-networking[(EXPERIMENTAL) Use new Docker networking functionality. Requires Docker 1.9 or later.]' \
'--x-network-driver[(EXPERIMENTAL) Specify a network driver (default: "bridge"). Requires Docker 1.9 or later.]:Network Driver:(bridge host none overlay)' \
'(-): :->command' \ '(-): :->command' \
'(-)*:: :->option-or-argument' && ret=0 '(-)*:: :->option-or-argument' && ret=0

View File

@ -338,7 +338,7 @@ class CLITestCase(DockerClientTestCase):
self.base_dir = 'tests/fixtures/links-composefile' self.base_dir = 'tests/fixtures/links-composefile'
self.dispatch(['up', '-d'], None) self.dispatch(['up', '-d'], None)
networks = self.client.networks(names=[self.project.name]) networks = self.client.networks(names=[self.project.default_network_name])
self.assertEqual(len(networks), 0) self.assertEqual(len(networks), 0)
for service in self.project.get_services(): for service in self.project.get_services():
@ -350,8 +350,8 @@ class CLITestCase(DockerClientTestCase):
self.assertTrue(web_container.get('HostConfig.Links')) self.assertTrue(web_container.get('HostConfig.Links'))
def test_up_with_networking(self): def test_up_with_networking(self):
self.base_dir = 'tests/fixtures/links-composefile' self.base_dir = 'tests/fixtures/v2-simple'
self.dispatch(['--x-networking', 'up', '-d'], None) self.dispatch(['up', '-d'], None)
services = self.project.get_services() services = self.project.get_services()
@ -369,7 +369,7 @@ class CLITestCase(DockerClientTestCase):
self.assertEqual(len(containers), 1) self.assertEqual(len(containers), 1)
self.assertIn(containers[0].id, network['Containers']) self.assertIn(containers[0].id, network['Containers'])
web_container = self.project.get_service('web').containers()[0] web_container = self.project.get_service('simple').containers()[0]
self.assertFalse(web_container.get('HostConfig.Links')) self.assertFalse(web_container.get('HostConfig.Links'))
def test_up_with_links(self): def test_up_with_links(self):
@ -645,8 +645,8 @@ class CLITestCase(DockerClientTestCase):
self.assertEqual(container.name, name) self.assertEqual(container.name, name)
def test_run_with_networking(self): def test_run_with_networking(self):
self.base_dir = 'tests/fixtures/simple-dockerfile' self.base_dir = 'tests/fixtures/v2-simple'
self.dispatch(['--x-networking', 'run', 'simple', 'true'], None) self.dispatch(['run', 'simple', 'true'], None)
service = self.project.get_service('simple') service = self.project.get_service('simple')
container, = service.containers(stopped=True, one_off=True) 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_name])

View File

@ -0,0 +1,8 @@
version: 2
services:
simple:
image: busybox:latest
command: top
another:
image: busybox:latest
command: top

View File

@ -36,14 +36,21 @@ class DockerClientTestCase(unittest.TestCase):
all=True, all=True,
filters={'label': '%s=composetest' % LABEL_PROJECT}): filters={'label': '%s=composetest' % LABEL_PROJECT}):
self.client.remove_container(c['Id'], force=True) self.client.remove_container(c['Id'], force=True)
for i in self.client.images( for i in self.client.images(
filters={'label': 'com.docker.compose.test_image'}): filters={'label': 'com.docker.compose.test_image'}):
self.client.remove_image(i) self.client.remove_image(i)
volumes = self.client.volumes().get('Volumes') or [] volumes = self.client.volumes().get('Volumes') or []
for v in volumes: for v in volumes:
if 'composetest_' in v['Name']: if 'composetest_' in v['Name']:
self.client.remove_volume(v['Name']) self.client.remove_volume(v['Name'])
networks = self.client.networks()
for n in networks:
if 'composetest_' in n['Name']:
self.client.remove_network(n['Name'])
def create_service(self, name, **kwargs): def create_service(self, name, **kwargs):
if 'image' not in kwargs and 'build' not in kwargs: if 'image' not in kwargs and 'build' not in kwargs:
kwargs['image'] = 'busybox:latest' kwargs['image'] = 'busybox:latest'

View File

@ -39,7 +39,7 @@ class ProjectTest(unittest.TestCase):
self.assertEqual(project.get_service('db').options['image'], 'busybox:latest') self.assertEqual(project.get_service('db').options['image'], 'busybox:latest')
def test_from_config(self): def test_from_config(self):
dicts = Config(None, [ config = Config(None, [
{ {
'name': 'web', 'name': 'web',
'image': 'busybox:latest', 'image': 'busybox:latest',
@ -49,12 +49,28 @@ class ProjectTest(unittest.TestCase):
'image': 'busybox:latest', 'image': 'busybox:latest',
}, },
], None) ], None)
project = Project.from_config('composetest', dicts, None) project = Project.from_config('composetest', config, None)
self.assertEqual(len(project.services), 2) self.assertEqual(len(project.services), 2)
self.assertEqual(project.get_service('web').name, 'web') self.assertEqual(project.get_service('web').name, 'web')
self.assertEqual(project.get_service('web').options['image'], 'busybox:latest') self.assertEqual(project.get_service('web').options['image'], 'busybox:latest')
self.assertEqual(project.get_service('db').name, 'db') self.assertEqual(project.get_service('db').name, 'db')
self.assertEqual(project.get_service('db').options['image'], 'busybox:latest') self.assertEqual(project.get_service('db').options['image'], 'busybox:latest')
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)
project = Project.from_config('composetest', config, None)
self.assertEqual(len(project.services), 2)
self.assertTrue(project.use_networking)
def test_get_service(self): def test_get_service(self):
web = Service( web = Service(