From 12305a076f4f3cc895e53737d09221c2e96d7ee2 Mon Sep 17 00:00:00 2001 From: Paul B Date: Tue, 28 Oct 2014 16:31:09 +0100 Subject: [PATCH] Add restart option to Fig. Related to #478 Signed-off-by: Paul Bonaud --- fig/service.py | 23 +++++++++++++++++++++-- tests/integration/service_test.py | 11 +++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/fig/service.py b/fig/service.py index 558ada2b2cf..a23d51c2a9a 100644 --- a/fig/service.py +++ b/fig/service.py @@ -15,7 +15,7 @@ log = logging.getLogger(__name__) -DOCKER_CONFIG_KEYS = ['image', 'command', 'hostname', 'domainname', 'user', 'detach', 'stdin_open', 'tty', 'mem_limit', 'ports', 'environment', 'dns', 'volumes', 'entrypoint', 'privileged', 'volumes_from', 'net', 'working_dir'] +DOCKER_CONFIG_KEYS = ['image', 'command', 'hostname', 'domainname', 'user', 'detach', 'stdin_open', 'tty', 'mem_limit', 'ports', 'environment', 'dns', 'volumes', 'entrypoint', 'privileged', 'volumes_from', 'net', 'working_dir', 'restart'] DOCKER_CONFIG_HINTS = { 'link' : 'links', 'port' : 'ports', @@ -263,6 +263,8 @@ def start_container(self, container=None, intermediate_container=None, **overrid net = options.get('net', 'bridge') dns = options.get('dns', None) + restart = parse_restart_spec(options.get('restart', None)) + container.start( links=self._get_links(link_to_self=options.get('one_off', False)), port_bindings=ports, @@ -271,6 +273,7 @@ def start_container(self, container=None, intermediate_container=None, **overrid privileged=privileged, network_mode=net, dns=dns, + restart_policy=restart ) return container @@ -377,7 +380,7 @@ def _get_container_create_options(self, override_options, one_off=False): container_options['image'] = self._build_tag_name() # Delete options which are only used when starting - for key in ['privileged', 'net', 'dns']: + for key in ['privileged', 'net', 'dns', 'restart']: if key in container_options: del container_options[key] @@ -467,6 +470,22 @@ def get_container_name(container): return name[1:] +def parse_restart_spec(restart_config): + if not restart_config: + return None + parts = restart_config.split(':') + if len(parts) > 2: + raise ConfigError("Restart %s has incorrect format, should be " + "mode[:max_retry]" % restart_config) + if len(parts) == 2: + name, max_retry_count = parts + else: + name, = parts + max_retry_count = 0 + + return {'name': name, 'maximum_retry_count': max_retry_count} + + def parse_volume_spec(volume_config): parts = volume_config.split(':') if len(parts) > 3: diff --git a/tests/integration/service_test.py b/tests/integration/service_test.py index c288edf6b97..86f33bd82ad 100644 --- a/tests/integration/service_test.py +++ b/tests/integration/service_test.py @@ -365,6 +365,17 @@ def test_dns_list(self): container = service.start_container().inspect() self.assertEqual(container['HostConfig']['Dns'], ['8.8.8.8', '9.9.9.9']) + def test_restart_always_value(self): + service = self.create_service('web', restart='always') + container = service.start_container().inspect() + self.assertEqual(container['HostConfig']['RestartPolicy']['Name'], 'always') + + def test_restart_on_failure_value(self): + service = self.create_service('web', restart='on-failure:5') + container = service.start_container().inspect() + self.assertEqual(container['HostConfig']['RestartPolicy']['Name'], 'on-failure') + self.assertEqual(container['HostConfig']['RestartPolicy']['MaximumRetryCount'], '5') + def test_working_dir_param(self): service = self.create_service('container', working_dir='/working/dir/sample') container = service.create_container().inspect()