diff --git a/.gitignore b/.gitignore index 1f35091..02ee5df 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,19 @@ -SOURCES/ansible-sshd-428d390668077f0baf5e88c5834ee810ae11113c.tar.gz -SOURCES/auto-maintenance-e9e30b03c0fe9387cb0ea8a5e7aac8313de2deef.tar.gz -SOURCES/certificate-23f1a414ab022a506614c5be8eadf1708dc45b2b.tar.gz -SOURCES/crypto_policies-ff335b87017954c0b47bfe818700e0f1600b04db.tar.gz -SOURCES/ha_cluster-d97f48a21002497e1ac1bd1385841f2939d7b840.tar.gz -SOURCES/kdump-77596fdd976c6160d6152c200a5432c609725a14.tar.gz -SOURCES/kernel_settings-a8ab76f8076078763dacacf3384315c86b342d52.tar.gz -SOURCES/logging-07e08107e7ccba5822f8a7aaec1a2ff0a221bede.tar.gz -SOURCES/metrics-c9b2ee085ccc741b5a9fa8a4b2a7a2f8c8551579.tar.gz -SOURCES/nbde_client-19f06159582550c8463f7d8492669e26fbdf760b.tar.gz -SOURCES/nbde_server-4dfc5e2aca74cb82f2a50eec7e975a2b78ad9678.tar.gz -SOURCES/network-0f5a882bcab58baba527015b7cde01c7c52d2254.tar.gz -SOURCES/postfix-bbf5784849d362cc3443fde8b09da26ea698a8ce.tar.gz -SOURCES/selinux-557546f922886fc1e73012f2af08ec80fec82fe2.tar.gz -SOURCES/ssh-54bec0855966cc3eed65b26a7c90962eb103d66d.tar.gz -SOURCES/storage-2c3eeb8b2dd898d8c589a0740c2ba9b707e4ed2c.tar.gz -SOURCES/timesync-8a95989e158519ce4bebe10091c47ef88b29261b.tar.gz -SOURCES/tlog-103d3996436c98dccf89e645378e76bd9add2abb.tar.gz -SOURCES/vpn-73e8f5e3b514a8e7a3637dc204d5c106adddeea7.tar.gz +SOURCES/ansible-sshd-32f9d0dda5a801cbefad09214ec2d88b6838b943.tar.gz +SOURCES/auto-maintenance-4e47b3809a4e6c1dcd9af57fee117d6df0c261ad.tar.gz +SOURCES/certificate-310fc53db04e8d3134524afb7a89b0477a2ffb83.tar.gz +SOURCES/crypto_policies-b2a9857ac661fa32e66666e444b73bfdb34cdf95.tar.gz +SOURCES/ha_cluster-6e1e37f0097db23c8b804e520e272575e9714d5f.tar.gz +SOURCES/kdump-02fc72b482e165472624b2f68eecd2ddce1d93b1.tar.gz +SOURCES/kernel_settings-9373303b98e09ef38df7afc8d06e5e55812096c7.tar.gz +SOURCES/logging-20dd3e5520ca06dcccaa9b3f1fb428d055e0c23f.tar.gz +SOURCES/metrics-384718b020c50ae274230e9dc59fc11620e03537.tar.gz +SOURCES/nbde_client-bef2fad5e365712d1f40e53662490ba2550a253f.tar.gz +SOURCES/nbde_server-c57d0b1f3384c525738fa26ba4bdca485e162567.tar.gz +SOURCES/network-ae2d60a0b204f4a7ba1f27696f11d950dd882fda.tar.gz +SOURCES/postfix-33ca4faa031be745c6d12220aa04caa3a8f9451f.tar.gz +SOURCES/selinux-62ff85a9c605a7c281d4dfb5a047f322245c63b5.tar.gz +SOURCES/ssh-59b9fd7b25607d8bd33bdb082748955f2652846a.tar.gz +SOURCES/storage-b3b456183edb7b8aa6ceff7ce667d8e22009ef6a.tar.gz +SOURCES/timesync-3f69039d5ff986a74ed76bc4419da7b2efb2992a.tar.gz +SOURCES/tlog-2b9e53233ee3a68bdb532e62f289733e436a6106.tar.gz +SOURCES/vpn-5f6cb73e6753fbdbb219b7d3079f0378b2d3bdb3.tar.gz diff --git a/.rhel-system-roles.metadata b/.rhel-system-roles.metadata index 9e2661b..2279a67 100644 --- a/.rhel-system-roles.metadata +++ b/.rhel-system-roles.metadata @@ -1,19 +1,19 @@ -51ded42654156b1020b9f1588c8bb5d59590ad10 SOURCES/ansible-sshd-428d390668077f0baf5e88c5834ee810ae11113c.tar.gz -09617750856b081379e9f6606a333b1dad95af5f SOURCES/auto-maintenance-e9e30b03c0fe9387cb0ea8a5e7aac8313de2deef.tar.gz -5ecfd4c067f022f0829aca57016a142560a15f2b SOURCES/certificate-23f1a414ab022a506614c5be8eadf1708dc45b2b.tar.gz -94134c1202c9fe2e55cb051ea9c3b1a6ef3859bc SOURCES/crypto_policies-ff335b87017954c0b47bfe818700e0f1600b04db.tar.gz -a710a3801be822da69033e5fedb61519dbb264ad SOURCES/ha_cluster-d97f48a21002497e1ac1bd1385841f2939d7b840.tar.gz -fa3d5daf6cf1ceeaa87f58c16e11153cf250e2fa SOURCES/kdump-77596fdd976c6160d6152c200a5432c609725a14.tar.gz -c2c48cce415e741b779cce66df37a72a9879a1e3 SOURCES/kernel_settings-a8ab76f8076078763dacacf3384315c86b342d52.tar.gz -60efc730800600f87e386e16730980ea08417d34 SOURCES/logging-07e08107e7ccba5822f8a7aaec1a2ff0a221bede.tar.gz -83b34f3749c06fc56f989f3c9e51edfd0cf5769a SOURCES/metrics-c9b2ee085ccc741b5a9fa8a4b2a7a2f8c8551579.tar.gz -66b84d088e2c3989f00b3151cc7fdc40f768f9a5 SOURCES/nbde_client-19f06159582550c8463f7d8492669e26fbdf760b.tar.gz -0e4e133b75e245d17c0c5a1097ab95f047ae6f65 SOURCES/nbde_server-4dfc5e2aca74cb82f2a50eec7e975a2b78ad9678.tar.gz -2c232e3d50d8b9b03fb2430ba4a599d23d2fae33 SOURCES/network-0f5a882bcab58baba527015b7cde01c7c52d2254.tar.gz -efc33802c79eaa012208447d7a504d7e264a0beb SOURCES/postfix-bbf5784849d362cc3443fde8b09da26ea698a8ce.tar.gz -4331656407ea431a1837062664334931f9398cb3 SOURCES/selinux-557546f922886fc1e73012f2af08ec80fec82fe2.tar.gz -395568b266f38baa6e1f9cc38444bfc187197979 SOURCES/ssh-54bec0855966cc3eed65b26a7c90962eb103d66d.tar.gz -a745ac856b11a6dc350311786b9d52c439f1e368 SOURCES/storage-2c3eeb8b2dd898d8c589a0740c2ba9b707e4ed2c.tar.gz -2eaeea57a6250d2d3793701ed9ac13eeb668fead SOURCES/timesync-8a95989e158519ce4bebe10091c47ef88b29261b.tar.gz -1e53ade9a3e026dbd88c209dee06692be23e55ab SOURCES/tlog-103d3996436c98dccf89e645378e76bd9add2abb.tar.gz -392e23f661f158e82f912a3694607848d4490c29 SOURCES/vpn-73e8f5e3b514a8e7a3637dc204d5c106adddeea7.tar.gz +7ea8f4a254259f270e1a442266e2f9cccbfc9527 SOURCES/ansible-sshd-32f9d0dda5a801cbefad09214ec2d88b6838b943.tar.gz +30f17b25c0971959762153c9509f0e5a25332d05 SOURCES/auto-maintenance-4e47b3809a4e6c1dcd9af57fee117d6df0c261ad.tar.gz +b2c6c7aa236c68467b9c6bd927486ec70314ad22 SOURCES/certificate-310fc53db04e8d3134524afb7a89b0477a2ffb83.tar.gz +97e0808740e2baf13be0ef18690baf861c218f99 SOURCES/crypto_policies-b2a9857ac661fa32e66666e444b73bfdb34cdf95.tar.gz +0bba79ccdfb382b085e43cdf912e8e1a0083ef46 SOURCES/ha_cluster-6e1e37f0097db23c8b804e520e272575e9714d5f.tar.gz +98c00815b05eed770357f2b826f1c6872446e2c9 SOURCES/kdump-02fc72b482e165472624b2f68eecd2ddce1d93b1.tar.gz +c48b0b3d74e703ad20c1fe9319e160760c352194 SOURCES/kernel_settings-9373303b98e09ef38df7afc8d06e5e55812096c7.tar.gz +305709bbbf763b72a7f41660c45735f6a35f2141 SOURCES/logging-20dd3e5520ca06dcccaa9b3f1fb428d055e0c23f.tar.gz +f1081bd6ed2b2cdcd075dd8a21977ce379400749 SOURCES/metrics-384718b020c50ae274230e9dc59fc11620e03537.tar.gz +80b6ad0a68c665861010fb6bcb73b83a4a852941 SOURCES/nbde_client-bef2fad5e365712d1f40e53662490ba2550a253f.tar.gz +59710a98972e9291bdcad9e319a012e825b85f72 SOURCES/nbde_server-c57d0b1f3384c525738fa26ba4bdca485e162567.tar.gz +0b902fe56d422deca254e130edddbb0ece485455 SOURCES/network-ae2d60a0b204f4a7ba1f27696f11d950dd882fda.tar.gz +ecc61b1c95deb554d3a68805f810902091697067 SOURCES/postfix-33ca4faa031be745c6d12220aa04caa3a8f9451f.tar.gz +2f7df1ba7ffc418f6d2be0d35fa0c0eec884455a SOURCES/selinux-62ff85a9c605a7c281d4dfb5a047f322245c63b5.tar.gz +ddd13f13bdb64bc2bd9e217df17fd225539c6441 SOURCES/ssh-59b9fd7b25607d8bd33bdb082748955f2652846a.tar.gz +4f0adb91f09f6b09f57729f617f26672318eaef0 SOURCES/storage-b3b456183edb7b8aa6ceff7ce667d8e22009ef6a.tar.gz +5c47063743e17680fc69ceaf5d1986e722021240 SOURCES/timesync-3f69039d5ff986a74ed76bc4419da7b2efb2992a.tar.gz +5a35e486a7fe9defa773a66fa1ac7b600b3745d2 SOURCES/tlog-2b9e53233ee3a68bdb532e62f289733e436a6106.tar.gz +a94ae620a6bfdf917102d1e64639d57cbd8e619e SOURCES/vpn-5f6cb73e6753fbdbb219b7d3079f0378b2d3bdb3.tar.gz diff --git a/SOURCES/kdump-fix-newline.diff b/SOURCES/kdump-fix-newline.diff deleted file mode 100644 index 52a1a7e..0000000 --- a/SOURCES/kdump-fix-newline.diff +++ /dev/null @@ -1,28 +0,0 @@ -commit cafd95d0b03360d12e86170eb10fc1fc3dcade06 -Author: Pavel Cahyna -Date: Thu Jan 14 11:42:48 2021 +0100 - - Get rid of the extra final newline in string - - Use the `-` chomping indicator to indicate that the trailing newline is - not intended as a part of the string. - https://yaml.org/spec/1.1/#chomping/ - - The trailing newline was causing an actual problem in the test. - - Also use the `>` folded style, which is more appropriate here than the - `|` literal style. - -diff --git a/tests/tests_ssh.yml b/tests/tests_ssh.yml -index 6d3699c..d3503f7 100644 ---- a/tests/tests_ssh.yml -+++ b/tests/tests_ssh.yml -@@ -27,7 +27,7 @@ - - include_role: - name: linux-system-roles.kdump - vars: -- kdump_ssh_user: | -+ kdump_ssh_user: >- - {{ hostvars[kdump_ssh_server_outside]['ansible_user_id'] }} - # This is the outside address. Ansible will connect to it to - # copy the ssh key. diff --git a/SOURCES/kdump-meta-el8.diff b/SOURCES/kdump-meta-el8.diff deleted file mode 100644 index d8f2764..0000000 --- a/SOURCES/kdump-meta-el8.diff +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/meta/main.yml b/meta/main.yml -index 2478fa6..ad8f4c6 100644 ---- a/meta/main.yml -+++ b/meta/main.yml -@@ -7,6 +7,6 @@ galaxy_info: - min_ansible_version: 2.4 - platforms: - - name: Fedora -- versions: [ 27, 28 ] -+ versions: [ 31, 32 ] - - name: EL -- versions: [ 6, 7 ] -+ versions: [ 6, 7, 8 ] diff --git a/SOURCES/kdump-tier1-tags.diff b/SOURCES/kdump-tier1-tags.diff deleted file mode 100644 index f80af83..0000000 --- a/SOURCES/kdump-tier1-tags.diff +++ /dev/null @@ -1,142 +0,0 @@ -diff --git a/tests/commonvars.yml b/tests/commonvars.yml -new file mode 100644 -index 0000000..2cd3566 ---- /dev/null -+++ b/tests/commonvars.yml -@@ -0,0 +1,2 @@ -+restore_services: -+ - kdump -diff --git a/tests/get_services_state.yml b/tests/get_services_state.yml -new file mode 100644 -index 0000000..4fe5d36 ---- /dev/null -+++ b/tests/get_services_state.yml -@@ -0,0 +1,4 @@ -+- name: Get initial state of services -+ tags: tests::cleanup -+ service_facts: -+ register: initial_state -diff --git a/tests/restore_services_state.yml b/tests/restore_services_state.yml -new file mode 100644 -index 0000000..2035dfc ---- /dev/null -+++ b/tests/restore_services_state.yml -@@ -0,0 +1,22 @@ -+- block: -+ - name: load common vars -+ include_vars: -+ file: commonvars.yml -+ -+ - name: Get final state of services -+ service_facts: -+ register: final_state -+ -+ - name: Restore state of services -+ service: -+ name: "{{ item }}" -+ state: "{{ 'started' if -+ initial_state.ansible_facts.services[sname]['state'] -+ == 'running' else 'stopped' }}" -+ when: -+ - sname in final_state.ansible_facts.services -+ - sname in initial_state.ansible_facts.services -+ vars: -+ sname: "{{ item + '.service' }}" -+ with_items: "{{ restore_services }}" -+ tags: tests::cleanup -diff --git a/tests/tests_default.yml b/tests/tests_default.yml -index af0b2a0..6ce5241 100644 ---- a/tests/tests_default.yml -+++ b/tests/tests_default.yml -@@ -3,3 +3,13 @@ - - roles: - - linux-system-roles.kdump -+ -+ pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ -+ post_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_default_wrapper.yml b/tests/tests_default_wrapper.yml -index eba31a0..857aab8 100644 ---- a/tests/tests_default_wrapper.yml -+++ b/tests/tests_default_wrapper.yml -@@ -1,6 +1,9 @@ - --- - - name: Create static inventory from hostvars - hosts: all -+ tags: -+# - 'tests::tier1' -+ - 'tests::slow' - tasks: - - name: create temporary file - tempfile: -@@ -17,10 +20,16 @@ - - - - name: Run tests_default.yml normally -+ tags: -+# - 'tests::tier1' -+ - 'tests::slow' - import_playbook: tests_default.yml - - - name: Run tests_default.yml in check_mode - hosts: all -+ tags: -+# - 'tests::tier1' -+ - 'tests::slow' - tasks: - - name: Run ansible-playbook with tests_default.yml in check mode - command: > -diff --git a/tests/tests_ssh.yml b/tests/tests_ssh.yml -index d12e884..6d3699c 100644 ---- a/tests/tests_ssh.yml -+++ b/tests/tests_ssh.yml -@@ -10,6 +10,13 @@ - # this is the address at which the ssh dump server can be reached - # from the managed host. Dumps will be uploaded there. - kdump_ssh_server_inside: "{{ kdump_ssh_source if kdump_ssh_source in hostvars[kdump_ssh_server_outside]['ansible_all_ipv4_addresses'] + hostvars[kdump_ssh_server_outside]['ansible_all_ipv6_addresses'] else hostvars[kdump_ssh_server_outside]['ansible_default_ipv4']['address'] }}" -+ tags: -+ # this test executes some tasks on localhost and relies on -+ # localhost being a different host than the managed host -+ # (localhost is being used as a second host in multihost -+ # scenario). This also means that localhost must be capable -+ # enough (not just a container - must be runnign a sshd). -+ - 'tests::multihost_localhost' - - tasks: - - name: gather facts from {{ kdump_ssh_server_outside }} -diff --git a/tests/tests_ssh_wrapper.yml b/tests/tests_ssh_wrapper.yml -index 2203f3f..96a764e 100644 ---- a/tests/tests_ssh_wrapper.yml -+++ b/tests/tests_ssh_wrapper.yml -@@ -1,6 +1,8 @@ - --- - - name: Create static inventory from hostvars - hosts: all -+ tags: -+ - 'tests::slow' - tasks: - - name: create temporary file - tempfile: -@@ -17,10 +19,15 @@ - - - - name: Run tests_ssh.yml normally -+ tags: -+ - 'tests::slow' - import_playbook: tests_ssh.yml - - - name: Run tests_ssh.yml in check_mode - hosts: all -+ tags: -+ - 'tests::slow' -+ - 'tests::multihost_localhost' - tasks: - - name: Run ansible-playbook with tests_ssh.yml in check mode - command: | diff --git a/SOURCES/network-ansible-test.diff b/SOURCES/network-ansible-test.diff deleted file mode 100644 index f8de3cf..0000000 --- a/SOURCES/network-ansible-test.diff +++ /dev/null @@ -1,813 +0,0 @@ -From c0297506cee0d615f44e52b7c826cd83916eba08 Mon Sep 17 00:00:00 2001 -From: Rich Megginson -Date: Thu, 25 Mar 2021 13:58:03 -0600 -Subject: [PATCH 4/4] Patch54: network-ansible-test.diff - ---- - .github/workflows/tox.yml | 4 +- - .sanity-ansible-ignore-2.9.txt | 47 ++++++++++ - README.md | 2 +- - library/network_connections.py | 88 ++++++++++++------- - module_utils/network_lsr/__init__.py | 7 -- - .../network_lsr/argument_validator.py | 9 +- - module_utils/network_lsr/ethtool.py | 6 +- - module_utils/network_lsr/myerror.py | 11 +++ - module_utils/network_lsr/nm/__init__.py | 4 + - .../network_lsr/nm/active_connection.py | 35 ++++---- - module_utils/network_lsr/nm/client.py | 4 + - module_utils/network_lsr/nm/connection.py | 18 ++-- - module_utils/network_lsr/nm/error.py | 4 + - module_utils/network_lsr/nm/provider.py | 8 +- - module_utils/network_lsr/nm_provider.py | 4 + - module_utils/network_lsr/utils.py | 10 ++- - tests/ensure_provider_tests.py | 8 +- - tests/get_coverage.sh | 6 +- - tests/get_total_coverage.sh | 2 +- - tests/integration/test_ethernet.py | 4 +- - tests/merge_coverage.sh | 3 + - tests/setup_module_utils.sh | 41 --------- - tox.ini | 3 - - 23 files changed, 199 insertions(+), 129 deletions(-) - create mode 100644 .sanity-ansible-ignore-2.9.txt - create mode 100644 module_utils/network_lsr/myerror.py - delete mode 100755 tests/setup_module_utils.sh - -diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml -index 207bcba..ba0f4c6 100644 ---- a/.github/workflows/tox.yml -+++ b/.github/workflows/tox.yml -@@ -3,7 +3,7 @@ name: tox - on: # yamllint disable-line rule:truthy - - pull_request - env: -- TOX_LSR: "git+https://github.com/linux-system-roles/tox-lsr@2.2.0" -+ TOX_LSR: "git+https://github.com/linux-system-roles/tox-lsr@2.3.0" - LSR_ANSIBLES: 'ansible==2.8.* ansible==2.9.*' - LSR_MSCENARIOS: default - # LSR_EXTRA_PACKAGES: "libdbus-1-dev libgirepository1.0-dev python3-dev" -@@ -36,7 +36,7 @@ jobs: - toxenvs="py${toxpyver}" - case "$toxpyver" in - 27) toxenvs="${toxenvs},coveralls,flake8,pylint" ;; -- 36) toxenvs="${toxenvs},coveralls,black,yamllint,ansible-lint,collection" ;; -+ 36) toxenvs="${toxenvs},coveralls,black,yamllint,ansible-lint,collection,ansible-test" ;; - 37) toxenvs="${toxenvs},coveralls" ;; - 38) toxenvs="${toxenvs},coveralls" ;; - esac -diff --git a/.sanity-ansible-ignore-2.9.txt b/.sanity-ansible-ignore-2.9.txt -new file mode 100644 -index 0000000..439197e ---- /dev/null -+++ b/.sanity-ansible-ignore-2.9.txt -@@ -0,0 +1,47 @@ -+tests/network/ensure_provider_tests.py compile-2.7!skip -+tests/network/ensure_provider_tests.py compile-3.5!skip -+plugins/module_utils/network_lsr/nm/__init__.py empty-init!skip -+plugins/module_utils/network_lsr/nm/active_connection.py import-2.7!skip -+plugins/module_utils/network_lsr/nm/client.py import-2.7!skip -+plugins/module_utils/network_lsr/nm/connection.py import-2.7!skip -+plugins/module_utils/network_lsr/nm/provider.py import-2.7!skip -+plugins/module_utils/network_lsr/nm/active_connection.py import-3.5!skip -+plugins/module_utils/network_lsr/nm/client.py import-3.5!skip -+plugins/module_utils/network_lsr/nm/connection.py import-3.5!skip -+plugins/module_utils/network_lsr/nm/provider.py import-3.5!skip -+plugins/module_utils/network_lsr/nm/active_connection.py import-3.6!skip -+plugins/module_utils/network_lsr/nm/client.py import-3.6!skip -+plugins/module_utils/network_lsr/nm/connection.py import-3.6!skip -+plugins/module_utils/network_lsr/nm/provider.py import-3.6!skip -+plugins/module_utils/network_lsr/nm/active_connection.py import-3.7!skip -+plugins/module_utils/network_lsr/nm/client.py import-3.7!skip -+plugins/module_utils/network_lsr/nm/connection.py import-3.7!skip -+plugins/module_utils/network_lsr/nm/provider.py import-3.7!skip -+plugins/module_utils/network_lsr/nm/active_connection.py import-3.8!skip -+plugins/module_utils/network_lsr/nm/client.py import-3.8!skip -+plugins/module_utils/network_lsr/nm/connection.py import-3.8!skip -+plugins/module_utils/network_lsr/nm/provider.py import-3.8!skip -+plugins/module_utils/network_lsr/__init__.py shebang!skip -+plugins/module_utils/network_lsr/argument_validator.py shebang!skip -+plugins/module_utils/network_lsr/utils.py shebang!skip -+plugins/module_utils/network_lsr/myerror.py shebang!skip -+tests/network/covstats shebang!skip -+tests/network/ensure_provider_tests.py shebang!skip -+tests/network/get_coverage.sh shebang!skip -+tests/network/get_total_coverage.sh shebang!skip -+tests/network/merge_coverage.sh shebang!skip -+tests/network/ensure_provider_tests.py future-import-boilerplate!skip -+tests/network/integration/conftest.py future-import-boilerplate!skip -+tests/network/integration/test_ethernet.py future-import-boilerplate!skip -+tests/network/unit/test_network_connections.py future-import-boilerplate!skip -+tests/network/unit/test_nm_provider.py future-import-boilerplate!skip -+tests/network/ensure_provider_tests.py metaclass-boilerplate!skip -+tests/network/integration/conftest.py metaclass-boilerplate!skip -+tests/network/integration/test_ethernet.py metaclass-boilerplate!skip -+tests/network/unit/test_network_connections.py metaclass-boilerplate!skip -+tests/network/unit/test_nm_provider.py metaclass-boilerplate!skip -+plugins/modules/network_connections.py validate-modules:missing-examples -+plugins/modules/network_connections.py validate-modules:missing-gplv3-license -+plugins/modules/network_connections.py validate-modules:no-default-for-required-parameter -+plugins/modules/network_connections.py validate-modules:parameter-type-not-in-doc -+plugins/modules/network_connections.py validate-modules:undocumented-parameter -diff --git a/README.md b/README.md -index 06a8b1b..48bb5bc 100644 ---- a/README.md -+++ b/README.md -@@ -145,7 +145,7 @@ a consequence, `state: up` always changes the system. - - You can deactivate a connection profile, even if is currently not active. As a consequence, `state: down` always changes the system. - --Note that if the `state` option is unset, the connection profile’s runtime state will not be changed. -+Note that if the `state` option is unset, the connection profile's runtime state will not be changed. - - - ### `persistent_state` -diff --git a/library/network_connections.py b/library/network_connections.py -index dc30ae8..32ebec9 100644 ---- a/library/network_connections.py -+++ b/library/network_connections.py -@@ -2,6 +2,30 @@ - # -*- coding: utf-8 -*- - # SPDX-License-Identifier: BSD-3-Clause - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ -+DOCUMENTATION = """ -+--- -+module: network_connections -+author: Thomas Haller (@thom311) -+short_description: module for network role to manage connection profiles -+requirements: [pygobject, dbus, NetworkManager] -+version_added: "2.0" -+description: -+ - "WARNING: Do not use this module directly! It is only for role internal use." -+ - | -+ Manage networking profiles (connections) for NetworkManager and -+ initscripts networking providers. Documentation needs to be written. Note -+ that the network_connections module tightly integrates with the network -+ role and currently it is not expected to use this module outside the role. -+ Thus, consult README.md for examples for the role. The requirements are -+ only for the NetworkManager (nm) provider. -+options: {} -+""" -+ -+ - import errno - import functools - import os -@@ -16,7 +40,7 @@ import logging - # pylint: disable=import-error, no-name-in-module - from ansible.module_utils.basic import AnsibleModule - from ansible.module_utils.network_lsr import ethtool # noqa:E501 --from ansible.module_utils.network_lsr import MyError # noqa:E501 -+from ansible.module_utils.network_lsr.myerror import MyError # noqa:E501 - - from ansible.module_utils.network_lsr.argument_validator import ( # noqa:E501 - ArgUtil, -@@ -30,22 +54,6 @@ from ansible.module_utils.network_lsr import nm_provider # noqa:E501 - # pylint: enable=import-error, no-name-in-module - - --DOCUMENTATION = """ ----- --module: network_connections --author: "Thomas Haller (thaller@redhat.com)" --short_description: module for network role to manage connection profiles --requirements: for 'nm' provider requires pygobject, dbus and NetworkManager. --version_added: "2.0" --description: Manage networking profiles (connections) for NetworkManager and -- initscripts networking providers. --options: Documentation needs to be written. Note that the network_connections -- module tightly integrates with the network role and currently it is not -- expected to use this module outside the role. Thus, consult README.md for -- examples for the role. --""" -- -- - ############################################################################### - PERSISTENT_STATE = "persistent_state" - ABSENT_STATE = "absent" -@@ -772,7 +780,7 @@ class NMUtil: - if compare_flags is None: - compare_flags = NM.SettingCompareFlags.IGNORE_TIMESTAMP - -- return not (not (con_a.compare(con_b, compare_flags))) -+ return con_a.compare(con_b, compare_flags) - - def connection_is_active(self, con): - NM = Util.NM() -@@ -1399,7 +1407,7 @@ class RunEnvironment(object): - def check_mode_set(self, check_mode, connections=None): - c = self._check_mode - self._check_mode = check_mode -- assert ( -+ if not ( - (c is None and check_mode in [CheckMode.PREPARE]) - or ( - c == CheckMode.PREPARE -@@ -1408,7 +1416,8 @@ class RunEnvironment(object): - or (c == CheckMode.PRE_RUN and check_mode in [CheckMode.REAL_RUN]) - or (c == CheckMode.REAL_RUN and check_mode in [CheckMode.DONE]) - or (c == CheckMode.DRY_RUN and check_mode in [CheckMode.DONE]) -- ) -+ ): -+ raise AssertionError("check_mode value is incorrect {0}".format(c)) - self._check_mode_changed(c, check_mode, connections) - - -@@ -1470,7 +1479,8 @@ class RunEnvironmentAnsible(RunEnvironment): - warn_traceback=False, - force_fail=False, - ): -- assert idx >= -1 -+ if not idx >= -1: -+ raise AssertionError("idx {0} is less than -1".format(idx)) - self._log_idx += 1 - self.run_results[idx]["log"].append((severity, msg, self._log_idx)) - if severity == LogLevel.ERROR: -@@ -1607,14 +1617,15 @@ class Cmd(object): - def connections_data(self): - c = self._connections_data - if c is None: -- assert self.check_mode in [ -+ if self.check_mode not in [ - CheckMode.DRY_RUN, - CheckMode.PRE_RUN, - CheckMode.REAL_RUN, -- ] -- c = [] -- for _ in range(0, len(self.connections)): -- c.append({"changed": False}) -+ ]: -+ raise AssertionError( -+ "invalid value {0} for self.check_mode".format(self.check_mode) -+ ) -+ c = [{"changed": False}] * len(self.connections) - self._connections_data = c - return c - -@@ -1623,11 +1634,14 @@ class Cmd(object): - c["changed"] = False - - def connections_data_set_changed(self, idx, changed=True): -- assert self._check_mode in [ -+ if self._check_mode not in [ - CheckMode.PRE_RUN, - CheckMode.DRY_RUN, - CheckMode.REAL_RUN, -- ] -+ ]: -+ raise AssertionError( -+ "invalid value {0} for self._check_mode".format(self._check_mode) -+ ) - if not changed: - return - self.connections_data[idx]["changed"] = changed -@@ -1697,7 +1711,10 @@ class Cmd(object): - # modify the connection. - - con = self.connections[idx] -- assert con["state"] in ["up", "down"] -+ if con["state"] not in ["up", "down"]: -+ raise AssertionError( -+ "connection state {0} not 'up' or 'down'".format(con["state"]) -+ ) - - # also check, if the current profile is 'up' with a 'type' (which - # possibly modifies the connection as well) -@@ -1745,7 +1762,9 @@ class Cmd(object): - elif self._check_mode != CheckMode.DONE: - c = CheckMode.DONE - else: -- assert False -+ raise AssertionError( -+ "invalid value {0} for self._check_mode".format(self._check_mode) -+ ) - self._check_mode = c - self.run_env.check_mode_set(c) - return c -@@ -1911,7 +1930,12 @@ class Cmd_nm(Cmd): - - name = connection["name"] - if not name: -- assert connection["persistent_state"] == "absent" -+ if not connection["persistent_state"] == "absent": -+ raise AssertionError( -+ "persistent_state must be 'absent' not {0} when there is no connection 'name'".format( -+ connection["persistent_state"] -+ ) -+ ) - continue - if name in names: - exists = names[name]["nm.exists"] -@@ -1988,7 +2012,7 @@ class Cmd_nm(Cmd): - idx, "ethtool.%s specified but not supported by NM", specified - ) - -- for option, _ in specified.items(): -+ for option in specified.keys(): - nm_name = nm_get_name_fcnt(option) - if not nm_name: - self.log_fatal( -diff --git a/module_utils/network_lsr/__init__.py b/module_utils/network_lsr/__init__.py -index 22c717c..e69de29 100644 ---- a/module_utils/network_lsr/__init__.py -+++ b/module_utils/network_lsr/__init__.py -@@ -1,7 +0,0 @@ --#!/usr/bin/python3 -tt --# vim: fileencoding=utf8 --# SPDX-License-Identifier: BSD-3-Clause -- -- --class MyError(Exception): -- pass -diff --git a/module_utils/network_lsr/argument_validator.py b/module_utils/network_lsr/argument_validator.py -index 1bfaeda..a6ed937 100644 ---- a/module_utils/network_lsr/argument_validator.py -+++ b/module_utils/network_lsr/argument_validator.py -@@ -2,12 +2,16 @@ - # vim: fileencoding=utf8 - # SPDX-License-Identifier: BSD-3-Clause - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - import posixpath - import socket - import re - - # pylint: disable=import-error, no-name-in-module --from ansible.module_utils.network_lsr import MyError # noqa:E501 -+from ansible.module_utils.network_lsr.myerror import MyError # noqa:E501 - from ansible.module_utils.network_lsr.utils import Util # noqa:E501 - - UINT32_MAX = 0xFFFFFFFF -@@ -72,7 +76,8 @@ class ArgUtil: - - class ValidationError(MyError): - def __init__(self, name, message): -- Exception.__init__(self, name + ": " + message) -+ # pylint: disable=non-parent-init-called -+ super(ValidationError, self).__init__(name + ": " + message) - self.error_message = message - self.name = name - -diff --git a/module_utils/network_lsr/ethtool.py b/module_utils/network_lsr/ethtool.py -index 21e2152..3246bef 100644 ---- a/module_utils/network_lsr/ethtool.py -+++ b/module_utils/network_lsr/ethtool.py -@@ -1,5 +1,9 @@ - # SPDX-License-Identifier: BSD-3-Clause - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - import array - import struct - import fcntl -@@ -46,7 +50,7 @@ def get_perm_addr(ifname): - res = ecmd.tobytes() - except AttributeError: # tobytes() is not available in python2 - res = ecmd.tostring() -- _, size, perm_addr = struct.unpack("II%is" % MAX_ADDR_LEN, res) -+ dummy, size, perm_addr = struct.unpack("II%is" % MAX_ADDR_LEN, res) - perm_addr = Util.mac_ntoa(perm_addr[:size]) - except IOError: - perm_addr = None -diff --git a/module_utils/network_lsr/myerror.py b/module_utils/network_lsr/myerror.py -new file mode 100644 -index 0000000..f785265 ---- /dev/null -+++ b/module_utils/network_lsr/myerror.py -@@ -0,0 +1,11 @@ -+#!/usr/bin/python3 -tt -+# vim: fileencoding=utf8 -+# SPDX-License-Identifier: BSD-3-Clause -+ -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ -+ -+class MyError(Exception): -+ pass -diff --git a/module_utils/network_lsr/nm/__init__.py b/module_utils/network_lsr/nm/__init__.py -index 58fbb5a..74c17cb 100644 ---- a/module_utils/network_lsr/nm/__init__.py -+++ b/module_utils/network_lsr/nm/__init__.py -@@ -1,5 +1,9 @@ - # Relative import is not support by ansible 2.8 yet - # pylint: disable=import-error, no-name-in-module -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - from ansible.module_utils.network_lsr.nm import provider # noqa:E501 - - # pylint: enable=import-error, no-name-in-module -diff --git a/module_utils/network_lsr/nm/active_connection.py b/module_utils/network_lsr/nm/active_connection.py -index a6c5a37..432142c 100644 ---- a/module_utils/network_lsr/nm/active_connection.py -+++ b/module_utils/network_lsr/nm/active_connection.py -@@ -2,6 +2,10 @@ - - # Handle NM.ActiveConnection - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - import logging - - # Relative import is not support by ansible 2.8 yet -@@ -21,19 +25,15 @@ def deactivate_active_connection(nm_ac, timeout, check_mode): - return False - if not check_mode: - main_loop = client.get_mainloop(timeout) -- logging.debug( -- "Deactivating {id} with timeout {timeout}".format( -- id=nm_ac.get_id(), timeout=timeout -- ) -- ) -+ logging.debug("Deactivating %s with timeout %s", nm_ac.get_id(), timeout) - user_data = main_loop - handler_id = nm_ac.connect( - NM_AC_STATE_CHANGED_SIGNAL, _nm_ac_state_change_callback, user_data - ) - logging.debug( -- "Registered {signal} on client.NM.ActiveConnection {id}".format( -- signal=NM_AC_STATE_CHANGED_SIGNAL, id=nm_ac.get_id() -- ) -+ "Registered %s on client.NM.ActiveConnection %s", -+ NM_AC_STATE_CHANGED_SIGNAL, -+ nm_ac.get_id(), - ) - if nm_ac.props.state != client.NM.ActiveConnectionState.DEACTIVATING: - nm_client = client.get_client() -@@ -44,9 +44,7 @@ def deactivate_active_connection(nm_ac, timeout, check_mode): - _nm_ac_deactivate_call_back, - user_data, - ) -- logging.debug( -- "Deactivating client.NM.ActiveConnection {0}".format(nm_ac.get_id()) -- ) -+ logging.debug("Deactivating client.NM.ActiveConnection %s", nm_ac.get_id()) - main_loop.run() - return True - -@@ -56,14 +54,13 @@ def _nm_ac_state_change_callback(nm_ac, state, reason, user_data): - if main_loop.is_cancelled: - return - logging.debug( -- "Got client.NM.ActiveConnection state change: {id}: {state} {reason}".format( -- id=nm_ac.get_id(), state=state, reason=reason -- ) -+ "Got client.NM.ActiveConnection state change: %s: %s %s", -+ nm_ac.get_id(), -+ state, -+ reason, - ) - if nm_ac.props.state == client.NM.ActiveConnectionState.DEACTIVATED: -- logging.debug( -- "client.NM.ActiveConnection {0} is deactivated".format(nm_ac.get_id()) -- ) -+ logging.debug("client.NM.ActiveConnection %s is deactivated", nm_ac.get_id()) - main_loop.quit() - - -@@ -82,9 +79,7 @@ def _nm_ac_deactivate_call_back(nm_client, result, user_data): - client.NM.ManagerError.quark(), client.NM.ManagerError.CONNECTIONNOTACTIVE - ): - logging.info( -- "Connection is not active on {0}, no need to deactivate".format( -- nm_ac_id -- ) -+ "Connection is not active on %s, no need to deactivate", nm_ac_id - ) - if nm_ac: - nm_ac.handler_disconnect(handler_id) -diff --git a/module_utils/network_lsr/nm/client.py b/module_utils/network_lsr/nm/client.py -index 4992887..f47cc53 100644 ---- a/module_utils/network_lsr/nm/client.py -+++ b/module_utils/network_lsr/nm/client.py -@@ -1,5 +1,9 @@ - # SPDX-License-Identifier: BSD-3-Clause - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - import logging - - # Relative import is not support by ansible 2.8 yet -diff --git a/module_utils/network_lsr/nm/connection.py b/module_utils/network_lsr/nm/connection.py -index 6982034..474da8d 100644 ---- a/module_utils/network_lsr/nm/connection.py -+++ b/module_utils/network_lsr/nm/connection.py -@@ -2,6 +2,10 @@ - - # Handle NM.RemoteConnection - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - import logging - - # Relative import is not support by ansible 2.8 yet -@@ -26,9 +30,10 @@ def delete_remote_connection(nm_profile, timeout, check_mode): - user_data, - ) - logging.debug( -- "Deleting profile {id}/{uuid} with timeout {timeout}".format( -- id=nm_profile.get_id(), uuid=nm_profile.get_uuid(), timeout=timeout -- ) -+ "Deleting profile %s/%s with timeout %s", -+ nm_profile.get_id(), -+ nm_profile.get_uuid(), -+ timeout, - ) - main_loop.run() - return True -@@ -78,9 +83,10 @@ def volatilize_remote_connection(nm_profile, timeout, check_mode): - user_data, - ) - logging.debug( -- "Volatilizing profile {id}/{uuid} with timeout {timeout}".format( -- id=nm_profile.get_id(), uuid=nm_profile.get_uuid(), timeout=timeout -- ) -+ "Volatilizing profile %s/%s with timeout %s", -+ nm_profile.get_id(), -+ nm_profile.get_uuid(), -+ timeout, - ) - main_loop.run() - return True -diff --git a/module_utils/network_lsr/nm/error.py b/module_utils/network_lsr/nm/error.py -index 42014ec..d87bc72 100644 ---- a/module_utils/network_lsr/nm/error.py -+++ b/module_utils/network_lsr/nm/error.py -@@ -1,5 +1,9 @@ - # SPDX-License-Identifier: BSD-3-Clause - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - - class LsrNetworkNmError(Exception): - pass -diff --git a/module_utils/network_lsr/nm/provider.py b/module_utils/network_lsr/nm/provider.py -index 52e7502..567c9d1 100644 ---- a/module_utils/network_lsr/nm/provider.py -+++ b/module_utils/network_lsr/nm/provider.py -@@ -1,5 +1,9 @@ - # SPDX-License-Identifier: BSD-3-Clause - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - import logging - - # Relative import is not support by ansible 2.8 yet -@@ -25,7 +29,7 @@ class NetworkManagerProvider: - nm_ac, timeout, check_mode - ) - if not changed: -- logging.info("No active connection for {0}".format(connection_name)) -+ logging.info("No active connection for %s", connection_name) - - return changed - -@@ -49,7 +53,7 @@ class NetworkManagerProvider: - nm_profile, timeout, check_mode - ) - if not changed: -- logging.info("No connection with UUID {0} to volatilize".format(uuid)) -+ logging.info("No connection with UUID %s to volatilize", uuid) - - return changed - -diff --git a/module_utils/network_lsr/nm_provider.py b/module_utils/network_lsr/nm_provider.py -index c75242a..d6168eb 100644 ---- a/module_utils/network_lsr/nm_provider.py -+++ b/module_utils/network_lsr/nm_provider.py -@@ -1,6 +1,10 @@ - # SPDX-License-Identifier: BSD-3-Clause - """ Support for NetworkManager aka the NM provider """ - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - # pylint: disable=import-error, no-name-in-module - from ansible.module_utils.network_lsr.utils import Util # noqa:E501 - -diff --git a/module_utils/network_lsr/utils.py b/module_utils/network_lsr/utils.py -index 73d9528..bc258fe 100644 ---- a/module_utils/network_lsr/utils.py -+++ b/module_utils/network_lsr/utils.py -@@ -2,18 +2,23 @@ - # SPDX-License-Identifier: BSD-3-Clause - # vim: fileencoding=utf8 - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - import socket - import sys - import uuid - - # pylint: disable=import-error, no-name-in-module --from ansible.module_utils.network_lsr import MyError # noqa:E501 -+from ansible.module_utils.network_lsr.myerror import MyError # noqa:E501 - - - class Util: - - PY3 = sys.version_info[0] == 3 - -+ # pylint: disable=undefined-variable - STRING_TYPE = str if PY3 else basestring # noqa:F821 - - @staticmethod -@@ -241,7 +246,8 @@ class Util: - n = int(c, 16) * 16 - i = 1 - else: -- assert i == 1 -+ if not i == 1: -+ raise AssertionError("i != 1 - value is {0}".format(i)) - n = n + int(c, 16) - i = 2 - b.append(n) -diff --git a/tests/ensure_provider_tests.py b/tests/ensure_provider_tests.py -index 078e99d..c22dbce 100755 ---- a/tests/ensure_provider_tests.py -+++ b/tests/ensure_provider_tests.py -@@ -76,8 +76,6 @@ NM_ONLY_TESTS = { - MINIMUM_VERSION: "'1.25.1'", - "comment": "# NetworkManager 1.25.1 introduced ethtool coalesce support", - }, -- "playbooks/tests_802_1x_updated.yml": {}, -- "playbooks/tests_802_1x.yml": {}, - "playbooks/tests_reapply.yml": {}, - # team interface is not supported on Fedora - "playbooks/tests_team.yml": { -@@ -122,9 +120,7 @@ def create_nm_playbook(test_playbook): - EXTRA_RUN_CONDITION, "" - ) - if extra_run_condition: -- extra_run_condition = "{}{}\n".format( -- EXTRA_RUN_CONDITION_PREFIX, extra_run_condition -- ) -+ extra_run_condition = f"{EXTRA_RUN_CONDITION_PREFIX}{extra_run_condition}\n" - - nm_version_check = "" - if minimum_nm_version: -@@ -217,7 +213,7 @@ def main(): - - if missing: - print("ERROR: No NM or initscripts tests found for:\n" + ", \n".join(missing)) -- print("Try to generate them with '{} generate'".format(sys.argv[0])) -+ print(f"Try to generate them with '{sys.argv[0]} generate'") - returncode = 1 - - return returncode -diff --git a/tests/get_coverage.sh b/tests/get_coverage.sh -index 858a8cf..4524fab 100755 ---- a/tests/get_coverage.sh -+++ b/tests/get_coverage.sh -@@ -19,7 +19,6 @@ shift - playbook="${1}" - - coverage_data="remote-coveragedata-${host}-${playbook%.yml}" --coverage="/root/.local/bin/coverage" - - echo "Getting coverage for ${playbook} on ${host}" >&2 - -@@ -32,10 +31,15 @@ call_ansible() { - } - - remote_coverage_dir="$(mktemp -d /tmp/remote_coverage-XXXXXX)" -+# we want to expand ${remote_coverage_dir} here, so tell SC to be quiet -+# https://github.com/koalaman/shellcheck/wiki/SC2064 -+# shellcheck disable=SC2064 - trap "rm -rf '${remote_coverage_dir}'" EXIT - ansible-playbook -i "${host}", get_coverage.yml -e "test_playbook=${playbook} destdir=${remote_coverage_dir}" - - #COVERAGE_FILE=remote-coverage coverage combine remote-coverage/tests_*/*/root/.coverage -+# https://github.com/koalaman/shellcheck/wiki/SC2046 -+# shellcheck disable=SC2046 - ./merge_coverage.sh coverage "${coverage_data}"-tmp $(find "${remote_coverage_dir}" -type f | tr , _) - - cat > tmp_merge_coveragerc < -Date: Thu, 25 Mar 2021 13:55:01 -0600 -Subject: [PATCH 1/4] Patch51: network-epel-minimal.diff - ---- - .../playbooks/integration_pytest_python3.yml | 5 ++++ - tests/tasks/el_repo_setup.yml | 26 ------------------- - tests/tasks/setup_802_1x_server.yml | 2 ++ - tests/tasks/setup_mock_wifi.yml | 2 ++ - tests/tests_802_1x_nm.yml | 1 - - tests/tests_802_1x_updated_nm.yml | 1 - - tests/tests_bond_deprecated_initscripts.yml | 1 - - tests/tests_bond_initscripts.yml | 1 - - tests/tests_bond_nm.yml | 1 - - tests/tests_bridge_initscripts.yml | 1 - - tests/tests_bridge_nm.yml | 1 - - tests/tests_default.yml | 1 - - tests/tests_default_initscripts.yml | 1 - - tests/tests_default_nm.yml | 1 - - tests/tests_ethernet_initscripts.yml | 2 -- - tests/tests_ethernet_nm.yml | 2 -- - tests/tests_ethtool_features_initscripts.yml | 1 - - tests/tests_ethtool_features_nm.yml | 2 -- - tests/tests_helpers_and_asserts.yml | 2 -- - tests/tests_integration_pytest.yml | 5 ++-- - tests/tests_provider_nm.yml | 2 -- - tests/tests_reapply_nm.yml | 2 -- - tests/tests_regression_nm.yml | 2 -- - tests/tests_states_initscripts.yml | 2 -- - tests/tests_states_nm.yml | 2 -- - tests/tests_team_nm.yml | 2 -- - tests/tests_unit.yml | 2 +- - tests/tests_vlan_mtu_initscripts.yml | 2 -- - tests/tests_vlan_mtu_nm.yml | 2 -- - tests/tests_wireless_nm.yml | 2 -- - 30 files changed, 12 insertions(+), 67 deletions(-) - delete mode 100644 tests/tasks/el_repo_setup.yml - -diff --git a/tests/playbooks/integration_pytest_python3.yml b/tests/playbooks/integration_pytest_python3.yml -index 075355b..5fc9dea 100644 ---- a/tests/playbooks/integration_pytest_python3.yml -+++ b/tests/playbooks/integration_pytest_python3.yml -@@ -9,6 +9,11 @@ - - rsync - - tasks: -+ - name: Install EPEL for RHEL and CentOS -+ # yamllint disable-line rule:line-length -+ command: "yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm" -+ when: ansible_distribution in ["CentOS", "RedHat"] -+ - - name: Install rpm dependencies - package: - state: present -diff --git a/tests/tasks/el_repo_setup.yml b/tests/tasks/el_repo_setup.yml -deleted file mode 100644 -index 0656e8c..0000000 ---- a/tests/tasks/el_repo_setup.yml -+++ /dev/null -@@ -1,26 +0,0 @@ --# SPDX-License-Identifier: BSD-3-Clause --- name: Fix CentOS6 Base repo -- copy: -- dest: /etc/yum.repos.d/CentOS-Base.repo -- content: | -- [base] -- name=CentOS-$releasever - Base -- baseurl=https://vault.centos.org/6.10/os/$basearch/ -- gpgcheck=1 -- gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 -- -- [updates] -- name=CentOS-$releasever - Updates -- baseurl=https://vault.centos.org/6.10/updates/$basearch/ -- gpgcheck=1 -- gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 -- -- [extras] -- name=CentOS-$releasever - Extras -- baseurl=https://vault.centos.org/6.10/extras/$basearch/ -- gpgcheck=1 -- gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 -- when: -- - ansible_distribution == 'CentOS' -- - ansible_distribution_major_version == '6' --- include_tasks: enable_epel.yml -diff --git a/tests/tasks/setup_802_1x_server.yml b/tests/tasks/setup_802_1x_server.yml -index 49d1ce1..3bf16a9 100644 ---- a/tests/tasks/setup_802_1x_server.yml -+++ b/tests/tasks/setup_802_1x_server.yml -@@ -1,5 +1,7 @@ - # SPDX-License-Identifier: BSD-3-Clause - --- -+- include_tasks: enable_epel.yml -+ - - name: Install hostapd - package: - name: hostapd -diff --git a/tests/tasks/setup_mock_wifi.yml b/tests/tasks/setup_mock_wifi.yml -index 997b704..d7a1e22 100644 ---- a/tests/tasks/setup_mock_wifi.yml -+++ b/tests/tasks/setup_mock_wifi.yml -@@ -1,5 +1,7 @@ - # SPDX-License-Identifier: BSD-3-Clause - --- -+- include_tasks: enable_epel.yml -+ - - name: Install packages required to set up mock wifi network - package: - name: -diff --git a/tests/tests_802_1x_nm.yml b/tests/tests_802_1x_nm.yml -index a27d8ea..288cd5d 100644 ---- a/tests/tests_802_1x_nm.yml -+++ b/tests/tests_802_1x_nm.yml -@@ -5,7 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_802_1x.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_802_1x_updated_nm.yml b/tests/tests_802_1x_updated_nm.yml -index 5a25f5b..bd335e4 100644 ---- a/tests/tests_802_1x_updated_nm.yml -+++ b/tests/tests_802_1x_updated_nm.yml -@@ -5,7 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_802_1x_updated.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_bond_deprecated_initscripts.yml b/tests/tests_bond_deprecated_initscripts.yml -index 1e74bcc..383b488 100644 ---- a/tests/tests_bond_deprecated_initscripts.yml -+++ b/tests/tests_bond_deprecated_initscripts.yml -@@ -4,7 +4,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_bond_deprecated.yml' with initscripts - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Set network provider to 'initscripts' - set_fact: - network_provider: initscripts -diff --git a/tests/tests_bond_initscripts.yml b/tests/tests_bond_initscripts.yml -index 32fcc32..8fa74c5 100644 ---- a/tests/tests_bond_initscripts.yml -+++ b/tests/tests_bond_initscripts.yml -@@ -4,7 +4,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_bond.yml' with initscripts as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Set network provider to 'initscripts' - set_fact: - network_provider: initscripts -diff --git a/tests/tests_bond_nm.yml b/tests/tests_bond_nm.yml -index 7075d95..8ac6cbd 100644 ---- a/tests/tests_bond_nm.yml -+++ b/tests/tests_bond_nm.yml -@@ -5,7 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_bond.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_bridge_initscripts.yml b/tests/tests_bridge_initscripts.yml -index 8ce42e6..db5663c 100644 ---- a/tests/tests_bridge_initscripts.yml -+++ b/tests/tests_bridge_initscripts.yml -@@ -4,7 +4,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_bridge.yml' with initscripts as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Set network provider to 'initscripts' - set_fact: - network_provider: initscripts -diff --git a/tests/tests_bridge_nm.yml b/tests/tests_bridge_nm.yml -index 3d1b53a..c565952 100644 ---- a/tests/tests_bridge_nm.yml -+++ b/tests/tests_bridge_nm.yml -@@ -5,7 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_bridge.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_default.yml b/tests/tests_default.yml -index e196314..f6f7550 100644 ---- a/tests/tests_default.yml -+++ b/tests/tests_default.yml -@@ -5,7 +5,6 @@ - roles: - - linux-system-roles.network - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Test warning and info logs - assert: - that: -diff --git a/tests/tests_default_initscripts.yml b/tests/tests_default_initscripts.yml -index 006889c..cc8b875 100644 ---- a/tests/tests_default_initscripts.yml -+++ b/tests/tests_default_initscripts.yml -@@ -2,7 +2,6 @@ - --- - - hosts: all - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Set network provider to 'initscripts' - set_fact: - network_provider: initscripts -diff --git a/tests/tests_default_nm.yml b/tests/tests_default_nm.yml -index 54bc3e1..8138ca9 100644 ---- a/tests/tests_default_nm.yml -+++ b/tests/tests_default_nm.yml -@@ -2,7 +2,6 @@ - --- - - hosts: all - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_ethernet_initscripts.yml b/tests/tests_ethernet_initscripts.yml -index 366b052..62e75fe 100644 ---- a/tests/tests_ethernet_initscripts.yml -+++ b/tests/tests_ethernet_initscripts.yml -@@ -4,8 +4,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_ethernet.yml' with initscripts as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'initscripts' - set_fact: - network_provider: initscripts -diff --git a/tests/tests_ethernet_nm.yml b/tests/tests_ethernet_nm.yml -index 238172d..ecefa14 100644 ---- a/tests/tests_ethernet_nm.yml -+++ b/tests/tests_ethernet_nm.yml -@@ -5,8 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_ethernet.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_ethtool_features_initscripts.yml b/tests/tests_ethtool_features_initscripts.yml -index 5bac5d3..6aea73b 100644 ---- a/tests/tests_ethtool_features_initscripts.yml -+++ b/tests/tests_ethtool_features_initscripts.yml -@@ -2,7 +2,6 @@ - # set network provider and gather facts - - hosts: all - tasks: -- - include_tasks: tasks/el_repo_setup.yml - - name: Set network provider to 'initscripts' - set_fact: - network_provider: initscripts -diff --git a/tests/tests_ethtool_features_nm.yml b/tests/tests_ethtool_features_nm.yml -index 2027862..30c6faa 100644 ---- a/tests/tests_ethtool_features_nm.yml -+++ b/tests/tests_ethtool_features_nm.yml -@@ -5,8 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_ethtool_features.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_helpers_and_asserts.yml b/tests/tests_helpers_and_asserts.yml -index 64e2875..5514182 100644 ---- a/tests/tests_helpers_and_asserts.yml -+++ b/tests/tests_helpers_and_asserts.yml -@@ -3,8 +3,6 @@ - - name: Check that creating and removing test devices and assertions work - hosts: all - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: test veth interface management - include_tasks: tasks/create_and_remove_interface.yml - vars: -diff --git a/tests/tests_integration_pytest.yml b/tests/tests_integration_pytest.yml -index 9b80bd4..153214d 100644 ---- a/tests/tests_integration_pytest.yml -+++ b/tests/tests_integration_pytest.yml -@@ -1,8 +1,7 @@ - # SPDX-License-Identifier: BSD-3-Clause - --- --- hosts: all -- tasks: -- - include_tasks: tasks/el_repo_setup.yml -+- name: Empty play to gather facts -+ hosts: all - - - import_playbook: playbooks/integration_pytest_python3.yml - when: (ansible_distribution in ["CentOS", "RedHat"] and -diff --git a/tests/tests_provider_nm.yml b/tests/tests_provider_nm.yml -index 67fcffe..99306a1 100644 ---- a/tests/tests_provider_nm.yml -+++ b/tests/tests_provider_nm.yml -@@ -5,8 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_provider.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_reapply_nm.yml b/tests/tests_reapply_nm.yml -index eb48ddb..69fb208 100644 ---- a/tests/tests_reapply_nm.yml -+++ b/tests/tests_reapply_nm.yml -@@ -5,8 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_reapply.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_regression_nm.yml b/tests/tests_regression_nm.yml -index b2c46e9..9eb8084 100644 ---- a/tests/tests_regression_nm.yml -+++ b/tests/tests_regression_nm.yml -@@ -3,8 +3,6 @@ - # set network provider and gather facts - - hosts: all - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_states_initscripts.yml b/tests/tests_states_initscripts.yml -index fa94103..3e55a43 100644 ---- a/tests/tests_states_initscripts.yml -+++ b/tests/tests_states_initscripts.yml -@@ -4,8 +4,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_states.yml' with initscripts as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'initscripts' - set_fact: - network_provider: initscripts -diff --git a/tests/tests_states_nm.yml b/tests/tests_states_nm.yml -index 34c8a24..3164a3a 100644 ---- a/tests/tests_states_nm.yml -+++ b/tests/tests_states_nm.yml -@@ -5,8 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_states.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_team_nm.yml b/tests/tests_team_nm.yml -index 8048029..0516765 100644 ---- a/tests/tests_team_nm.yml -+++ b/tests/tests_team_nm.yml -@@ -5,8 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_team.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_unit.yml b/tests/tests_unit.yml -index 44dfaec..8c5388b 100644 ---- a/tests/tests_unit.yml -+++ b/tests/tests_unit.yml -@@ -3,7 +3,7 @@ - - hosts: all - name: Setup for test running - tasks: -- - include_tasks: tasks/el_repo_setup.yml -+ - include_tasks: tasks/enable_epel.yml - - - name: Install dependencies - package: -diff --git a/tests/tests_vlan_mtu_initscripts.yml b/tests/tests_vlan_mtu_initscripts.yml -index dcd5d74..37770a9 100644 ---- a/tests/tests_vlan_mtu_initscripts.yml -+++ b/tests/tests_vlan_mtu_initscripts.yml -@@ -4,8 +4,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_vlan_mtu.yml' with initscripts as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'initscripts' - set_fact: - network_provider: initscripts -diff --git a/tests/tests_vlan_mtu_nm.yml b/tests/tests_vlan_mtu_nm.yml -index c38263c..f201de3 100644 ---- a/tests/tests_vlan_mtu_nm.yml -+++ b/tests/tests_vlan_mtu_nm.yml -@@ -5,8 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_vlan_mtu.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'nm' - set_fact: - network_provider: nm -diff --git a/tests/tests_wireless_nm.yml b/tests/tests_wireless_nm.yml -index 03b5ad6..86baf67 100644 ---- a/tests/tests_wireless_nm.yml -+++ b/tests/tests_wireless_nm.yml -@@ -5,8 +5,6 @@ - - hosts: all - name: Run playbook 'playbooks/tests_wireless.yml' with nm as provider - tasks: -- - include_tasks: tasks/el_repo_setup.yml -- - - name: Set network provider to 'nm' - set_fact: - network_provider: nm --- -2.30.2 - diff --git a/SOURCES/network-tier1-tags.diff b/SOURCES/network-tier1-tags.diff index 3fff8a1..9529a03 100644 --- a/SOURCES/network-tier1-tags.diff +++ b/SOURCES/network-tier1-tags.diff @@ -1,567 +1,54 @@ -From c050984fda1e5bed1882335c30108b402b55b795 Mon Sep 17 00:00:00 2001 +From 4b1a8a87e7d297fd6669d653af7308dd9c1a513a Mon Sep 17 00:00:00 2001 From: Rich Megginson -Date: Thu, 25 Mar 2021 13:55:52 -0600 -Subject: [PATCH 2/4] Patch52: network-tier1-tags.diff +Date: Thu, 6 May 2021 13:52:38 -0600 +Subject: [PATCH] tag 802-1x test as expfail; make sure bridge test cleans up + properly +The 802-1x test will fail on platforms where `hostapd` is not available, +so tag that test to make it skippable. + +The initscripts bridge test does not clean up properly, leaving the +device around which causes the nm test to fail. Explicitly remove +the device for cleanup. --- - tests/playbooks/tests_802_1x.yml | 10 ++++++++ - tests/playbooks/tests_bond.yml | 10 ++++++++ - tests/playbooks/tests_bridge.yml | 27 +++++++++++++++++++- - tests/playbooks/tests_checkpoint_cleanup.yml | 10 ++++++++ - tests/playbooks/tests_ethernet.yml | 21 +++++++++++++++ - tests/playbooks/tests_ethtool_features.yml | 10 ++++++++ - tests/playbooks/tests_provider.yml | 10 ++++++++ - tests/playbooks/tests_reapply.yml | 10 ++++++++ - tests/playbooks/tests_states.yml | 20 +++++++++++++++ - tests/playbooks/tests_vlan_mtu.yml | 18 +++++++++++++ - tests/playbooks/tests_wireless.yml | 10 ++++++++ - tests/tasks/commonvars.yml | 2 ++ - tests/tasks/get_services_state.yml | 4 +++ - tests/tasks/restore_services_state.yml | 22 ++++++++++++++++ - tests/tasks/restore_state.yml | 24 +++++++++++++++++ - tests/tasks/save_state.yml | 11 ++++++++ - tests/tests_802_1x_nm.yml | 4 +++ - tests/tests_802_1x_updated_nm.yml | 4 +++ - tests/tests_default.yml | 8 ++++++ - tests/tests_helpers_and_asserts.yml | 8 ++++++ - 20 files changed, 242 insertions(+), 1 deletion(-) - create mode 100644 tests/tasks/commonvars.yml - create mode 100644 tests/tasks/get_services_state.yml - create mode 100644 tests/tasks/restore_services_state.yml - create mode 100644 tests/tasks/restore_state.yml - create mode 100644 tests/tasks/save_state.yml + tests/playbooks/tests_802_1x.yml | 2 ++ + tests/playbooks/tests_bridge.yml | 10 ++++++++++ + 2 files changed, 12 insertions(+) diff --git a/tests/playbooks/tests_802_1x.yml b/tests/playbooks/tests_802_1x.yml -index 9cce1ae..76d99e9 100644 +index 9cce1ae..4ceebb1 100644 --- a/tests/playbooks/tests_802_1x.yml +++ b/tests/playbooks/tests_802_1x.yml -@@ -1,5 +1,10 @@ - # SPDX-License-Identifier: BSD-3-Clause - --- -+- name: Save host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/save_state.yml -+ +@@ -3,6 +3,8 @@ - hosts: all vars: interface: 802-1x-test -@@ -122,3 +127,8 @@ - command: update-ca-trust - tags: - - "tests::cleanup" -+ -+- name: Restore host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/restore_state.yml -diff --git a/tests/playbooks/tests_bond.yml b/tests/playbooks/tests_bond.yml -index 69f07f8..1e45788 100644 ---- a/tests/playbooks/tests_bond.yml -+++ b/tests/playbooks/tests_bond.yml -@@ -1,5 +1,10 @@ - # SPDX-License-Identifier: BSD-3-Clause - --- -+- name: Save host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/save_state.yml -+ - - hosts: all - vars: - controller_profile: bond0 -@@ -95,3 +100,8 @@ - - import_tasks: tasks/remove_test_interfaces_with_dhcp.yml - tags: - - "tests::cleanup" -+ -+- name: Restore host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/restore_state.yml ++ tags: ++ - tests::expfail + tasks: + - name: "INIT: 802.1x tests" + debug: diff --git a/tests/playbooks/tests_bridge.yml b/tests/playbooks/tests_bridge.yml -index d79d6ad..c8cf3cd 100644 +index d79d6ad..14b1225 100644 --- a/tests/playbooks/tests_bridge.yml +++ b/tests/playbooks/tests_bridge.yml -@@ -1,5 +1,10 @@ - # SPDX-License-Identifier: BSD-3-Clause - --- -+- name: Save host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/save_state.yml -+ - - name: Test configuring bridges - hosts: all - vars: -@@ -14,6 +19,8 @@ - - - name: Add test bridge - hosts: all -+ tags: -+ - 'tests::net::bridge' - vars: - network_connections: - - name: "{{ interface }}" -@@ -36,11 +43,15 @@ - task: tasks/assert_profile_present.yml - - - import_playbook: down_profile.yml -+ tags: -+ - 'tests::net::bridge' - vars: - profile: "{{ interface }}" - # FIXME: assert profile/device down - - - import_playbook: remove_profile.yml -+ tags: -+ - 'tests::net::bridge' - vars: +@@ -49,6 +49,16 @@ profile: "{{ interface }}" + task: tasks/assert_profile_absent.yml -@@ -51,5 +62,19 @@ - - # FIXME: Devices might still be left when profile is absent - # - import_playbook: run_tasks.yml --# vars: -+# vars: - # task: tasks/assert_device_absent.yml -+ +- name: Remove test bridge + hosts: all + tags: -+ - 'tests::cleanup' -+ - 'tests::net::bridge::cleanup' ++ - tests::cleanup + tasks: -+ - command: 'ip link delete "{{ interface }}"' ++ - name: Remove the test interface ++ command: ip link delete {{ interface | quote }} + ignore_errors: yes ++ changed_when: false + -+- name: Restore host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/restore_state.yml -diff --git a/tests/playbooks/tests_checkpoint_cleanup.yml b/tests/playbooks/tests_checkpoint_cleanup.yml -index 18e3fd7..3b5a41a 100644 ---- a/tests/playbooks/tests_checkpoint_cleanup.yml -+++ b/tests/playbooks/tests_checkpoint_cleanup.yml -@@ -4,6 +4,11 @@ - # mark a device as unmanaged for NM and then tries to activiate it using NM. - # This failed without removing the checkpoint. - --- -+- name: Save host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/save_state.yml -+ - - hosts: all - vars: - interface: cptstbr -@@ -80,3 +85,8 @@ - ignore_errors: true - tags: - - "tests::cleanup" -+ -+- name: Restore host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/restore_state.yml -diff --git a/tests/playbooks/tests_ethernet.yml b/tests/playbooks/tests_ethernet.yml -index cd02579..adcffee 100644 ---- a/tests/playbooks/tests_ethernet.yml -+++ b/tests/playbooks/tests_ethernet.yml -@@ -1,5 +1,10 @@ - # SPDX-License-Identifier: BSD-3-Clause - --- -+- name: Save host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/save_state.yml -+ - - hosts: all - tasks: - - debug: -@@ -9,6 +14,8 @@ - - - name: Test configuring ethernet devices - hosts: all -+ tags: -+ - 'tests::net::veth' - vars: - type: veth - interface: lsr27 -@@ -26,6 +33,8 @@ - - - name: Test static interface up - hosts: all -+ tags: -+ - 'tests::net::reconf' - vars: - network_connections: - - name: "{{ interface }}" -@@ -48,17 +57,29 @@ - # FIXME: assert profile present - # FIXME: assert profile/device up + IP address - - import_playbook: down_profile.yml -+ tags: -+ - 'tests::cleanup' - vars: - profile: "{{ interface }}" - # FIXME: assert profile/device down - - import_playbook: remove_profile.yml -+ tags: -+ - 'tests::cleanup' - vars: - profile: "{{ interface }}" - # FIXME: assert profile away - - name: Remove interfaces - hosts: all -+ tags: -+ - 'tests::cleanup' -+ - 'tests::net::veth::cleanup' - tasks: - - include_tasks: tasks/manage_test_interface.yml - vars: - state: absent - - include_tasks: tasks/assert_device_absent.yml -+ -+- name: Restore host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/restore_state.yml -diff --git a/tests/playbooks/tests_ethtool_features.yml b/tests/playbooks/tests_ethtool_features.yml -index 43fddc3..d1a87fe 100644 ---- a/tests/playbooks/tests_ethtool_features.yml -+++ b/tests/playbooks/tests_ethtool_features.yml -@@ -1,5 +1,10 @@ - # SPDX-License-Identifier: BSD-3-Clause - --- -+- name: Save host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/save_state.yml -+ - - hosts: all - vars: - interface: testnic1 -@@ -198,3 +203,8 @@ - state: absent - tags: - - "tests::cleanup" -+ -+- name: Restore host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/restore_state.yml -diff --git a/tests/playbooks/tests_provider.yml b/tests/playbooks/tests_provider.yml -index 1db2d08..e097b4b 100644 ---- a/tests/playbooks/tests_provider.yml -+++ b/tests/playbooks/tests_provider.yml -@@ -1,5 +1,10 @@ - # SPDX-License-Identifier: BSD-3-Clause - --- -+- name: Save host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/save_state.yml -+ - - hosts: all - vars: - interface: testnic1 -@@ -33,3 +38,8 @@ - - tasks/cleanup_profile+device.yml - tags: - - tests::provider:initscripts_to_nm -+ -+- name: Restore host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/restore_state.yml -diff --git a/tests/playbooks/tests_reapply.yml b/tests/playbooks/tests_reapply.yml -index 4b1cb09..6995607 100644 ---- a/tests/playbooks/tests_reapply.yml -+++ b/tests/playbooks/tests_reapply.yml -@@ -4,6 +4,11 @@ - # of via Ansible. Until there is better test support for this, just check the - # log output for the respective log message. - --- -+- name: Save host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/save_state.yml -+ - - hosts: all - vars: - interface: rpltstbr -@@ -64,3 +69,8 @@ - ignore_errors: true - tags: - - "tests::cleanup" -+ -+- name: Restore host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/restore_state.yml -diff --git a/tests/playbooks/tests_states.yml b/tests/playbooks/tests_states.yml -index eec27c0..a8d0ecd 100644 ---- a/tests/playbooks/tests_states.yml -+++ b/tests/playbooks/tests_states.yml -@@ -135,3 +135,23 @@ - - tasks/cleanup_profile+device.yml - tags: - - tests::states:remove_down_twice -+ -+ pre_tasks: -+ - name: Save host state -+ import_tasks: tasks/save_state.yml -+ -+ post_tasks: -+ - name: Remove test profile -+ tags: -+ - 'tests::cleanup' -+ - 'tests::net::bridge::cleanup' -+ import_role: -+ name: linux-system-roles.network -+ vars: -+ network_connections: -+ - name: statebr -+ state: down -+ persistent_state: absent -+ -+ - name: Restore host state -+ import_tasks: tasks/restore_state.yml -diff --git a/tests/playbooks/tests_vlan_mtu.yml b/tests/playbooks/tests_vlan_mtu.yml -index 029b599..378d5fe 100644 ---- a/tests/playbooks/tests_vlan_mtu.yml -+++ b/tests/playbooks/tests_vlan_mtu.yml -@@ -10,6 +10,8 @@ - - include_tasks: tasks/manage_test_interface.yml - vars: - state: present -+ tags: -+ - 'tests::net::veth' - - include_tasks: tasks/assert_device_present.yml - - name: >- - TEST: I can configure the MTU for a vlan interface without autoconnect. -@@ -38,6 +40,8 @@ - ip: - dhcp4: false - auto6: false -+ tags: -+ - 'tests::net::reconf' - - include_tasks: tasks/assert_device_present.yml - vars: - interface: "{{ vlan_interface }}" -@@ -62,6 +66,20 @@ - persistent_state: absent - state: down - ignore_errors: true -+ tags: -+ - 'tests::cleanup' -+ - 'tests::net::veth::cleanup' - - include_tasks: tasks/manage_test_interface.yml - vars: - state: absent -+ tags: -+ - 'tests::cleanup' -+ - 'tests::net::veth::cleanup' -+ -+ pre_tasks: -+ - name: Save host state -+ import_tasks: tasks/save_state.yml -+ -+ post_tasks: -+ - name: Restore host state -+ import_tasks: tasks/restore_state.yml -diff --git a/tests/playbooks/tests_wireless.yml b/tests/playbooks/tests_wireless.yml -index 822a15e..52661bd 100644 ---- a/tests/playbooks/tests_wireless.yml -+++ b/tests/playbooks/tests_wireless.yml -@@ -1,5 +1,10 @@ - # SPDX-License-Identifier: BSD-3-Clause - --- -+- name: Save host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/save_state.yml -+ - - hosts: all - vars: - interface: wlan0 -@@ -86,3 +91,8 @@ - - include_tasks: tasks/cleanup_mock_wifi.yml - tags: - - "tests::cleanup" -+ -+- name: Restore host state -+ hosts: all -+ tasks: -+ - import_tasks: tasks/restore_state.yml -diff --git a/tests/tasks/commonvars.yml b/tests/tasks/commonvars.yml -new file mode 100644 -index 0000000..50452f7 ---- /dev/null -+++ b/tests/tasks/commonvars.yml -@@ -0,0 +1,2 @@ -+restore_services: -+ - NetworkManager -diff --git a/tests/tasks/get_services_state.yml b/tests/tasks/get_services_state.yml -new file mode 100644 -index 0000000..4fe5d36 ---- /dev/null -+++ b/tests/tasks/get_services_state.yml -@@ -0,0 +1,4 @@ -+- name: Get initial state of services -+ tags: tests::cleanup -+ service_facts: -+ register: initial_state -diff --git a/tests/tasks/restore_services_state.yml b/tests/tasks/restore_services_state.yml -new file mode 100644 -index 0000000..2035dfc ---- /dev/null -+++ b/tests/tasks/restore_services_state.yml -@@ -0,0 +1,22 @@ -+- block: -+ - name: load common vars -+ include_vars: -+ file: commonvars.yml -+ -+ - name: Get final state of services -+ service_facts: -+ register: final_state -+ -+ - name: Restore state of services -+ service: -+ name: "{{ item }}" -+ state: "{{ 'started' if -+ initial_state.ansible_facts.services[sname]['state'] -+ == 'running' else 'stopped' }}" -+ when: -+ - sname in final_state.ansible_facts.services -+ - sname in initial_state.ansible_facts.services -+ vars: -+ sname: "{{ item + '.service' }}" -+ with_items: "{{ restore_services }}" -+ tags: tests::cleanup -diff --git a/tests/tasks/restore_state.yml b/tests/tasks/restore_state.yml -new file mode 100644 -index 0000000..f4e3d5f ---- /dev/null -+++ b/tests/tasks/restore_state.yml -@@ -0,0 +1,24 @@ -+--- -+- name: Remove /etc/sysconfig/network if there was no one -+ tags: -+ - 'tests::cleanup' -+ file: -+ path: /etc/sysconfig/network -+ state: absent -+ when: -+ - etc_sysconfig_network_stat is defined -+ - not etc_sysconfig_network_stat.stat.exists -+ -+- name: Restore services -+ import_tasks: restore_services_state.yml -+ -+- name: reload NetworkManager -+ tags: -+ - 'tests::cleanup' -+ command: nmcli connection reload -+ when: -+ - sname in final_state.ansible_facts.services -+ - sname in initial_state.ansible_facts.services -+ - final_state.ansible_facts.services[sname]['state'] == 'running' -+ vars: -+ sname: NetworkManager.service -diff --git a/tests/tasks/save_state.yml b/tests/tasks/save_state.yml -new file mode 100644 -index 0000000..5690aed ---- /dev/null -+++ b/tests/tasks/save_state.yml -@@ -0,0 +1,11 @@ -+--- -+- name: Get services state -+ import_tasks: get_services_state.yml -+ -+- name: Investigate /etc/sysconfig/network presence -+ tags: -+ - 'tests::cleanup' -+ stat: -+ path: /etc/sysconfig/network -+ register: etc_sysconfig_network_stat -+ ignore_errors: yes -diff --git a/tests/tests_802_1x_nm.yml b/tests/tests_802_1x_nm.yml -index 288cd5d..840958d 100644 ---- a/tests/tests_802_1x_nm.yml -+++ b/tests/tests_802_1x_nm.yml -@@ -4,6 +4,8 @@ - # set network provider and gather facts - - hosts: all - name: Run playbook 'playbooks/tests_802_1x.yml' with nm as provider -+ tags: -+ - tests::expfail - tasks: - - name: Set network provider to 'nm' - set_fact: -@@ -17,3 +19,5 @@ - - import_playbook: playbooks/tests_802_1x.yml - when: - - ansible_distribution_major_version != '6' -+ tags: -+ - tests::expfail -diff --git a/tests/tests_802_1x_updated_nm.yml b/tests/tests_802_1x_updated_nm.yml -index bd335e4..4ebcaf9 100644 ---- a/tests/tests_802_1x_updated_nm.yml -+++ b/tests/tests_802_1x_updated_nm.yml -@@ -4,6 +4,8 @@ - # set network provider and gather facts - - hosts: all - name: Run playbook 'playbooks/tests_802_1x_updated.yml' with nm as provider -+ tags: -+ - tests::expfail - tasks: - - name: Set network provider to 'nm' - set_fact: -@@ -17,3 +19,5 @@ - - import_playbook: playbooks/tests_802_1x_updated.yml - when: - - ansible_distribution_major_version != '6' -+ tags: -+ - tests::expfail -diff --git a/tests/tests_default.yml b/tests/tests_default.yml -index f6f7550..98e3c7e 100644 ---- a/tests/tests_default.yml -+++ b/tests/tests_default.yml -@@ -10,3 +10,11 @@ - that: - - "'warnings' not in __network_connections_result" - msg: "There are warnings" -+ -+ pre_tasks: -+ - name: Save host state -+ import_tasks: tasks/save_state.yml -+ -+ post_tasks: -+ - name: Restore host state -+ import_tasks: tasks/restore_state.yml -diff --git a/tests/tests_helpers_and_asserts.yml b/tests/tests_helpers_and_asserts.yml -index 5514182..d9bfa11 100644 ---- a/tests/tests_helpers_and_asserts.yml -+++ b/tests/tests_helpers_and_asserts.yml -@@ -15,6 +15,14 @@ - type: dummy - interface: dummy1298 - -+ pre_tasks: -+ - name: Save host state -+ import_tasks: tasks/save_state.yml -+ -+ post_tasks: -+ - name: Restore host state -+ import_tasks: tasks/restore_state.yml -+ - # FIXME: when: does not seem to work with include_tasks, therefore this cannot - # be safely tested for now - # - name: test tap interfaces + # FIXME: Devices might still be left when profile is absent + # - import_playbook: run_tasks.yml + # vars: -- 2.30.2 diff --git a/SOURCES/rhel-system-roles-kdump-pr22.diff b/SOURCES/rhel-system-roles-kdump-pr22.diff deleted file mode 100644 index 342eddc..0000000 --- a/SOURCES/rhel-system-roles-kdump-pr22.diff +++ /dev/null @@ -1,80 +0,0 @@ -diff --git a/tasks/ssh.yml b/tasks/ssh.yml -index 1a4e858..b05d01a 100644 ---- a/tasks/ssh.yml -+++ b/tasks/ssh.yml -@@ -18,3 +18,15 @@ - key: "{{ keydata.content|b64decode }}" - state: present - delegate_to: "{{ kdump_ssh_server }}" -+ -+- name: Fetch the servers public key -+ slurp: -+ src: /etc/ssh/ssh_host_rsa_key.pub -+ register: serverpubkey -+ delegate_to: "{{ kdump_ssh_server }}" -+ -+- name: Add the servers public key to known_hosts on managed node -+ known_hosts: -+ key: "{{ kdump_ssh_server_location }} {{ serverpubkey.content | b64decode }}" -+ name: "{{ kdump_ssh_server_location }}" -+ path: /etc/ssh/ssh_known_hosts -diff --git a/templates/kdump.conf.j2 b/templates/kdump.conf.j2 -index bf24210..504ff34 100644 ---- a/templates/kdump.conf.j2 -+++ b/templates/kdump.conf.j2 -@@ -1,12 +1,17 @@ - # {{ ansible_managed }} - - {% if kdump_target %} --{{ kdump_target.type }} {{ kdump_target.location }} --{% endif %} -+{% if kdump_target.type == "ssh" %} -+ssh {{ kdump_target.location | d(kdump_ssh_user ~ '@' ~ kdump_ssh_server) }} - --{% if kdump_target and kdump_target.type == "ssh" and kdump_sshkey != '/root/.ssh/kdump_id_rsa' %} -+{% if kdump_sshkey != '/root/.ssh/kdump_id_rsa' %} - sshkey {{ kdump_sshkey }} - {% endif %} -+{% else %} -+{{ kdump_target.type }} {{ kdump_target.location }} -+ -+{% endif %} -+{% endif %} - - path {{ kdump_path }} - {% if kdump_core_collector %} -diff --git a/tests/tests_ssh.yml b/tests/tests_ssh.yml -index 1da99df..d12e884 100644 ---- a/tests/tests_ssh.yml -+++ b/tests/tests_ssh.yml -@@ -5,6 +5,11 @@ - # known and ansible is supposed to be configured to be able to - # connect to it (via inventory). - kdump_ssh_server_outside: localhost -+ kdump_ssh_source: "{{ ansible_env['SSH_CONNECTION'].split()[0] }}" -+ -+ # this is the address at which the ssh dump server can be reached -+ # from the managed host. Dumps will be uploaded there. -+ kdump_ssh_server_inside: "{{ kdump_ssh_source if kdump_ssh_source in hostvars[kdump_ssh_server_outside]['ansible_all_ipv4_addresses'] + hostvars[kdump_ssh_server_outside]['ansible_all_ipv6_addresses'] else hostvars[kdump_ssh_server_outside]['ansible_default_ipv4']['address'] }}" - - tasks: - - name: gather facts from {{ kdump_ssh_server_outside }} -@@ -25,8 +30,5 @@ - type: ssh - # This is the ssh dump server address visible from inside - # the machine being configured. Dumps are to be copied -- # there. We make here the assumption that this machine is -- # being run as a VM and the dump server is the VM host -- # (i.e. for ansible this is localhost). From the VM its -- # address is then identical to the default route. -- location: "{{ kdump_ssh_user }}@{{ ansible_default_ipv4.gateway }}" -+ # there. -+ location: "{{ kdump_ssh_user }}@{{ kdump_ssh_server_inside }}" -diff --git a/vars/main.yml b/vars/main.yml -new file mode 100644 -index 0000000..34d2d62 ---- /dev/null -+++ b/vars/main.yml -@@ -0,0 +1,2 @@ -+# determine the managed node facing ssh server address -+kdump_ssh_server_location: "{{ kdump_target.location | regex_replace('.*@(.*)$', '\\1') if kdump_target.location is defined else kdump_ssh_server }}" diff --git a/SOURCES/selinux-tier1-tags.diff b/SOURCES/selinux-tier1-tags.diff deleted file mode 100644 index 388c2b6..0000000 --- a/SOURCES/selinux-tier1-tags.diff +++ /dev/null @@ -1,195 +0,0 @@ -From 4a8f0c2b240ffccde5018d2de1166e6c22daa500 Mon Sep 17 00:00:00 2001 -From: Rich Megginson -Date: Mon, 22 Mar 2021 17:13:26 -0600 -Subject: [PATCH] add tags; fix cleanup task - ---- - tests/set_selinux_variables.yml | 8 ++++++ - tests/tests_all_purge.yml | 6 ++++- - tests/tests_all_transitions.yml | 2 ++ - tests/tests_boolean.yml | 3 ++- - tests/tests_fcontext.yml | 2 +- - tests/tests_login.yml | 2 +- - tests/tests_port.yml | 2 +- - tests/tests_selinux_disabled.yml | 45 +++++++++++++++++++++----------- - 8 files changed, 50 insertions(+), 20 deletions(-) - -diff --git a/tests/set_selinux_variables.yml b/tests/set_selinux_variables.yml -index 05f0c88..3446647 100644 ---- a/tests/set_selinux_variables.yml -+++ b/tests/set_selinux_variables.yml -@@ -1,4 +1,12 @@ - --- -+- name: Install SELinux tool semanage on Fedora -+ package: -+ name: -+ - policycoreutils-python-utils -+ state: present -+ when: ansible_distribution == "Fedora" or -+ ( ansible_distribution_major_version > "7" and -+ ( ansible_distribution == "CentOS" or ansible_distribution == "RedHat" )) - - name: Get local modifications - boolean - command: /usr/sbin/semanage boolean -l -n -C - changed_when: false -diff --git a/tests/tests_all_purge.yml b/tests/tests_all_purge.yml -index 40e933b..4688994 100644 ---- a/tests/tests_all_purge.yml -+++ b/tests/tests_all_purge.yml -@@ -8,13 +8,17 @@ - fcontext -a -t user_home_dir_t /tmp/test_dir - login -a -s staff_u sar-user - -+ tags: -+ - 'tests::avc' - tasks: - - name: Install SELinux tool semanage on Fedora - package: - name: - - policycoreutils-python-utils - state: present -- when: ansible_distribution == "Fedora" -+ when: ansible_distribution == "Fedora" or -+ ( ansible_distribution_major_version > "7" and -+ ( ansible_distribution == "CentOS" or ansible_distribution == "RedHat" )) - - - name: Add a Linux System Roles SELinux User - user: -diff --git a/tests/tests_all_transitions.yml b/tests/tests_all_transitions.yml -index acd37ad..20f96c4 100644 ---- a/tests/tests_all_transitions.yml -+++ b/tests/tests_all_transitions.yml -@@ -1,6 +1,8 @@ - - name: Test all the possible selinux_state transitions - hosts: all - become: true -+ tags: -+ - 'tests::reboot' - vars: - states: - - permissive -diff --git a/tests/tests_boolean.yml b/tests/tests_boolean.yml -index 368e8dc..966abe4 100644 ---- a/tests/tests_boolean.yml -+++ b/tests/tests_boolean.yml -@@ -1,4 +1,5 @@ - - name: Check if selinux role sets SELinux booleans -+ tags: tests::expfail - hosts: all - become: true - -@@ -11,7 +12,7 @@ - selinux_booleans: - - { name: 'samba_enable_home_dirs', state: 'on', persistent: 'yes' } - -- - include: set_selinux_variables.yml -+ - import_tasks: set_selinux_variables.yml - - name: save state after initial changes and before other changes - set_fact: - boolean_before: "{{ selinux_role_boolean.stdout_lines }}" -diff --git a/tests/tests_fcontext.yml b/tests/tests_fcontext.yml -index b96b07a..aa1e1fa 100644 ---- a/tests/tests_fcontext.yml -+++ b/tests/tests_fcontext.yml -@@ -13,7 +13,7 @@ - - { target: '/tmp/test_dir1(/.*)?', setype: 'user_home_dir_t', - ftype: 'd' } - -- - include: set_selinux_variables.yml -+ - import_tasks: set_selinux_variables.yml - - name: save state after initial changes and before other changes - set_fact: - fcontext_before: "{{ selinux_role_fcontext.stdout }}" -diff --git a/tests/tests_login.yml b/tests/tests_login.yml -index 67c6a9f..4ce8a0b 100644 ---- a/tests/tests_login.yml -+++ b/tests/tests_login.yml -@@ -17,7 +17,7 @@ - - { login: 'sar-user', seuser: 'staff_u', - serange: 's0-s0:c0.c1023', state: 'present' } - -- - include: set_selinux_variables.yml -+ - import_tasks: set_selinux_variables.yml - - name: save state after initial changes and before other changes - set_fact: - login_before: "{{ selinux_role_login.stdout }}" -diff --git a/tests/tests_port.yml b/tests/tests_port.yml -index 5b651b0..4172dcb 100644 ---- a/tests/tests_port.yml -+++ b/tests/tests_port.yml -@@ -29,7 +29,7 @@ - - { ports: '22022', proto: 'tcp', setype: 'ssh_port_t', - state: 'present' } - -- - include: set_selinux_variables.yml -+ - import_tasks: set_selinux_variables.yml - - name: save state after other changes - set_fact: - port_after: "{{ selinux_role_port.stdout }}" -diff --git a/tests/tests_selinux_disabled.yml b/tests/tests_selinux_disabled.yml -index a0dbaeb..4d896a0 100644 ---- a/tests/tests_selinux_disabled.yml -+++ b/tests/tests_selinux_disabled.yml -@@ -11,13 +11,17 @@ - fcontext -a -t user_home_dir_t /tmp/test_dir - login -a -s staff_u sar-user - -+ tags: -+ - 'tests::avc' - tasks: - - name: Install SELinux tool semanage on Fedora - package: - name: - - policycoreutils-python-utils - state: present -- when: ansible_distribution == "Fedora" -+ when: ansible_distribution == "Fedora" or -+ ( ansible_distribution_major_version > "7" and -+ ( ansible_distribution == "CentOS" or ansible_distribution == "RedHat" )) - - - name: Add a Linux System Roles SELinux User - user: -@@ -80,18 +84,29 @@ - that: "{{ ansible_selinux.config_mode == 'enforcing' }}" - msg: "SELinux config mode should be enforcing instead of - {{ ansible_selinux.config_mode }}" -- - name: Restore original /etc/selinux/config -- copy: -- remote_src: true -- dest: /etc/selinux/config -- src: /etc/selinux/config.test_selinux_disabled -- mode: preserve -- - name: Remove /etc/selinux/config backup -- file: -- path: /etc/selinux/config.test_selinux_disabled -- state: absent -- - name: Remove Linux System Roles SELinux User -- user: -- name: sar-user -- remove: yes -- state: absent -+ -+ - name: Cleanup -+ tags: [ 'tests::cleanup' ] -+ block: -+ - name: Restore original /etc/selinux/config -+ copy: -+ remote_src: true -+ dest: /etc/selinux/config -+ src: /etc/selinux/config.test_selinux_disabled -+ mode: preserve -+ -+ - name: Remove /etc/selinux/config backup -+ file: -+ path: /etc/selinux/config.test_selinux_disabled -+ state: absent -+ -+ - name: Remove Linux System Roles SELinux User -+ user: -+ name: sar-user -+ remove: yes -+ state: absent -+ -+ - import_role: -+ name: linux-system-roles.selinux -+ vars: -+ selinux_all_purge: true diff --git a/SOURCES/storage-ansible-test.diff b/SOURCES/storage-ansible-test.diff deleted file mode 100644 index 0e6d45e..0000000 --- a/SOURCES/storage-ansible-test.diff +++ /dev/null @@ -1,3661 +0,0 @@ -From 0a69c057b41890d3d426ac10dfc198e7a3dbab4e Mon Sep 17 00:00:00 2001 -From: Rich Megginson -Date: Wed, 3 Mar 2021 07:55:20 -0700 -Subject: [PATCH] resolve ansible-test issues - -This fixes many formatting issues as well to make black, flake8, -pylint, yamllint, and ansible-lint happier. ---- - .github/workflows/tox.yml | 4 +- - .sanity-ansible-ignore-2.9.txt | 13 + - library/blivet.py | 968 +++++++++++------- - library/blockdev_info.py | 45 +- - library/bsize.py | 56 +- - library/find_unused_disk.py | 101 +- - library/lvm_gensym.py | 119 ++- - library/resolve_blockdev.py | 71 +- - module_utils/storage_lsr/size.py | 86 +- - tests/setup_module_utils.sh | 41 - - tests/test-verify-volume-device.yml | 4 +- - tests/test-verify-volume-md.yml | 2 +- - tests/test.yml | 2 +- - tests/tests_create_lv_size_equal_to_vg.yml | 28 +- - ...ts_create_partition_volume_then_remove.yml | 4 +- - tests/tests_existing_lvm_pool.yml | 12 +- - tests/tests_lvm_auto_size_cap.yml | 42 +- - tests/tests_lvm_one_disk_one_volume.yml | 46 +- - tests/tests_misc.yml | 2 +- - tests/tests_null_raid_pool.yml | 14 +- - tests/tests_resize.yml | 86 +- - tests/unit/bsize_test.py | 5 + - tests/unit/gensym_test.py | 103 +- - tests/unit/resolve_blockdev_test.py | 74 +- - tests/unit/test_unused_disk.py | 73 +- - tox.ini | 6 - - 26 files changed, 1177 insertions(+), 830 deletions(-) - create mode 100644 .sanity-ansible-ignore-2.9.txt - delete mode 100755 tests/setup_module_utils.sh - -diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml -index eceb71f..ec3ec9f 100644 ---- a/.github/workflows/tox.yml -+++ b/.github/workflows/tox.yml -@@ -3,7 +3,7 @@ name: tox - on: # yamllint disable-line rule:truthy - - pull_request - env: -- TOX_LSR: "git+https://github.com/linux-system-roles/tox-lsr@2.2.0" -+ TOX_LSR: "git+https://github.com/linux-system-roles/tox-lsr@2.3.0" - LSR_ANSIBLES: 'ansible==2.8.* ansible==2.9.*' - LSR_MSCENARIOS: default - # LSR_EXTRA_PACKAGES: libdbus-1-dev -@@ -36,7 +36,7 @@ jobs: - toxenvs="py${toxpyver}" - case "$toxpyver" in - 27) toxenvs="${toxenvs},coveralls,flake8,pylint,custom" ;; -- 36) toxenvs="${toxenvs},coveralls,black,yamllint,ansible-lint,shellcheck,custom,collection" ;; -+ 36) toxenvs="${toxenvs},coveralls,black,yamllint,ansible-lint,shellcheck,custom,collection,ansible-test" ;; - 37) toxenvs="${toxenvs},coveralls,custom" ;; - 38) toxenvs="${toxenvs},coveralls,custom" ;; - esac -diff --git a/.sanity-ansible-ignore-2.9.txt b/.sanity-ansible-ignore-2.9.txt -new file mode 100644 -index 0000000..bf700c6 ---- /dev/null -+++ b/.sanity-ansible-ignore-2.9.txt -@@ -0,0 +1,13 @@ -+plugins/modules/blivet.py import-2.7!skip -+plugins/modules/blivet.py import-3.5!skip -+plugins/modules/blivet.py import-3.6!skip -+plugins/modules/blivet.py import-3.7!skip -+plugins/modules/blivet.py import-3.8!skip -+tests/storage/unit/gensym_test.py shebang!skip -+plugins/modules/blivet.py validate-modules:import-error -+plugins/modules/blivet.py validate-modules:missing-gplv3-license -+plugins/modules/blockdev_info.py validate-modules:missing-gplv3-license -+plugins/modules/bsize.py validate-modules:missing-gplv3-license -+plugins/modules/find_unused_disk.py validate-modules:missing-gplv3-license -+plugins/modules/lvm_gensym.py validate-modules:missing-gplv3-license -+plugins/modules/resolve_blockdev.py validate-modules:missing-gplv3-license -diff --git a/library/blivet.py b/library/blivet.py -index 946b640..0e0b30c 100644 ---- a/library/blivet.py -+++ b/library/blivet.py -@@ -1,12 +1,16 @@ - #!/usr/bin/python - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - ANSIBLE_METADATA = { -- 'metadata_version': '1.1', -- 'status': ['preview'], -- 'supported_by': 'community' -+ "metadata_version": "1.1", -+ "status": ["preview"], -+ "supported_by": "community", - } - --DOCUMENTATION = ''' -+DOCUMENTATION = """ - --- - module: blivet - -@@ -15,6 +19,7 @@ short_description: Module for management of linux block device stacks - version_added: "2.5" - - description: -+ - "WARNING: Do not use this module directly! It is only for role internal use." - - "Module configures storage pools and volumes to match the state specified - in input parameters. It does not do any management of /etc/fstab entries." - -@@ -30,7 +35,8 @@ options: - - boolean indicating whether to create partitions on disks for pool backing devices - disklabel_type: - description: -- - disklabel type string (eg: 'gpt') to use, overriding the built-in logic in blivet -+ - | -+ disklabel type string (eg: 'gpt') to use, overriding the built-in logic in blivet - safe_mode: - description: - - boolean indicating that we should fail rather than implicitly/automatically -@@ -41,10 +47,10 @@ options: - when creating a disk volume (that is, a whole disk filesystem) - - author: -- - David Lehman (dlehman@redhat.com) --''' -+ - David Lehman (@dwlehman) -+""" - --EXAMPLES = ''' -+EXAMPLES = """ - - - name: Manage devices - blivet: -@@ -64,28 +70,40 @@ EXAMPLES = ''' - mount_point: /whole_disk1 - fs_type: ext4 - mount_options: journal_checksum,async,noexec --''' -+""" - --RETURN = ''' -+RETURN = """ - actions: - description: list of dicts describing actions taken -- type: list of dict -+ returned: success -+ type: list -+ elements: dict - leaves: - description: list of paths to leaf devices -- type: list of str -+ returned: success -+ type: list -+ elements: dict - mounts: - description: list of dicts describing mounts to set up -- type: list of dict -+ returned: success -+ type: list -+ elements: dict - crypts: - description: list of dicts describing crypttab entries to set up -- type: list of dict -+ returned: success -+ type: list -+ elements: dict - pools: - description: list of dicts describing the pools w/ device path for each volume -- type: list of dict -+ returned: success -+ type: list -+ elements: dict - volumes: - description: list of dicts describing the volumes w/ device path for each -- type: list of dict --''' -+ returned: success -+ type: list -+ elements: dict -+""" - - import logging - import os -@@ -106,7 +124,8 @@ try: - from blivet3.size import Size - from blivet3.udev import trigger - from blivet3.util import set_up_logging -- BLIVET_PACKAGE = 'blivet3' -+ -+ BLIVET_PACKAGE = "blivet3" - except ImportError: - LIB_IMP_ERR3 = traceback.format_exc() - try: -@@ -119,7 +138,8 @@ except ImportError: - from blivet.size import Size - from blivet.udev import trigger - from blivet.util import set_up_logging -- BLIVET_PACKAGE = 'blivet' -+ -+ BLIVET_PACKAGE = "blivet" - except ImportError: - LIB_IMP_ERR = traceback.format_exc() - -@@ -135,23 +155,23 @@ MAX_TRIM_PERCENT = 2 - - use_partitions = None # create partitions on pool backing device disks? - disklabel_type = None # user-specified disklabel type --safe_mode = None # do not remove any existing devices or formatting -+safe_mode = None # do not remove any existing devices or formatting - pool_defaults = dict() - volume_defaults = dict() - - - def find_duplicate_names(dicts): -- """ Return a list of names that appear more than once in a list of dicts. -+ """Return a list of names that appear more than once in a list of dicts. - -- Items can be a list of any dicts with a 'name' key; that's all we're -- looking at. """ -+ Items can be a list of any dicts with a 'name' key; that's all we're -+ looking at.""" - names = list() - duplicates = list() - for item in dicts: -- if item['name'] in names and item['name'] not in duplicates: -- duplicates.append(item['name']) -+ if item["name"] in names and item["name"] not in duplicates: -+ duplicates.append(item["name"]) - else: -- names.append(item['name']) -+ names.append(item["name"]) - - return duplicates - -@@ -177,41 +197,54 @@ class BlivetBase(object): - global safe_mode - ret = device - # Make sure to handle adjusting both existing stacks and future stacks. -- if device == device.raw_device and self._spec_dict['encryption']: -+ if device == device.raw_device and self._spec_dict["encryption"]: - # add luks - luks_name = "luks-%s" % device._name -- if safe_mode and (device.original_format.type is not None or -- device.original_format.name != get_format(None).name): -- raise BlivetAnsibleError("cannot remove existing formatting on device '%s' in safe mode due to adding encryption" % -- device._name) -+ if safe_mode and ( -+ device.original_format.type is not None -+ or device.original_format.name != get_format(None).name -+ ): -+ raise BlivetAnsibleError( -+ "cannot remove existing formatting on device '%s' in safe mode due to adding encryption" -+ % device._name -+ ) - if not device.format.exists: - fmt = device.format - else: - fmt = get_format(None) - -- self._blivet.format_device(device, -- get_format("luks", -- name=luks_name, -- cipher=self._spec_dict.get('encryption_cipher'), -- key_size=self._spec_dict.get('encryption_key_size'), -- luks_version=self._spec_dict.get('encryption_luks_version'), -- passphrase=self._spec_dict.get('encryption_password') or None, -- key_file=self._spec_dict.get('encryption_key') or None)) -+ self._blivet.format_device( -+ device, -+ get_format( -+ "luks", -+ name=luks_name, -+ cipher=self._spec_dict.get("encryption_cipher"), -+ key_size=self._spec_dict.get("encryption_key_size"), -+ luks_version=self._spec_dict.get("encryption_luks_version"), -+ passphrase=self._spec_dict.get("encryption_password") or None, -+ key_file=self._spec_dict.get("encryption_key") or None, -+ ), -+ ) - - if not device.format.has_key: -- raise BlivetAnsibleError("encrypted %s '%s' missing key/password" % (self._type, self._spec_dict['name'])) -+ raise BlivetAnsibleError( -+ "encrypted %s '%s' missing key/password" -+ % (self._type, self._spec_dict["name"]) -+ ) - -- luks_device = devices.LUKSDevice(luks_name, -- fmt=fmt, -- parents=[device]) -+ luks_device = devices.LUKSDevice(luks_name, fmt=fmt, parents=[device]) - self._blivet.create_device(luks_device) - ret = luks_device -- elif device != device.raw_device and not self._spec_dict['encryption']: -+ elif device != device.raw_device and not self._spec_dict["encryption"]: - # remove luks -- if safe_mode and (device.original_format.type is not None or -- device.original_format.name != get_format(None).name): -- raise BlivetAnsibleError("cannot remove existing formatting on device '%s' in safe mode due to encryption removal" % -- device._name) -+ if safe_mode and ( -+ device.original_format.type is not None -+ or device.original_format.name != get_format(None).name -+ ): -+ raise BlivetAnsibleError( -+ "cannot remove existing formatting on device '%s' in safe mode due to encryption removal" -+ % device._name -+ ) - if not device.format.exists: - fmt = device.format - else: -@@ -240,12 +273,21 @@ class BlivetBase(object): - requested_spares = self._spec_dict.get("raid_spare_count") - - if requested_actives is not None and requested_spares is not None: -- if (requested_actives + requested_spares != len(members) or -- requested_actives < 0 or requested_spares < 0): -- raise BlivetAnsibleError("failed to set up '%s': cannot create RAID " -- "with %s members (%s active and %s spare)" -- % (self._spec_dict["name"], len(members), -- requested_actives, requested_spares)) -+ if ( -+ requested_actives + requested_spares != len(members) -+ or requested_actives < 0 -+ or requested_spares < 0 -+ ): -+ raise BlivetAnsibleError( -+ "failed to set up '%s': cannot create RAID " -+ "with %s members (%s active and %s spare)" -+ % ( -+ self._spec_dict["name"], -+ len(members), -+ requested_actives, -+ requested_spares, -+ ) -+ ) - - if requested_actives is not None: - active_count = requested_actives -@@ -264,16 +306,20 @@ class BlivetBase(object): - raise BlivetAnsibleError("chunk size must be multiple of 4 KiB") - - try: -- raid_array = self._blivet.new_mdarray(name=raid_name, -- level=self._spec_dict["raid_level"], -- member_devices=active_count, -- total_devices=len(members), -- parents=members, -- chunk_size=chunk_size, -- metadata_version=self._spec_dict.get("raid_metadata_version"), -- fmt=self._get_format()) -+ raid_array = self._blivet.new_mdarray( -+ name=raid_name, -+ level=self._spec_dict["raid_level"], -+ member_devices=active_count, -+ total_devices=len(members), -+ parents=members, -+ chunk_size=chunk_size, -+ metadata_version=self._spec_dict.get("raid_metadata_version"), -+ fmt=self._get_format(), -+ ) - except ValueError as e: -- raise BlivetAnsibleError("cannot create RAID '%s': %s" % (raid_name, str(e))) -+ raise BlivetAnsibleError( -+ "cannot create RAID '%s': %s" % (raid_name, str(e)) -+ ) - - return raid_array - -@@ -298,17 +344,18 @@ class BlivetVolume(BlivetBase): - if self.__class__.blivet_device_class is not None: - packages.extend(self.__class__.blivet_device_class._packages) - -- fmt = get_format(self._volume.get('fs_type')) -+ fmt = get_format(self._volume.get("fs_type")) - packages.extend(fmt.packages) -- if self._volume.get('encryption'): -- packages.extend(get_format('luks').packages) -+ if self._volume.get("encryption"): -+ packages.extend(get_format("luks").packages) - return packages - - @property - def ultimately_present(self): - """ Should this volume be present when we are finished? """ -- return (self._volume.get('state', 'present') == 'present' and -- (self._blivet_pool is None or self._blivet_pool.ultimately_present)) -+ return self._volume.get("state", "present") == "present" and ( -+ self._blivet_pool is None or self._blivet_pool.ultimately_present -+ ) - - def _type_check(self): # pylint: disable=no-self-use - """ Is self._device of the correct type? """ -@@ -316,7 +363,7 @@ class BlivetVolume(BlivetBase): - - def _get_device_id(self): - """ Return an identifier by which to try looking the volume up. """ -- return self._volume['name'] -+ return self._volume["name"] - - def _look_up_device(self): - """ Try to look up this volume in blivet's device tree. """ -@@ -331,14 +378,14 @@ class BlivetVolume(BlivetBase): - if device is None: - return - -- if device.format.type == 'luks': -+ if device.format.type == "luks": - # XXX If we have no key we will always re-encrypt. -- device.format._key_file = self._volume.get('encryption_key') -- device.format.passphrase = self._volume.get('encryption_password') -+ device.format._key_file = self._volume.get("encryption_key") -+ device.format.passphrase = self._volume.get("encryption_password") - - # set up the original format as well since it'll get used for processing -- device.original_format._key_file = self._volume.get('encryption_key') -- device.original_format.passphrase = self._volume.get('encryption_password') -+ device.original_format._key_file = self._volume.get("encryption_key") -+ device.original_format.passphrase = self._volume.get("encryption_password") - if device.isleaf: - self._blivet.populate() - -@@ -361,26 +408,31 @@ class BlivetVolume(BlivetBase): - elif encrypted: - luks_fmt = self._device.format - -- if param_name == 'size': -- self._volume['size'] = int(self._device.size.convert_to()) -- elif param_name == 'fs_type' and (self._device.format.type or self._device.format.name != get_format(None).name): -- self._volume['fs_type'] = self._device.format.type -- elif param_name == 'fs_label': -- self._volume['fs_label'] = getattr(self._device.format, 'label', "") or "" -- elif param_name == 'mount_point': -- self._volume['mount_point'] = getattr(self._device.format, 'mountpoint', None) -- elif param_name == 'disks': -- self._volume['disks'] = [d.name for d in self._device.disks] -- elif param_name == 'encryption': -- self._volume['encryption'] = encrypted -- elif param_name == 'encryption_key_size' and encrypted: -- self._volume['encryption_key_size'] = luks_fmt.key_size -- elif param_name == 'encryption_key_file' and encrypted: -- self._volume['encryption_key_file'] = luks_fmt.key_file -- elif param_name == 'encryption_cipher' and encrypted: -- self._volume['encryption_cipher'] = luks_fmt.cipher -- elif param_name == 'encryption_luks_version' and encrypted: -- self._volume['encryption_luks_version'] = luks_fmt.luks_version -+ if param_name == "size": -+ self._volume["size"] = int(self._device.size.convert_to()) -+ elif param_name == "fs_type" and ( -+ self._device.format.type -+ or self._device.format.name != get_format(None).name -+ ): -+ self._volume["fs_type"] = self._device.format.type -+ elif param_name == "fs_label": -+ self._volume["fs_label"] = getattr(self._device.format, "label", "") or "" -+ elif param_name == "mount_point": -+ self._volume["mount_point"] = getattr( -+ self._device.format, "mountpoint", None -+ ) -+ elif param_name == "disks": -+ self._volume["disks"] = [d.name for d in self._device.disks] -+ elif param_name == "encryption": -+ self._volume["encryption"] = encrypted -+ elif param_name == "encryption_key_size" and encrypted: -+ self._volume["encryption_key_size"] = luks_fmt.key_size -+ elif param_name == "encryption_key_file" and encrypted: -+ self._volume["encryption_key_file"] = luks_fmt.key_file -+ elif param_name == "encryption_cipher" and encrypted: -+ self._volume["encryption_cipher"] = luks_fmt.cipher -+ elif param_name == "encryption_luks_version" and encrypted: -+ self._volume["encryption_luks_version"] = luks_fmt.luks_version - else: - return False - -@@ -392,7 +444,7 @@ class BlivetVolume(BlivetBase): - if name in self._volume: - continue - -- default = None if default in ('none', 'None', 'null') else default -+ default = None if default in ("none", "None", "null") else default - - if self._device: - # Apply values from the device if it already exists. -@@ -403,12 +455,17 @@ class BlivetVolume(BlivetBase): - - def _get_format(self): - """ Return a blivet.formats.DeviceFormat instance for this volume. """ -- fmt = get_format(self._volume['fs_type'], -- mountpoint=self._volume.get('mount_point'), -- label=self._volume['fs_label'], -- create_options=self._volume['fs_create_options']) -+ fmt = get_format( -+ self._volume["fs_type"], -+ mountpoint=self._volume.get("mount_point"), -+ label=self._volume["fs_label"], -+ create_options=self._volume["fs_create_options"], -+ ) - if not fmt.supported or not fmt.formattable: -- raise BlivetAnsibleError("required tools for file system '%s' are missing" % self._volume['fs_type']) -+ raise BlivetAnsibleError( -+ "required tools for file system '%s' are missing" -+ % self._volume["fs_type"] -+ ) - - return fmt - -@@ -422,9 +479,9 @@ class BlivetVolume(BlivetBase): - return - - # save device identifiers for use by the role -- self._volume['_device'] = self._device.path -- self._volume['_raw_device'] = self._device.raw_device.path -- self._volume['_mount_id'] = self._device.fstab_spec -+ self._volume["_device"] = self._device.path -+ self._volume["_raw_device"] = self._device.raw_device.path -+ self._volume["_mount_id"] = self._device.fstab_spec - - # schedule removal of this device and any descendant devices - self._blivet.devicetree.recursive_remove(self._device.raw_device) -@@ -435,9 +492,12 @@ class BlivetVolume(BlivetBase): - def _resize(self): - """ Schedule actions as needed to ensure the device has the desired size. """ - try: -- size = Size(self._volume['size']) -+ size = Size(self._volume["size"]) - except Exception: -- raise BlivetAnsibleError("invalid size specification for volume '%s': '%s'" % (self._volume['name'], self._volume['size'])) -+ raise BlivetAnsibleError( -+ "invalid size specification for volume '%s': '%s'" -+ % (self._volume["name"], self._volume["size"]) -+ ) - - if size and self._device.size != size: - try: -@@ -448,28 +508,44 @@ class BlivetVolume(BlivetBase): - if not self._device.resizable: - return - -- trim_percent = (1.0 - float(self._device.max_size / size))*100 -- log.debug("resize: size=%s->%s ; trim=%s", self._device.size, size, trim_percent) -+ trim_percent = (1.0 - float(self._device.max_size / size)) * 100 -+ log.debug( -+ "resize: size=%s->%s ; trim=%s", self._device.size, size, trim_percent -+ ) - if size > self._device.max_size and trim_percent <= MAX_TRIM_PERCENT: -- log.info("adjusting %s resize target from %s to %s to fit in free space", -- self._volume['name'], -- size, -- self._device.max_size) -+ log.info( -+ "adjusting %s resize target from %s to %s to fit in free space", -+ self._volume["name"], -+ size, -+ self._device.max_size, -+ ) - size = self._device.max_size - if size == self._device.size: - return - - if not self._device.min_size <= size <= self._device.max_size: -- raise BlivetAnsibleError("volume '%s' cannot be resized to '%s'" % (self._volume['name'], size)) -+ raise BlivetAnsibleError( -+ "volume '%s' cannot be resized to '%s'" -+ % (self._volume["name"], size) -+ ) - - try: - self._blivet.resize_device(self._device, size) - except ValueError as e: -- raise BlivetAnsibleError("volume '%s' cannot be resized from %s to %s: %s" % (self._device.name, -- self._device.size, -- size, str(e))) -- elif size and self._device.exists and self._device.size != size and not self._device.resizable: -- raise BlivetAnsibleError("volume '%s' cannot be resized from %s to %s" % (self._device.name, self._device.size, size)) -+ raise BlivetAnsibleError( -+ "volume '%s' cannot be resized from %s to %s: %s" -+ % (self._device.name, self._device.size, size, str(e)) -+ ) -+ elif ( -+ size -+ and self._device.exists -+ and self._device.size != size -+ and not self._device.resizable -+ ): -+ raise BlivetAnsibleError( -+ "volume '%s' cannot be resized from %s to %s" -+ % (self._device.name, self._device.size, size) -+ ) - - def _reformat(self): - """ Schedule actions as needed to ensure the volume is formatted as specified. """ -@@ -477,10 +553,18 @@ class BlivetVolume(BlivetBase): - if self._device.format.type == fmt.type: - return - -- if safe_mode and (self._device.format.type is not None or self._device.format.name != get_format(None).name): -- raise BlivetAnsibleError("cannot remove existing formatting on volume '%s' in safe mode" % self._volume['name']) -- -- if self._device.format.status and (self._device.format.mountable or self._device.format.type == "swap"): -+ if safe_mode and ( -+ self._device.format.type is not None -+ or self._device.format.name != get_format(None).name -+ ): -+ raise BlivetAnsibleError( -+ "cannot remove existing formatting on volume '%s' in safe mode" -+ % self._volume["name"] -+ ) -+ -+ if self._device.format.status and ( -+ self._device.format.mountable or self._device.format.type == "swap" -+ ): - self._device.format.teardown() - if not self._device.isleaf: - self._blivet.devicetree.recursive_remove(self._device, remove_device=False) -@@ -503,7 +587,9 @@ class BlivetVolume(BlivetBase): - - # at this point we should have a blivet.devices.StorageDevice instance - if self._device is None: -- raise BlivetAnsibleError("failed to look up or create device '%s'" % self._volume['name']) -+ raise BlivetAnsibleError( -+ "failed to look up or create device '%s'" % self._volume["name"] -+ ) - - self._manage_encryption() - -@@ -511,24 +597,31 @@ class BlivetVolume(BlivetBase): - if self._device.raw_device.exists: - self._reformat() - -- if self.ultimately_present and self._volume['mount_point'] and not self._device.format.mountable: -- raise BlivetAnsibleError("volume '%s' has a mount point but no mountable file system" % self._volume['name']) -+ if ( -+ self.ultimately_present -+ and self._volume["mount_point"] -+ and not self._device.format.mountable -+ ): -+ raise BlivetAnsibleError( -+ "volume '%s' has a mount point but no mountable file system" -+ % self._volume["name"] -+ ) - - # schedule resize if appropriate -- if self._device.raw_device.exists and self._volume['size']: -+ if self._device.raw_device.exists and self._volume["size"]: - self._resize() - - # save device identifiers for use by the role -- self._volume['_device'] = self._device.path -- self._volume['_raw_device'] = self._device.raw_device.path -- self._volume['_mount_id'] = self._device.fstab_spec -+ self._volume["_device"] = self._device.path -+ self._volume["_raw_device"] = self._device.raw_device.path -+ self._volume["_mount_id"] = self._device.fstab_spec - - - class BlivetDiskVolume(BlivetVolume): - blivet_device_class = devices.DiskDevice - - def _get_device_id(self): -- return self._volume['disks'][0] -+ return self._volume["disks"][0] - - def _type_check(self): - return self._device.raw_device.is_disk -@@ -536,7 +629,7 @@ class BlivetDiskVolume(BlivetVolume): - def _get_format(self): - fmt = super(BlivetDiskVolume, self)._get_format() - # pass -F to mke2fs on whole disks in RHEL7 -- mkfs_options = diskvolume_mkfs_option_map.get(self._volume['fs_type']) -+ mkfs_options = diskvolume_mkfs_option_map.get(self._volume["fs_type"]) - if mkfs_options: - if fmt.create_options: - fmt.create_options += " " -@@ -552,23 +645,31 @@ class BlivetDiskVolume(BlivetVolume): - def _look_up_device(self): - super(BlivetDiskVolume, self)._look_up_device() - if not self._get_device_id(): -- raise BlivetAnsibleError("no disks specified for volume '%s'" % self._volume['name']) -- elif not isinstance(self._volume['disks'], list): -+ raise BlivetAnsibleError( -+ "no disks specified for volume '%s'" % self._volume["name"] -+ ) -+ elif not isinstance(self._volume["disks"], list): - raise BlivetAnsibleError("volume disks must be specified as a list") - - if self._device is None: -- raise BlivetAnsibleError("unable to resolve disk specified for volume '%s' (%s)" % (self._volume['name'], self._volume['disks'])) -+ raise BlivetAnsibleError( -+ "unable to resolve disk specified for volume '%s' (%s)" -+ % (self._volume["name"], self._volume["disks"]) -+ ) - - - class BlivetPartitionVolume(BlivetVolume): - blivet_device_class = devices.PartitionDevice - - def _type_check(self): -- return self._device.raw_device.type == 'partition' -+ return self._device.raw_device.type == "partition" - - def _get_device_id(self): - device_id = None -- if self._blivet_pool._disks[0].partitioned and len(self._blivet_pool._disks[0].children) == 1: -+ if ( -+ self._blivet_pool._disks[0].partitioned -+ and len(self._blivet_pool._disks[0].children) == 1 -+ ): - device_id = self._blivet_pool._disks[0].children[0].name - - return device_id -@@ -583,22 +684,29 @@ class BlivetPartitionVolume(BlivetVolume): - if self._blivet_pool: - parent = self._blivet_pool._device - else: -- parent = self._blivet.devicetree.resolve_device(self._volume['pool']) -+ parent = self._blivet.devicetree.resolve_device(self._volume["pool"]) - - if parent is None: -- raise BlivetAnsibleError("failed to find pool '%s' for volume '%s'" % (self._blivet_pool['name'], self._volume['name'])) -+ raise BlivetAnsibleError( -+ "failed to find pool '%s' for volume '%s'" -+ % (self._blivet_pool["name"], self._volume["name"]) -+ ) - - size = Size("256 MiB") - try: -- device = self._blivet.new_partition(parents=[parent], size=size, grow=True, fmt=self._get_format()) -+ device = self._blivet.new_partition( -+ parents=[parent], size=size, grow=True, fmt=self._get_format() -+ ) - except Exception: -- raise BlivetAnsibleError("failed set up volume '%s'" % self._volume['name']) -+ raise BlivetAnsibleError("failed set up volume '%s'" % self._volume["name"]) - - self._blivet.create_device(device) - try: - do_partitioning(self._blivet) - except Exception: -- raise BlivetAnsibleError("partition allocation failed for volume '%s'" % self._volume['name']) -+ raise BlivetAnsibleError( -+ "partition allocation failed for volume '%s'" % self._volume["name"] -+ ) - - self._device = device - -@@ -609,7 +717,7 @@ class BlivetLVMVolume(BlivetVolume): - def _get_device_id(self): - if not self._blivet_pool._device: - return None -- return "%s-%s" % (self._blivet_pool._device.name, self._volume['name']) -+ return "%s-%s" % (self._blivet_pool._device.name, self._volume["name"]) - - def _create(self): - if self._device: -@@ -617,51 +725,75 @@ class BlivetLVMVolume(BlivetVolume): - - parent = self._blivet_pool._device - if parent is None: -- raise BlivetAnsibleError("failed to find pool '%s' for volume '%s'" % (self._blivet_pool['name'], self._volume['name'])) -+ raise BlivetAnsibleError( -+ "failed to find pool '%s' for volume '%s'" -+ % (self._blivet_pool["name"], self._volume["name"]) -+ ) - - try: -- size = Size(self._volume['size']) -+ size = Size(self._volume["size"]) - except Exception: -- raise BlivetAnsibleError("invalid size '%s' specified for volume '%s'" % (self._volume['size'], self._volume['name'])) -+ raise BlivetAnsibleError( -+ "invalid size '%s' specified for volume '%s'" -+ % (self._volume["size"], self._volume["name"]) -+ ) - - fmt = self._get_format() -- trim_percent = (1.0 - float(parent.free_space / size))*100 -+ trim_percent = (1.0 - float(parent.free_space / size)) * 100 - log.debug("size: %s ; %s", size, trim_percent) - if size > parent.free_space: - if trim_percent > MAX_TRIM_PERCENT: -- raise BlivetAnsibleError("specified size for volume '%s' exceeds available space in pool '%s' (%s)" -- % (size, parent.name, parent.free_space)) -+ raise BlivetAnsibleError( -+ "specified size for volume '%s' exceeds available space in pool '%s' (%s)" -+ % (size, parent.name, parent.free_space) -+ ) - else: -- log.info("adjusting %s size from %s to %s to fit in %s free space", self._volume['name'], -- size, -- parent.free_space, -- parent.name) -+ log.info( -+ "adjusting %s size from %s to %s to fit in %s free space", -+ self._volume["name"], -+ size, -+ parent.free_space, -+ parent.name, -+ ) - size = parent.free_space - - try: -- device = self._blivet.new_lv(name=self._volume['name'], -- parents=[parent], size=size, fmt=fmt) -+ device = self._blivet.new_lv( -+ name=self._volume["name"], parents=[parent], size=size, fmt=fmt -+ ) - except Exception as e: -- raise BlivetAnsibleError("failed to set up volume '%s': %s" % (self._volume['name'], str(e))) -+ raise BlivetAnsibleError( -+ "failed to set up volume '%s': %s" % (self._volume["name"], str(e)) -+ ) - - self._blivet.create_device(device) - self._device = device - - - class BlivetMDRaidVolume(BlivetVolume): -- -- def _process_device_numbers(self, members_count, requested_actives, requested_spares): -+ def _process_device_numbers( -+ self, members_count, requested_actives, requested_spares -+ ): - - active_count = members_count - spare_count = 0 - - if requested_actives is not None and requested_spares is not None: -- if (requested_actives + requested_spares != members_count or -- requested_actives < 0 or requested_spares < 0): -- raise BlivetAnsibleError("failed to set up volume '%s': cannot create RAID " -- "with %s members (%s active and %s spare)" -- % (self._volume['name'], members_count, -- requested_actives, requested_spares)) -+ if ( -+ requested_actives + requested_spares != members_count -+ or requested_actives < 0 -+ or requested_spares < 0 -+ ): -+ raise BlivetAnsibleError( -+ "failed to set up volume '%s': cannot create RAID " -+ "with %s members (%s active and %s spare)" -+ % ( -+ self._volume["name"], -+ members_count, -+ requested_actives, -+ requested_spares, -+ ) -+ ) - - if requested_actives is not None: - active_count = requested_actives -@@ -685,7 +817,9 @@ class BlivetMDRaidVolume(BlivetVolume): - self._blivet.format_device(member_disk, label) - - # create new partition -- member = self._blivet.new_partition(parents=[member_disk], grow=True) -+ member = self._blivet.new_partition( -+ parents=[member_disk], grow=True -+ ) - self._blivet.create_device(member) - self._blivet.format_device(member, fmt=get_format("mdmember")) - members.append(member) -@@ -697,16 +831,16 @@ class BlivetMDRaidVolume(BlivetVolume): - - def _update_from_device(self, param_name): - """ Return True if param_name's value was retrieved from a looked-up device. """ -- if param_name == 'raid_level': -- self._volume['raid_level'] = self._device.level.name -- elif param_name == 'raid_chunk_size': -- self._volume['raid_chunk_size'] = str(self._device.chunk_size) -- elif param_name == 'raid_device_count': -- self._volume['raid_device_count'] = self._device.member_devices -- elif param_name == 'raid_spare_count': -- self._volume['raid_spare_count'] = self._device.spares -- elif param_name == 'raid_metadata_version': -- self._volume['raid_metadata_version'] = self._device.metadata_version -+ if param_name == "raid_level": -+ self._volume["raid_level"] = self._device.level.name -+ elif param_name == "raid_chunk_size": -+ self._volume["raid_chunk_size"] = str(self._device.chunk_size) -+ elif param_name == "raid_device_count": -+ self._volume["raid_device_count"] = self._device.member_devices -+ elif param_name == "raid_spare_count": -+ self._volume["raid_spare_count"] = self._device.spares -+ elif param_name == "raid_metadata_version": -+ self._volume["raid_metadata_version"] = self._device.metadata_version - else: - return super(BlivetMDRaidVolume, self)._update_from_device(param_name) - -@@ -728,7 +862,10 @@ class BlivetMDRaidVolume(BlivetVolume): - try: - do_partitioning(self._blivet) - except Exception as e: -- raise BlivetAnsibleError("failed to allocate partitions for mdraid '%s': %s" % (self._volume['name'], str(e))) -+ raise BlivetAnsibleError( -+ "failed to allocate partitions for mdraid '%s': %s" -+ % (self._volume["name"], str(e)) -+ ) - - raid_array = self._new_mdarray(members) - -@@ -764,16 +901,20 @@ _BLIVET_VOLUME_TYPES = { - "disk": BlivetDiskVolume, - "lvm": BlivetLVMVolume, - "partition": BlivetPartitionVolume, -- "raid": BlivetMDRaidVolume -+ "raid": BlivetMDRaidVolume, - } - - - def _get_blivet_volume(blivet_obj, volume, bpool=None): - """ Return a BlivetVolume instance appropriate for the volume dict. """ - global volume_defaults -- volume_type = volume.get('type', bpool._pool['type'] if bpool else volume_defaults['type']) -+ volume_type = volume.get( -+ "type", bpool._pool["type"] if bpool else volume_defaults["type"] -+ ) - if volume_type not in _BLIVET_VOLUME_TYPES: -- raise BlivetAnsibleError("Volume '%s' has unknown type '%s'" % (volume['name'], volume_type)) -+ raise BlivetAnsibleError( -+ "Volume '%s' has unknown type '%s'" % (volume["name"], volume_type) -+ ) - - return _BLIVET_VOLUME_TYPES[volume_type](blivet_obj, volume, bpool=bpool) - -@@ -796,19 +937,19 @@ class BlivetPool(BlivetBase): - if self.ultimately_present and self.__class__.blivet_device_class is not None: - packages.extend(self.__class__.blivet_device_class._packages) - -- if self._pool.get('encryption'): -- packages.extend(get_format('luks').packages) -+ if self._pool.get("encryption"): -+ packages.extend(get_format("luks").packages) - - return packages - - @property - def ultimately_present(self): - """ Should this pool be present when we are finished? """ -- return self._pool.get('state', 'present') == 'present' -+ return self._pool.get("state", "present") == "present" - - @property - def _is_raid(self): -- return self._pool.get('raid_level') not in [None, "null", ""] -+ return self._pool.get("raid_level") not in [None, "null", ""] - - def _member_management_is_destructive(self): - return False -@@ -849,25 +990,30 @@ class BlivetPool(BlivetBase): - if self._disks: - return - -- if not self._device and not self._pool['disks']: -- raise BlivetAnsibleError("no disks specified for pool '%s'" % self._pool['name']) -- elif not isinstance(self._pool['disks'], list): -+ if not self._device and not self._pool["disks"]: -+ raise BlivetAnsibleError( -+ "no disks specified for pool '%s'" % self._pool["name"] -+ ) -+ elif not isinstance(self._pool["disks"], list): - raise BlivetAnsibleError("pool disks must be specified as a list") - - disks = list() -- for spec in self._pool['disks']: -+ for spec in self._pool["disks"]: - device = self._blivet.devicetree.resolve_device(spec) - if device is not None: # XXX fail if any disk isn't resolved? - disks.append(device) - -- if self._pool['disks'] and not self._device and not disks: -- raise BlivetAnsibleError("unable to resolve any disks specified for pool '%s' (%s)" % (self._pool['name'], self._pool['disks'])) -+ if self._pool["disks"] and not self._device and not disks: -+ raise BlivetAnsibleError( -+ "unable to resolve any disks specified for pool '%s' (%s)" -+ % (self._pool["name"], self._pool["disks"]) -+ ) - - self._disks = disks - - def _look_up_device(self): - """ Look up the pool in blivet's device tree. """ -- device = self._blivet.devicetree.resolve_device(self._pool['name']) -+ device = self._blivet.devicetree.resolve_device(self._pool["name"]) - if device is None: - return - -@@ -895,45 +1041,62 @@ class BlivetPool(BlivetBase): - """ Return True if param_name's value was retrieved from a looked-up device. """ - # We wouldn't have the pool device if the member devices weren't unlocked, so we do not - # have to consider the case where the devices are unlocked like we do for volumes. -- encrypted = bool(self._device.parents) and all("luks" in d.type for d in self._device.parents) -- raid = len(self._device.parents) == 1 and hasattr(self._device.parents[0].raw_device, 'level') -+ encrypted = bool(self._device.parents) and all( -+ "luks" in d.type for d in self._device.parents -+ ) -+ raid = len(self._device.parents) == 1 and hasattr( -+ self._device.parents[0].raw_device, "level" -+ ) - log.debug("BlivetPool._update_from_device: %s", self._device) - -- if param_name == 'disks': -- self._pool['disks'] = [d.name for d in self._device.disks] -- elif param_name == 'encryption': -- self._pool['encryption'] = encrypted -- elif param_name == 'encryption_key_size' and encrypted: -- self._pool['encryption_key_size'] = self._device.parents[0].parents[0].format.key_size -- elif param_name == 'encryption_key_file' and encrypted: -- self._pool['encryption_key_file'] = self._device.parents[0].parents[0].format.key_file -- elif param_name == 'encryption_cipher' and encrypted: -- self._pool['encryption_cipher'] = self._device.parents[0].parents[0].format.cipher -- elif param_name == 'encryption_luks_version' and encrypted: -- self._pool['encryption_luks_version'] = self._device.parents[0].parents[0].format.luks_version -- elif param_name == 'raid_level' and raid: -- self._pool['raid_level'] = self._device.parents[0].raw_device.level.name -- elif param_name == 'raid_chunk_size' and raid: -- self._pool['raid_chunk_size'] = str(self._device.parents[0].raw_device.chunk_size) -- elif param_name == 'raid_device_count' and raid: -- self._pool['raid_device_count'] = self._device.parents[0].raw_device.member_devices -- elif param_name == 'raid_spare_count' and raid: -- self._pool['raid_spare_count'] = self._device.parents[0].raw_device.spares -- elif param_name == 'raid_metadata_version' and raid: -- self._pool['raid_metadata_version'] = self._device.parents[0].raw_device.metadata_version -+ if param_name == "disks": -+ self._pool["disks"] = [d.name for d in self._device.disks] -+ elif param_name == "encryption": -+ self._pool["encryption"] = encrypted -+ elif param_name == "encryption_key_size" and encrypted: -+ self._pool["encryption_key_size"] = ( -+ self._device.parents[0].parents[0].format.key_size -+ ) -+ elif param_name == "encryption_key_file" and encrypted: -+ self._pool["encryption_key_file"] = ( -+ self._device.parents[0].parents[0].format.key_file -+ ) -+ elif param_name == "encryption_cipher" and encrypted: -+ self._pool["encryption_cipher"] = ( -+ self._device.parents[0].parents[0].format.cipher -+ ) -+ elif param_name == "encryption_luks_version" and encrypted: -+ self._pool["encryption_luks_version"] = ( -+ self._device.parents[0].parents[0].format.luks_version -+ ) -+ elif param_name == "raid_level" and raid: -+ self._pool["raid_level"] = self._device.parents[0].raw_device.level.name -+ elif param_name == "raid_chunk_size" and raid: -+ self._pool["raid_chunk_size"] = str( -+ self._device.parents[0].raw_device.chunk_size -+ ) -+ elif param_name == "raid_device_count" and raid: -+ self._pool["raid_device_count"] = self._device.parents[ -+ 0 -+ ].raw_device.member_devices -+ elif param_name == "raid_spare_count" and raid: -+ self._pool["raid_spare_count"] = self._device.parents[0].raw_device.spares -+ elif param_name == "raid_metadata_version" and raid: -+ self._pool["raid_metadata_version"] = self._device.parents[ -+ 0 -+ ].raw_device.metadata_version - else: - return False - - return True - -- - def _apply_defaults(self): - global pool_defaults - for name, default in pool_defaults.items(): - if name in self._pool: - continue - -- default = None if default in ('none', 'None', 'null') else default -+ default = None if default in ("none", "None", "null") else default - - if self._device: - if not self._update_from_device(name): -@@ -948,14 +1111,19 @@ class BlivetPool(BlivetBase): - for disk in self._disks: - if not disk.isleaf or disk.format.type is not None: - if safe_mode: -- raise BlivetAnsibleError("cannot remove existing formatting and/or devices on disk '%s' (pool '%s') in safe mode" % (disk.name, self._pool['name'])) -+ raise BlivetAnsibleError( -+ "cannot remove existing formatting and/or devices on disk '%s' (pool '%s') in safe mode" -+ % (disk.name, self._pool["name"]) -+ ) - else: - self._blivet.devicetree.recursive_remove(disk) - - if use_partitions: - label = get_format("disklabel", device=disk.path) - self._blivet.format_device(disk, label) -- member = self._blivet.new_partition(parents=[disk], size=Size("256MiB"), grow=True) -+ member = self._blivet.new_partition( -+ parents=[disk], size=Size("256MiB"), grow=True -+ ) - self._blivet.create_device(member) - else: - member = disk -@@ -966,9 +1134,8 @@ class BlivetPool(BlivetBase): - self._blivet.format_device(member, self._get_format()) - members.append(member) - -- - if self._is_raid: -- raid_name = "%s-1" % self._pool['name'] -+ raid_name = "%s-1" % self._pool["name"] - - raid_array = self._new_mdarray(members, raid_name=raid_name) - -@@ -981,14 +1148,15 @@ class BlivetPool(BlivetBase): - try: - do_partitioning(self._blivet) - except Exception: -- raise BlivetAnsibleError("failed to allocate partitions for pool '%s'" % self._pool['name']) -+ raise BlivetAnsibleError( -+ "failed to allocate partitions for pool '%s'" % self._pool["name"] -+ ) - - return result - -- - def _get_volumes(self): - """ Set up BlivetVolume instances for this pool's volumes. """ -- for volume in self._pool.get('volumes', []): -+ for volume in self._pool.get("volumes", []): - bvolume = _get_blivet_volume(self._blivet, volume, self) - self._blivet_volumes.append(bvolume) - -@@ -1013,7 +1181,10 @@ class BlivetPool(BlivetBase): - return - elif self._member_management_is_destructive(): - if safe_mode: -- raise BlivetAnsibleError("cannot remove and recreate existing pool '%s' in safe mode" % self._pool['name']) -+ raise BlivetAnsibleError( -+ "cannot remove and recreate existing pool '%s' in safe mode" -+ % self._pool["name"] -+ ) - else: - self._destroy() - -@@ -1031,15 +1202,22 @@ class BlivetPartitionPool(BlivetPool): - self._device = self._disks[0] - - def _create(self): -- if self._device.format.type != "disklabel" or \ -- (disklabel_type and self._device.format.label_type != disklabel_type): -+ if self._device.format.type != "disklabel" or ( -+ disklabel_type and self._device.format.label_type != disklabel_type -+ ): - if safe_mode: -- raise BlivetAnsibleError("cannot remove existing formatting and/or devices on disk '%s' " -- "(pool '%s') in safe mode" % (self._device.name, self._pool['name'])) -+ raise BlivetAnsibleError( -+ "cannot remove existing formatting and/or devices on disk '%s' " -+ "(pool '%s') in safe mode" % (self._device.name, self._pool["name"]) -+ ) - else: -- self._blivet.devicetree.recursive_remove(self._device, remove_device=False) -+ self._blivet.devicetree.recursive_remove( -+ self._device, remove_device=False -+ ) - -- label = get_format("disklabel", device=self._device.path, label_type=disklabel_type) -+ label = get_format( -+ "disklabel", device=self._device.path, label_type=disklabel_type -+ ) - self._blivet.format_device(self._device, label) - - -@@ -1053,9 +1231,13 @@ class BlivetLVMPool(BlivetPool): - if self._device is None: - return False - -- if self._pool['encryption'] and not all(m.encrypted for m in self._device.parents): -+ if self._pool["encryption"] and not all( -+ m.encrypted for m in self._device.parents -+ ): - return True -- elif not self._pool['encryption'] and any(m.encrypted for m in self._device.parents): -+ elif not self._pool["encryption"] and any( -+ m.encrypted for m in self._device.parents -+ ): - return True - - return False -@@ -1080,49 +1262,50 @@ class BlivetLVMPool(BlivetPool): - - members = self._manage_encryption(self._create_members()) - try: -- pool_device = self._blivet.new_vg(name=self._pool['name'], parents=members) -+ pool_device = self._blivet.new_vg(name=self._pool["name"], parents=members) - except Exception as e: -- raise BlivetAnsibleError("failed to set up pool '%s': %s" % (self._pool['name'], str(e))) -+ raise BlivetAnsibleError( -+ "failed to set up pool '%s': %s" % (self._pool["name"], str(e)) -+ ) - - self._blivet.create_device(pool_device) - self._device = pool_device - - --_BLIVET_POOL_TYPES = { -- "partition": BlivetPartitionPool, -- "lvm": BlivetLVMPool --} -+_BLIVET_POOL_TYPES = {"partition": BlivetPartitionPool, "lvm": BlivetLVMPool} - - - def _get_blivet_pool(blivet_obj, pool): - """ Return an appropriate BlivetPool instance for the pool dict. """ -- if 'type' not in pool: -+ if "type" not in pool: - global pool_defaults -- pool['type'] = pool_defaults['type'] -+ pool["type"] = pool_defaults["type"] - -- if pool['type'] not in _BLIVET_POOL_TYPES: -- raise BlivetAnsibleError("Pool '%s' has unknown type '%s'" % (pool['name'], pool['type'])) -+ if pool["type"] not in _BLIVET_POOL_TYPES: -+ raise BlivetAnsibleError( -+ "Pool '%s' has unknown type '%s'" % (pool["name"], pool["type"]) -+ ) - -- return _BLIVET_POOL_TYPES[pool['type']](blivet_obj, pool) -+ return _BLIVET_POOL_TYPES[pool["type"]](blivet_obj, pool) - - - def manage_volume(b, volume): - """ Schedule actions as needed to manage a single standalone volume. """ - bvolume = _get_blivet_volume(b, volume) - bvolume.manage() -- volume['_device'] = bvolume._volume.get('_device', '') -- volume['_raw_device'] = bvolume._volume.get('_raw_device', '') -- volume['_mount_id'] = bvolume._volume.get('_mount_id', '') -+ volume["_device"] = bvolume._volume.get("_device", "") -+ volume["_raw_device"] = bvolume._volume.get("_raw_device", "") -+ volume["_mount_id"] = bvolume._volume.get("_mount_id", "") - - - def manage_pool(b, pool): - """ Schedule actions as needed to manage a single pool and its volumes. """ - bpool = _get_blivet_pool(b, pool) - bpool.manage() -- for (volume, bvolume) in zip(pool['volumes'], bpool._blivet_volumes): -- volume['_device'] = bvolume._volume.get('_device', '') -- volume['_raw_device'] = bvolume._volume.get('_raw_device', '') -- volume['_mount_id'] = bvolume._volume.get('_mount_id', '') -+ for (volume, bvolume) in zip(pool["volumes"], bpool._blivet_volumes): -+ volume["_device"] = bvolume._volume.get("_device", "") -+ volume["_raw_device"] = bvolume._volume.get("_raw_device", "") -+ volume["_mount_id"] = bvolume._volume.get("_mount_id", "") - - - class FSTab(object): -@@ -1141,7 +1324,7 @@ class FSTab(object): - if self._entries: - self.reset() - -- for line in open('/etc/fstab').readlines(): -+ for line in open("/etc/fstab").readlines(): - if line.lstrip().startswith("#"): - continue - -@@ -1150,23 +1333,27 @@ class FSTab(object): - continue - - device = self._blivet.devicetree.resolve_device(fields[0]) -- self._entries.append(dict(device_id=fields[0], -- device_path=getattr(device, 'path', None), -- fs_type=fields[2], -- mount_point=fields[1], -- mount_options=fields[3])) -+ self._entries.append( -+ dict( -+ device_id=fields[0], -+ device_path=getattr(device, "path", None), -+ fs_type=fields[2], -+ mount_point=fields[1], -+ mount_options=fields[3], -+ ) -+ ) - - - def get_mount_info(pools, volumes, actions, fstab): -- """ Return a list of argument dicts to pass to the mount module to manage mounts. -+ """Return a list of argument dicts to pass to the mount module to manage mounts. - -- The overall approach is to remove existing mounts associated with file systems -- we are removing and those with changed mount points, re-adding them with the -- new mount point later. -+ The overall approach is to remove existing mounts associated with file systems -+ we are removing and those with changed mount points, re-adding them with the -+ new mount point later. - -- Removed mounts go directly into the mount_info list, which is the return value, -- while added/active mounts to a list that gets appended to the mount_info list -- at the end to ensure that removals happen first. -+ Removed mounts go directly into the mount_info list, which is the return value, -+ while added/active mounts to a list that gets appended to the mount_info list -+ at the end to ensure that removals happen first. - """ - mount_info = list() - mount_vols = list() -@@ -1174,33 +1361,50 @@ def get_mount_info(pools, volumes, actions, fstab): - # account for mounts removed by removing or reformatting volumes - if actions: - for action in actions: -- if action.is_destroy and action.is_format and action.format.type is not None: -- mount = fstab.lookup('device_path', action.device.path) -+ if ( -+ action.is_destroy -+ and action.is_format -+ and action.format.type is not None -+ ): -+ mount = fstab.lookup("device_path", action.device.path) - if mount is not None: -- mount_info.append({"src": mount['device_id'], "path": mount['mount_point'], -- 'state': 'absent', 'fstype': mount['fs_type']}) -+ mount_info.append( -+ { -+ "src": mount["device_id"], -+ "path": mount["mount_point"], -+ "state": "absent", -+ "fstype": mount["fs_type"], -+ } -+ ) - - def handle_new_mount(volume, fstab): - replace = None - mounted = False - -- mount = fstab.lookup('device_path', volume['_device']) -- if (volume['mount_point'] and volume['mount_point'].startswith('/')) \ -- or volume['fs_type'] == 'swap': -+ mount = fstab.lookup("device_path", volume["_device"]) -+ if (volume["mount_point"] and volume["mount_point"].startswith("/")) or volume[ -+ "fs_type" -+ ] == "swap": - mounted = True - - # handle removal of existing mounts of this volume -- if mount and mount['fs_type'] != 'swap' and mount['mount_point'] != volume['mount_point']: -- replace = dict(path=mount['mount_point'], state="absent") -- elif mount and mount['fs_type'] == 'swap': -- replace = dict(src=mount['device_id'], fstype="swap", path="none", state="absent") -+ if ( -+ mount -+ and mount["fs_type"] != "swap" -+ and mount["mount_point"] != volume["mount_point"] -+ ): -+ replace = dict(path=mount["mount_point"], state="absent") -+ elif mount and mount["fs_type"] == "swap": -+ replace = dict( -+ src=mount["device_id"], fstype="swap", path="none", state="absent" -+ ) - - return mounted, replace - - # account for mounts that we set up or are replacing in pools - for pool in pools: -- for volume in pool['volumes']: -- if pool['state'] == 'present' and volume['state'] == 'present': -+ for volume in pool["volumes"]: -+ if pool["state"] == "present" and volume["state"] == "present": - mounted, replace = handle_new_mount(volume, fstab) - if replace: - mount_info.append(replace) -@@ -1209,7 +1413,7 @@ def get_mount_info(pools, volumes, actions, fstab): - - # account for mounts that we set up or are replacing in standalone volumes - for volume in volumes: -- if volume['state'] == 'present': -+ if volume["state"] == "present": - mounted, replace = handle_new_mount(volume, fstab) - if replace: - mount_info.append(replace) -@@ -1217,13 +1421,19 @@ def get_mount_info(pools, volumes, actions, fstab): - mount_vols.append(volume) - - for volume in mount_vols: -- mount_info.append({'src': volume['_mount_id'], -- 'path': volume['mount_point'] if volume['fs_type'] != "swap" else "none", -- 'fstype': volume['fs_type'], -- 'opts': volume['mount_options'], -- 'dump': volume['mount_check'], -- 'passno': volume['mount_passno'], -- 'state': 'mounted' if volume['fs_type'] != "swap" else "present"}) -+ mount_info.append( -+ { -+ "src": volume["_mount_id"], -+ "path": volume["mount_point"] -+ if volume["fs_type"] != "swap" -+ else "none", -+ "fstype": volume["fs_type"], -+ "opts": volume["mount_options"], -+ "dump": volume["mount_check"], -+ "passno": volume["mount_passno"], -+ "state": "mounted" if volume["fs_type"] != "swap" else "present", -+ } -+ ) - - return mount_info - -@@ -1231,15 +1441,19 @@ def get_mount_info(pools, volumes, actions, fstab): - def get_crypt_info(actions): - info = list() - for action in actions: -- if not (action.is_format and action.format.type == 'luks'): -+ if not (action.is_format and action.format.type == "luks"): - continue - -- info.append(dict(backing_device=action.device.path, -- name=action.format.map_name, -- password=action.format.key_file or '-', -- state='present' if action.is_create else 'absent')) -+ info.append( -+ dict( -+ backing_device=action.device.path, -+ name=action.format.map_name, -+ password=action.format.key_file or "-", -+ state="present" if action.is_create else "absent", -+ ) -+ ) - -- return sorted(info, key=lambda e: e['state']) -+ return sorted(info, key=lambda e: e["state"]) - - - def get_required_packages(b, pools, volumes): -@@ -1259,66 +1473,70 @@ def get_required_packages(b, pools, volumes): - - - def update_fstab_identifiers(b, pools, volumes): -- """ Update fstab device identifiers. -+ """Update fstab device identifiers. - -- This is to pick up new UUIDs for newly-formatted devices. -+ This is to pick up new UUIDs for newly-formatted devices. - """ - all_volumes = volumes[:] - for pool in pools: -- if not pool['state'] == 'present': -+ if not pool["state"] == "present": - continue - -- all_volumes += pool['volumes'] -+ all_volumes += pool["volumes"] - - for volume in all_volumes: -- if volume['state'] == 'present': -- device = b.devicetree.resolve_device(volume['_mount_id']) -- if device is None and volume['encryption']: -- device = b.devicetree.resolve_device(volume['_raw_device']) -+ if volume["state"] == "present": -+ device = b.devicetree.resolve_device(volume["_mount_id"]) -+ if device is None and volume["encryption"]: -+ device = b.devicetree.resolve_device(volume["_raw_device"]) - if device is not None and not device.isleaf: - device = device.children[0] -- volume['_device'] = device.path -+ volume["_device"] = device.path - - if device is None: -- raise BlivetAnsibleError("failed to look up device for volume %s (%s/%s)" % (volume['name'], volume['_device'], volume['_mount_id'])) -- volume['_mount_id'] = device.fstab_spec -- if device.format.type == 'swap': -+ raise BlivetAnsibleError( -+ "failed to look up device for volume %s (%s/%s)" -+ % (volume["name"], volume["_device"], volume["_mount_id"]) -+ ) -+ volume["_mount_id"] = device.fstab_spec -+ if device.format.type == "swap": - device.format.setup() - - if device.status: -- volume['_kernel_device'] = os.path.realpath(device.path) -+ volume["_kernel_device"] = os.path.realpath(device.path) - if device.raw_device.status: -- volume['_raw_kernel_device'] = os.path.realpath(device.raw_device.path) -+ volume["_raw_kernel_device"] = os.path.realpath(device.raw_device.path) - - - def activate_swaps(b, pools, volumes): - """ Activate all swaps specified as present. """ - all_volumes = volumes[:] - for pool in pools: -- if not pool['state'] == 'present': -+ if not pool["state"] == "present": - continue - -- all_volumes += pool['volumes'] -+ all_volumes += pool["volumes"] - - for volume in all_volumes: -- if volume['state'] == 'present': -- device = b.devicetree.resolve_device(volume['_mount_id']) -- if device.format.type == 'swap': -+ if volume["state"] == "present": -+ device = b.devicetree.resolve_device(volume["_mount_id"]) -+ if device.format.type == "swap": - device.format.setup() - - - def run_module(): - # available arguments/parameters that a user can pass - module_args = dict( -- pools=dict(type='list'), -- volumes=dict(type='list'), -- packages_only=dict(type='bool', required=False, default=False), -- disklabel_type=dict(type='str', required=False, default=None), -- safe_mode=dict(type='bool', required=False, default=True), -- pool_defaults=dict(type='dict', required=False), -- volume_defaults=dict(type='dict', required=False), -- use_partitions=dict(type='bool', required=False, default=True), -- diskvolume_mkfs_option_map=dict(type='dict', required=False, default={})) -+ pools=dict(type="list"), -+ volumes=dict(type="list"), -+ packages_only=dict(type="bool", required=False, default=False), -+ disklabel_type=dict(type="str", required=False, default=None), -+ safe_mode=dict(type="bool", required=False, default=True), -+ pool_defaults=dict(type="dict", required=False), -+ volume_defaults=dict(type="dict", required=False), -+ use_partitions=dict(type="bool", required=False, default=True), -+ diskvolume_mkfs_option_map=dict(type="dict", required=False, default={}), -+ ) - - # seed the result dict in the object - result = dict( -@@ -1332,47 +1550,52 @@ def run_module(): - packages=list(), - ) - -- module = AnsibleModule(argument_spec=module_args, -- supports_check_mode=True) -+ module = AnsibleModule(argument_spec=module_args, supports_check_mode=True) - if not BLIVET_PACKAGE: -- module.fail_json(msg="Failed to import the blivet or blivet3 Python modules", -- exception=inspect.cleandoc(""" -+ module.fail_json( -+ msg="Failed to import the blivet or blivet3 Python modules", -+ exception=inspect.cleandoc( -+ """ - blivet3 exception: - {} - blivet exception: -- {}""").format(LIB_IMP_ERR3, LIB_IMP_ERR)) -+ {}""" -+ ).format(LIB_IMP_ERR3, LIB_IMP_ERR), -+ ) - -- if not module.params['pools'] and not module.params['volumes']: -+ if not module.params["pools"] and not module.params["volumes"]: - module.exit_json(**result) - - global disklabel_type -- disklabel_type = module.params['disklabel_type'] -+ disklabel_type = module.params["disklabel_type"] - - global use_partitions -- use_partitions = module.params['use_partitions'] -+ use_partitions = module.params["use_partitions"] - - global safe_mode -- safe_mode = module.params['safe_mode'] -+ safe_mode = module.params["safe_mode"] - - global diskvolume_mkfs_option_map -- diskvolume_mkfs_option_map = module.params['diskvolume_mkfs_option_map'] -+ diskvolume_mkfs_option_map = module.params["diskvolume_mkfs_option_map"] - - global pool_defaults -- if 'pool_defaults' in module.params: -- pool_defaults = module.params['pool_defaults'] -+ if "pool_defaults" in module.params: -+ pool_defaults = module.params["pool_defaults"] - - global volume_defaults -- if 'volume_defaults' in module.params: -- volume_defaults = module.params['volume_defaults'] -+ if "volume_defaults" in module.params: -+ volume_defaults = module.params["volume_defaults"] - - b = Blivet() - b.reset() - fstab = FSTab(b) - actions = list() - -- if module.params['packages_only']: -+ if module.params["packages_only"]: - try: -- result['packages'] = get_required_packages(b, module.params['pools'], module.params['volumes']) -+ result["packages"] = get_required_packages( -+ b, module.params["pools"], module.params["volumes"] -+ ) - except BlivetAnsibleError as e: - module.fail_json(msg=str(e), **result) - module.exit_json(**result) -@@ -1388,44 +1611,56 @@ def run_module(): - sys_path = action.device.path - if os.path.islink(sys_path): - sys_path = os.readlink(action.device.path) -- trigger(action='change', subsystem='block', name=os.path.basename(sys_path)) -+ trigger(action="change", subsystem="block", name=os.path.basename(sys_path)) - - def action_dict(action): -- return dict(action=action.type_desc_str, -- fs_type=action.format.type if action.is_format else None, -- device=action.device.path) -+ return dict( -+ action=action.type_desc_str, -+ fs_type=action.format.type if action.is_format else None, -+ device=action.device.path, -+ ) - -- duplicates = find_duplicate_names(module.params['pools']) -+ duplicates = find_duplicate_names(module.params["pools"]) - if duplicates: -- module.fail_json(msg="multiple pools with the same name: {0}".format(",".join(duplicates)), -- **result) -- for pool in module.params['pools']: -- duplicates = find_duplicate_names(pool.get('volumes', list())) -+ module.fail_json( -+ msg="multiple pools with the same name: {0}".format(",".join(duplicates)), -+ **result -+ ) -+ for pool in module.params["pools"]: -+ duplicates = find_duplicate_names(pool.get("volumes", list())) - if duplicates: -- module.fail_json(msg="multiple volumes in pool '{0}' with the " -- "same name: {1}".format(pool['name'], ",".join(duplicates)), -- **result) -+ module.fail_json( -+ msg="multiple volumes in pool '{0}' with the " -+ "same name: {1}".format(pool["name"], ",".join(duplicates)), -+ **result -+ ) - try: - manage_pool(b, pool) - except BlivetAnsibleError as e: - module.fail_json(msg=str(e), **result) - -- duplicates = find_duplicate_names(module.params['volumes']) -+ duplicates = find_duplicate_names(module.params["volumes"]) - if duplicates: -- module.fail_json(msg="multiple volumes with the same name: {0}".format(",".join(duplicates)), -- **result) -- for volume in module.params['volumes']: -+ module.fail_json( -+ msg="multiple volumes with the same name: {0}".format(",".join(duplicates)), -+ **result -+ ) -+ for volume in module.params["volumes"]: - try: - manage_volume(b, volume) - except BlivetAnsibleError as e: - module.fail_json(msg=str(e), **result) - - scheduled = b.devicetree.actions.find() -- result['packages'] = b.packages[:] -+ result["packages"] = b.packages[:] - - for action in scheduled: -- if (action.is_destroy or action.is_resize) and action.is_format and action.format.exists and \ -- (action.format.mountable or action.format.type == "swap"): -+ if ( -+ (action.is_destroy or action.is_resize) -+ and action.is_format -+ and action.format.exists -+ and (action.format.mountable or action.format.type == "swap") -+ ): - action.format.teardown() - - if scheduled: -@@ -1433,21 +1668,27 @@ def run_module(): - callbacks.action_executed.add(record_action) - callbacks.action_executed.add(ensure_udev_update) - try: -- b.devicetree.actions.process(devices=b.devicetree.devices, dry_run=module.check_mode) -+ b.devicetree.actions.process( -+ devices=b.devicetree.devices, dry_run=module.check_mode -+ ) - except Exception as e: -- module.fail_json(msg="Failed to commit changes to disk: %s" % str(e), **result) -+ module.fail_json( -+ msg="Failed to commit changes to disk: %s" % str(e), **result -+ ) - finally: -- result['changed'] = True -- result['actions'] = [action_dict(a) for a in actions] -+ result["changed"] = True -+ result["actions"] = [action_dict(a) for a in actions] - -- update_fstab_identifiers(b, module.params['pools'], module.params['volumes']) -- activate_swaps(b, module.params['pools'], module.params['volumes']) -+ update_fstab_identifiers(b, module.params["pools"], module.params["volumes"]) -+ activate_swaps(b, module.params["pools"], module.params["volumes"]) - -- result['mounts'] = get_mount_info(module.params['pools'], module.params['volumes'], actions, fstab) -- result['crypts'] = get_crypt_info(actions) -- result['leaves'] = [d.path for d in b.devicetree.leaves] -- result['pools'] = module.params['pools'] -- result['volumes'] = module.params['volumes'] -+ result["mounts"] = get_mount_info( -+ module.params["pools"], module.params["volumes"], actions, fstab -+ ) -+ result["crypts"] = get_crypt_info(actions) -+ result["leaves"] = [d.path for d in b.devicetree.leaves] -+ result["pools"] = module.params["pools"] -+ result["volumes"] = module.params["volumes"] - - # success - return result - module.exit_json(**result) -@@ -1456,5 +1697,6 @@ def run_module(): - def main(): - run_module() - --if __name__ == '__main__': -+ -+if __name__ == "__main__": - main() -diff --git a/library/blockdev_info.py b/library/blockdev_info.py -index 52ddd78..ca1577f 100644 ---- a/library/blockdev_info.py -+++ b/library/blockdev_info.py -@@ -1,35 +1,41 @@ - #!/usr/bin/python - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - ANSIBLE_METADATA = { -- 'metadata_version': '1.1', -- 'status': ['preview'], -- 'supported_by': 'community' -+ "metadata_version": "1.1", -+ "status": ["preview"], -+ "supported_by": "community", - } - --DOCUMENTATION = ''' -+DOCUMENTATION = """ - --- - module: blockdev_info - short_description: Collect info about block devices in the system. - version_added: "2.5" - description: -+ - "WARNING: Do not use this module directly! It is only for role internal use." - - "This module collects information about block devices" --options: -+options: {} - author: -- - David Lehman (dlehman@redhat.com) --''' -+ - David Lehman (@dwlehman) -+""" - --EXAMPLES = ''' -+EXAMPLES = """ - - name: Get info about block devices - blockdev_info: - register: blk_info - --''' -+""" - --RETURN = ''' -+RETURN = """ - info: - description: dict w/ device path keys and device info dict values -+ returned: success - type: dict --''' -+""" - - import os - import shlex -@@ -38,7 +44,7 @@ from ansible.module_utils.basic import AnsibleModule - - - LSBLK_DEVICE_TYPES = {"part": "partition"} --DEV_MD_DIR = '/dev/md' -+DEV_MD_DIR = "/dev/md" - - - def fixup_md_path(path): -@@ -59,7 +65,9 @@ def fixup_md_path(path): - - - def get_block_info(run_cmd): -- buf = run_cmd(["lsblk", "-o", "NAME,FSTYPE,LABEL,UUID,TYPE,SIZE", "-p", "-P", "-a"])[1] -+ buf = run_cmd( -+ ["lsblk", "-o", "NAME,FSTYPE,LABEL,UUID,TYPE,SIZE", "-p", "-P", "-a"] -+ )[1] - info = dict() - for line in buf.splitlines(): - dev = dict() -@@ -75,7 +83,7 @@ def get_block_info(run_cmd): - - dev[key.lower()] = LSBLK_DEVICE_TYPES.get(value, value) - if dev: -- info[dev['name']] = dev -+ info[dev["name"]] = dev - - return info - -@@ -87,13 +95,10 @@ def run_module(): - info=None, - ) - -- module = AnsibleModule( -- argument_spec=module_args, -- supports_check_mode=True -- ) -+ module = AnsibleModule(argument_spec=module_args, supports_check_mode=True) - - try: -- result['info'] = get_block_info(module.run_command) -+ result["info"] = get_block_info(module.run_command) - except Exception: - module.fail_json(msg="Failed to collect block device info.") - -@@ -104,5 +109,5 @@ def main(): - run_module() - - --if __name__ == '__main__': -+if __name__ == "__main__": - main() -diff --git a/library/bsize.py b/library/bsize.py -index 40442f5..524b0f9 100644 ---- a/library/bsize.py -+++ b/library/bsize.py -@@ -1,12 +1,16 @@ - #!/usr/bin/python - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - ANSIBLE_METADATA = { -- 'metadata_version': '1.1', -- 'status': ['preview'], -- 'supported_by': 'community' -+ "metadata_version": "1.1", -+ "status": ["preview"], -+ "supported_by": "community", - } - --DOCUMENTATION = ''' -+DOCUMENTATION = """ - --- - module: bsize - -@@ -15,6 +19,7 @@ short_description: Module for basic manipulation with byte sizes - version_added: "2.5" - - description: -+ - "WARNING: Do not use this module directly! It is only for role internal use." - - "Module accepts byte size strings with the units and produces strings in - form of input accepted by different storage tools" - -@@ -23,67 +28,72 @@ options: - description: - - String containing number and byte units - required: true -+ type: str - - author: -- - Jan Pokorny (japokorn@redhat.com) --''' -+ - Jan Pokorny (@japokorn) -+""" - --EXAMPLES = ''' -+EXAMPLES = """ - # Obtain sizes in format for various tools - - name: Get 10 KiB size - bsize: - size: 10 KiB --''' -+""" - --RETURN = ''' -+RETURN = """ - size: - description: Size in binary format units - type: str -+ returned: success - bytes: - description: Size in bytes - type: int -+ returned: success - lvm: - description: Size in binary format. No space after the number, - first letter of unit prefix in lowercase only - type: str -+ returned: success - parted: - description: Size in binary format. No space after the number - type: str --''' -+ returned: success -+""" - - from ansible.module_utils.basic import AnsibleModule - from ansible.module_utils.storage_lsr.size import Size - -+ - def run_module(): - # available arguments/parameters that a user can pass - module_args = dict( -- size=dict(type='str', required=True), -+ size=dict(type="str", required=True), - ) - - # seed the result dict in the object -- result = dict( -- changed=False -- ) -+ result = dict(changed=False) - -- module = AnsibleModule(argument_spec=module_args, -- supports_check_mode=True) -+ module = AnsibleModule(argument_spec=module_args, supports_check_mode=True) - -- size = Size(module.params['size']) -+ size = Size(module.params["size"]) - -- result['size'] = size.get(fmt="%d %sb") -- result['bytes'] = size.bytes -- result['lvm'] = size.get(fmt="%d%sb").lower()[:-2] -- result['parted'] = size.get(fmt="%d%sb") -+ result["size"] = size.get(fmt="%d %sb") -+ result["bytes"] = size.bytes -+ result["lvm"] = size.get(fmt="%d%sb").lower()[:-2] -+ result["parted"] = size.get(fmt="%d%sb") - - # use whatever logic you need to determine whether or not this module - # made any modifications to your target -- result['changed'] = False -+ result["changed"] = False - - # success - return result - module.exit_json(**result) - -+ - def main(): - run_module() - --if __name__ == '__main__': -+ -+if __name__ == "__main__": - main() -diff --git a/library/find_unused_disk.py b/library/find_unused_disk.py -index 0a6fc7d..c688170 100644 ---- a/library/find_unused_disk.py -+++ b/library/find_unused_disk.py -@@ -1,10 +1,15 @@ - #!/usr/bin/python - --DOCUMENTATION = ''' -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ -+DOCUMENTATION = """ - --- - module: find_unused_disk - short_description: Gets unused disks - description: -+ - "WARNING: Do not use this module directly! It is only for role internal use." - - Disks are considered in ascending alphanumeric sorted order. - - Disks that meet all conditions are considered 'empty' and returned (using kernel device name) in a list. - - 1. No known signatures exist on the disk, with the exception of partition tables. -@@ -15,18 +20,18 @@ description: - - Number of returned disks defaults to first 10, but can be specified with 'max_return' argument. - author: Eda Zhou (@edamamez) - options: -- option-name: max_return -- description: Sets the maximum number of unused disks to return. -- default: 10 -- type: int -- -- option-name: min_size -- description: Specifies the minimum disk size to return an unused disk. -- default: 0 -- type: str --''' -- --EXAMPLES = ''' -+ max_return: -+ description: Sets the maximum number of unused disks to return. -+ default: 10 -+ type: int -+ -+ min_size: -+ description: Specifies the minimum disk size to return an unused disk. -+ default: 0 -+ type: str -+""" -+ -+EXAMPLES = """ - - name: test finding first unused device module - hosts: localhost - tasks: -@@ -38,9 +43,9 @@ EXAMPLES = ''' - - name: dump test output - debug: - msg: '{{ testout }}' --''' -+""" - --RETURN = ''' -+RETURN = """ - disk_name: - description: Information about unused disks - returned: On success -@@ -50,14 +55,15 @@ disk_name: - description: Unused disk(s) that have been found - returned: On success - type: list -- samples: ["sda1", "dm-0", "dm-3"] -- ["sda"] -+ samples: | -+ ["sda1", "dm-0", "dm-3"] -+ ["sda"] - none: - description: No unused disks were found - returned: On success - type: string - sample: "Unable to find unused disk" --''' -+""" - - - import os -@@ -68,7 +74,7 @@ from ansible.module_utils.storage_lsr.size import Size - - - SYS_CLASS_BLOCK = "/sys/class/block/" --IGNORED_DEVICES = [re.compile(r'^/dev/nullb\d+$')] -+IGNORED_DEVICES = [re.compile(r"^/dev/nullb\d+$")] - - - def is_ignored(disk_path): -@@ -78,13 +84,13 @@ def is_ignored(disk_path): - - def no_signature(run_command, disk_path): - """Return true if no known signatures exist on the disk.""" -- signatures = run_command(['blkid', '-p', disk_path]) -- return not 'UUID' in signatures[1] -+ signatures = run_command(["blkid", "-p", disk_path]) -+ return "UUID" not in signatures[1] - - - def no_holders(disk_path): - """Return true if the disk has no holders.""" -- holders = os.listdir(SYS_CLASS_BLOCK + get_sys_name(disk_path) + '/holders/') -+ holders = os.listdir(SYS_CLASS_BLOCK + get_sys_name(disk_path) + "/holders/") - return len(holders) == 0 - - -@@ -101,36 +107,45 @@ def get_sys_name(disk_path): - if not os.path.islink(disk_path): - return os.path.basename(disk_path) - -- node_dir = '/'.join(disk_path.split('/')[-1]) -- return os.path.normpath(node_dir + '/' + os.readlink(disk_path)) -+ node_dir = "/".join(disk_path.split("/")[-1]) -+ return os.path.normpath(node_dir + "/" + os.readlink(disk_path)) - - - def get_partitions(disk_path): - sys_name = get_sys_name(disk_path) - partitions = list() - for filename in os.listdir(SYS_CLASS_BLOCK + sys_name): -- if re.match(sys_name + r'p?\d+$', filename): -+ if re.match(sys_name + r"p?\d+$", filename): - partitions.append(filename) - - return partitions - - - def get_disks(run_command): -- buf = run_command(["lsblk", "-p", "--pairs", "--bytes", "-o", "NAME,TYPE,SIZE,FSTYPE"])[1] -+ buf = run_command( -+ ["lsblk", "-p", "--pairs", "--bytes", "-o", "NAME,TYPE,SIZE,FSTYPE"] -+ )[1] - disks = dict() - for line in buf.splitlines(): - if not line: - continue - -- m = re.search(r'NAME="(?P[^"]*)" TYPE="(?P[^"]*)" SIZE="(?P\d+)" FSTYPE="(?P[^"]*)"', line) -+ m = re.search( -+ r'NAME="(?P[^"]*)" TYPE="(?P[^"]*)" SIZE="(?P\d+)" FSTYPE="(?P[^"]*)"', -+ line, -+ ) - if m is None: - print(line) - continue - -- if m.group('type') != "disk": -+ if m.group("type") != "disk": - continue - -- disks[m.group('path')] = {"type": m.group('type'), "size": m.group('size'), "fstype": m.group('fstype')} -+ disks[m.group("path")] = { -+ "type": m.group("type"), -+ "size": m.group("size"), -+ "fstype": m.group("fstype"), -+ } - - return disks - -@@ -138,19 +153,13 @@ def get_disks(run_command): - def run_module(): - """Create the module""" - module_args = dict( -- max_return=dict(type='int', required=False, default=10), -- min_size=dict(type='str', required=False, default=0) -+ max_return=dict(type="int", required=False, default=10), -+ min_size=dict(type="str", required=False, default=0), - ) - -- result = dict( -- changed=False, -- disks=[] -- ) -+ result = dict(changed=False, disks=[]) - -- module = AnsibleModule( -- argument_spec=module_args, -- supports_check_mode=True -- ) -+ module = AnsibleModule(argument_spec=module_args, supports_check_mode=True) - - run_command = module.run_command - -@@ -161,7 +170,7 @@ def run_module(): - if attrs["fstype"]: - continue - -- if Size(attrs["size"]).bytes < Size(module.params['min_size']).bytes: -+ if Size(attrs["size"]).bytes < Size(module.params["min_size"]).bytes: - continue - - if get_partitions(path): -@@ -173,14 +182,14 @@ def run_module(): - if not can_open(path): - continue - -- result['disks'].append(os.path.basename(path)) -- if len(result['disks']) >= module.params['max_return']: -+ result["disks"].append(os.path.basename(path)) -+ if len(result["disks"]) >= module.params["max_return"]: - break - -- if not result['disks']: -- result['disks'] = "Unable to find unused disk" -+ if not result["disks"]: -+ result["disks"] = "Unable to find unused disk" - else: -- result['disks'].sort() -+ result["disks"].sort() - - module.exit_json(**result) - -@@ -190,5 +199,5 @@ def main(): - run_module() - - --if __name__ == '__main__': -+if __name__ == "__main__": - main() -diff --git a/library/lvm_gensym.py b/library/lvm_gensym.py -index 49d1822..3e0f613 100644 ---- a/library/lvm_gensym.py -+++ b/library/lvm_gensym.py -@@ -1,66 +1,75 @@ - #!/usr/bin/python - """Generates unique, default names for a volume group and logical volume""" - --from ansible.module_utils.basic import AnsibleModule --from ansible.module_utils import facts -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type - - ANSIBLE_METADATA = { -- 'metadata_version': '1.1', -- 'status': ['preview'], -- 'supported_by': 'community' -+ "metadata_version": "1.1", -+ "status": ["preview"], -+ "supported_by": "community", - } - --DOCUMENTATION = ''' -+DOCUMENTATION = """ - --- - module: lvm_gensym - short_description: Generate default names for lvm variables - version_added: "2.4" --description: -- - "Module accepts two input strings consisting of a file system type and -+description: -+ - "WARNING: Do not use this module directly! It is only for role internal use." -+ - "Module accepts two input strings consisting of a file system type and - a mount point path, and outputs names based on system information" - options: - fs_type: - description: -- - String describing the desired file system type -- required: true -+ - String describing the desired file system type -+ required: true -+ type: str - mount: - description: -- - String describing the mount point path -+ - String describing the mount point path - required: true --author: -- - Tim Flannagan (tflannag@redhat.com) --''' -+ type: str -+author: -+ - Tim Flannagan (@timflannagan) -+""" - --EXAMPLES = ''' --- name: Generate names -+EXAMPLES = """ -+- name: Generate names - lvm_gensym: - fs_type: "{{ fs_type }}" - mount: "{{ mount_point }}" - register: lvm_results - when: lvm_vg == "" and mount_point != "" and fs_type != "" --''' -+""" - --RETURN = ''' -+RETURN = """ - vg_name: - description: The default generated name for an unspecified volume group - type: str -- -+ returned: success - lv_name: - description: The default generated name for an unspecified logical volume - type: str --''' -+ returned: success -+""" -+ -+from ansible.module_utils.basic import AnsibleModule -+from ansible.module_utils import facts - - - def get_os_name(): - """Search the host file and return the name in the ID column""" -- for line in open('/etc/os-release').readlines(): -- if not line.find('ID='): -+ for line in open("/etc/os-release").readlines(): -+ if not line.find("ID="): - os_name = line[3:] - break - -- os_name = os_name.replace('\n', '').replace('"', '') -+ os_name = os_name.replace("\n", "").replace('"', "") - return os_name - -+ - def name_is_unique(name, used_names): - """Check if name is contained in the used_names list and return boolean value""" - if name not in used_names: -@@ -68,14 +77,15 @@ def name_is_unique(name, used_names): - - return False - -+ - def get_unique_name_from_base(base_name, used_names): - """Generate a unique name given a base name and a list of used names, and return that unique name""" - counter = 0 - while not name_is_unique(base_name, used_names): - if counter == 0: -- base_name = base_name + '_' + str(counter) -+ base_name = base_name + "_" + str(counter) - else: -- base_name = base_name[:-2] + '_' + str(counter) -+ base_name = base_name[:-2] + "_" + str(counter) - counter += 1 - - return base_name -@@ -83,8 +93,8 @@ def get_unique_name_from_base(base_name, used_names): - - def get_vg_name_base(host_name, os_name): - """Return a base name for a volume group based on the host and os names""" -- if host_name != None and len(host_name) != 0: -- vg_default = os_name + '_' + host_name -+ if host_name is not None and len(host_name) != 0: -+ vg_default = os_name + "_" + host_name - else: - vg_default = os_name - -@@ -93,65 +103,68 @@ def get_vg_name_base(host_name, os_name): - - def get_vg_name(host_name, lvm_facts): - """Generate a base volume group name, verify its uniqueness, and return that unique name""" -- used_vg_names = lvm_facts['vgs'].keys() -+ used_vg_names = lvm_facts["vgs"].keys() - os_name = get_os_name() - name = get_vg_name_base(host_name, os_name) - - return get_unique_name_from_base(name, used_vg_names) - -+ - def get_lv_name_base(fs_type, mount_point): - """Return a logical volume base name using given parameters""" -- if 'swap' in fs_type.lower(): -- lv_default = 'swap' -- elif mount_point.startswith('/'): -- if mount_point == '/': -- lv_default = 'root' -+ if "swap" in fs_type.lower(): -+ lv_default = "swap" -+ elif mount_point.startswith("/"): -+ if mount_point == "/": -+ lv_default = "root" - else: -- lv_default = mount_point[1:].replace('/', '_') -+ lv_default = mount_point[1:].replace("/", "_") - else: -- lv_default = 'lv' -+ lv_default = "lv" - - return lv_default - - - def get_lv_name(fs_type, mount_point, lvm_facts): - """Return a unique logical volume name based on specified file system type, mount point, and system facts""" -- used_lv_names = lvm_facts['lvs'].keys() -+ used_lv_names = lvm_facts["lvs"].keys() - name = get_lv_name_base(fs_type, mount_point) - - return get_unique_name_from_base(name, used_lv_names) - -+ - def run_module(): - """Setup and initialize all relevant ansible module data""" - module_args = dict( -- mount=dict(type='str', required=True), -- fs_type=dict(type='str', required=True) -+ mount=dict(type="str", required=True), fs_type=dict(type="str", required=True) - ) - -- result = dict( -- changed=False, -- vg_name='', -- lv_name='' -- ) -+ result = dict(changed=False, vg_name="", lv_name="") - -- module = AnsibleModule( -- argument_spec=module_args, -- supports_check_mode=True -- ) -+ module = AnsibleModule(argument_spec=module_args, supports_check_mode=True) - -- lvm_facts = facts.ansible_facts(module)['lvm'] -- host_name = facts.ansible_facts(module)['nodename'].lower().replace('.', '_').replace('-', '_') -+ lvm_facts = facts.ansible_facts(module)["lvm"] -+ host_name = ( -+ facts.ansible_facts(module)["nodename"] -+ .lower() -+ .replace(".", "_") -+ .replace("-", "_") -+ ) - -- result['lv_name'] = get_lv_name(module.params['fs_type'], module.params['mount'], lvm_facts) -- result['vg_name'] = get_vg_name(host_name, lvm_facts) -+ result["lv_name"] = get_lv_name( -+ module.params["fs_type"], module.params["mount"], lvm_facts -+ ) -+ result["vg_name"] = get_vg_name(host_name, lvm_facts) - -- if result['lv_name'] != '' and result['vg_name'] != '': -+ if result["lv_name"] != "" and result["vg_name"] != "": - module.exit_json(**result) - else: - module.fail_json(msg="Unable to initialize both group and volume names") - -+ - def main(): - run_module() - --if __name__ == '__main__': -+ -+if __name__ == "__main__": - main() -diff --git a/library/resolve_blockdev.py b/library/resolve_blockdev.py -index 007bb28..df9dcb1 100644 ---- a/library/resolve_blockdev.py -+++ b/library/resolve_blockdev.py -@@ -1,17 +1,22 @@ - #!/usr/bin/python - -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - ANSIBLE_METADATA = { -- 'metadata_version': '1.1', -- 'status': ['preview'], -- 'supported_by': 'community' -+ "metadata_version": "1.1", -+ "status": ["preview"], -+ "supported_by": "community", - } - --DOCUMENTATION = ''' -+DOCUMENTATION = """ - --- - module: resolve_blockdev - short_description: Resolve block device specification to device node path. - version_added: "2.5" - description: -+ - "WARNING: Do not use this module directly! It is only for role internal use." - - "This module accepts various forms of block device identifiers and - resolves them to the correct block device node path." - options: -@@ -19,11 +24,12 @@ options: - description: - - String describing a block device - required: true -+ type: str - author: -- - David Lehman (dlehman@redhat.com) --''' -+ - David Lehman (@dwlehman) -+""" - --EXAMPLES = ''' -+EXAMPLES = """ - - name: Resolve device by label - resolve_blockdev: - spec: LABEL=MyData -@@ -35,13 +41,14 @@ EXAMPLES = ''' - - name: Resolve device by /dev/disk/by-id symlink name - resolve_blockdev: - spec: wwn-0x5000c5005bc37f3f --''' -+""" - --RETURN = ''' -+RETURN = """ - device: - description: Path to block device node - type: str --''' -+ returned: success -+""" - - import glob - import os -@@ -52,37 +59,42 @@ from ansible.module_utils.basic import AnsibleModule - DEV_MD = "/dev/md" - DEV_MAPPER = "/dev/mapper" - SYS_CLASS_BLOCK = "/sys/class/block" --SEARCH_DIRS = ['/dev', DEV_MAPPER, DEV_MD] + glob.glob("/dev/disk/by-*") --MD_KERNEL_DEV = re.compile(r'/dev/md\d+(p\d+)?$') -+SEARCH_DIRS = ["/dev", DEV_MAPPER, DEV_MD] + glob.glob("/dev/disk/by-*") -+MD_KERNEL_DEV = re.compile(r"/dev/md\d+(p\d+)?$") - - - def resolve_blockdev(spec, run_cmd): - if "=" in spec: - device = run_cmd("blkid -t %s -o device" % spec)[1].strip() -- elif not spec.startswith('/'): -+ elif not spec.startswith("/"): - for devdir in SEARCH_DIRS: - device = "%s/%s" % (devdir, spec) - if os.path.exists(device): - break - else: -- device = '' -+ device = "" - else: - device = spec - - if not device or not os.path.exists(device): -- return '' -+ return "" - - return canonical_device(os.path.realpath(device)) - - - def _get_dm_name_from_kernel_dev(kdev): -- return open("%s/%s/dm/name" % (SYS_CLASS_BLOCK, os.path.basename(kdev))).read().strip() -+ return ( -+ open("%s/%s/dm/name" % (SYS_CLASS_BLOCK, os.path.basename(kdev))).read().strip() -+ ) - - - def _get_md_name_from_kernel_dev(kdev): - minor = os.minor(os.stat(kdev).st_rdev) -- return next(name for name in os.listdir(DEV_MD) -- if os.minor(os.stat("%s/%s" % (DEV_MD, name)).st_rdev) == minor) -+ return next( -+ name -+ for name in os.listdir(DEV_MD) -+ if os.minor(os.stat("%s/%s" % (DEV_MD, name)).st_rdev) == minor -+ ) - - - def canonical_device(device): -@@ -94,26 +106,27 @@ def canonical_device(device): - - - def run_module(): -- module_args = dict( -- spec=dict(type='str') -- ) -+ module_args = dict(spec=dict(type="str")) - - result = dict( - device=None, - ) - -- module = AnsibleModule( -- argument_spec=module_args, -- supports_check_mode=True -- ) -+ module = AnsibleModule(argument_spec=module_args, supports_check_mode=True) - - try: -- result['device'] = resolve_blockdev(module.params['spec'], run_cmd=module.run_command) -+ result["device"] = resolve_blockdev( -+ module.params["spec"], run_cmd=module.run_command -+ ) - except Exception: - pass - -- if not result['device'] or not os.path.exists(result['device']): -- module.fail_json(msg="The {} device spec could not be resolved".format(module.params['spec'])) -+ if not result["device"] or not os.path.exists(result["device"]): -+ module.fail_json( -+ msg="The {0} device spec could not be resolved".format( -+ module.params["spec"] -+ ) -+ ) - - module.exit_json(**result) - -@@ -122,5 +135,5 @@ def main(): - run_module() - - --if __name__ == '__main__': -+if __name__ == "__main__": - main() -diff --git a/module_utils/storage_lsr/size.py b/module_utils/storage_lsr/size.py -index 16f3d7c..1e91faa 100644 ---- a/module_utils/storage_lsr/size.py -+++ b/module_utils/storage_lsr/size.py -@@ -1,4 +1,6 @@ --#!/bin/python2 -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type - - import re - -@@ -7,15 +9,20 @@ BINARY_FACTOR = 2 ** 10 - - # index of the item in the list determines the exponent for size computation - # e.g. size_in_bytes = value * (DECIMAL_FACTOR ** (index(mega)+1)) = value * (1000 ** (1+1)) --PREFIXES_DECIMAL = [["k", "M", "G", "T", "P", "E", "Z", "Y"], -- ["kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"]] --PREFIXES_BINARY = [["Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi"], -- ["kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"]] -+# pylint: disable=bad-whitespace -+PREFIXES_DECIMAL = [ -+ ["k", "M", "G", "T", "P", "E", "Z", "Y"], # nopep8 -+ ["kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"], -+] # nopep8 -+PREFIXES_BINARY = [ -+ ["Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi"], # nopep8 -+ ["kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"], -+] # nopep8 - SUFFIXES = ["bytes", "byte", "B"] - -+ - class Size(object): -- ''' Class for basic manipulation of the sizes in *bytes -- ''' -+ """Class for basic manipulation of the sizes in *bytes""" - - def __init__(self, value): - raw_number, raw_units = self._parse_input(str(value)) -@@ -25,9 +32,9 @@ class Size(object): - self.units = raw_units - - def _parse_input(self, value): -- ''' splits input string into number and unit parts -- returns number part, unit part -- ''' -+ """splits input string into number and unit parts -+ returns number part, unit part -+ """ - m = re.search("^(.*?)([^0-9]*)$", value) - - raw_number = m.group(1).strip() -@@ -39,12 +46,12 @@ class Size(object): - return raw_number, raw_units - - def _parse_units(self, raw_units): -- ''' -- gets string containing size units and -- returns *_FACTOR (BINARY or DECIMAL) and the prefix position (not index!) -- in the PREFIXES_* list -- If no unit is specified defaults to BINARY and Bytes -- ''' -+ """ -+ gets string containing size units and -+ returns *_FACTOR (BINARY or DECIMAL) and the prefix position (not index!) -+ in the PREFIXES_* list -+ If no unit is specified defaults to BINARY and Bytes -+ """ - - prefix = raw_units - no_suffix_flag = True -@@ -54,7 +61,7 @@ class Size(object): - for suffix in SUFFIXES: - if raw_units.lower().endswith(suffix.lower()): - no_suffix_flag = False -- prefix = raw_units[:-len(suffix)] -+ prefix = raw_units[: -len(suffix)] - break - - if prefix == "": -@@ -87,18 +94,18 @@ class Size(object): - if idx < 0 or not valid_suffix: - raise ValueError("Unable to identify unit '%s'" % raw_units) - -- return used_factor, idx+1 -+ return used_factor, idx + 1 - - def _parse_number(self, raw_number): -- ''' parse input string containing number -- return float -- ''' -+ """parse input string containing number -+ return float -+ """ - return float(raw_number) - - def _get_unit(self, factor, exponent, unit_type=0): -- ''' based on decimal or binary factor and exponent -- obtain and return correct unit -- ''' -+ """based on decimal or binary factor and exponent -+ obtain and return correct unit -+ """ - - if unit_type == 0: - suffix = "B" -@@ -112,12 +119,11 @@ class Size(object): - prefix_lst = PREFIXES_DECIMAL[unit_type] - else: - prefix_lst = PREFIXES_BINARY[unit_type] -- return prefix_lst[exponent-1] + suffix -+ return prefix_lst[exponent - 1] + suffix - - @property - def bytes(self): -- ''' returns size value in bytes as int -- ''' -+ """returns size value in bytes as int""" - return int((self.factor ** self.exponent) * self.number) - - def _format(self, format_str, factor, exponent): -@@ -129,20 +135,20 @@ class Size(object): - return result - - def get(self, units="autobin", fmt="%0.1f %sb"): -- ''' returns size value as a string with given units and format -+ """returns size value as a string with given units and format - -- "units" parameter allows to select preferred unit: -- for example "KiB" or "megabytes" -- accepted values are also: -- "autobin" (default) - uses the highest human readable unit (binary) -- "autodec" - uses the highest human readable unit (decimal) -+ "units" parameter allows to select preferred unit: -+ for example "KiB" or "megabytes" -+ accepted values are also: -+ "autobin" (default) - uses the highest human readable unit (binary) -+ "autodec" - uses the highest human readable unit (decimal) - -- "fmt" parameter allows to specify the output format: -- %sb - will be replaced with the short byte size unit (e.g. MiB) -- %lb - will be replaced with the long byte size unit (e.g. kilobytes) -- value can be formatted using standard string replacements (e.g. %d, %f) -+ "fmt" parameter allows to specify the output format: -+ %sb - will be replaced with the short byte size unit (e.g. MiB) -+ %lb - will be replaced with the long byte size unit (e.g. kilobytes) -+ value can be formatted using standard string replacements (e.g. %d, %f) - -- ''' -+ """ - - ftr = BINARY_FACTOR - if units == "autodec": -@@ -155,6 +161,8 @@ class Size(object): - exp += 1 - else: - ftr, exp = self._parse_units(units.strip()) -- value = (float(self.factor ** self.exponent) / float(ftr ** exp)) * self.number -+ value = ( -+ float(self.factor ** self.exponent) / float(ftr ** exp) -+ ) * self.number - - return self._format(fmt, ftr, exp) % value -diff --git a/tests/setup_module_utils.sh b/tests/setup_module_utils.sh -deleted file mode 100755 -index 94d102d..0000000 ---- a/tests/setup_module_utils.sh -+++ /dev/null -@@ -1,41 +0,0 @@ --#!/bin/bash --# SPDX-License-Identifier: MIT -- --set -euo pipefail -- --if [ -n "${DEBUG:-}" ] ; then -- set -x --fi -- --if [ ! -d "${1:-}" ] ; then -- echo Either ansible is not installed, or there is no ansible/module_utils -- echo in "$1" - Skipping -- exit 0 --fi -- --if [ ! -d "${2:-}" ] ; then -- echo Role has no module_utils - Skipping -- exit 0 --fi -- --# we need absolute path for $2 --absmoddir=$( readlink -f "$2" ) -- --# clean up old links to module_utils --for item in "$1"/* ; do -- if lnitem=$( readlink "$item" ) && test -n "$lnitem" ; then -- case "$lnitem" in -- *"${2}"*) rm -f "$item" ;; -- esac -- fi --done -- --# add new links to module_utils --for item in "$absmoddir"/* ; do -- case "$item" in -- *__pycache__) continue;; -- *.pyc) continue;; -- esac -- bnitem=$( basename "$item" ) -- ln -s "$item" "$1/$bnitem" --done -diff --git a/tests/test-verify-volume-device.yml b/tests/test-verify-volume-device.yml -index 3fb56a6..c7ba5ec 100644 ---- a/tests/test-verify-volume-device.yml -+++ b/tests/test-verify-volume-device.yml -@@ -23,11 +23,11 @@ - - - name: (1/2) Process volume type (set initial value) - set_fact: -- st_volume_type: "{{ storage_test_volume.type }}" -+ st_volume_type: "{{ storage_test_volume.type }}" - - - name: (2/2) Process volume type (get RAID value) - set_fact: -- st_volume_type: "{{ storage_test_volume.raid_level }}" -+ st_volume_type: "{{ storage_test_volume.raid_level }}" - when: storage_test_volume.type == "raid" - - - name: Verify the volume's device type -diff --git a/tests/test-verify-volume-md.yml b/tests/test-verify-volume-md.yml -index b21d8d2..27e8333 100644 ---- a/tests/test-verify-volume-md.yml -+++ b/tests/test-verify-volume-md.yml -@@ -9,7 +9,7 @@ - register: storage_test_mdadm - changed_when: false - -- # pre-chew regex search patterns -+ # pre-chew regex search patterns - - set_fact: - storage_test_md_active_devices_re: "{{ ('Active Devices : ' ~ storage_test_volume.raid_device_count ~ '\n')|regex_escape() }}" - when: storage_test_volume.raid_device_count is defined -diff --git a/tests/test.yml b/tests/test.yml -index 944b3cd..cb718a7 100644 ---- a/tests/test.yml -+++ b/tests/test.yml -@@ -16,7 +16,7 @@ - mount_point: '/opt/test1' - - name: bar - disks: ['vdc'] -- #state: "absent" -+ # state: "absent" - volumes: - - name: test2 - size: 8g -diff --git a/tests/tests_create_lv_size_equal_to_vg.yml b/tests/tests_create_lv_size_equal_to_vg.yml -index 21a5788..1737036 100644 ---- a/tests/tests_create_lv_size_equal_to_vg.yml -+++ b/tests/tests_create_lv_size_equal_to_vg.yml -@@ -23,13 +23,13 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- volumes: -- - name: test1 -- size: "{{ lv_size }}" -- mount_point: "{{ mount_location }}" -+ storage_pools: -+ - name: foo -+ disks: "{{ unused_disks }}" -+ volumes: -+ - name: test1 -+ size: "{{ lv_size }}" -+ mount_point: "{{ mount_location }}" - - - include_tasks: verify-role-results.yml - -@@ -37,12 +37,12 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- state: "absent" -- volumes: -- - name: test1 -- mount_point: "{{ mount_location }}" -+ storage_pools: -+ - name: foo -+ disks: "{{ unused_disks }}" -+ state: "absent" -+ volumes: -+ - name: test1 -+ mount_point: "{{ mount_location }}" - - - include_tasks: verify-role-results.yml -diff --git a/tests/tests_create_partition_volume_then_remove.yml b/tests/tests_create_partition_volume_then_remove.yml -index 351b022..567f8dd 100644 ---- a/tests/tests_create_partition_volume_then_remove.yml -+++ b/tests/tests_create_partition_volume_then_remove.yml -@@ -53,7 +53,7 @@ - name: linux-system-roles.storage - vars: - storage_pools: -- - name: "{{ unused_disks[0] }}" -+ - name: "{{ unused_disks[0] }}" - type: partition - disks: "{{ unused_disks }}" - state: absent -@@ -70,7 +70,7 @@ - name: linux-system-roles.storage - vars: - storage_pools: -- - name: "{{ unused_disks[0] }}" -+ - name: "{{ unused_disks[0] }}" - type: partition - disks: "{{ unused_disks }}" - state: absent -diff --git a/tests/tests_existing_lvm_pool.yml b/tests/tests_existing_lvm_pool.yml -index 854ac0d..2490914 100644 ---- a/tests/tests_existing_lvm_pool.yml -+++ b/tests/tests_existing_lvm_pool.yml -@@ -20,12 +20,12 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: "{{ pool_name }}" -- disks: "{{ unused_disks }}" -- volumes: -- - name: test1 -- size: "{{ volume_size }}" -+ storage_pools: -+ - name: "{{ pool_name }}" -+ disks: "{{ unused_disks }}" -+ volumes: -+ - name: test1 -+ size: "{{ volume_size }}" - - - include_tasks: verify-role-results.yml - -diff --git a/tests/tests_lvm_auto_size_cap.yml b/tests/tests_lvm_auto_size_cap.yml -index 30aa6a7..eae7ff3 100644 ---- a/tests/tests_lvm_auto_size_cap.yml -+++ b/tests/tests_lvm_auto_size_cap.yml -@@ -35,12 +35,12 @@ - name: linux-system-roles.storage - vars: - storage_pools: -- - name: foo -- type: lvm -- disks: "{{ unused_disks }}" -- volumes: -- - name: test1 -- size: "{{ doubled_size.stdout|trim }}" -+ - name: foo -+ type: lvm -+ disks: "{{ unused_disks }}" -+ volumes: -+ - name: test1 -+ size: "{{ doubled_size.stdout|trim }}" - - name: unreachable task - fail: - msg: UNREACH -@@ -58,11 +58,11 @@ - name: linux-system-roles.storage - vars: - storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- volumes: -- - name: test1 -- size: "{{ test_disk_size }}" -+ - name: foo -+ disks: "{{ unused_disks }}" -+ volumes: -+ - name: test1 -+ size: "{{ test_disk_size }}" - - - include_tasks: verify-role-results.yml - -@@ -71,12 +71,12 @@ - name: linux-system-roles.storage - vars: - storage_pools: -- - name: foo -- type: lvm -- disks: "{{ unused_disks }}" -- volumes: -- - name: test1 -- size: "{{ test_disk_size }}" -+ - name: foo -+ type: lvm -+ disks: "{{ unused_disks }}" -+ volumes: -+ - name: test1 -+ size: "{{ test_disk_size }}" - - - include_tasks: verify-role-results.yml - -@@ -85,7 +85,7 @@ - name: linux-system-roles.storage - vars: - storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- state: absent -- volumes: [] -+ - name: foo -+ disks: "{{ unused_disks }}" -+ state: absent -+ volumes: [] -diff --git a/tests/tests_lvm_one_disk_one_volume.yml b/tests/tests_lvm_one_disk_one_volume.yml -index b1096cf..6452f54 100644 ---- a/tests/tests_lvm_one_disk_one_volume.yml -+++ b/tests/tests_lvm_one_disk_one_volume.yml -@@ -19,13 +19,13 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- volumes: -- - name: test1 -- size: "{{ volume_size }}" -- mount_point: "{{ mount_location }}" -+ storage_pools: -+ - name: foo -+ disks: "{{ unused_disks }}" -+ volumes: -+ - name: test1 -+ size: "{{ volume_size }}" -+ mount_point: "{{ mount_location }}" - - - include_tasks: verify-role-results.yml - -@@ -33,13 +33,13 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- volumes: -- - name: test1 -- size: "{{ volume_size }}" -- mount_point: "{{ mount_location }}" -+ storage_pools: -+ - name: foo -+ disks: "{{ unused_disks }}" -+ volumes: -+ - name: test1 -+ size: "{{ volume_size }}" -+ mount_point: "{{ mount_location }}" - - - include_tasks: verify-role-results.yml - -@@ -47,14 +47,14 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- state: absent -- volumes: -- - name: test1 -- size: "{{ volume_size }}" -- mount_point: "{{ mount_location }}" -- state: absent -+ storage_pools: -+ - name: foo -+ disks: "{{ unused_disks }}" -+ state: absent -+ volumes: -+ - name: test1 -+ size: "{{ volume_size }}" -+ mount_point: "{{ mount_location }}" -+ state: absent - - - include_tasks: verify-role-results.yml -diff --git a/tests/tests_misc.yml b/tests/tests_misc.yml -index 3139bc7..afe753a 100644 ---- a/tests/tests_misc.yml -+++ b/tests/tests_misc.yml -@@ -197,7 +197,7 @@ - block: - - name: Try to mount swap filesystem to "{{ mount_location }}" - include_role: -- name: linux-system-roles.storage -+ name: linux-system-roles.storage - vars: - storage_volumes: - - name: test1 -diff --git a/tests/tests_null_raid_pool.yml b/tests/tests_null_raid_pool.yml -index 2b7b9f3..5c3c785 100644 ---- a/tests/tests_null_raid_pool.yml -+++ b/tests/tests_null_raid_pool.yml -@@ -31,9 +31,9 @@ - raid_level: "null" - state: present - volumes: -- - name: lv1 -- size: "{{ volume1_size }}" -- mount_point: "{{ mount_location1 }}" -+ - name: lv1 -+ size: "{{ volume1_size }}" -+ mount_point: "{{ mount_location1 }}" - - - name: get existing raids (after run) - command: "cat /proc/mdstat" -@@ -52,12 +52,12 @@ - raid_level: "null" - state: absent - volumes: -- - name: lv1 -- size: "{{ volume1_size }}" -- mount_point: "{{ mount_location1 }}" -+ - name: lv1 -+ size: "{{ volume1_size }}" -+ mount_point: "{{ mount_location1 }}" - - - name: compare mdstat results - assert: - that: -- - storage_test_mdstat1.stdout == storage_test_mdstat2.stdout -+ - storage_test_mdstat1.stdout == storage_test_mdstat2.stdout - msg: "Raid created when it should not be" -diff --git a/tests/tests_resize.yml b/tests/tests_resize.yml -index 209d129..4fd8583 100644 ---- a/tests/tests_resize.yml -+++ b/tests/tests_resize.yml -@@ -29,16 +29,16 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- type: lvm -- volumes: -- - name: test1 -- # resizing is currently supported only for ext2/3/4 -- fs_type: 'ext4' -- size: "{{ volume_size_before }}" -- mount_point: "{{ mount_location }}" -+ storage_pools: -+ - name: foo -+ disks: "{{ unused_disks }}" -+ type: lvm -+ volumes: -+ - name: test1 -+ # resizing is currently supported only for ext2/3/4 -+ fs_type: 'ext4' -+ size: "{{ volume_size_before }}" -+ mount_point: "{{ mount_location }}" - - - include_tasks: verify-role-results.yml - -@@ -46,15 +46,15 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: foo -- type: lvm -- disks: "{{ unused_disks }}" -- volumes: -- - name: test1 -- fs_type: 'ext4' -- size: "{{ volume_size_after }}" -- mount_point: "{{ mount_location }}" -+ storage_pools: -+ - name: foo -+ type: lvm -+ disks: "{{ unused_disks }}" -+ volumes: -+ - name: test1 -+ fs_type: 'ext4' -+ size: "{{ volume_size_after }}" -+ mount_point: "{{ mount_location }}" - - - include_tasks: verify-role-results.yml - -@@ -194,14 +194,14 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- state: absent -- volumes: -- - name: test1 -- size: "{{ volume_size_before }}" -- mount_point: "{{ mount_location }}" -+ storage_pools: -+ - name: foo -+ disks: "{{ unused_disks }}" -+ state: absent -+ volumes: -+ - name: test1 -+ size: "{{ volume_size_before }}" -+ mount_point: "{{ mount_location }}" - - - include_tasks: verify-role-results.yml - -@@ -259,14 +259,14 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- state: absent -- volumes: -- - name: test1 -- size: "{{ volume_size_before }}" -- mount_point: "{{ mount_location }}" -+ storage_pools: -+ - name: foo -+ disks: "{{ unused_disks }}" -+ state: absent -+ volumes: -+ - name: test1 -+ size: "{{ volume_size_before }}" -+ mount_point: "{{ mount_location }}" - - - include_tasks: verify-role-results.yml - -@@ -324,13 +324,13 @@ - include_role: - name: linux-system-roles.storage - vars: -- storage_pools: -- - name: foo -- disks: "{{ unused_disks }}" -- state: absent -- volumes: -- - name: test1 -- size: "{{ volume_size_before }}" -- mount_point: "{{ mount_location }}" -+ storage_pools: -+ - name: foo -+ disks: "{{ unused_disks }}" -+ state: absent -+ volumes: -+ - name: test1 -+ size: "{{ volume_size_before }}" -+ mount_point: "{{ mount_location }}" - - - include_tasks: verify-role-results.yml -diff --git a/tests/unit/bsize_test.py b/tests/unit/bsize_test.py -index f88a9c1..fae0f5f 100644 ---- a/tests/unit/bsize_test.py -+++ b/tests/unit/bsize_test.py -@@ -1,7 +1,12 @@ -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - import pytest - - from storage_lsr.size import Size - -+ - def test_bsize(): - # check failure on incorrect string - with pytest.raises(ValueError) as e: -diff --git a/tests/unit/gensym_test.py b/tests/unit/gensym_test.py -index 6d164dc..fd00ddf 100644 ---- a/tests/unit/gensym_test.py -+++ b/tests/unit/gensym_test.py -@@ -1,68 +1,115 @@ - #!/usr/bin/python - """This module tests methods defined in the lvm_gensym.py module using the pytest framework""" --import pytest -- -+from __future__ import absolute_import, division, print_function - --import lvm_gensym -+__metaclass__ = type - -+import pytest - --used_lv_names = ['root', 'root_0', 'root_1', 'root_2', 'root_3', 'swap_0', 'swap', 'swap_1'] - --test_lv_names = [{'fs_type': 'ext', 'mount': '/'}, -- {'fs_type': 'zfs', 'mount': '/home/user'}, -- {'fs_type': 'swap', 'mount': ''} -- ] -+import lvm_gensym - --used_vg_names = ['linux_host', 'rhel_user0', 'rhel_0_user'] - --test_vg_names = ['rhel_user', 'rhel_user_0', 'rhel_user_1', -- 'rhel_user_2', 'rhel_user_3', 'linux_user', -- 'fedora_user', 'fedora_user_0', 'fedora_user_1' -- ] -+used_lv_names = [ -+ "root", -+ "root_0", -+ "root_1", -+ "root_2", -+ "root_3", -+ "swap_0", -+ "swap", -+ "swap_1", -+] -+ -+test_lv_names = [ -+ {"fs_type": "ext", "mount": "/"}, -+ {"fs_type": "zfs", "mount": "/home/user"}, -+ {"fs_type": "swap", "mount": ""}, -+] -+ -+used_vg_names = ["linux_host", "rhel_user0", "rhel_0_user"] -+ -+test_vg_names = [ -+ "rhel_user", -+ "rhel_user_0", -+ "rhel_user_1", -+ "rhel_user_2", -+ "rhel_user_3", -+ "linux_user", -+ "fedora_user", -+ "fedora_user_0", -+ "fedora_user_1", -+] -+ -+lvm_facts = { -+ "lvs": { -+ "Home": "", -+ "Swap": "", -+ "Root": "", -+ "Root_0": "", -+ "root": "", -+ "root_0": "", -+ "swap": "", -+ "swap_0": "", -+ "swap_1": "", -+ }, -+ "vgs": {"rhel_user": "", "rhel_user_0": "", "rhel_user_1": ""}, -+} - --lvm_facts = {'lvs': {'Home': '', 'Swap': '', 'Root': '', -- 'Root_0': '', 'root': '', 'root_0': '', -- 'swap': '', 'swap_0': '', 'swap_1': '', -- }, -- 'vgs': {'rhel_user': '', 'rhel_user_0': '', 'rhel_user_1': ''} -- } - - def test_unique_base_name(): - """Test whether the returned name is unique using a supplied list of test names""" -- assert lvm_gensym.get_unique_name_from_base('root', used_lv_names) == 'root_4' -- assert lvm_gensym.get_unique_name_from_base('rhel_user', test_vg_names) == 'rhel_user_4' -+ assert lvm_gensym.get_unique_name_from_base("root", used_lv_names) == "root_4" -+ assert ( -+ lvm_gensym.get_unique_name_from_base("rhel_user", test_vg_names) -+ == "rhel_user_4" -+ ) -+ - - def test_return_val(): - """Verify that a supplied unique name and a list of used names returns True""" - for (index, name) in enumerate(test_vg_names): - assert lvm_gensym.name_is_unique(name[index], used_vg_names) - -+ - def test_get_base_vg_name(): - """Check generated base volume group name against the expected base name""" -- assert lvm_gensym.get_vg_name_base('hostname', 'rhel') == 'rhel_hostname' -+ assert lvm_gensym.get_vg_name_base("hostname", "rhel") == "rhel_hostname" -+ - - @pytest.mark.parametrize("os_name", ["foo", "bar", "baz"]) - def test_vg_eval(monkeypatch, os_name): - """Check generated unique volume group name against the expected name""" -+ - def get_os_name(): - return os_name - - vg_names = [os_name + "_user", os_name + "_user_0", os_name + "_user_1"] - _lvm_facts = dict(vgs=dict.fromkeys(vg_names), lvs=dict()) - monkeypatch.setattr(lvm_gensym, "get_os_name", get_os_name) -- assert lvm_gensym.get_vg_name('user', _lvm_facts) == os_name + '_user_2' -- assert lvm_gensym.get_vg_name('', _lvm_facts) == os_name -+ assert lvm_gensym.get_vg_name("user", _lvm_facts) == os_name + "_user_2" -+ assert lvm_gensym.get_vg_name("", _lvm_facts) == os_name -+ - - def test_lv_eval(): - """Test the generated unique logical volume name against the expected name""" -- expected = ['root_1', 'home_user', 'swap_2'] -+ expected = ["root_1", "home_user", "swap_2"] - - for (ctr, name_inputs) in enumerate(test_lv_names): -- assert lvm_gensym.get_lv_name(name_inputs['fs_type'], name_inputs['mount'], lvm_facts) == expected[ctr] -+ assert ( -+ lvm_gensym.get_lv_name( -+ name_inputs["fs_type"], name_inputs["mount"], lvm_facts -+ ) -+ == expected[ctr] -+ ) -+ - - def test_get_base_lv_name(): - """Test the generated base logical volume name against the expected name""" -- expected = ['root', 'home_user', 'swap'] -+ expected = ["root", "home_user", "swap"] - - for (ctr, names_input) in enumerate(test_lv_names): -- assert lvm_gensym.get_lv_name_base(names_input['fs_type'], names_input['mount']) == expected[ctr] -+ assert ( -+ lvm_gensym.get_lv_name_base(names_input["fs_type"], names_input["mount"]) -+ == expected[ctr] -+ ) -diff --git a/tests/unit/resolve_blockdev_test.py b/tests/unit/resolve_blockdev_test.py -index 0eafe7b..ad50628 100644 ---- a/tests/unit/resolve_blockdev_test.py -+++ b/tests/unit/resolve_blockdev_test.py -@@ -1,3 +1,6 @@ -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type - - import os - import pytest -@@ -5,73 +8,80 @@ import pytest - import resolve_blockdev - - --blkid_data = [('LABEL=target', '/dev/sdx3'), -- ('UUID=6c75fa75-e5ab-4a12-a567-c8aa0b4b60a5', '/dev/sdaz'), -- ('LABEL=missing', '')] -+blkid_data = [ -+ ("LABEL=target", "/dev/sdx3"), -+ ("UUID=6c75fa75-e5ab-4a12-a567-c8aa0b4b60a5", "/dev/sdaz"), -+ ("LABEL=missing", ""), -+] - --path_data = ['/dev/md/unreal', -- '/dev/mapper/fakevg-fakelv', -- '/dev/adisk', -- '/dev/disk/by-id/wwn-0x123456789abc'] -+path_data = [ -+ "/dev/md/unreal", -+ "/dev/mapper/fakevg-fakelv", -+ "/dev/adisk", -+ "/dev/disk/by-id/wwn-0x123456789abc", -+] - --canonical_paths = {"/dev/sda": "/dev/sda", -- "/dev/dm-3": "/dev/mapper/vg_system-lv_data", -- "/dev/md127": "/dev/md/userdb", -- "/dev/notfound": ""} -+canonical_paths = { -+ "/dev/sda": "/dev/sda", -+ "/dev/dm-3": "/dev/mapper/vg_system-lv_data", -+ "/dev/md127": "/dev/md/userdb", -+ "/dev/notfound": "", -+} - - --@pytest.mark.parametrize('spec,device', blkid_data) -+@pytest.mark.parametrize("spec,device", blkid_data) - def test_key_value_pair(spec, device, monkeypatch): - def run_cmd(args): - for _spec, _dev in blkid_data: - if _spec in args: - break - else: -- _dev = '' -- return (0, _dev, '') -+ _dev = "" -+ return (0, _dev, "") - -- monkeypatch.setattr(os.path, 'exists', lambda p: True) -+ monkeypatch.setattr(os.path, "exists", lambda p: True) - assert resolve_blockdev.resolve_blockdev(spec, run_cmd) == device - - --@pytest.mark.parametrize('name', [os.path.basename(p) for p in path_data]) -+@pytest.mark.parametrize("name", [os.path.basename(p) for p in path_data]) - def test_device_names(name, monkeypatch): - """ Test return values for basename specs, assuming all paths are real. """ -+ - def path_exists(path): - return next((data for data in path_data if data == path), False) - -- expected = next((data for data in path_data if os.path.basename(data) == name), '') -- monkeypatch.setattr(os.path, 'exists', path_exists) -+ expected = next((data for data in path_data if os.path.basename(data) == name), "") -+ monkeypatch.setattr(os.path, "exists", path_exists) - assert resolve_blockdev.resolve_blockdev(name, None) == expected - - - def test_device_name(monkeypatch): -- assert os.path.exists('/dev/xxx') is False -+ assert os.path.exists("/dev/xxx") is False - -- monkeypatch.setattr(os.path, 'exists', lambda p: True) -- assert resolve_blockdev.resolve_blockdev('xxx', None) == '/dev/xxx' -+ monkeypatch.setattr(os.path, "exists", lambda p: True) -+ assert resolve_blockdev.resolve_blockdev("xxx", None) == "/dev/xxx" - -- monkeypatch.setattr(os.path, 'exists', lambda p: False) -- assert resolve_blockdev.resolve_blockdev('xxx', None) == '' -+ monkeypatch.setattr(os.path, "exists", lambda p: False) -+ assert resolve_blockdev.resolve_blockdev("xxx", None) == "" - - - def test_full_path(monkeypatch): - path = "/dev/idonotexist" -- monkeypatch.setattr(os.path, 'exists', lambda p: True) -+ monkeypatch.setattr(os.path, "exists", lambda p: True) - assert resolve_blockdev.resolve_blockdev(path, None) == path - -- monkeypatch.setattr(os.path, 'exists', lambda p: False) -- assert resolve_blockdev.resolve_blockdev(path, None) == '' -+ monkeypatch.setattr(os.path, "exists", lambda p: False) -+ assert resolve_blockdev.resolve_blockdev(path, None) == "" - - path = "/dev/disk/by-label/alabel" -- monkeypatch.setattr(os.path, 'exists', lambda p: True) -+ monkeypatch.setattr(os.path, "exists", lambda p: True) - assert resolve_blockdev.resolve_blockdev(path, None) == path - -- monkeypatch.setattr(os.path, 'exists', lambda p: False) -- assert resolve_blockdev.resolve_blockdev(path, None) == '' -+ monkeypatch.setattr(os.path, "exists", lambda p: False) -+ assert resolve_blockdev.resolve_blockdev(path, None) == "" - - --@pytest.mark.parametrize('device', list(canonical_paths.keys())) -+@pytest.mark.parametrize("device", list(canonical_paths.keys())) - def test_canonical_path(device, monkeypatch): - def _get_name(device): - name = os.path.basename(canonical_paths[device]) -@@ -79,8 +89,8 @@ def test_canonical_path(device, monkeypatch): - raise Exception("failed to find name") - return name - -- monkeypatch.setattr(resolve_blockdev, '_get_dm_name_from_kernel_dev', _get_name) -- monkeypatch.setattr(resolve_blockdev, '_get_md_name_from_kernel_dev', _get_name) -+ monkeypatch.setattr(resolve_blockdev, "_get_dm_name_from_kernel_dev", _get_name) -+ monkeypatch.setattr(resolve_blockdev, "_get_md_name_from_kernel_dev", _get_name) - - canonical = canonical_paths[device] - if canonical: -diff --git a/tests/unit/test_unused_disk.py b/tests/unit/test_unused_disk.py -index a4339c4..493b4b0 100644 ---- a/tests/unit/test_unused_disk.py -+++ b/tests/unit/test_unused_disk.py -@@ -1,72 +1,91 @@ -+from __future__ import absolute_import, division, print_function -+ -+__metaclass__ = type -+ - import pytest - import find_unused_disk - import os - - --blkid_data_pttype = [('/dev/sdx', '/dev/sdx: PTTYPE=\"dos\"'), -- ('/dev/sdy', '/dev/sdy: PTTYPE=\"test\"')] -+blkid_data_pttype = [ -+ ("/dev/sdx", '/dev/sdx: PTTYPE="dos"'), -+ ("/dev/sdy", '/dev/sdy: PTTYPE="test"'), -+] - --blkid_data = [('/dev/sdx', 'UUID=\"hello-1234-56789\" TYPE=\"crypto_LUKS\"'), -- ('/dev/sdy', 'UUID=\"this-1s-a-t3st-f0r-ansible\" VERSION=\"LVM2 001\" TYPE=\"LVM2_member\" USAGE=\"raid\"'), -- ('/dev/sdz', 'LABEL=\"/data\" UUID=\"a12bcdef-345g-67h8-90i1-234j56789k10\" VERSION=\"1.0\" TYPE=\"ext4\" USAGE=\"filesystem\"')] -+blkid_data = [ -+ ("/dev/sdx", 'UUID="hello-1234-56789" TYPE="crypto_LUKS"'), -+ ( -+ "/dev/sdy", -+ 'UUID="this-1s-a-t3st-f0r-ansible" VERSION="LVM2 001" TYPE="LVM2_member" USAGE="raid"', -+ ), -+ ( -+ "/dev/sdz", -+ 'LABEL="/data" UUID="a12bcdef-345g-67h8-90i1-234j56789k10" VERSION="1.0" TYPE="ext4" USAGE="filesystem"', -+ ), -+] - --holders_data_none = [('/dev/sdx', ''), -- ('/dev/dm-99', '')] -+holders_data_none = [("/dev/sdx", ""), ("/dev/dm-99", "")] - --holders_data = [('/dev/sdx', 'dm-0'), -- ('/dev/dm-99', 'dm-2 dm-3 dm-4')] -+holders_data = [("/dev/sdx", "dm-0"), ("/dev/dm-99", "dm-2 dm-3 dm-4")] - - --@pytest.mark.parametrize('disk, blkid', blkid_data_pttype) -+@pytest.mark.parametrize("disk, blkid", blkid_data_pttype) - def test_no_signature_true(disk, blkid): - def run_command(args): -- return [0, blkid, ''] -+ return [0, blkid, ""] -+ - assert find_unused_disk.no_signature(run_command, disk) is True - - --@pytest.mark.parametrize('disk, blkid', blkid_data) -+@pytest.mark.parametrize("disk, blkid", blkid_data) - def test_no_signature_false(disk, blkid): - def run_command(args): -- return [0, blkid, ''] -+ return [0, blkid, ""] -+ - assert find_unused_disk.no_signature(run_command, disk) is False - - --@pytest.mark.parametrize('disk, holders', holders_data_none) -+@pytest.mark.parametrize("disk, holders", holders_data_none) - def test_no_holders_true(disk, holders, monkeypatch): - def mock_return(args): - return holders -- monkeypatch.setattr(os, 'listdir', mock_return) -+ -+ monkeypatch.setattr(os, "listdir", mock_return) - assert find_unused_disk.no_holders(disk) is True - - --@pytest.mark.parametrize('disk, holders', holders_data) -+@pytest.mark.parametrize("disk, holders", holders_data) - def test_no_holders_false(disk, holders, monkeypatch): - def mock_return(args): - return holders -- monkeypatch.setattr(os, 'listdir', mock_return) -+ -+ monkeypatch.setattr(os, "listdir", mock_return) - assert find_unused_disk.no_holders(disk) is False - - - def test_can_open_true(monkeypatch): - def mock_return(args, flag): - return True -- monkeypatch.setattr(os, 'open', mock_return) -- assert find_unused_disk.can_open('/hello') is True -+ -+ monkeypatch.setattr(os, "open", mock_return) -+ assert find_unused_disk.can_open("/hello") is True - - - def test_can_open_false(monkeypatch): - def mock_return(args, flag): - raise OSError -- monkeypatch.setattr(os, 'open', mock_return) -- assert find_unused_disk.can_open('/hello') is False -+ -+ monkeypatch.setattr(os, "open", mock_return) -+ assert find_unused_disk.can_open("/hello") is False - - - def test_is_ignored(monkeypatch): - def mock_realpath(path): - return path -- monkeypatch.setattr(os.path, 'realpath', mock_realpath) -- assert find_unused_disk.is_ignored('/dev/sda') is False -- assert find_unused_disk.is_ignored('/dev/vda') is False -- assert find_unused_disk.is_ignored('/dev/mapper/mpatha') is False -- assert find_unused_disk.is_ignored('/dev/md/Volume0') is False -- assert find_unused_disk.is_ignored('/dev/nullb0') is True -+ -+ monkeypatch.setattr(os.path, "realpath", mock_realpath) -+ assert find_unused_disk.is_ignored("/dev/sda") is False -+ assert find_unused_disk.is_ignored("/dev/vda") is False -+ assert find_unused_disk.is_ignored("/dev/mapper/mpatha") is False -+ assert find_unused_disk.is_ignored("/dev/md/Volume0") is False -+ assert find_unused_disk.is_ignored("/dev/nullb0") is True -diff --git a/tox.ini b/tox.ini -index 92482d5..91c22a8 100644 ---- a/tox.ini -+++ b/tox.ini -@@ -13,9 +13,3 @@ configfile = .ansible-lint - setenv = - RUN_PYTEST_SETUP_MODULE_UTILS = true - RUN_PYLINT_SETUP_MODULE_UTILS = true -- --[testenv:black] --commands = bash -c 'echo black is currently not enabled - please fix this' -- --[testenv:flake8] --commands = bash -c 'echo flake8 is currently not enabled - please fix this' --- -2.30.2 - diff --git a/SOURCES/timesync-tier1-tags.diff b/SOURCES/timesync-tier1-tags.diff deleted file mode 100644 index 7d4d8eb..0000000 --- a/SOURCES/timesync-tier1-tags.diff +++ /dev/null @@ -1,362 +0,0 @@ -From e658f6f0e7906d220027c9a36bf16398fdca1564 Mon Sep 17 00:00:00 2001 -From: Rich Megginson -Date: Mon, 22 Mar 2021 13:45:01 -0600 -Subject: [PATCH] add service cleanup for downstream testing - ---- - tests/get_services_state.yml | 4 ++++ - tests/restore_services_state.yml | 23 +++++++++++++++++++++++ - tests/tests_default.yml | 10 ++++++++++ - tests/tests_default_wrapper.yml | 9 +++++++++ - tests/tests_ntp.yml | 10 ++++++++++ - tests/tests_ntp_provider1.yml | 8 ++++++++ - tests/tests_ntp_provider2.yml | 8 ++++++++ - tests/tests_ntp_provider3.yml | 8 ++++++++ - tests/tests_ntp_provider4.yml | 8 ++++++++ - tests/tests_ntp_provider5.yml | 8 ++++++++ - tests/tests_ntp_provider6.yml | 8 ++++++++ - tests/tests_ntp_ptp.yml | 10 ++++++++++ - tests/tests_ptp_multi.yml | 11 +++++++++++ - tests/tests_ptp_single.yml | 11 +++++++++++ - 14 files changed, 136 insertions(+) - create mode 100644 tests/get_services_state.yml - create mode 100644 tests/restore_services_state.yml - -diff --git a/tests/get_services_state.yml b/tests/get_services_state.yml -new file mode 100644 -index 0000000..4fe5d36 ---- /dev/null -+++ b/tests/get_services_state.yml -@@ -0,0 +1,4 @@ -+- name: Get initial state of services -+ tags: tests::cleanup -+ service_facts: -+ register: initial_state -diff --git a/tests/restore_services_state.yml b/tests/restore_services_state.yml -new file mode 100644 -index 0000000..9cc9768 ---- /dev/null -+++ b/tests/restore_services_state.yml -@@ -0,0 +1,23 @@ -+- name: Get final state of services -+ tags: tests::cleanup -+ service_facts: -+ register: final_state -+ -+- name: Restore state of services -+ tags: tests::cleanup -+ service: -+ name: "{{ item }}" -+ state: "{{ -+ 'started' -+ if initial_state.ansible_facts.services[item + '.service']['state'] == 'running' -+ else 'stopped' -+ }}" -+ when: -+ - item + '.service' in final_state.ansible_facts.services -+ - item + '.service' in initial_state.ansible_facts.services -+ with_items: -+ - chronyd -+ - ntpd -+ - ptp4l -+ - phc2sys -+ - timemaster -diff --git a/tests/tests_default.yml b/tests/tests_default.yml -index 9dc0e4c..61c1ea8 100644 ---- a/tests/tests_default.yml -+++ b/tests/tests_default.yml -@@ -3,3 +3,13 @@ - - roles: - - linux-system-roles.timesync -+ -+ pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ -+ post_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_default_wrapper.yml b/tests/tests_default_wrapper.yml -index 3090259..98be26f 100644 ---- a/tests/tests_default_wrapper.yml -+++ b/tests/tests_default_wrapper.yml -@@ -1,4 +1,7 @@ - - name: Create static inventory from hostvars -+ tags: -+# - 'tests::tier1' -+ - 'tests::slow' - hosts: all - tasks: - - name: create temporary file -@@ -15,9 +18,15 @@ - delegate_to: localhost - - - name: Run tests_default.yml normally -+ tags: -+# - 'tests::tier1' -+ - 'tests::slow' - import_playbook: tests_default.yml - - - name: Run tests_default.yml in check_mode -+ tags: -+# - 'tests::tier1' -+ - 'tests::slow' - hosts: all - tasks: - - name: Run ansible-playbook with tests_default.yml in check mode -diff --git a/tests/tests_ntp.yml b/tests/tests_ntp.yml -index 9f39d24..c5768f4 100644 ---- a/tests/tests_ntp.yml -+++ b/tests/tests_ntp.yml -@@ -20,6 +20,11 @@ - roles: - - linux-system-roles.timesync - -+ pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ - tasks: - - block: - - meta: flush_handlers -@@ -67,3 +72,8 @@ - __timesync_chrony_version is version('3.1', '>=') - when: chrony_conf is defined - tags: tests::verify -+ -+ post_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_ntp_provider1.yml b/tests/tests_ntp_provider1.yml -index 988330a..e231b18 100644 ---- a/tests/tests_ntp_provider1.yml -+++ b/tests/tests_ntp_provider1.yml -@@ -7,6 +7,10 @@ - - linux-system-roles.timesync - - pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ - - block: - - name: Remove NTP providers - package: name={{ item }} state=absent -@@ -31,3 +35,7 @@ - that: - - "'172.16.123.1' in sources.stdout" - tags: tests::verify -+ -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_ntp_provider2.yml b/tests/tests_ntp_provider2.yml -index 5a6284f..cf3e2a7 100644 ---- a/tests/tests_ntp_provider2.yml -+++ b/tests/tests_ntp_provider2.yml -@@ -7,6 +7,10 @@ - - linux-system-roles.timesync - - pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ - - block: - - name: Remove ntp - package: name=ntp state=absent -@@ -33,3 +37,7 @@ - - name: Check chronyd service - shell: chronyc -n tracking - tags: tests::verify -+ -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_ntp_provider3.yml b/tests/tests_ntp_provider3.yml -index d5117de..4b88991 100644 ---- a/tests/tests_ntp_provider3.yml -+++ b/tests/tests_ntp_provider3.yml -@@ -7,6 +7,10 @@ - - linux-system-roles.timesync - - pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ - - block: - - name: Remove chrony - package: name=chrony state=absent -@@ -33,3 +37,7 @@ - - name: Check ntpd service - shell: ntpq -c rv | grep 'associd=0' - tags: tests::verify -+ -+ - name: Import tasks -+ tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_ntp_provider4.yml b/tests/tests_ntp_provider4.yml -index c4e33c7..2e030c3 100644 ---- a/tests/tests_ntp_provider4.yml -+++ b/tests/tests_ntp_provider4.yml -@@ -8,6 +8,10 @@ - - linux-system-roles.timesync - - pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ - - block: - - name: Install chrony - package: name=chrony state=present -@@ -31,3 +35,7 @@ - - name: Check chronyd service - shell: chronyc -n tracking - tags: tests::verify -+ -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_ntp_provider5.yml b/tests/tests_ntp_provider5.yml -index 09a855a..a4fbc2d 100644 ---- a/tests/tests_ntp_provider5.yml -+++ b/tests/tests_ntp_provider5.yml -@@ -8,6 +8,10 @@ - - linux-system-roles.timesync - - pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ - - block: - - name: Install ntp - package: name=ntp state=present -@@ -31,3 +35,7 @@ - - name: Check ntpd service - shell: ntpq -c rv | grep 'associd=0' - tags: tests::verify -+ -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_ntp_provider6.yml b/tests/tests_ntp_provider6.yml -index 346b96a..31b55a1 100644 ---- a/tests/tests_ntp_provider6.yml -+++ b/tests/tests_ntp_provider6.yml -@@ -7,6 +7,10 @@ - both_avail: true - - tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ - - block: - - name: Check for availability of both NTP providers - package: name={{ item }} state=present -@@ -81,3 +85,7 @@ - when: - - not is_ntp_default - tags: tests::verify -+ -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_ntp_ptp.yml b/tests/tests_ntp_ptp.yml -index 56079a3..fba330d 100644 ---- a/tests/tests_ntp_ptp.yml -+++ b/tests/tests_ntp_ptp.yml -@@ -21,6 +21,11 @@ - roles: - - linux-system-roles.timesync - -+ pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ - tasks: - - block: - - meta: flush_handlers -@@ -49,3 +54,8 @@ - - when: "'SOF_TIMESTAMPING_TX_' in ethtool.stdout" - tags: tests::verify -+ -+ post_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_ptp_multi.yml b/tests/tests_ptp_multi.yml -index 1d1cd8e..02b44cb 100644 ---- a/tests/tests_ptp_multi.yml -+++ b/tests/tests_ptp_multi.yml -@@ -1,4 +1,5 @@ - - name: Configure time synchronization with multiple PTP domains -+ tags: tests::expfail - hosts: all - vars: - timesync_ptp_domains: -@@ -15,6 +16,11 @@ - roles: - - linux-system-roles.timesync - -+ pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ - tasks: - - block: - - meta: flush_handlers -@@ -61,3 +67,8 @@ - - when: "'SOF_TIMESTAMPING_TX_' in ethtool.stdout" - tags: tests::verify -+ -+ post_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml -diff --git a/tests/tests_ptp_single.yml b/tests/tests_ptp_single.yml -index c7ba401..b96c34c 100644 ---- a/tests/tests_ptp_single.yml -+++ b/tests/tests_ptp_single.yml -@@ -1,4 +1,5 @@ - - name: Configure time synchronization with single PTP domain -+ tags: tests::expfail - hosts: all - vars: - timesync_ptp_domains: -@@ -7,6 +8,11 @@ - roles: - - linux-system-roles.timesync - -+ pre_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: get_services_state.yml -+ - tasks: - - block: - - meta: flush_handlers -@@ -32,3 +38,8 @@ - - when: "'SOF_TIMESTAMPING_TX_' in ethtool.stdout" - tags: tests::verify -+ -+ post_tasks: -+ - name: Import tasks -+# tags: tests::tier1::cleanup -+ import_tasks: restore_services_state.yml --- -2.30.2 - diff --git a/SPECS/rhel-system-roles.spec b/SPECS/rhel-system-roles.spec index 54b8eb9..704b5a6 100644 --- a/SPECS/rhel-system-roles.spec +++ b/SPECS/rhel-system-roles.spec @@ -13,8 +13,8 @@ Name: linux-system-roles %endif Url: https://github.com/linux-system-roles/ Summary: Set of interfaces for unified system management -Version: 1.1.0 -Release: 1%{?dist} +Version: 1.2.2 +Release: 3%{?dist} #Group: Development/Libraries License: GPLv3+ and MIT and BSD @@ -54,17 +54,11 @@ BuildRequires: ansible >= 2.9.10 %endif %if %{without ansible} -# Empty command. We don't have ansible-galaxy. -%define ansible_collection_build() tar -cf %{_tmppath}/%{collection_namespace}-%{collection_name}-%{version}.tar.gz . -%else -%define ansible_collection_build() ansible-galaxy collection build -%endif - -%if %{without ansible} +# We don't have ansible-galaxy. # Simply copy everything instead of galaxy-installing the built artifact. -%define ansible_collection_install() mkdir -p %{buildroot}%{ansible_collection_files}/%{collection_name}; (cd %{buildroot}%{ansible_collection_files}/%{collection_name}; tar -xf %{_tmppath}/%{collection_namespace}-%{collection_name}-%{version}.tar.gz) +%define ansible_collection_build_install() tar -cf %{_tmppath}/%{collection_namespace}-%{collection_name}-%{version}.tar.gz .; mkdir -p %{buildroot}%{ansible_collection_files}/%{collection_name}; (cd %{buildroot}%{ansible_collection_files}/%{collection_name}; tar -xf %{_tmppath}/%{collection_namespace}-%{collection_name}-%{version}.tar.gz) %else -%define ansible_collection_install() ansible-galaxy collection install -n -p %{buildroot}%{_datadir}/ansible/collections %{collection_namespace}-%{collection_name}-%{version}.tar.gz +%define ansible_collection_build_install() ansible-galaxy collection build; ansible-galaxy collection install -n -p %{buildroot}%{_datadir}/ansible/collections %{collection_namespace}-%{collection_name}-%{version}.tar.gz %endif # For each role, call either defcommit() or deftag(). The other macros @@ -97,76 +91,76 @@ BuildRequires: ansible >= 2.9.10 %%global rolestodir %%{?rolestodir} %%{roletodir%{1}} } -%defcommit 1 bbf5784849d362cc3443fde8b09da26ea698a8ce +%defcommit 1 33ca4faa031be745c6d12220aa04caa3a8f9451f %global rolename1 postfix #%%deftag 1 0.1 -%defcommit 2 557546f922886fc1e73012f2af08ec80fec82fe2 +%defcommit 2 62ff85a9c605a7c281d4dfb5a047f322245c63b5 %global rolename2 selinux #%%deftag 2 1.1.1 -%defcommit 3 8a95989e158519ce4bebe10091c47ef88b29261b +%defcommit 3 3f69039d5ff986a74ed76bc4419da7b2efb2992a %global rolename3 timesync #%%deftag 3 1.0.0 -%defcommit 4 77596fdd976c6160d6152c200a5432c609725a14 +%defcommit 4 02fc72b482e165472624b2f68eecd2ddce1d93b1 %global rolename4 kdump #%%deftag 4 1.0.0 -%defcommit 5 0f5a882bcab58baba527015b7cde01c7c52d2254 +%defcommit 5 ae2d60a0b204f4a7ba1f27696f11d950dd882fda %global rolename5 network #%%deftag 5 1.0.0 -%defcommit 6 2c3eeb8b2dd898d8c589a0740c2ba9b707e4ed2c +%defcommit 6 b3b456183edb7b8aa6ceff7ce667d8e22009ef6a %global rolename6 storage #%%deftag 6 1.2.2 -%defcommit 7 c9b2ee085ccc741b5a9fa8a4b2a7a2f8c8551579 +%defcommit 7 384718b020c50ae274230e9dc59fc11620e03537 %global rolename7 metrics #%%deftag 7 0.1.0 -%defcommit 8 103d3996436c98dccf89e645378e76bd9add2abb +%defcommit 8 2b9e53233ee3a68bdb532e62f289733e436a6106 %global rolename8 tlog #%%deftag 8 1.1.0 -%defcommit 9 a8ab76f8076078763dacacf3384315c86b342d52 +%defcommit 9 9373303b98e09ef38df7afc8d06e5e55812096c7 %global rolename9 kernel_settings #%%deftag 9 1.0.1 -%defcommit 10 07e08107e7ccba5822f8a7aaec1a2ff0a221bede +%defcommit 10 20dd3e5520ca06dcccaa9b3f1fb428d055e0c23f %global rolename10 logging #%%deftag 10 0.2.0 -%defcommit 11 4dfc5e2aca74cb82f2a50eec7e975a2b78ad9678 +%defcommit 11 c57d0b1f3384c525738fa26ba4bdca485e162567 %global rolename11 nbde_server #%%deftag 11 1.0.1 -%defcommit 12 19f06159582550c8463f7d8492669e26fbdf760b +%defcommit 12 bef2fad5e365712d1f40e53662490ba2550a253f %global rolename12 nbde_client #%%deftag 12 1.0.1 -%defcommit 13 23f1a414ab022a506614c5be8eadf1708dc45b2b +%defcommit 13 310fc53db04e8d3134524afb7a89b0477a2ffb83 %global rolename13 certificate #%%deftag 13 1.0.1 -%defcommit 14 ff335b87017954c0b47bfe818700e0f1600b04db +%defcommit 14 b2a9857ac661fa32e66666e444b73bfdb34cdf95 %global rolename14 crypto_policies %global forgeorg15 https://github.com/willshersystems/ %global repo15 ansible-sshd %global rolename15 sshd -%defcommit 15 428d390668077f0baf5e88c5834ee810ae11113c +%defcommit 15 32f9d0dda5a801cbefad09214ec2d88b6838b943 -%defcommit 16 54bec0855966cc3eed65b26a7c90962eb103d66d +%defcommit 16 59b9fd7b25607d8bd33bdb082748955f2652846a %global rolename16 ssh -%defcommit 17 d97f48a21002497e1ac1bd1385841f2939d7b840 +%defcommit 17 6e1e37f0097db23c8b804e520e272575e9714d5f %global rolename17 ha_cluster -%defcommit 18 73e8f5e3b514a8e7a3637dc204d5c106adddeea7 +%defcommit 18 5f6cb73e6753fbdbb219b7d3079f0378b2d3bdb3 %global rolename18 vpn -%global mainid e9e30b03c0fe9387cb0ea8a5e7aac8313de2deef +%global mainid 4e47b3809a4e6c1dcd9af57fee117d6df0c261ad Source: %{url}auto-maintenance/archive/%{mainid}/auto-maintenance-%{mainid}.tar.gz Source1: %{archiveurl1} Source2: %{archiveurl2} @@ -191,29 +185,21 @@ Source18: %{archiveurl18} # Not used on Fedora. Source998: collection_readme.sh -Patch21: selinux-tier1-tags.diff - -Patch31: timesync-tier1-tags.diff - -Patch41: rhel-system-roles-kdump-pr22.diff -Patch42: kdump-tier1-tags.diff -Patch43: kdump-meta-el8.diff -Patch44: kdump-fix-newline.diff - -Patch51: network-epel-minimal.diff -# Not suitable for upstream, since the files need to be executable there -Patch52: network-tier1-tags.diff -Patch53: network-disable-bondtests.diff -Patch54: network-ansible-test.diff - -Patch61: storage-ansible-test.diff +Patch51: network-tier1-tags.diff +Patch52: network-disable-bondtests.diff BuildArch: noarch -# These are needed for md2html.sh to build the documentation -BuildRequires: asciidoc +# Requirements for md2html.sh to build the documentation +%if 0%{?fedora} || 0%{?rhel} >= 9 +BuildRequires: rubygem-kramdown-parser-gfm +%else BuildRequires: pandoc +BuildRequires: asciidoc BuildRequires: highlight +%endif + +# Requirements for galaxy_transform.py BuildRequires: python3 BuildRequires: python3-six BuildRequires: python3dist(ruamel.yaml) @@ -259,26 +245,9 @@ for rolename in %{rolenames}; do mv "${ROLESTODIR[${rolename}]}" ${rolename} done -cd %{rolename2} -%patch21 -p1 -cd .. -cd %{rolename3} -%patch31 -p1 -cd .. -cd %{rolename4} -%patch41 -p1 -%patch42 -p1 -%patch43 -p1 -%patch44 -p1 -cd .. cd %{rolename5} %patch51 -p1 %patch52 -p1 -%patch53 -p1 -%patch54 -p1 -cd .. -cd %{rolename6} -%patch61 -p1 cd .. cd %{rolename15} sed -r -i -e "s/ansible-sshd/linux-system-roles.sshd/" tests/*.yml examples/*.yml @@ -332,6 +301,16 @@ for role in %{rolenames}; do --namespace %{collection_namespace} --collection %{collection_name} done +# copy requirements.txt and bindep.txt from auto-maintenance/lsr_role2collection +if [ -f lsr_role2collection/collection_requirements.txt ]; then + cp lsr_role2collection/collection_requirements.txt \ + .collections/ansible_collections/%{collection_namespace}/%{collection_name}/requirements.txt +fi +if [ -f lsr_role2collection/collection_bindep.txt ]; then + cp lsr_role2collection/collection_bindep.txt \ + .collections/ansible_collections/%{collection_namespace}/%{collection_name}/bindep.txt +fi + rm -f .collections/ansible_collections/%{collection_namespace}/%{collection_name}/tests/sanity/ignore-2.9.txt # Merge .sanity-ansible-ignore-2.9-ROLENAME.txt into tests/sanity/ignore-2.9.txt mkdir -p .collections/ansible_collections/%{collection_namespace}/%{collection_name}/tests/sanity @@ -350,16 +329,19 @@ rm -r .collections/ansible_collections/%{collection_namespace}/%{collection_name cp -p galaxy.yml lsr_role2collection/.ansible-lint \ .collections/ansible_collections/%{collection_namespace}/%{collection_name} -# converting README.md to README.html for collection -readmes=".collections/ansible_collections/%{collection_namespace}/%{collection_name}/README.md" +# Remove table of contents from logging README.md +# It is not needed for html and AH/Galaxy +sed -i -e 's/^\(## Table of Contents\)/## Background\n\1/' \ + .collections/ansible_collections/%{collection_namespace}/%{collection_name}/roles/logging/README.md +sed -i -e '/^## Table of Contents/,/^## Background/d' \ + .collections/ansible_collections/%{collection_namespace}/%{collection_name}/roles/logging/README.md + +# Remove internal links from readme files +# They are not rendered properly on AH. for role in %{rolenames}; do - readmes="${readmes} .collections/ansible_collections/%{collection_namespace}/%{collection_name}/roles/$role/README.md" + sed -r -i -e 's/\[([^[]+)\]\(#[^)]+\)/\1/g' \ + .collections/ansible_collections/%{collection_namespace}/%{collection_name}/roles/$role/README.md done -sh md2html.sh $readmes - -pushd .collections/ansible_collections/%{collection_namespace}/%{collection_name}/ -%ansible_collection_build -popd %install mkdir -p $RPM_BUILD_ROOT%{installbase} @@ -425,29 +407,30 @@ rm $RPM_BUILD_ROOT%{installbase}/%{roleinstprefix}*/tests/.git* # must be updated if changing the file path pushd .collections/ansible_collections/%{collection_namespace}/%{collection_name}/ -%ansible_collection_install +%ansible_collection_build_install popd mkdir -p $RPM_BUILD_ROOT%{_pkgdocdir}/collection mkdir -p $RPM_BUILD_ROOT%{_pkgdocdir}/collection/roles cp -p %{buildroot}%{ansible_collection_files}/%{collection_name}/README.md \ - %{buildroot}%{ansible_collection_files}/%{collection_name}/README.html \ $RPM_BUILD_ROOT%{_pkgdocdir}/collection -# no html files in collection directory -rm -f %{buildroot}%{ansible_collection_files}/%{collection_name}/README.html for rolename in %{rolenames}; do if [ -f %{buildroot}%{ansible_collection_files}/%{collection_name}/roles/${rolename}/README.md ]; then mkdir -p $RPM_BUILD_ROOT%{_pkgdocdir}/collection/roles/${rolename} cp -p %{buildroot}%{ansible_collection_files}/%{collection_name}/roles/${rolename}/README.md \ - %{buildroot}%{ansible_collection_files}/%{collection_name}/roles/${rolename}/README.html \ $RPM_BUILD_ROOT%{_pkgdocdir}/collection/roles/${rolename} - # no html files in collection directory - rm -f %{buildroot}%{ansible_collection_files}/%{collection_name}/roles/${rolename}/README.html fi done +# converting README.md to README.html for collection in $RPM_BUILD_ROOT%{_pkgdocdir}/collection +readmes="$RPM_BUILD_ROOT%{_pkgdocdir}/collection/README.md" +for role in %{rolenames}; do + readmes="${readmes} $RPM_BUILD_ROOT%{_pkgdocdir}/collection/roles/${role}/README.md" +done +sh md2html.sh $readmes + %if %{with collection_artifact} # Copy collection artifact to /usr/share/ansible/collections/ for collection-artifact pushd .collections/ansible_collections/%{collection_namespace}/%{collection_name}/ @@ -559,6 +542,54 @@ fi %endif %changelog +* Wed Jun 16 2021 Rich Megginson - 1.2.2-3 +- Fix HTML rendering of internal links when using pandoc/asciidoc +- Uses pandoc gfm instead of markdown_github + Resolves rhbz#1962976 + +* Fri Jun 11 2021 Noriko Hosoi - 1.2.2-2 +- Make spec file available for older versions of OSes. +- Drop python3-six dependency which was used by lsr_role2collection.py. +- Drop html files from rpm if the version has no markdown parser. +- Drop unnecessary python scripts which include python3 only code, e.g., + f-strings. +- auto_maintenance - ability to convert "- ROLENAME" to "- FQCN" in the doc files such as README +- auto_maintenance - lsr_role2collection.py - Adding encoding="utf-8" to open. + Resolves rhbz#1957876 + +* Wed Jun 9 2021 Rich Megginson - 1.2.2-1 +- fix kdump tests_ssh for basic smoke test + Resolves rhbz#1957876 +- ha_cluster - cannot read preshared key in binary format + Resolves rhbz#1952620 +- Add hybrid_e2e option to PTP domain + Resolves rhbz#1957849 + +* Fri May 21 2021 Noriko Hosoi - 1.2.1-1 +- fix logging README.html examples' rendering problems + Resolves rhbz#1962374 +- fix broken internal links in README.md files + Resolves rhbz#1962976 + +* Mon May 17 2021 Sergei Petrosian - 1.2.0-2 +- Add BuildRequires: rubygem-kramdown for Fedora and RHEL >= 9 + +* Fri May 14 2021 Rich Megginson - 1.2.0-1 +- rebase roles to latest upstream + Resolves rhbz#1957876 +- use FQRN in postfix README + Resolves rhbz#1958963 +- use relayhost in postfix README + Resolves rhbz#1866544 +- network - Add support for ETHTOOL Ring option + Resolves rhbz#1959649 +- storage: calltrace observed when set type: partition for storage_pools + Resolves rhbz#1854187 + +* Thu May 13 2021 Noriko Hosoi - 1.1.0-2 +- Dependencies in the collection packaging + Resolves rhbz#1954747 + * Wed Apr 14 2021 Rich Megginson - 1.1.0-1 - rebase timesync role to latest upstream Resolves rhbz#1937938