Преглед на файлове

Add restart option to Fig. Related to #478

Signed-off-by: Paul Bonaud <[email protected]>
Paul B преди 11 години
родител
ревизия
04da6b035e
променени са 3 файла, в които са добавени 35 реда и са изтрити 3 реда
  1. 3 1
      docs/yml.md
  2. 21 2
      fig/service.py
  3. 11 0
      tests/integration/service_test.py

+ 3 - 1
docs/yml.md

@@ -142,7 +142,7 @@ dns:
   - 9.9.9.9
 ```
 
-### working\_dir, entrypoint, user, hostname, domainname, mem\_limit, privileged
+### working\_dir, entrypoint, user, hostname, domainname, mem\_limit, privileged, restart
 
 Each of these is a single value, analogous to its [docker run](https://docs.docker.com/reference/run/) counterpart.
 
@@ -156,4 +156,6 @@ domainname: foo.com
 
 mem_limit: 1000000000
 privileged: true
+
+restart: always
 ```

+ 21 - 2
fig/service.py

@@ -15,7 +15,7 @@ from .progress_stream import stream_output, StreamOutputError
 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',
@@ -262,6 +262,8 @@ class Service(object):
         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=port_bindings,
@@ -270,6 +272,7 @@ class Service(object):
             privileged=privileged,
             network_mode=net,
             dns=dns,
+            restart_policy=restart
         )
         return container
 
@@ -376,7 +379,7 @@ class Service(object):
             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]
 
@@ -466,6 +469,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, 'MaximumRetryCount': int(max_retry_count)}
+
+
 def parse_volume_spec(volume_config):
     parts = volume_config.split(':')
     if len(parts) > 3:

+ 11 - 0
tests/integration/service_test.py

@@ -365,6 +365,17 @@ class ServiceTest(DockerClientTestCase):
         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()