Kaydet (Commit) 042c7054 authored tarafından Jamie Greeff's avatar Jamie Greeff Kaydeden (comit) Joffrey F

Add support for passing healthcheck to create_container

Signed-off-by: 's avatarJamie Greeff <jamie@greeff.me>
üst aa282f37
......@@ -115,7 +115,8 @@ class ContainerApiMixin(object):
cpu_shares=None, working_dir=None, domainname=None,
memswap_limit=None, cpuset=None, host_config=None,
mac_address=None, labels=None, volume_driver=None,
stop_signal=None, networking_config=None):
stop_signal=None, networking_config=None,
healthcheck=None):
if isinstance(volumes, six.string_types):
volumes = [volumes, ]
......@@ -130,7 +131,7 @@ class ContainerApiMixin(object):
tty, mem_limit, ports, environment, dns, volumes, volumes_from,
network_disabled, entrypoint, cpu_shares, working_dir, domainname,
memswap_limit, cpuset, host_config, mac_address, labels,
volume_driver, stop_signal, networking_config,
volume_driver, stop_signal, networking_config, healthcheck,
)
return self.create_container_from_config(config, name)
......@@ -365,7 +366,7 @@ class ContainerApiMixin(object):
cap_drop=cap_drop, volumes_from=volumes_from, devices=devices,
network_mode=network_mode, restart_policy=restart_policy,
extra_hosts=extra_hosts, read_only=read_only, pid_mode=pid_mode,
ipc_mode=ipc_mode, security_opt=security_opt, ulimits=ulimits
ipc_mode=ipc_mode, security_opt=security_opt, ulimits=ulimits,
)
start_config = None
......
......@@ -4,4 +4,5 @@ from .services import (
ContainerSpec, DriverConfig, EndpointSpec, Mount, Resources, RestartPolicy,
TaskTemplate, UpdateConfig
)
from .healthcheck import Healthcheck
from .swarm import SwarmSpec, SwarmExternalCA
from .base import DictType
class Healthcheck(DictType):
def __init__(self, **kwargs):
test = kwargs.get('test', kwargs.get('Test'))
interval = kwargs.get('interval', kwargs.get('Interval'))
timeout = kwargs.get('timeout', kwargs.get('Timeout'))
retries = kwargs.get('retries', kwargs.get('Retries'))
super(Healthcheck, self).__init__({
'Test': test,
'Interval': interval,
'Timeout': timeout,
'Retries': retries
})
@property
def test(self):
return self['Test']
@test.setter
def test(self, value):
self['Test'] = value
@property
def interval(self):
return self['Interval']
@interval.setter
def interval(self, value):
self['Interval'] = value
@property
def timeout(self):
return self['Timeout']
@timeout.setter
def timeout(self, value):
self['Timeout'] = value
@property
def retries(self):
return self['Retries']
@retries.setter
def retries(self, value):
self['Retries'] = value
......@@ -1041,6 +1041,7 @@ def create_container_config(
entrypoint=None, cpu_shares=None, working_dir=None, domainname=None,
memswap_limit=None, cpuset=None, host_config=None, mac_address=None,
labels=None, volume_driver=None, stop_signal=None, networking_config=None,
healthcheck=None,
):
if isinstance(command, six.string_types):
command = split_command(command)
......@@ -1069,6 +1070,11 @@ def create_container_config(
'stop_signal was only introduced in API version 1.21'
)
if healthcheck is not None and version_lt(version, '1.24'):
raise errors.InvalidVersion(
'Health options were only introduced in API version 1.24'
)
if compare_version('1.19', version) < 0:
if volume_driver is not None:
raise errors.InvalidVersion(
......@@ -1176,5 +1182,6 @@ def create_container_config(
'MacAddress': mac_address,
'Labels': labels,
'VolumeDriver': volume_driver,
'StopSignal': stop_signal
'StopSignal': stop_signal,
'Healthcheck': healthcheck,
}
import time
import docker
from ..base import requires_api_version
from .. import helpers
class HealthcheckTest(helpers.BaseTestCase):
@requires_api_version('1.21')
def test_healthcheck(self):
healthcheck = docker.types.Healthcheck(
test=["CMD-SHELL",
"foo.txt || (/bin/usleep 10000 && touch foo.txt)"],
interval=500000,
timeout=1000000000,
retries=1
)
container = self.client.create_container(helpers.BUSYBOX, 'cat',
detach=True, stdin_open=True,
healthcheck=healthcheck)
id = container['Id']
self.client.start(id)
self.tmp_containers.append(id)
res1 = self.client.inspect_container(id)
self.assertIn('State', res1)
self.assertIn('Health', res1['State'])
self.assertIn('Status', res1['State']['Health'])
self.assertEqual(res1['State']['Health']['Status'], "starting")
time.sleep(0.5)
res2 = self.client.inspect_container(id)
self.assertIn('State', res2)
self.assertIn('Health', res2['State'])
self.assertIn('Status', res2['State']['Health'])
self.assertEqual(res2['State']['Health']['Status'], "healthy")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment