From b126a21963729bc512556f4e4efb68660a8a2225 Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Mon, 12 Nov 2018 12:24:07 +0100 Subject: [PATCH] Docker volume fix labels (#48536) * Add integration test for labels (which fails). * Changing labels from list to dict. * Add changelog. (cherry picked from commit feb60b947cd07085c7bb5c60b346bae790994478) --- .../fragments/48536-docker_volume-labels.yml | 2 + .../modules/cloud/docker/docker_volume.py | 11 +++-- .../docker_volume/tasks/tests/basic.yml | 47 +++++++++++++++++++ 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 changelogs/fragments/48536-docker_volume-labels.yml diff --git a/changelogs/fragments/48536-docker_volume-labels.yml b/changelogs/fragments/48536-docker_volume-labels.yml new file mode 100644 index 00000000000..8ac0d90f633 --- /dev/null +++ b/changelogs/fragments/48536-docker_volume-labels.yml @@ -0,0 +1,2 @@ +bugfixes: +- "docker_volume - ``labels`` now work (and are a ``dict`` and no longer a ``list``)." diff --git a/lib/ansible/modules/cloud/docker/docker_volume.py b/lib/ansible/modules/cloud/docker/docker_volume.py index f1f480e7e81..a39d9cf5224 100644 --- a/lib/ansible/modules/cloud/docker/docker_volume.py +++ b/lib/ansible/modules/cloud/docker/docker_volume.py @@ -25,6 +25,7 @@ options: description: - Name of the volume to operate on. required: true + type: dict aliases: - volume_name @@ -32,15 +33,18 @@ options: description: - Specify the type of volume. Docker provides the C(local) driver, but 3rd party drivers can also be used. default: local + type: str driver_options: description: - "Dictionary of volume settings. Consult docker docs for valid options and values: U(https://docs.docker.com/engine/reference/commandline/volume_create/#driver-specific-options)" + type: dict labels: description: - - List of labels to set for the volume + - Dictionary of label key/values to set for the volume + type: dict force: description: @@ -185,8 +189,7 @@ class DockerVolumeManager(object): differences.append('driver_options.%s' % key) if self.parameters.labels: existing_labels = self.existing_volume.get('Labels', {}) - all_labels = set(self.parameters.labels) | set(existing_labels) - for label in all_labels: + for label in self.parameters.labels: if existing_labels.get(label) != self.parameters.labels.get(label): differences.append('labels.%s' % label) @@ -247,7 +250,7 @@ def main(): state=dict(type='str', default='present', choices=['present', 'absent']), driver=dict(type='str', default='local'), driver_options=dict(type='dict', default={}), - labels=dict(type='list'), + labels=dict(type='dict'), force=dict(type='bool', default=False), debug=dict(type='bool', default=False) ) diff --git a/test/integration/targets/docker_volume/tasks/tests/basic.yml b/test/integration/targets/docker_volume/tasks/tests/basic.yml index f40e54a137a..89787c72a3b 100644 --- a/test/integration/targets/docker_volume/tasks/tests/basic.yml +++ b/test/integration/targets/docker_volume/tasks/tests/basic.yml @@ -90,3 +90,50 @@ - driver_options_1 is changed - driver_options_2 is not changed - driver_options_3 is changed + +#################################################################### +## labels ########################################################## +#################################################################### + +- name: Create a volume with labels + docker_volume: + name: "{{ vname }}" + labels: + ansible.test.1: hello + ansible.test.2: world + register: driver_labels_1 + +- name: Create a volume with labels (idempotency) + docker_volume: + name: "{{ vname }}" + labels: + ansible.test.2: world + ansible.test.1: hello + register: driver_labels_2 + +- name: Create a volume with labels (less) + docker_volume: + name: "{{ vname }}" + labels: + ansible.test.1: hello + register: driver_labels_3 + +- name: Create a volume with labels (more) + docker_volume: + name: "{{ vname }}" + labels: + ansible.test.1: hello + ansible.test.3: ansible + register: driver_labels_4 + +- name: Cleanup + docker_volume: + name: "{{ vname }}" + state: absent + +- assert: + that: + - driver_labels_1 is changed + - driver_labels_2 is not changed + - driver_labels_3 is not changed + - driver_labels_4 is changed