From 2d420827378d43d79def26fb254cd33b7a6e89b5 Mon Sep 17 00:00:00 2001 From: Sagi Shnaidman Date: Sat, 2 Nov 2019 12:13:27 +0200 Subject: [PATCH] Molecule job for testing plugins and modules and remove ansible_facts from podman_container_info module Change-Id: I0c768bc6168363fa3758562f9f053aa9ab85236b --- tox.ini | 7 + .../modules/podman_container_info.py | 584 +++++++++--------- .../modules/podman_volume_info.py | 64 +- .../ansible_plugins/tests/.yamllint | 33 + .../molecule/podman_container/molecule.yml | 56 ++ .../molecule/podman_container/playbook.yml | 352 +++++++++++ .../molecule/podman_container/prepare.yml | 22 + .../podman_container_info/molecule.yml | 56 ++ .../podman_container_info/playbook.yml | 70 +++ .../podman_container_info/prepare.yml | 22 + .../molecule/podman_volume_info/molecule.yml | 56 ++ .../molecule/podman_volume_info/playbook.yml | 63 ++ .../molecule/podman_volume_info/prepare.yml | 22 + tripleo_ansible/playbooks/podman_tests.yml | 351 ----------- .../molecule/default/playbook.yml | 2 +- .../tasks/podman.yaml | 2 +- zuul.d/molecule.yaml | 10 + zuul.d/playbooks/run.yml | 13 +- 18 files changed, 1101 insertions(+), 684 deletions(-) create mode 100644 tripleo_ansible/ansible_plugins/tests/.yamllint create mode 100644 tripleo_ansible/ansible_plugins/tests/molecule/podman_container/molecule.yml create mode 100644 tripleo_ansible/ansible_plugins/tests/molecule/podman_container/playbook.yml create mode 100644 tripleo_ansible/ansible_plugins/tests/molecule/podman_container/prepare.yml create mode 100644 tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/molecule.yml create mode 100644 tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/playbook.yml create mode 100644 tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/prepare.yml create mode 100644 tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/molecule.yml create mode 100644 tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/playbook.yml create mode 100644 tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/prepare.yml delete mode 100644 tripleo_ansible/playbooks/podman_tests.yml diff --git a/tox.ini b/tox.ini index 1f3b8ea7d..49a18f282 100644 --- a/tox.ini +++ b/tox.ini @@ -123,3 +123,10 @@ commands = echo -e '\n\nNo molecule tests have been executed\nSee https://docs.openstack.org/tripleo-ansible/latest/contributing.html#local-testing-of-new-roles\n\n'; \ fi" {[testenv:linters]commands} + +[testenv:modules] +deps= + {[testenv:linters]deps} +commands = + bash -c "cd {toxinidir}/tripleo_ansible/ansible_plugins/tests; molecule test --all;" + {[testenv:linters]commands} diff --git a/tripleo_ansible/ansible_plugins/modules/podman_container_info.py b/tripleo_ansible/ansible_plugins/modules/podman_container_info.py index 257844a02..0e63e15af 100644 --- a/tripleo_ansible/ansible_plugins/modules/podman_container_info.py +++ b/tripleo_ansible/ansible_plugins/modules/podman_container_info.py @@ -13,54 +13,43 @@ # License for the specific language governing permissions and limitations # under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function +from __future__ import absolute_import, division, print_function +__metaclass__ = type -import json -import yaml - -from ansible.module_utils.basic import AnsibleModule -import ansible.module_utils.six as six - -six.add_metaclass(type) ANSIBLE_METADATA = { - 'metadata_version': '1.0', + 'metadata_version': '1.1', 'status': ['preview'], 'supported_by': 'community' } DOCUMENTATION = """ ---- module: podman_container_info author: - Sagi Shnaidman (@sshnaidm) - Emilien Macchi (@EmilienM) -version_added: '2.9' +version_added: '2.10' short_description: Gather facts about containers using podman notes: - - Podman may required elevated privileges in order to run properly. + - Podman may require elevated privileges in order to run properly. description: - Gather facts about containers using C(podman) requirements: - "Podman installed on host" options: - executable: - description: - - Path to C(podman) executable if it is not in the C($PATH) on the - machine running C(podman) - default: 'podman' - type: str - name: - description: - - List of tags or UID to gather facts about. If no name is given - return facts about all containers. - type: list - elements: str - + name: + description: + - List of container names to gather facts about. If no name is given + return facts about all containers. + type: list + elements: str + executable: + description: + - Path to C(podman) executable if it is not in the C($PATH) on the + machine running C(podman) + default: 'podman' + type: str """ - EXAMPLES = """ - name: Gather facts for all containers podman_container_info: @@ -75,273 +64,274 @@ EXAMPLES = """ - redis - web1 """ - RETURN = """ containers: description: Facts from all or specificed containers returned: always - type: dict + type: list sample: [ - { - "Id": "c5c39f9b80a6ea2ad665aa9946435934e478a0c5322da835f3883872f", - "Created": "2019-10-01T12:51:00.233106443Z", - "Path": "dumb-init", - "Args": [ - "--single-child", - "--", - "kolla_start" - ], - "State": { - "OciVersion": "1.0.1-dev", - "Status": "configured", - "Running": false, - "Paused": false, - "Restarting": false, - "OOMKilled": false, - "Dead": false, - "Pid": 0, - "ExitCode": 0, - "Error": "", - "StartedAt": "0001-01-01T00:00:00Z", - "FinishedAt": "0001-01-01T00:00:00Z", - "Healthcheck": { - "Status": "", - "FailingStreak": 0, - "Log": null - } - }, - "Image": "0e267acda67d0ebd643e900d820a91b961d859743039e620191ca1", - "ImageName": "docker.io/tripleomaster/centos-haproxy:latest", - "Rootfs": "", - "Pod": "", - "ResolvConfPath": "", - "HostnamePath": "", - "HostsPath": "", - "OCIRuntime": "runc", - "Name": "haproxy", - "RestartCount": 0, - "Driver": "overlay", - "MountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c78,c866", - "ProcessLabel": "system_u:system_r:svirt_lxc_net_t:s0:c785,c866", - "AppArmorProfile": "", - "EffectiveCaps": [ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE" - ], - "BoundingCaps": [ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE" - ], - "ExecIDs": [], - "GraphDriver": { - "Name": "overlay", - } - }, - "Mounts": [], - "Dependencies": [], - "NetworkSettings": { - "Bridge": "", - "SandboxID": "", - "HairpinMode": false, - "LinkLocalIPv6Address": "", - "LinkLocalIPv6PrefixLen": 0, - "Ports": [], - "SandboxKey": "", - "SecondaryIPAddresses": null, - "SecondaryIPv6Addresses": null, - "EndpointID": "", - "Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "IPAddress": "", - "IPPrefixLen": 0, - "IPv6Gateway": "", - "MacAddress": "" - }, - "ExitCommand": [ - "/usr/bin/podman", - "--root", - "/var/lib/containers/storage", - "--runroot", - "/var/run/containers/storage", - "--log-level", - "error", - "--cgroup-manager", - "systemd", - "--tmpdir", - "/var/run/libpod", - "--runtime", - "runc", - "--storage-driver", - "overlay", - "--events-backend", - "journald", - "container", - "cleanup", - "c9e813703f9b80a6ea2ad665aa9946435934e478a0c5322da835f3883872f" - ], - "Namespace": "", - "IsInfra": false, - "Config": { - "Hostname": "c5c39e813703", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "PATH=/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "TERM=xterm", - "HOSTNAME=", - "container=oci", - "KOLLA_INSTALL_METATYPE=rdo", - "KOLLA_BASE_DISTRO=centos", - "KOLLA_INSTALL_TYPE=binary", - "KOLLA_DISTRO_PYTHON_VERSION=2.7", - "KOLLA_BASE_ARCH=x86_64" - ], - "Cmd": [ + { + "Id": "c5c39f9b80a6ea2ad665aa9946435934e478a0c5322da835f3883872f", + "Created": "2019-10-01T12:51:00.233106443Z", + "Path": "dumb-init", + "Args": [ + "--single-child", + "--", "kolla_start" ], - "Image": "docker.io/tripleomaster/centos-haproxy:latest", - "Volumes": null, - "WorkingDir": "/", - "Entrypoint": "dumb-init --single-child --", - "OnBuild": null, - "Labels": { - "build-date": "20190919", - "kolla_version": "8.1.0", - "name": "haproxy", - "org.label-schema.build-date": "20190801", - "org.label-schema.license": "GPLv2", - "org.label-schema.name": "CentOS Base Image", - "org.label-schema.schema-version": "1.0", - "org.label-schema.vendor": "CentOS" - }, - "Annotations": { - "io.kubernetes.cri-o.ContainerType": "sandbox", - "io.kubernetes.cri-o.TTY": "false", - "io.podman.annotations.autoremove": "FALSE", - "io.podman.annotations.init": "FALSE", - "io.podman.annotations.privileged": "FALSE", - "io.podman.annotations.publish-all": "FALSE" - }, - "StopSignal": 15 - }, - "HostConfig": { - "Binds": [], - "ContainerIDFile": "", - "LogConfig": { - "Type": "k8s-file", - "Config": null - }, - "NetworkMode": "default", - "PortBindings": {}, - "RestartPolicy": { - "Name": "", - "MaximumRetryCount": 0 - }, - "AutoRemove": false, - "VolumeDriver": "", - "VolumesFrom": null, - "CapAdd": [], - "CapDrop": [], - "Dns": [], - "DnsOptions": [], - "DnsSearch": [], - "ExtraHosts": [], - "GroupAdd": [], - "IpcMode": "", - "Cgroup": "", - "Links": null, - "OomScoreAdj": 0, - "PidMode": "", - "Privileged": false, - "PublishAllPorts": false, - "ReadonlyRootfs": false, - "SecurityOpt": [], - "Tmpfs": {}, - "UTSMode": "", - "UsernsMode": "", - "ShmSize": 65536000, - "Runtime": "oci", - "ConsoleSize": [ - 0, - 0 - ], - "Isolation": "", - "CpuShares": 0, - "Memory": 0, - "NanoCpus": 0, - "CgroupParent": "", - "BlkioWeight": 0, - "BlkioWeightDevice": null, - "BlkioDeviceReadBps": null, - "BlkioDeviceWriteBps": null, - "BlkioDeviceReadIOps": null, - "BlkioDeviceWriteIOps": null, - "CpuPeriod": 0, - "CpuQuota": 0, - "CpuRealtimePeriod": 0, - "CpuRealtimeRuntime": 0, - "CpusetCpus": "", - "CpusetMems": "", - "Devices": [], - "DiskQuota": 0, - "KernelMemory": 0, - "MemoryReservation": 0, - "MemorySwap": 0, - "MemorySwappiness": -1, - "OomKillDisable": false, - "PidsLimit": 0, - "Ulimits": [ - { - "Name": "RLIMIT_NOFILE", - "Soft": 1048576, - "Hard": 1048576 - }, - { - "Name": "RLIMIT_NPROC", - "Soft": 1048576, - "Hard": 1048576 + "State": { + "OciVersion": "1.0.1-dev", + "Status": "configured", + "Running": false, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 0, + "ExitCode": 0, + "Error": "", + "StartedAt": "0001-01-01T00:00:00Z", + "FinishedAt": "0001-01-01T00:00:00Z", + "Healthcheck": { + "Status": "", + "FailingStreak": 0, + "Log": null } + }, + "Image": "0e267acda67d0ebd643e900d820a91b961d859743039e620191ca1", + "ImageName": "docker.io/tripleomaster/centos-haproxy:latest", + "Rootfs": "", + "Pod": "", + "ResolvConfPath": "", + "HostnamePath": "", + "HostsPath": "", + "OCIRuntime": "runc", + "Name": "haproxy", + "RestartCount": 0, + "Driver": "overlay", + "MountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c78,c866", + "ProcessLabel": "system_u:system_r:svirt_lxc_net_t:s0:c785,c866", + "AppArmorProfile": "", + "EffectiveCaps": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" ], - "CpuCount": 0, - "CpuPercent": 0, - "IOMaximumIOps": 0, - "IOMaximumBandwidth": 0 - } - } - ] + "BoundingCaps": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ], + "ExecIDs": [], + "GraphDriver": { + "Name": "overlay" + }, + "Mounts": [], + "Dependencies": [], + "NetworkSettings": { + "Bridge": "", + "SandboxID": "", + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "Ports": [], + "SandboxKey": "", + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "" + }, + "ExitCommand": [ + "/usr/bin/podman", + "--root", + "/var/lib/containers/storage", + "--runroot", + "/var/run/containers/storage", + "--log-level", + "error", + "--cgroup-manager", + "systemd", + "--tmpdir", + "/var/run/libpod", + "--runtime", + "runc", + "--storage-driver", + "overlay", + "--events-backend", + "journald", + "container", + "cleanup", + "c9e813703f9b80a6ea2ad665aa9946435934e478a0c5322da835f3883872f" + ], + "Namespace": "", + "IsInfra": false, + "Config": { + "Hostname": "c5c39e813703", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "TERM=xterm", + "HOSTNAME=", + "container=oci", + "KOLLA_INSTALL_METATYPE=rdo", + "KOLLA_BASE_DISTRO=centos", + "KOLLA_INSTALL_TYPE=binary", + "KOLLA_DISTRO_PYTHON_VERSION=2.7", + "KOLLA_BASE_ARCH=x86_64" + ], + "Cmd": [ + "kolla_start" + ], + "Image": "docker.io/tripleomaster/centos-haproxy:latest", + "Volumes": null, + "WorkingDir": "/", + "Entrypoint": "dumb-init --single-child --", + "OnBuild": null, + "Labels": { + "build-date": "20190919", + "kolla_version": "8.1.0", + "name": "haproxy", + "org.label-schema.build-date": "20190801", + "org.label-schema.license": "GPLv2", + "org.label-schema.name": "CentOS Base Image", + "org.label-schema.schema-version": "1.0", + "org.label-schema.vendor": "CentOS" + }, + "Annotations": { + "io.kubernetes.cri-o.ContainerType": "sandbox", + "io.kubernetes.cri-o.TTY": "false", + "io.podman.annotations.autoremove": "FALSE", + "io.podman.annotations.init": "FALSE", + "io.podman.annotations.privileged": "FALSE", + "io.podman.annotations.publish-all": "FALSE" + }, + "StopSignal": 15 + }, + "HostConfig": { + "Binds": [], + "ContainerIDFile": "", + "LogConfig": { + "Type": "k8s-file", + "Config": null + }, + "NetworkMode": "default", + "PortBindings": {}, + "RestartPolicy": { + "Name": "", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "CapAdd": [], + "CapDrop": [], + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": [], + "IpcMode": "", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": [], + "Tmpfs": {}, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 65536000, + "Runtime": "oci", + "ConsoleSize": [ + 0, + 0 + ], + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DiskQuota": 0, + "KernelMemory": 0, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": -1, + "OomKillDisable": false, + "PidsLimit": 0, + "Ulimits": [ + { + "Name": "RLIMIT_NOFILE", + "Soft": 1048576, + "Hard": 1048576 + }, + { + "Name": "RLIMIT_NPROC", + "Soft": 1048576, + "Hard": 1048576 + } + ], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0 + } + } + ] """ +import json +from ansible.module_utils.basic import AnsibleModule + def get_containers_facts(module, executable, name): if not name: @@ -353,30 +343,32 @@ def get_containers_facts(module, executable, name): command = [executable, 'container', 'inspect'] command.extend(name) rc, out, err = module.run_command(command) - if not out or rc != 0: + if rc != 0: + module.fail_json(msg="Unable to gather info for %s: %s" % (name or 'all containers', err)) + if not out or json.loads(out) is None: return [], out, err return json.loads(out), out, err def main(): module = AnsibleModule( - argument_spec=yaml.safe_load(DOCUMENTATION)['options'], + argument_spec=dict( + executable=dict(type='str', default='podman'), + name=dict(type='list', elements='str') + ), supports_check_mode=True, ) - executable = module.params['executable'] - name = module.params.get('name') - executable = module.get_bin_path(executable, required=True) + name = module.params['name'] + executable = module.get_bin_path(module.params['executable'], required=True) inspect_results, out, err = get_containers_facts(module, executable, name) - results = dict( - changed=False, - containers=inspect_results, - ansible_facts=dict(podman_containers=inspect_results), - stdout=out, - stderr=err - ) + results = { + "changed": False, + "containers": inspect_results, + "stderr": err + } module.exit_json(**results) diff --git a/tripleo_ansible/ansible_plugins/modules/podman_volume_info.py b/tripleo_ansible/ansible_plugins/modules/podman_volume_info.py index 943043b4c..71176dd30 100644 --- a/tripleo_ansible/ansible_plugins/modules/podman_volume_info.py +++ b/tripleo_ansible/ansible_plugins/modules/podman_volume_info.py @@ -15,17 +15,11 @@ # License for the specific language governing permissions and limitations # under the License. - from __future__ import absolute_import, division, print_function - -import json -import yaml - -from ansible.module_utils.basic import AnsibleModule - +__metaclass__ = type ANSIBLE_METADATA = { - 'metadata_version': '1.0', + 'metadata_version': '1.1', 'status': ['preview'], 'supported_by': 'community' } @@ -34,7 +28,7 @@ DOCUMENTATION = """ module: podman_volume_info author: - "Sagi Shnaidman (@sshnaidm)" -version_added: '2.9' +version_added: '2.10' short_description: Gather info about podman volumes notes: [] description: @@ -65,21 +59,22 @@ RETURN = """ volumes: description: Facts from all or specified volumes returned: always - type: dict - sample: - [ - { - "name": "testvolume", - "labels": {}, - "mountPoint": "/home/ansible/.local/share/testvolume/_data", - "driver": "local", - "options": {}, - "scope": "local" - } - ] - + type: list + sample: [ + { + "name": "testvolume", + "labels": {}, + "mountPoint": "/home/ansible/.local/share/testvolume/_data", + "driver": "local", + "options": {}, + "scope": "local" + } + ] """ +import json +from ansible.module_utils.basic import AnsibleModule + def get_volume_info(module, executable, name): command = [executable, 'volume', 'inspect'] @@ -88,31 +83,32 @@ def get_volume_info(module, executable, name): else: command.append("--all") rc, out, err = module.run_command(command) - if not out or rc != 0: + if rc != 0 or 'no such volume' in err: + module.fail_json(msg="Unable to gather info for %s: %s" % (name or 'all volumes', err)) + if not out or json.loads(out) is None: return [], out, err return json.loads(out), out, err def main(): module = AnsibleModule( - argument_spec=yaml.safe_load(DOCUMENTATION)['options'], + argument_spec=dict( + executable=dict(type='str', default='podman'), + name=dict(type='str') + ), supports_check_mode=True, ) - executable = module.params['executable'] name = module.params['name'] - executable = module.get_bin_path(executable, required=True) + executable = module.get_bin_path(module.params['executable'], required=True) inspect_results, out, err = get_volume_info(module, executable, name) - results = dict( - changed=False, - volume=inspect_results, - stdout=out, - stderr=err - ) - if name: - results.update({"exists": bool(inspect_results)}) + results = { + "changed": False, + "volumes": inspect_results, + "stderr": err + } module.exit_json(**results) diff --git a/tripleo_ansible/ansible_plugins/tests/.yamllint b/tripleo_ansible/ansible_plugins/tests/.yamllint new file mode 100644 index 000000000..882767605 --- /dev/null +++ b/tripleo_ansible/ansible_plugins/tests/.yamllint @@ -0,0 +1,33 @@ +--- +# Based on ansible-lint config +extends: default + +rules: + braces: + max-spaces-inside: 1 + level: error + brackets: + max-spaces-inside: 1 + level: error + colons: + max-spaces-after: -1 + level: error + commas: + max-spaces-after: -1 + level: error + comments: disable + comments-indentation: disable + document-start: disable + empty-lines: + max: 3 + level: error + hyphens: + level: error + indentation: disable + key-duplicates: enable + line-length: disable + new-line-at-end-of-file: disable + new-lines: + type: unix + trailing-spaces: disable + truthy: disable diff --git a/tripleo_ansible/ansible_plugins/tests/molecule/podman_container/molecule.yml b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container/molecule.yml new file mode 100644 index 000000000..bea14b986 --- /dev/null +++ b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container/molecule.yml @@ -0,0 +1,56 @@ +--- +driver: + name: delegated + options: + managed: false + login_cmd_template: >- + ssh + -o UserKnownHostsFile=/dev/null + -o StrictHostKeyChecking=no + -o Compression=no + -o TCPKeepAlive=yes + -o VerifyHostKeyDNS=no + -o ForwardX11=no + -o ForwardAgent=no + {instance} + ansible_connection_options: + ansible_connection: ssh + +log: true + +platforms: + - name: instance + +provisioner: + name: ansible + config_options: + defaults: + fact_caching: jsonfile + fact_caching_connection: /tmp/molecule/facts + inventory: + hosts: + all: + hosts: + instance: + ansible_host: localhost + log: true + env: + ANSIBLE_STDOUT_CALLBACK: yaml + ANSIBLE_ROLES_PATH: "${ANSIBLE_ROLES_PATH:-/usr/share/ansible/roles}:${HOME}/zuul-jobs/roles" + ANSIBLE_LIBRARY: "${ANSIBLE_LIBRARY:-/usr/share/ansible/plugins/modules}" + ANSIBLE_FILTER_PLUGINS: "${ANSIBLE_FILTER_PLUGINS:-/usr/share/ansible/plugins/filter}" + +scenario: + name: podman_container + test_sequence: + - prepare + - converge + - verify + +lint: + enabled: false + +verifier: + name: testinfra + lint: + name: flake8 diff --git a/tripleo_ansible/ansible_plugins/tests/molecule/podman_container/playbook.yml b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container/playbook.yml new file mode 100644 index 000000000..96474d658 --- /dev/null +++ b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container/playbook.yml @@ -0,0 +1,352 @@ +--- +- name: Converge + hosts: all + tasks: + - name: Test podman_container + become: true + block: + - name: Delete all container leftovers from tests + podman_container: + name: "{{ item }}" + state: absent + loop: + - "alpine:3.7" + - "container" + - "container2" + + - name: Test no image with default action + podman_container: + name: container + ignore_errors: true + register: no_image + + - name: Test no image with state 'started' + podman_container: + name: container + state: started + ignore_errors: true + register: no_image1 + + - name: Test no image with state 'present' + podman_container: + name: container + state: present + ignore_errors: true + register: no_image2 + + - name: Check no image + assert: + that: + - no_image is failed + - no_image1 is failed + - no_image2 is failed + - no_image.msg == "State 'started' required image to be configured!" + - no_image1.msg == "State 'started' required image to be configured!" + - no_image2.msg == "State 'present' required image to be configured!" + fail_msg: No image test failed! + success_msg: No image test passed! + + - name: Ensure image doesn't exist + podman_image: + name: alpine:3.7 + state: absent + + - name: Check pulling image + podman_container: + name: container + image: alpine:3.7 + state: present + command: sleep 1d + register: image + + - name: Check using already pulled image + podman_container: + name: container2 + image: alpine:3.7 + state: present + command: sleep 1d + register: image2 + + - name: Check output is correct + assert: + that: + - image is changed + - image.ansible_facts is defined + - image.ansible_facts.podman_container is defined + - image.ansible_facts.podman_container['State']['Running'] + - image.container is defined + - image.container['State']['Running'] + - "'pulled image alpine:3.7' in image.actions" + - "'started container' in image.actions" + - image2 is changed + - image2.ansible_facts is defined + - image2.ansible_facts.podman_container is defined + - image2.ansible_facts.podman_container['State']['Running'] + - image2.container is defined + - image2.container['State']['Running'] + - "'pulled image alpine:3.7' not in image2.actions" + - "'started container2' in image2.actions" + fail_msg: Pulling image test failed! + success_msg: Pulling image test passed! + + - name: Check failed image pull + podman_container: + name: container + image: ineverneverneverexist + state: present + command: sleep 1d + register: imagefail + ignore_errors: true + + - name: Check output is correct + assert: + that: + - imagefail is failed + - imagefail.msg == "Can't pull image ineverneverneverexist" + + + - name: Force container recreate + podman_container: + name: container + image: alpine + state: present + command: sleep 1d + recreate: true + register: recreated + + - name: Check output is correct + assert: + that: + - recreated is changed + - recreated.ansible_facts is defined + - recreated.ansible_facts.podman_container is defined + - recreated.ansible_facts.podman_container['State']['Running'] + - "'recreated container' in recreated.actions" + fail_msg: Force recreate test failed! + success_msg: Force recreate test passed! + + - name: Stop container + podman_container: + name: container + state: stopped + register: stopped + + - name: Stop the same container again (idempotency) + podman_container: + name: container + state: stopped + register: stopped_again + + - name: Check output is correct + assert: + that: + - stopped is changed + - stopped.ansible_facts is defined + - stopped.ansible_facts.podman_container is defined + - not stopped.ansible_facts.podman_container['State']['Running'] + - "'stopped container' in stopped.actions" + - stopped_again is not changed + - stopped_again.ansible_facts is defined + - stopped_again.ansible_facts.podman_container is defined + - not stopped_again.ansible_facts.podman_container['State']['Running'] + - stopped_again.actions == [] + fail_msg: Stopping container test failed! + success_msg: Stopping container test passed! + + - name: Delete stopped container + podman_container: + name: container + state: absent + register: deleted + + - name: Delete again container (idempotency) + podman_container: + name: container + state: absent + register: deleted_again + + - name: Check output is correct + assert: + that: + - deleted is changed + - deleted.ansible_facts is defined + - deleted.ansible_facts.podman_container is defined + - deleted.ansible_facts.podman_container == {} + - "'deleted container' in deleted.actions" + - deleted_again is not changed + - deleted_again.ansible_facts is defined + - deleted_again.ansible_facts.podman_container is defined + - deleted_again.ansible_facts.podman_container == {} + - deleted_again.actions == [] + fail_msg: Deleting stopped container test failed! + success_msg: Deleting stopped container test passed! + + - name: Create container, but don't run + podman_container: + name: container + image: alpine:3.7 + state: stopped + command: sleep 1d + register: created + + - name: Check output is correct + assert: + that: + - created is changed + - created.ansible_facts is defined + - created.ansible_facts.podman_container is defined + - created.ansible_facts.podman_container != {} + - not created.ansible_facts.podman_container['State']['Running'] + - "'created container' in created.actions" + fail_msg: "Creating stopped container test failed!" + success_msg: "Creating stopped container test passed!" + + - name: Delete created container + podman_container: + name: container + state: absent + + - name: Start container that was deleted + podman_container: + name: container + image: alpine:3.7 + state: started + command: sleep 1d + register: started + + - name: Check output is correct + assert: + that: + - started is changed + - started.ansible_facts is defined + - started.ansible_facts.podman_container is defined + - started.ansible_facts.podman_container['State']['Running'] + - started.container is defined + - started.container['State']['Running'] + - "'pulled image alpine:3.7' not in started.actions" + + - name: Delete started container + podman_container: + name: container + state: absent + register: deleted + + - name: Delete again container (idempotency) + podman_container: + name: container + state: absent + register: deleted_again + + - name: Check output is correct + assert: + that: + - deleted is changed + - deleted.ansible_facts is defined + - deleted.ansible_facts.podman_container is defined + - deleted.ansible_facts.podman_container == {} + - "'deleted container' in deleted.actions" + - deleted_again is not changed + - deleted_again.ansible_facts is defined + - deleted_again.ansible_facts.podman_container is defined + - deleted_again.ansible_facts.podman_container == {} + - deleted_again.actions == [] + fail_msg: Deleting started container test failed! + success_msg: Deleting started container test passed! + + - name: Recreate container with parameters + podman_container: + name: container + image: alpine:3.7 + state: started + command: sleep 1d + recreate: true + etc_hosts: + host1: 127.0.0.1 + host2: 127.0.0.1 + annotation: + this: "annotation_value" + dns: + - 1.1.1.1 + - 8.8.4.4 + dns_search: example.com + cap_add: + - SYS_TIME + - NET_ADMIN + publish: + - "9000:80" + - "9001:8000" + workdir: "/bin" + env: + FOO: bar + BAR: foo + TEST: 1 + BOOL: false + group_add: "somegroup" + label: + somelabel: labelvalue + otheralbe: othervalue + volumes: + - /tmp:/data + register: test + + - name: Check output is correct + assert: + that: + - test is changed + - test.ansible_facts is defined + - test.ansible_facts.podman_container is defined + - test.ansible_facts.podman_container != {} + - test.ansible_facts.podman_container['State']['Running'] + # test capabilities + - "'CAP_SYS_TIME' in test.ansible_facts.podman_container['BoundingCaps']" + - "'CAP_NET_ADMIN' in test.ansible_facts.podman_container['BoundingCaps']" + # test annotations + - test.ansible_facts.podman_container['Config']['Annotations']['this'] is defined + - test.ansible_facts.podman_container['Config']['Annotations']['this'] == "annotation_value" + # test DNS + - >- + (test.ansible_facts.podman_container['HostConfig']['Dns'] is defined and + test.ansible_facts.podman_container['HostConfig']['Dns'] == ['1.1.1.1', '8.8.4.4']) or + (test.ansible_facts.podman_container['HostConfig']['DNS'] is defined and + test.ansible_facts.podman_container['HostConfig']['DNS'] == ['1.1.1.1', '8.8.4.4']) + # test ports + - test.ansible_facts.podman_container['NetworkSettings']['Ports']|length == 2 + # test working dir + - test.ansible_facts.podman_container['Config']['WorkingDir'] == "/bin" + # test dns search + - >- + (test.ansible_facts.podman_container['HostConfig']['DnsSearch'] is defined and + test.ansible_facts.podman_container['HostConfig']['DnsSearch'] == ['example.com']) or + (test.ansible_facts.podman_container['HostConfig']['DNSSearch'] is defined and + test.ansible_facts.podman_container['HostConfig']['DNSSearch'] == ['example.com']) + # test environment variables + - "'FOO=bar' in test.ansible_facts.podman_container['Config']['Env']" + - "'BAR=foo' in test.ansible_facts.podman_container['Config']['Env']" + - "'TEST=1' in test.ansible_facts.podman_container['Config']['Env']" + - "'BOOL=False' in test.ansible_facts.podman_container['Config']['Env']" + # test labels + - test.ansible_facts.podman_container['Config']['Labels'] | length == 2 + - test.ansible_facts.podman_container['Config']['Labels']['somelabel'] == "labelvalue" + - test.ansible_facts.podman_container['Config']['Labels']['otheralbe'] == "othervalue" + # test mounts + - >- + (test.ansible_facts.podman_container['Mounts'][0]['Destination'] is defined and + '/data' in test.ansible_facts.podman_container['Mounts'] | map(attribute='Destination') | list) or + (test.ansible_facts.podman_container['Mounts'][0]['destination'] is defined and + '/data' in test.ansible_facts.podman_container['Mounts'] | map(attribute='destination') | list) + - >- + (test.ansible_facts.podman_container['Mounts'][0]['Source'] is defined and + '/tmp' in test.ansible_facts.podman_container['Mounts'] | map(attribute='Source') | list) or + (test.ansible_facts.podman_container['Mounts'][0]['source'] is defined and + '/tmp' in test.ansible_facts.podman_container['Mounts'] | map(attribute='source') | list) + fail_msg: Parameters container test failed! + success_msg: Parameters container test passed! + always: + - name: Delete all container leftovers from tests + podman_container: + name: "{{ item }}" + state: absent + loop: + - "alpine:3.7" + - "container" + - "container2" diff --git a/tripleo_ansible/ansible_plugins/tests/molecule/podman_container/prepare.yml b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container/prepare.yml new file mode 100644 index 000000000..9c4724137 --- /dev/null +++ b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container/prepare.yml @@ -0,0 +1,22 @@ +--- +# Copyright 2019 Red Hat, Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +- name: Prepare + hosts: all + roles: + - role: test_deps + test_deps_extra_packages: + - podman diff --git a/tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/molecule.yml b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/molecule.yml new file mode 100644 index 000000000..34a29b082 --- /dev/null +++ b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/molecule.yml @@ -0,0 +1,56 @@ +--- +driver: + name: delegated + options: + managed: false + login_cmd_template: >- + ssh + -o UserKnownHostsFile=/dev/null + -o StrictHostKeyChecking=no + -o Compression=no + -o TCPKeepAlive=yes + -o VerifyHostKeyDNS=no + -o ForwardX11=no + -o ForwardAgent=no + {instance} + ansible_connection_options: + ansible_connection: ssh + +log: true + +platforms: + - name: instance + +provisioner: + name: ansible + config_options: + defaults: + fact_caching: jsonfile + fact_caching_connection: /tmp/molecule/facts + inventory: + hosts: + all: + hosts: + instance: + ansible_host: localhost + log: true + env: + ANSIBLE_STDOUT_CALLBACK: yaml + ANSIBLE_ROLES_PATH: "${ANSIBLE_ROLES_PATH:-/usr/share/ansible/roles}:${HOME}/zuul-jobs/roles" + ANSIBLE_LIBRARY: "${ANSIBLE_LIBRARY:-/usr/share/ansible/plugins/modules}" + ANSIBLE_FILTER_PLUGINS: "${ANSIBLE_FILTER_PLUGINS:-/usr/share/ansible/plugins/filter}" + +scenario: + name: podman_container_info + test_sequence: + - prepare + - converge + - verify + +lint: + enabled: false + +verifier: + name: testinfra + lint: + name: flake8 diff --git a/tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/playbook.yml b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/playbook.yml new file mode 100644 index 000000000..aaebfdb14 --- /dev/null +++ b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/playbook.yml @@ -0,0 +1,70 @@ +--- +- name: Converge + hosts: all + tasks: + - name: Test podman_container_info + become: true + block: + - name: Generate random value for container name + set_fact: + container_name: "{{ 'ansible-test-podman-%0x' % ((2**32) | random) }}" + + - name: Make sure container doesn't exist + command: podman container rm -f {{ container_name }} + ignore_errors: true + + - name: Get missing container info + podman_container_info: + name: "{{ container_name }}" + register: nonexist + ignore_errors: true + + - name: Check results + assert: + that: + - "'containers' not in nonexist" + - nonexist is failed + + - name: Make sure container exists + command: podman container run -d --name {{ container_name }} alpine sleep 15m + + - name: Get existing container info + podman_container_info: + name: "{{ container_name }}" + register: existing_container + + - name: Get all containers info + podman_container_info: + register: all_containers + + - name: Dump podman container inspect result + debug: var=existing_container + + - name: Comparison with 'podman container inspect' + command: podman container inspect "{{ container_name }}" + register: podman_inspect + + - name: Convert podman inspect output to JSON + set_fact: + podman_inspect_result: "{{ podman_inspect.stdout | from_json }}" + + - name: Cleanup + command: podman container rm -f {{ container_name }} + + - name: Make checks + assert: + that: + - "'containers' in existing_container" + - existing_container.containers + - "existing_container.containers == podman_inspect_result" + - all_containers.containers == existing_container.containers + + always: + - name: Delete all container leftovers from tests + podman_container: + name: "{{ item }}" + state: absent + loop: + - "alpine:3.7" + - "container" + - "container2" diff --git a/tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/prepare.yml b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/prepare.yml new file mode 100644 index 000000000..9c4724137 --- /dev/null +++ b/tripleo_ansible/ansible_plugins/tests/molecule/podman_container_info/prepare.yml @@ -0,0 +1,22 @@ +--- +# Copyright 2019 Red Hat, Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +- name: Prepare + hosts: all + roles: + - role: test_deps + test_deps_extra_packages: + - podman diff --git a/tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/molecule.yml b/tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/molecule.yml new file mode 100644 index 000000000..64204d4ca --- /dev/null +++ b/tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/molecule.yml @@ -0,0 +1,56 @@ +--- +driver: + name: delegated + options: + managed: false + login_cmd_template: >- + ssh + -o UserKnownHostsFile=/dev/null + -o StrictHostKeyChecking=no + -o Compression=no + -o TCPKeepAlive=yes + -o VerifyHostKeyDNS=no + -o ForwardX11=no + -o ForwardAgent=no + {instance} + ansible_connection_options: + ansible_connection: ssh + +log: true + +platforms: + - name: instance + +provisioner: + name: ansible + config_options: + defaults: + fact_caching: jsonfile + fact_caching_connection: /tmp/molecule/facts + inventory: + hosts: + all: + hosts: + instance: + ansible_host: localhost + log: true + env: + ANSIBLE_STDOUT_CALLBACK: yaml + ANSIBLE_ROLES_PATH: "${ANSIBLE_ROLES_PATH:-/usr/share/ansible/roles}:${HOME}/zuul-jobs/roles" + ANSIBLE_LIBRARY: "${ANSIBLE_LIBRARY:-/usr/share/ansible/plugins/modules}" + ANSIBLE_FILTER_PLUGINS: "${ANSIBLE_FILTER_PLUGINS:-/usr/share/ansible/plugins/filter}" + +scenario: + name: podman_volume_info + test_sequence: + - prepare + - converge + - verify + +lint: + enabled: false + +verifier: + name: testinfra + lint: + name: flake8 diff --git a/tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/playbook.yml b/tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/playbook.yml new file mode 100644 index 000000000..d955222c3 --- /dev/null +++ b/tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/playbook.yml @@ -0,0 +1,63 @@ +--- +- name: Converge + hosts: all + tasks: + - name: Test podman_volume_info + become: true + block: + - name: Print podman version + command: podman version + + - name: Generate random value for volume name + set_fact: + volume_name: "{{ 'ansible-test-podman-%0x' % ((2**32) | random) }}" + + - name: Make sure volume doesn't exist + command: podman volume rm {{ volume_name }} + ignore_errors: true + + - name: Get missing volume info + podman_volume_info: + name: "{{ volume_name }}" + register: nonexist + ignore_errors: true + + - name: Check results + assert: + that: + - "'volumes' not in nonexist" + - nonexist is failed + + - name: Make sure volume exists + command: podman volume create {{ volume_name }} + + - name: Get existing volume info + podman_volume_info: + name: "{{ volume_name }}" + register: existing_volume + + - name: Dump podman volume inspect result + debug: var=existing_volume + + - name: Comparison with 'podman volume inspect' + command: podman volume inspect "{{ volume_name }}" + register: podman_inspect + + - name: Convert podman inspect output to JSON + set_fact: + podman_inspect_result: "{{ podman_inspect.stdout | from_json }}" + + - name: Cleanup + command: podman volume rm {{ volume_name }} + + - name: Make checks + assert: + that: + - "'volumes' in existing_volume" + - existing_volume.volumes + - "existing_volume.volumes == podman_inspect_result" + always: + + - name: Cleanup + command: podman volume rm {{ volume_name }} + ignore_errors: true diff --git a/tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/prepare.yml b/tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/prepare.yml new file mode 100644 index 000000000..9c4724137 --- /dev/null +++ b/tripleo_ansible/ansible_plugins/tests/molecule/podman_volume_info/prepare.yml @@ -0,0 +1,22 @@ +--- +# Copyright 2019 Red Hat, Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +- name: Prepare + hosts: all + roles: + - role: test_deps + test_deps_extra_packages: + - podman diff --git a/tripleo_ansible/playbooks/podman_tests.yml b/tripleo_ansible/playbooks/podman_tests.yml deleted file mode 100644 index cc34fe18b..000000000 --- a/tripleo_ansible/playbooks/podman_tests.yml +++ /dev/null @@ -1,351 +0,0 @@ ---- -- name: Test podman_image - when: - - ansible_facts.virtualization_type != 'docker' - - ansible_facts.distribution in ['RedHat', 'Fedora', 'CentOS'] - block: - - name: Delete all container leftovers from tests - podman_container: - name: "{{ item }}" - state: absent - loop: - - "alpine:3.7" - - "container" - - "container2" - - - name: Test no image with default action - podman_container: - name: container - ignore_errors: true - register: no_image - - - name: Test no image with state 'started' - podman_container: - name: container - state: started - ignore_errors: true - register: no_image1 - - - name: Test no image with state 'present' - podman_container: - name: container - state: present - ignore_errors: true - register: no_image2 - - - name: Check no image - assert: - that: - - no_image is failed - - no_image1 is failed - - no_image2 is failed - - no_image.msg == "State 'started' required image to be configured!" - - no_image1.msg == "State 'started' required image to be configured!" - - no_image2.msg == "State 'present' required image to be configured!" - fail_msg: No image test failed! - success_msg: No image test passed! - - - name: Ensure image doesn't exist - podman_image: - name: alpine:3.7 - state: absent - - - name: Check pulling image - podman_container: - name: container - image: alpine:3.7 - state: present - command: sleep 1d - register: image - - - name: Check using already pulled image - podman_container: - name: container2 - image: alpine:3.7 - state: present - command: sleep 1d - register: image2 - - - name: Check output is correct - assert: - that: - - image is changed - - image.ansible_facts is defined - - image.ansible_facts.podman_container is defined - - image.ansible_facts.podman_container['State']['Running'] - - image.container is defined - - image.container['State']['Running'] - - "'pulled image alpine:3.7' in image.actions" - - "'started container' in image.actions" - - image2 is changed - - image2.ansible_facts is defined - - image2.ansible_facts.podman_container is defined - - image2.ansible_facts.podman_container['State']['Running'] - - image2.container is defined - - image2.container['State']['Running'] - - "'pulled image alpine:3.7' not in image2.actions" - - "'started container2' in image2.actions" - fail_msg: Pulling image test failed! - success_msg: Pulling image test passed! - - - name: Check failed image pull - podman_container: - name: container - image: ineverneverneverexist - state: present - command: sleep 1d - register: imagefail - ignore_errors: true - - - name: Check output is correct - assert: - that: - - imagefail is failed - - imagefail.msg == "Can't pull image ineverneverneverexist" - - - - name: Force container recreate - podman_container: - name: container - image: alpine - state: present - command: sleep 1d - recreate: true - register: recreated - - - name: Check output is correct - assert: - that: - - recreated is changed - - recreated.ansible_facts is defined - - recreated.ansible_facts.podman_container is defined - - recreated.ansible_facts.podman_container['State']['Running'] - - "'recreated container' in recreated.actions" - fail_msg: Force recreate test failed! - success_msg: Force recreate test passed! - - - name: Stop container - podman_container: - name: container - state: stopped - register: stopped - - - name: Stop the same container again (idempotency) - podman_container: - name: container - state: stopped - register: stopped_again - - - name: Check output is correct - assert: - that: - - stopped is changed - - stopped.ansible_facts is defined - - stopped.ansible_facts.podman_container is defined - - not stopped.ansible_facts.podman_container['State']['Running'] - - "'stopped container' in stopped.actions" - - stopped_again is not changed - - stopped_again.ansible_facts is defined - - stopped_again.ansible_facts.podman_container is defined - - not stopped_again.ansible_facts.podman_container['State']['Running'] - - stopped_again.actions == [] - fail_msg: Stopping container test failed! - success_msg: Stopping container test passed! - - - name: Delete stopped container - podman_container: - name: container - state: absent - register: deleted - - - name: Delete again container (idempotency) - podman_container: - name: container - state: absent - register: deleted_again - - - name: Check output is correct - assert: - that: - - deleted is changed - - deleted.ansible_facts is defined - - deleted.ansible_facts.podman_container is defined - - deleted.ansible_facts.podman_container == {} - - "'deleted container' in deleted.actions" - - deleted_again is not changed - - deleted_again.ansible_facts is defined - - deleted_again.ansible_facts.podman_container is defined - - deleted_again.ansible_facts.podman_container == {} - - deleted_again.actions == [] - fail_msg: Deleting stopped container test failed! - success_msg: Deleting stopped container test passed! - - - name: Create container, but don't run - podman_container: - name: container - image: alpine:3.7 - state: stopped - command: sleep 1d - register: created - - - name: Check output is correct - assert: - that: - - created is changed - - created.ansible_facts is defined - - created.ansible_facts.podman_container is defined - - created.ansible_facts.podman_container != {} - - not created.ansible_facts.podman_container['State']['Running'] - - "'created container' in created.actions" - fail_msg: "Creating stopped container test failed!" - success_msg: "Creating stopped container test passed!" - - - name: Delete created container - podman_container: - name: container - state: absent - - - name: Start container that was deleted - podman_container: - name: container - image: alpine:3.7 - state: started - command: sleep 1d - register: started - - - name: Check output is correct - assert: - that: - - started is changed - - started.ansible_facts is defined - - started.ansible_facts.podman_container is defined - - started.ansible_facts.podman_container['State']['Running'] - - started.container is defined - - started.container['State']['Running'] - - "'pulled image alpine:3.7' not in started.actions" - - - name: Delete started container - podman_container: - name: container - state: absent - register: deleted - - - name: Delete again container (idempotency) - podman_container: - name: container - state: absent - register: deleted_again - - - name: Check output is correct - assert: - that: - - deleted is changed - - deleted.ansible_facts is defined - - deleted.ansible_facts.podman_container is defined - - deleted.ansible_facts.podman_container == {} - - "'deleted container' in deleted.actions" - - deleted_again is not changed - - deleted_again.ansible_facts is defined - - deleted_again.ansible_facts.podman_container is defined - - deleted_again.ansible_facts.podman_container == {} - - deleted_again.actions == [] - fail_msg: Deleting started container test failed! - success_msg: Deleting started container test passed! - - - name: Recreate container with parameters - podman_container: - name: container - image: alpine:3.7 - state: started - command: sleep 1d - recreate: true - etc_hosts: - host1: 127.0.0.1 - host2: 127.0.0.1 - annotation: - this: "annotation_value" - dns: - - 1.1.1.1 - - 8.8.4.4 - dns_search: example.com - cap_add: - - SYS_TIME - - NET_ADMIN - publish: - - "9000:80" - - "9001:8000" - workdir: "/bin" - env: - FOO: bar - BAR: foo - TEST: 1 - BOOL: false - group_add: "somegroup" - label: - somelabel: labelvalue - otheralbe: othervalue - volumes: - - /tmp:/data - register: test - - - name: Check output is correct - assert: - that: - - test is changed - - test.ansible_facts is defined - - test.ansible_facts.podman_container is defined - - test.ansible_facts.podman_container != {} - - test.ansible_facts.podman_container['State']['Running'] - # test capabilities - - "'CAP_SYS_TIME' in test.ansible_facts.podman_container['BoundingCaps']" - - "'CAP_NET_ADMIN' in test.ansible_facts.podman_container['BoundingCaps']" - # test annotations - - test.ansible_facts.podman_container['Config']['Annotations']['this'] is defined - - test.ansible_facts.podman_container['Config']['Annotations']['this'] == "annotation_value" - # test DNS - - >- - (test.ansible_facts.podman_container['HostConfig']['Dns'] is defined and - test.ansible_facts.podman_container['HostConfig']['Dns'] == ['1.1.1.1', '8.8.4.4']) or - (test.ansible_facts.podman_container['HostConfig']['DNS'] is defined and - test.ansible_facts.podman_container['HostConfig']['DNS'] == ['1.1.1.1', '8.8.4.4']) - # test ports - - test.ansible_facts.podman_container['NetworkSettings']['Ports']|length == 2 - # test working dir - - test.ansible_facts.podman_container['Config']['WorkingDir'] == "/bin" - # test dns search - - >- - (test.ansible_facts.podman_container['HostConfig']['DnsSearch'] is defined and - test.ansible_facts.podman_container['HostConfig']['DnsSearch'] == ['example.com']) or - (test.ansible_facts.podman_container['HostConfig']['DNSSearch'] is defined and - test.ansible_facts.podman_container['HostConfig']['DNSSearch'] == ['example.com']) - # test environment variables - - "'FOO=bar' in test.ansible_facts.podman_container['Config']['Env']" - - "'BAR=foo' in test.ansible_facts.podman_container['Config']['Env']" - - "'TEST=1' in test.ansible_facts.podman_container['Config']['Env']" - - "'BOOL=False' in test.ansible_facts.podman_container['Config']['Env']" - # test labels - - test.ansible_facts.podman_container['Config']['Labels'] | length == 2 - - test.ansible_facts.podman_container['Config']['Labels']['somelabel'] == "labelvalue" - - test.ansible_facts.podman_container['Config']['Labels']['otheralbe'] == "othervalue" - # test mounts - - >- - (test.ansible_facts.podman_container['Mounts'][0]['Destination'] is defined and - '/data' in test.ansible_facts.podman_container['Mounts'] | map(attribute='Destination') | list) or - (test.ansible_facts.podman_container['Mounts'][0]['destination'] is defined and - '/data' in test.ansible_facts.podman_container['Mounts'] | map(attribute='destination') | list) - - >- - (test.ansible_facts.podman_container['Mounts'][0]['Source'] is defined and - '/tmp' in test.ansible_facts.podman_container['Mounts'] | map(attribute='Source') | list) or - (test.ansible_facts.podman_container['Mounts'][0]['source'] is defined and - '/tmp' in test.ansible_facts.podman_container['Mounts'] | map(attribute='source') | list) - fail_msg: Parameters container test failed! - success_msg: Parameters container test passed! - always: - - name: Delete all container leftovers from tests - podman_container: - name: "{{ item }}" - state: absent - loop: - - "alpine:3.7" - - "container" - - "container2" diff --git a/tripleo_ansible/roles/tripleo-container-manage/molecule/default/playbook.yml b/tripleo_ansible/roles/tripleo-container-manage/molecule/default/playbook.yml index 5f0718f4f..54ce00057 100644 --- a/tripleo_ansible/roles/tripleo-container-manage/molecule/default/playbook.yml +++ b/tripleo_ansible/roles/tripleo-container-manage/molecule/default/playbook.yml @@ -38,6 +38,6 @@ - name: Assert that fedora container has the right image assert: that: - - "'fedora:latest' in fedora_infos.ansible_facts.podman_containers.0.ImageName" + - "'fedora:latest' in fedora_infos.containers.0.ImageName" fail_msg: 'fedora container has wrong image' success_msg: 'fedora container has the right image' diff --git a/tripleo_ansible/roles/tripleo-container-manage/tasks/podman.yaml b/tripleo_ansible/roles/tripleo-container-manage/tasks/podman.yaml index 26a6ce42b..3cf307906 100644 --- a/tripleo_ansible/roles/tripleo-container-manage/tasks/podman.yaml +++ b/tripleo_ansible/roles/tripleo-container-manage/tasks/podman.yaml @@ -32,7 +32,7 @@ fail: msg: "Can't run container exec for {{ item.0 }}, {{ item.1.command.0 }} is not running" when: - - not podman_containers.ansible_facts.podman_containers.0.State.Running + - not podman_containers.0.State.Running - name: "Prepare the exec command for {{ item.0 }}" set_fact: cmd_template: diff --git a/zuul.d/molecule.yaml b/zuul.d/molecule.yaml index 820904156..8b60bb569 100644 --- a/zuul.d/molecule.yaml +++ b/zuul.d/molecule.yaml @@ -39,6 +39,7 @@ - tripleo-ansible-centos-7-molecule-tripleo-packages - tripleo-ansible-centos-7-molecule-tripleo-hosts-entries - tripleo-ansible-centos-7-molecule-tripleo-container-manage + - tripleo-ansible-centos-7-molecule-tripleo-modules gate: jobs: - tripleo-ansible-centos-7-molecule-aide @@ -78,6 +79,7 @@ - tripleo-ansible-centos-7-molecule-tripleo-packages - tripleo-ansible-centos-7-molecule-tripleo-hosts-entries - tripleo-ansible-centos-7-molecule-tripleo-container-manage + - tripleo-ansible-centos-7-molecule-tripleo-modules name: tripleo-ansible-molecule-jobs - job: files: @@ -350,3 +352,11 @@ parent: tripleo-ansible-centos-7-base vars: tripleo_role_name: tripleo-container-manage + +- job: + files: + - ^tripleo_ansible/ansible_plugins/.*$ + - ^tox.ini + - ^molecule-requirements.txt + name: tripleo-ansible-centos-7-molecule-tripleo-modules + parent: tripleo-ansible-centos-7-base diff --git a/zuul.d/playbooks/run.yml b/zuul.d/playbooks/run.yml index 1ced4073e..69d395906 100644 --- a/zuul.d/playbooks/run.yml +++ b/zuul.d/playbooks/run.yml @@ -4,10 +4,21 @@ environment: ANSIBLE_LOG_PATH: "{{ ansible_user_dir }}/zuul-output/logs/ansible-execution.log" pre_tasks: + - name: Set project path fact set_fact: tripleo_ansible_project_path: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}" + - name: Set role or plugin path fact + set_fact: + triple_ansible_testdir: "{{ tripleo_ansible_project_path }}/tripleo_ansible/roles/{{ tripleo_role_name }}" + when: tripleo_role_name is defined and tripleo_role_name + + - name: Set role or plugin path fact + set_fact: + triple_ansible_testdir: "{{ tripleo_ansible_project_path }}/tripleo_ansible/ansible_plugins/tests" + when: tripleo_role_name is not defined + - name: Set action plugin path fact set_fact: tripleo_action_plugins_paths: @@ -25,7 +36,7 @@ --ansible-args='{{ tripleo_job_ansible_args | default('') }}' \ {{ tripleo_ansible_project_path }}/tests/test_molecule.py args: - chdir: "{{ tripleo_ansible_project_path }}/tripleo_ansible/roles/{{ tripleo_role_name }}" + chdir: "{{ triple_ansible_testdir }}" executable: /bin/bash environment: ANSIBLE_ACTION_PLUGINS: "{{ tripleo_action_plugins_paths | join(':') }}"