feat(docker_swarm_service): Add support for replicated jobs

This commit is contained in:
Tristan Pourcelot 2025-08-01 16:46:57 +02:00
parent 920015706b
commit 07a4b615d2
2 changed files with 46 additions and 2 deletions

View File

@ -242,6 +242,7 @@ options:
choices: choices:
- replicated - replicated
- global - global
- replicated-job
mounts: mounts:
description: description:
- List of dictionaries describing the service mounts. - List of dictionaries describing the service mounts.
@ -400,7 +401,7 @@ options:
type: bool type: bool
replicas: replicas:
description: description:
- Number of containers instantiated in the service. Valid only if O(mode=replicated). - Number of containers instantiated in the service. Valid only if O(mode=replicated) or O(mode=replicated-job).
- If set to V(-1), and service is not present, service replicas will be set to V(1). - If set to V(-1), and service is not present, service replicas will be set to V(1).
- If set to V(-1), and service is present, service replicas will be unchanged. - If set to V(-1), and service is present, service replicas will be unchanged.
- Corresponds to the C(--replicas) option of C(docker service create). - Corresponds to the C(--replicas) option of C(docker service create).
@ -2210,6 +2211,9 @@ class DockerServiceManager(object):
ds.replicas = mode['Replicated']['Replicas'] ds.replicas = mode['Replicated']['Replicas']
elif 'Global' in mode.keys(): elif 'Global' in mode.keys():
ds.mode = 'global' ds.mode = 'global'
elif 'ReplicatedJob' in mode.keys():
ds.mode = to_text('replicated-job', encoding='utf-8')
ds.replicas = mode['ReplicatedJob']['TotalCompletions']
else: else:
raise Exception('Unknown service mode: %s' % mode) raise Exception('Unknown service mode: %s' % mode)
@ -2605,7 +2609,7 @@ def main():
mode=dict( mode=dict(
type='str', type='str',
default='replicated', default='replicated',
choices=['replicated', 'global'] choices=['replicated', 'global', 'replicated-job']
), ),
replicas=dict(type='int', default=-1), replicas=dict(type='int', default=-1),
endpoint_mode=dict(type='str', choices=['vip', 'dnsrr']), endpoint_mode=dict(type='str', choices=['vip', 'dnsrr']),

View File

@ -1307,11 +1307,51 @@
state: absent state: absent
diff: false diff: false
- name: mode
docker_swarm_service:
name: "{{ service_name }}"
image: "{{ docker_test_image_alpine }}"
resolve_image: false
command: '/bin/sh -v -c "sleep 10m"'
mode: "replicated-job"
replicas: 1
register: mode_4
- name: mode (idempotency)
docker_swarm_service:
name: "{{ service_name }}"
image: "{{ docker_test_image_alpine }}"
resolve_image: false
command: '/bin/sh -v -c "sleep 10m"'
mode: "replicated-job"
replicas: 1
register: mode_5
- name: mode (change)
docker_swarm_service:
name: "{{ service_name }}"
image: "{{ docker_test_image_alpine }}"
resolve_image: false
command: '/bin/sh -v -c "sleep 10m"'
mode: "replicated"
replicas: 1
register: mode_6
- name: cleanup
docker_swarm_service:
name: "{{ service_name }}"
state: absent
diff: false
- assert: - assert:
that: that:
- mode_1 is changed - mode_1 is changed
- mode_2 is not changed - mode_2 is not changed
- mode_3 is changed - mode_3 is changed
- mode_4 is changed
- mode_5 is not changed
- mode_6 is changed
#################################################################### ####################################################################
## stop_grace_period ############################################### ## stop_grace_period ###############################################