summaryrefslogtreecommitdiffstats
path: root/ansible/library/docker_list_containers.py
blob: 2811d6b5a8afd9383cafe6167b8fccc79d54a424 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/usr/bin/python

ANSIBLE_METADATA = {
    'metadata_version': '1.1',
    'status': ['preview'],
    'supported_by': 'community'
}

DOCUMENTATION = '''
---
module: docker_list_containers

short_description: "List running docker containers"

description:
    - "Lists all running containers or those with matching label"

options:
    label_name:
        description:
            - container label name to match
        required: false
    label_value:
        description:
            - container label value to match
        required: false

author:
    - Bartek Grzybowski (b.grzybowski@partner.samsung.com)
'''

EXAMPLES = '''
# List all running containers
- name: List containers
  docker_list_containers:

# List all running containers matching label
- name: List containers
  docker_list_containers:
    label_name: 'io.rancher.project.name'
    label_value: 'kubernetes'
'''

RETURN = '''
containers:
    description: List of running containers matching module criteria
    type: list
    returned: always
    sample: [
        "rancher-agent",
        "rancher-server",
        "kubernetes-node-1",
        "infrastructure-server"
    ]
'''

from ansible_collections.community.docker.plugins.module_utils.common import AnsibleDockerClient

class DockerListContainers:

    def __init__(self):
        self.docker_client = AnsibleDockerClient(
            argument_spec=dict(
                label_name=dict(type='str', required=False),
                label_value=dict(type='str', required=False)
            )
        )

        self.containers = self.docker_client.containers()
        self.label_name=self.docker_client.module.params.get('label_name')
        self.label_value=self.docker_client.module.params.get('label_value')

        if self.label_name:
            self.containers_names=self._get_containers_names_by_label()
        else:
            self.containers_names=self._get_containers_names()

        self.result=dict(
            containers=self.containers_names,
            changed=False
        )

    def _get_containers_names(self):
        return [str(container_meta.get('Names')[0][1:]) for container_meta in self.containers if 'Names' in container_meta]

    def _get_containers_names_by_label(self):
        names=[]
        for container_meta in self.containers:
            if container_meta.get('Labels',{}).get(self.label_name) == self.label_value:
                names.append(str(container_meta['Names'][0][1:])) # strip leading '/' in container name and convert to str from unicode

        return names

def main():
    cont=DockerListContainers()
    cont.docker_client.module.exit_json(**cont.result)

if __name__ == '__main__':
    main()