Kaydet (Commit) b4f2b5fa authored tarafından Jamie Greeff's avatar Jamie Greeff Kaydeden (comit) Aanand Prasad

Add support for passing healthcheck to create_container

Signed-off-by: 's avatarJamie Greeff <jamie@greeff.me>
üst f262dd6d
...@@ -115,7 +115,8 @@ class ContainerApiMixin(object): ...@@ -115,7 +115,8 @@ class ContainerApiMixin(object):
cpu_shares=None, working_dir=None, domainname=None, cpu_shares=None, working_dir=None, domainname=None,
memswap_limit=None, cpuset=None, host_config=None, memswap_limit=None, cpuset=None, host_config=None,
mac_address=None, labels=None, volume_driver=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): if isinstance(volumes, six.string_types):
volumes = [volumes, ] volumes = [volumes, ]
...@@ -130,7 +131,7 @@ class ContainerApiMixin(object): ...@@ -130,7 +131,7 @@ class ContainerApiMixin(object):
tty, mem_limit, ports, environment, dns, volumes, volumes_from, tty, mem_limit, ports, environment, dns, volumes, volumes_from,
network_disabled, entrypoint, cpu_shares, working_dir, domainname, network_disabled, entrypoint, cpu_shares, working_dir, domainname,
memswap_limit, cpuset, host_config, mac_address, labels, 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) return self.create_container_from_config(config, name)
...@@ -365,7 +366,7 @@ class ContainerApiMixin(object): ...@@ -365,7 +366,7 @@ class ContainerApiMixin(object):
cap_drop=cap_drop, volumes_from=volumes_from, devices=devices, cap_drop=cap_drop, volumes_from=volumes_from, devices=devices,
network_mode=network_mode, restart_policy=restart_policy, network_mode=network_mode, restart_policy=restart_policy,
extra_hosts=extra_hosts, read_only=read_only, pid_mode=pid_mode, 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 start_config = None
......
...@@ -4,4 +4,5 @@ from .services import ( ...@@ -4,4 +4,5 @@ from .services import (
ContainerSpec, DriverConfig, EndpointSpec, Mount, Resources, RestartPolicy, ContainerSpec, DriverConfig, EndpointSpec, Mount, Resources, RestartPolicy,
TaskTemplate, UpdateConfig TaskTemplate, UpdateConfig
) )
from .healthcheck import Healthcheck
from .swarm import SwarmSpec, SwarmExternalCA 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
...@@ -1029,6 +1029,7 @@ def create_container_config( ...@@ -1029,6 +1029,7 @@ def create_container_config(
entrypoint=None, cpu_shares=None, working_dir=None, domainname=None, entrypoint=None, cpu_shares=None, working_dir=None, domainname=None,
memswap_limit=None, cpuset=None, host_config=None, mac_address=None, memswap_limit=None, cpuset=None, host_config=None, mac_address=None,
labels=None, volume_driver=None, stop_signal=None, networking_config=None, labels=None, volume_driver=None, stop_signal=None, networking_config=None,
healthcheck=None,
): ):
if isinstance(command, six.string_types): if isinstance(command, six.string_types):
command = split_command(command) command = split_command(command)
...@@ -1057,6 +1058,11 @@ def create_container_config( ...@@ -1057,6 +1058,11 @@ def create_container_config(
'stop_signal was only introduced in API version 1.21' '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 compare_version('1.19', version) < 0:
if volume_driver is not None: if volume_driver is not None:
raise errors.InvalidVersion( raise errors.InvalidVersion(
...@@ -1164,5 +1170,6 @@ def create_container_config( ...@@ -1164,5 +1170,6 @@ def create_container_config(
'MacAddress': mac_address, 'MacAddress': mac_address,
'Labels': labels, 'Labels': labels,
'VolumeDriver': volume_driver, '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