From 169abbedffefc7bfb83b8906d493c6a2f57ded6b Mon Sep 17 00:00:00 2001 From: mg Date: Tue, 17 May 2022 12:05:45 +0200 Subject: [PATCH] =?UTF-8?q?LVM=20Konfiguration=20f=C3=BCr=20docker=20mit?= =?UTF-8?q?=20neuer=20Rolle=20umgesetzt=20(#363)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michael Grote Reviewed-on: https://git.mgrote.net/mg/ansible/pulls/363 Co-authored-by: mg Co-committed-by: mg --- group_vars/docker.yml | 15 + playbooks/3_service/docker.yml | 30 +- .../.ansible-lint | 1 + roles/mrlesmithjr.ansible-manage-lvm/.flake8 | 3 + .../.github/config.yml | 14 + .../.github/release-drafter.yml | 32 + .../.github/settings.yml | 10 + .../.github/stale.yml | 17 + .../.github/workflows/molecule.yml | 46 + .../.github/workflows/release-drafter.yml | 17 + .../.github/workflows/release-galaxy.yml | 34 + .../mrlesmithjr.ansible-manage-lvm/.gitignore | 3 + .../.travis.yml | 32 + .../.yamllint.yml | 36 + .../CHANGELOG.md | 322 +++ .../mrlesmithjr.ansible-manage-lvm/README.md | 34 + .../defaults/main.yml | 77 + .../handlers/main.yml | 2 + .../meta/main.yml | 30 + .../molecule/default/converge.yml | 29 + .../molecule/default/molecule.yml | 42 + .../molecule/default/tests/conftest.py | 21 + .../molecule/default/tests/test_default.py | 33 + .../molecule/kvm/converge.yml | 29 + .../molecule/kvm/molecule.yml | 29 + .../molecule/kvm/tests | 1 + .../molecule/kvmonlyvg/converge.yml | 14 + .../molecule/kvmonlyvg/molecule.yml | 29 + .../molecule/kvmonlyvg/tests/conftest.py | 1 + .../molecule/kvmonlyvg/tests/test_default.py | 11 + .../molecule/kvmsinglelv/converge.yml | 22 + .../molecule/kvmsinglelv/molecule.yml | 29 + .../molecule/kvmsinglelv/tests/conftest.py | 1 + .../kvmsinglelv/tests/test_default.py | 22 + .../playbook.yml | 27 + .../poetry.lock | 2174 +++++++++++++++++ .../pyproject.toml | 30 + .../requirements-dev.txt | 114 + .../requirements.txt | 11 + .../tasks/amazon.yml | 70 + .../tasks/centos.yml | 69 + .../tasks/create_fs.yml | 96 + .../tasks/create_lv.yml | 31 + .../tasks/create_vg.yml | 29 + .../tasks/debian.yml | 40 + .../tasks/main.yml | 19 + .../tasks/manage_lvm.yml | 31 + .../templates/70-ec2-nvme-devices.rules.j2 | 3 + .../templates/ebsnvme-id.j2 | 15 + .../tests/.ansible-lint | 1 + .../tests/Dockerfile.centos-7 | 27 + .../tests/Dockerfile.debian-stretch | 13 + .../tests/Dockerfile.fedora-25 | 26 + .../tests/Dockerfile.fedora-26 | 26 + .../tests/Dockerfile.ubuntu-bionic | 13 + .../tests/Dockerfile.ubuntu-xenial | 13 + .../tests/inventory | 1 + .../tests/test.yml | 5 + .../vars/main.yml | 7 + 59 files changed, 3930 insertions(+), 29 deletions(-) create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.ansible-lint create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.flake8 create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.github/config.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.github/release-drafter.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.github/settings.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.github/stale.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/molecule.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/release-drafter.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/release-galaxy.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.gitignore create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.travis.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/.yamllint.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/CHANGELOG.md create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/README.md create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/defaults/main.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/handlers/main.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/meta/main.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/default/converge.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/default/molecule.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/default/tests/conftest.py create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/default/tests/test_default.py create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/converge.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/molecule.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/tests create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/converge.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/molecule.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/tests/conftest.py create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/tests/test_default.py create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/converge.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/molecule.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/tests/conftest.py create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/tests/test_default.py create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/playbook.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/poetry.lock create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/pyproject.toml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/requirements-dev.txt create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/requirements.txt create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tasks/amazon.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tasks/centos.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tasks/create_fs.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tasks/create_lv.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tasks/create_vg.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tasks/debian.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tasks/main.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tasks/manage_lvm.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/templates/70-ec2-nvme-devices.rules.j2 create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/templates/ebsnvme-id.j2 create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tests/.ansible-lint create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.centos-7 create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.debian-stretch create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.fedora-25 create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.fedora-26 create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.ubuntu-bionic create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.ubuntu-xenial create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tests/inventory create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/tests/test.yml create mode 100644 roles/mrlesmithjr.ansible-manage-lvm/vars/main.yml diff --git a/group_vars/docker.yml b/group_vars/docker.yml index 7ee331eb..fc3d62ad 100644 --- a/group_vars/docker.yml +++ b/group_vars/docker.yml @@ -1,4 +1,19 @@ --- + ### mrlesmithjr.ansible-manage-lvm + lvm_groups: + - vgname: vg_docker + disks: + - /dev/sdb + create: true + lvnames: + - lvname: lv_docker + size: 100%FREE + create: true + filesystem: xfs + mount: true + mntp: /var/lib/docker + manage_lvm: true + ### mgrote.user users: - username: mg diff --git a/playbooks/3_service/docker.yml b/playbooks/3_service/docker.yml index aee014c8..5c1bb4a9 100644 --- a/playbooks/3_service/docker.yml +++ b/playbooks/3_service/docker.yml @@ -1,35 +1,7 @@ --- - hosts: docker - pre_tasks: - - name: create pv + vg for docker - become: true - community.general.lvg: - vg: vg_docker - pvs: /dev/sdb - state: present - - name: create lv for docker - become: true - community.general.lvol: - state: present - vg: vg_docker - lv: lv_docker - size: +100%FREE - - name: create fs on lv - become: true - community.general.filesystem: - fstype: xfs - dev: /dev/mapper/vg_docker-lv_docker - - name: mount lv - become: true - ansible.posix.mount: - path: /var/lib/docker - src: /dev/mapper/vg_docker-lv_docker - state: mounted - fstype: xfs - boot: yes - - roles: + - { role: mrlesmithjr.ansible-manage-lvm, tags: "lvm", become: true } - { role: geerlingguy.pip, tags: "pip", become: true } - { role: geerlingguy.docker, tags: "docker", become: true } - { role: gantsign.ctop, tags: "ctop", become: true } diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.ansible-lint b/roles/mrlesmithjr.ansible-manage-lvm/.ansible-lint new file mode 100644 index 00000000..e83e3089 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.ansible-lint @@ -0,0 +1 @@ +skip_list: [] diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.flake8 b/roles/mrlesmithjr.ansible-manage-lvm/.flake8 new file mode 100644 index 00000000..ee188520 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.flake8 @@ -0,0 +1,3 @@ +[flake8] +exclude = .venv/ +max-line-length = 88 diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.github/config.yml b/roles/mrlesmithjr.ansible-manage-lvm/.github/config.yml new file mode 100644 index 00000000..47ca920e --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.github/config.yml @@ -0,0 +1,14 @@ +# Configuration for request-info - https://github.com/behaviorbot/request-info + +# *Required* Comment to reply with +requestInfoReplyComment: > + We would appreciate it if you could provide us with more info about this issue/pr! + +# *OPTIONAL* default titles to check against for lack of descriptiveness +# MUST BE ALL LOWERCASE +requestInfoDefaultTitles: + - update readme.md + - updates + +# *OPTIONAL* Label to be added to Issues and Pull Requests with insufficient information given +requestInfoLabelToAdd: needs-more-info diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.github/release-drafter.yml b/roles/mrlesmithjr.ansible-manage-lvm/.github/release-drafter.yml new file mode 100644 index 00000000..5d89759e --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.github/release-drafter.yml @@ -0,0 +1,32 @@ +name-template: "v$RESOLVED_VERSION ๐ŸŒˆ" +tag-template: "v$RESOLVED_VERSION" +categories: + - title: "๐Ÿš€ Features" + labels: + - "feature" + - "enhancement" + - title: "๐Ÿ› Bug Fixes" + labels: + - "fix" + - "bugfix" + - "bug" + - title: "๐Ÿงฐ Maintenance" + label: "chore" + - title: "๐Ÿงบ Miscellaneous" #Everything except ABAP + label: "misc" +change-template: "- $TITLE @$AUTHOR (#$NUMBER)" +change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. +version-resolver: + major: + labels: + - "major" + minor: + labels: + - "minor" + patch: + labels: + - "patch" + default: patch +template: | + ## Changes + $CHANGES diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.github/settings.yml b/roles/mrlesmithjr.ansible-manage-lvm/.github/settings.yml new file mode 100644 index 00000000..c457adeb --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.github/settings.yml @@ -0,0 +1,10 @@ +# These settings are synced to GitHub by https://probot.github.io/apps/settings/ + +repository: + # See https://developer.github.com/v3/repos/#edit for all available settings. + + # The name of the repository. Changing this will rename the repository + name: ansible-manage-lvm + + # A short description of the repository that will show up on GitHub + description: Ansible role to manage LVM Groups/Logical Volumes diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.github/stale.yml b/roles/mrlesmithjr.ansible-manage-lvm/.github/stale.yml new file mode 100644 index 00000000..dc90e5a1 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: wontfix +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/molecule.yml b/roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/molecule.yml new file mode 100644 index 00000000..11ab7084 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/molecule.yml @@ -0,0 +1,46 @@ +--- +name: Molecule +on: + push: + branches-ignore: + - main + - master + pull_request: + branches: + - develop + - main + - master + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + lint: + # The type of runner that the job will run on + runs-on: macos-10.15 + strategy: + fail-fast: false + max-parallel: 4 + matrix: + python-version: [3.8] + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - uses: actions/checkout@v2 + with: + submodules: recursive + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt -r requirements-dev.txt + - name: molecule lint + run: | + molecule lint diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/release-drafter.yml b/roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/release-drafter.yml new file mode 100644 index 00000000..689fc73b --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/release-drafter.yml @@ -0,0 +1,17 @@ +name: Release Drafter + +on: + push: + # branches to consider in the event; optional, defaults to all + branches: + - main + - master + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + # Drafts your next Release notes as Pull Requests are merged into "master" + - uses: release-drafter/release-drafter@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/release-galaxy.yml b/roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/release-galaxy.yml new file mode 100644 index 00000000..b96555a4 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.github/workflows/release-galaxy.yml @@ -0,0 +1,34 @@ +--- +name: Ansible Galaxy +on: + push: + branches: + - main + - master + release: + types: + - published + +jobs: + galaxy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: recursive + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt -r requirements-dev.txt + - name: Trigger a new import on Galaxy. + run: ansible-galaxy role import --api-key ${{ secrets.GALAXY_API_KEY }} $(echo ${{ github.repository }} | cut -d/ -f1) $(echo ${{ github.repository }} | cut -d/ -f2) diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.gitignore b/roles/mrlesmithjr.ansible-manage-lvm/.gitignore new file mode 100644 index 00000000..02e68f3d --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.gitignore @@ -0,0 +1,3 @@ +.idea +**/__pycache__ +.venv/ diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.travis.yml b/roles/mrlesmithjr.ansible-manage-lvm/.travis.yml new file mode 100644 index 00000000..c8e05ae5 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.travis.yml @@ -0,0 +1,32 @@ +--- +dist: bionic + +language: python +python: + - "3.8" + +before_install: + - | + sudo apt -y install bridge-utils dnsmasq-base ebtables libvirt-bin libvirt-dev qemu-kvm qemu-utils ruby-dev + + - | + wget https://releases.hashicorp.com/vagrant/2.2.7/vagrant_2.2.7_x86_64.deb + sudo apt -y install ./vagrant_2.2.7_x86_64.deb + sudo vagrant plugin install vagrant-libvirt + + - | + sudo apt-get -y purge python3-openssl && sudo apt-get -y autoremove + sudo apt-get update && sudo apt-get install -y ca-certificates curl gcc iproute2 python3 python3-dev sudo + curl -skL https://bootstrap.pypa.io/get-pip.py | sudo -H python3 + sudo pip3 install wheel + sudo pip3 install netaddr python-vagrant yamllint testinfra flake8 + sudo pip3 install ansible ansible-lint + sudo pip3 install -I molecule molecule-vagrant + +script: + - | + sudo molecule test --scenario-name kvm + sudo molecule test --scenario-name kvmsinglelv + sudo molecule test --scenario-name kvmonlyvg +notifications: + webhooks: https://galaxy.ansible.com/api/v1/notifications/ diff --git a/roles/mrlesmithjr.ansible-manage-lvm/.yamllint.yml b/roles/mrlesmithjr.ansible-manage-lvm/.yamllint.yml new file mode 100644 index 00000000..f09307db --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/.yamllint.yml @@ -0,0 +1,36 @@ +--- +# Based on ansible-lint config +extends: default + +ignore: | + .venv/ + +rules: + braces: + max-spaces-inside: 1 + level: error + brackets: + max-spaces-inside: 1 + level: error + colons: + max-spaces-after: -1 + level: error + commas: + max-spaces-after: -1 + level: error + comments: disable + comments-indentation: disable + document-start: disable + empty-lines: + max: 3 + level: error + hyphens: + level: error + indentation: disable + key-duplicates: enable + line-length: disable + new-line-at-end-of-file: disable + new-lines: + type: unix + trailing-spaces: disable + truthy: disable diff --git a/roles/mrlesmithjr.ansible-manage-lvm/CHANGELOG.md b/roles/mrlesmithjr.ansible-manage-lvm/CHANGELOG.md new file mode 100644 index 00000000..f40f9fb4 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/CHANGELOG.md @@ -0,0 +1,322 @@ +commit 881d5d77fa435ccaa026c3341d0d2ac1fb537b98 +Author: Larry Smith Jr +Date: Mon Apr 27 11:26:18 2020 -0400 + + Fixing syntax issue for wantlist + +commit 89360e3ffef9ff1dbbb5ad525a7ee1d77e6b8895 +Author: Larry Smith Jr +Date: Mon Apr 27 11:16:02 2020 -0400 + + Trying to fix the subelements lookup for a single element + + This addresses #42. Will need to do some validation testing, etc. + +commit c6a7034e4b0b381c5c5b44a15ce7baad7eab9c1b +Author: Charlie Mordant +Date: Fri Apr 24 17:22:07 2020 +0200 + + remove unused molecule env property + +commit 883055c33f2d6b4c0df8e61ce49771c451905334 +Author: Charlie Mordant +Date: Thu Apr 23 19:38:35 2020 +0200 + + lint + +commit 325c2d6240022fe17abf40dffee842ccf79543f1 +Author: Charlie Mordant +Date: Thu Apr 23 19:25:09 2020 +0200 + + install xfs + +commit 4a1177e420fd9632f77d07ce0a19f89a1515f8eb +Author: Charlie Mordant +Date: Tue Apr 21 19:01:29 2020 +0200 + + use xfs_info on mountpoint instead of lvm + +commit 7fd5a8eec9f4b5110929862056ab88c4db3f14de +Author: Larry Smith Jr +Date: Sun Apr 19 01:59:29 2020 -0400 + + Only doing a Molecule lint at this time + +commit 7e2a076b0a8155015fd21502db860fa89a2114b3 +Author: Larry Smith Jr +Date: Sun Apr 19 01:44:38 2020 -0400 + + Added Python requirements for testing, etc. + + Closes #33 + +commit dadb9f24f7ebc2752e6495c4c3569bdee5e0cc68 +Author: Charlie Mordant +Date: Fri Apr 17 13:12:06 2020 +0200 + + remove unwanted files + +commit 2f63eab727cf7b0b389d0d0cc1a1c7236b71f839 +Author: Charlie Mordant +Date: Fri Apr 17 12:56:31 2020 +0200 + + code smells + +commit 050f8a56f10d81f7827be53b8c769b1aa5021c00 +Author: Charlie Mordant +Date: Wed Apr 15 19:08:34 2020 +0200 + + typo in check + +commit b955a6f073b91773f5f90da878268e74872a99e9 +Author: Charlie Mordant +Date: Wed Apr 15 18:54:17 2020 +0200 + + remove unwanted newline + +commit f81937e9d82bc48f2ee03f6ff462c32bca3da8f0 +Author: Charlie Mordant +Date: Wed Apr 15 18:52:52 2020 +0200 + + makes xfs mountpoint repeatable + +commit 1c3818e5d06887c01dc0a4b88a39c0561a446300 +Author: Charlie Mordant +Date: Wed Apr 15 17:34:53 2020 +0200 + + mistake on remove volume + +commit 47f8dae16a096050dccbb8d161f4a18946a6ae73 +Author: Charlie Mordant +Date: Wed Apr 15 17:13:38 2020 +0200 + + github action lint + +commit 96fa78d6d099d0a48642d377d3e7f30a0c554bdf +Author: Charlie Mordant +Date: Wed Apr 15 17:07:33 2020 +0200 + + remove deprecated machines + +commit 17e8ec1058c5cb66b21b15a8d3912ac9980508a9 +Author: Charlie Mordant +Date: Wed Apr 15 16:56:18 2020 +0200 + + configured molecule and fix xfs on centos + +commit ba5d929fce982af9baa44cfe8ad0b3079133f444 +Author: Charlie Mordant +Date: Wed Apr 15 15:14:30 2020 +0200 + + use dots instead of carets + +commit ea9109220bb268b5f14e75e38d9fb32c2d79bae5 +Author: Charlie Mordant +Date: Wed Apr 15 14:33:41 2020 +0200 + + molecule test and idempotence + +commit d8b3a4e93257dfeb79bc8d4ef349acb53f0019dc +Author: Samuel Mutel +Date: Mon Oct 14 12:21:03 2019 +0200 + + bug: Resize XFS parts is not working + +commit b15ecea51d0045a89aae24e4b0c108b35f060b2c +Author: Tony Peรฑa +Date: Wed Jun 26 14:56:13 2019 +0200 + + Update debian.yml + + Since ansible 2.8.0 must be change way using dict + +commit 9788ee5df68798ad94f11c8133b1d62ff409d0e8 +Author: Michele Caputo +Date: Mon Apr 8 14:16:04 2019 +0200 + + issue #23: extra parenthesis + +commit 0f428a0e40d71aea410fbc1aa329203c0b4f15cd +Author: faisalnizam +Date: Tue Mar 26 10:48:45 2019 +0400 + + FIX LINT FOR BUILD + + FIX LINT FOR BUILD + +commit 8957630c04b8befa99c08ed667e43d95198202ce +Author: faisalnizam +Date: Tue Mar 26 10:40:11 2019 +0400 + + Adding SWAP FileSystem Exception + + Adding Check for SWAP Filesystem if defined skip + 1. SKIP New Filesystem Creation + 2. SKIP mountpoint check + +commit 183087e767cbce08ce2da1a3b04f47d3fc03a7e6 +Author: Larry Smith Jr +Date: Tue Apr 2 08:03:42 2019 -0400 + + Resolves #21 + +commit b3ef85d4f738597260d9db0d90e84d0f8721259a +Author: Larry Smith Jr +Date: Wed Dec 5 08:39:10 2018 -0500 + + Added skip codes for ansible-lint + +commit 9f4afa7afb3fedc270c44ff1fa357da4b87845c0 +Author: Larry Smith Jr +Date: Wed Dec 5 08:00:13 2018 -0500 + + Fixing Travis testing and yamllint issues + +commit 5603c5f6b0899a1b2cdeeeb3c035eb6249e96fa7 +Author: Larry Smith Jr +Date: Wed Dec 5 07:51:31 2018 -0500 + + Added Travis testing and hooks for galaxy + +commit 563aa1effba936340cbaad9766a49f570292edee +Author: Mark Goddard +Date: Wed Oct 31 11:42:20 2018 +0000 + + Fix indentation + +commit 4a58cb36cf6d4dd4bb23e86972658be508cca082 +Author: Mark Goddard +Date: Wed Oct 31 11:16:27 2018 +0000 + + Update tasks/manage_lvm.yml + + Co-Authored-By: oneswig + +commit a0c784797f538fc5393d75589ac48e86c51e88db +Author: Stig Telfer +Date: Wed Oct 31 10:16:44 2018 +0100 + + Support not formatting volumes. + + Logic to make the filesystem attribute optional, in situations where + we do not want the volumes formatted. + +commit 66368de1d3d2b6712cbf66fc3dd0962705bf86f9 +Author: David Castellanos +Date: Mon Dec 18 00:33:45 2017 +0100 + + Add opts and mopts support + +commit 386cc28bdb58886ed492d3438c9cb088d36de161 +Author: Larry Smith Jr +Date: Sun Jun 11 14:57:53 2017 -0400 + + Addresses issue #10 + + Signed-off-by: Larry Smith Jr + +commit 0d255cb5ce9e6016a503203c2ed39a70fb0ccd9c +Author: Larry Smith Jr +Date: Fri May 5 09:12:25 2017 -0400 + + Fixes issue #8 + + Signed-off-by: Larry Smith Jr + +commit f2d06d0d46086da0191b4dbde0d420e709e3ea01 +Author: Stefan Heimberg +Date: Thu Apr 6 00:25:55 2017 +0200 + + added support for btrfs + +commit 7749d0c62a6e1539aff94c57fd2c0eeaf43dd1a0 +Author: Kevin Loveland +Date: Fri Nov 18 10:26:16 2016 -0800 + + Fixed issue with idempotency of lvol module. See ansible-module-extras issue #428 + +commit 3ad965237280d534f0aab0027f9ef61701354e8b +Author: Kevin Loveland +Date: Thu Nov 17 15:17:26 2016 -0800 + + Changes to adjust to removal of bare vars in Ansible 2.2 + +commit a82877c290cfe0b62eda90d8874b8e2b62402946 +Author: Larry Smith Jr +Date: Sun Oct 2 09:58:47 2016 -0400 + + First commit of CHANGELOG + + Signed-off-by: Larry Smith Jr + +commit 99366fa547faccb0359dd8d3b19cec802640eb95 +Author: Rohit Kothari +Date: Thu Sep 29 17:59:19 2016 -0700 + + Replace system-storage-manager with lvm2 in centos + +commit ca1535d774b4e3310fc993841f1f99400612c7a5 +Author: Olivier LOCARD +Date: Fri Sep 23 16:21:07 2016 +0200 + + Add xfs_growfs for xfs systemfile type. + +commit bb87fa8dbff5df50ed376db74a6d2b95f64fd745 +Author: Larry Smith Jr +Date: Tue Nov 3 10:39:58 2015 -0500 + + updated vars and conditionals + +commit 49b20e2e4a80581f1c53559ff4073b3384eae28c +Author: Larry Smith Jr +Date: Tue Nov 3 10:24:54 2015 -0500 + + updated when conditions + +commit 0232734bed92e976376d4c9f2550b515f72f3d54 +Author: Larry Smith Jr +Date: Tue Nov 3 10:22:09 2015 -0500 + + updated tasks to only work when lvnames is defined + +commit 9f592112095208843da1fd69a658bd49c163a7bb +Author: Larry Smith Jr +Date: Tue Nov 3 09:37:38 2015 -0500 + + updated vars and meta + +commit 686455514d8bc0da70b3440dbc5afe669188d333 +Author: Larry Smith Jr +Date: Tue Nov 3 09:22:00 2015 -0500 + + cleaned up and fixed all tasks including swap + +commit 9f5c61e25599a130e1625e879438561cc1f6a437 +Author: Larry Smith Jr +Date: Mon Nov 2 23:38:38 2015 -0500 + + added new task + +commit a5103ff6396138f531cf8457f16706b6fc90d1d1 +Author: Larry Smith Jr +Date: Mon Nov 2 23:38:23 2015 -0500 + + changing role tasks and vars + +commit c776e9f339f0bcfe987aa571d29411ac44a29526 +Author: Larry Smith Jr +Date: Mon Nov 2 21:50:07 2015 -0500 + + updated meta + +commit 46e0fd1fc2477693fc66aa4b38ac7bde19087047 +Author: Larry Smith Jr +Date: Mon Nov 2 21:23:59 2015 -0500 + + updated meta + +commit d1d99b2f17d3bc46a479af5d01a976686429b7ce +Author: Larry Smith Jr +Date: Mon Nov 2 21:23:03 2015 -0500 + + first commit diff --git a/roles/mrlesmithjr.ansible-manage-lvm/README.md b/roles/mrlesmithjr.ansible-manage-lvm/README.md new file mode 100644 index 00000000..9e81f9ce --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/README.md @@ -0,0 +1,34 @@ +# ansible-manage-lvm + +Ansible role to manage LVM Groups/Logical Volumes. + +> NOTE: Can be used to create, extend or resize LVM Groups and volumes. + +## Requirements + +Devices/disks to be members of the LVM setup **must be** identified prior to +using this role. + +## Role Variables + +[defaults/main.yml](defaults/main.yml) + +## Dependencies + +None + +## Example Playbook + +[playbook.yml](playbook.yml) + +## License + +MIT + +## Author Information + +Larry Smith Jr. + +- [@mrlesmithjr](https://twitter.com/mrlesmithjr) +- [mrlesmithjr@gmail.com](mailto:mrlesmithjr@gmail.com) +- [http://everythingshouldbevirtual.com](http://everythingshouldbevirtual.com) diff --git a/roles/mrlesmithjr.ansible-manage-lvm/defaults/main.yml b/roles/mrlesmithjr.ansible-manage-lvm/defaults/main.yml new file mode 100644 index 00000000..5ade5ec0 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/defaults/main.yml @@ -0,0 +1,77 @@ +--- +# defaults file for ansible-manage-lvm +lvm_groups: [] +# - vgname: ubuntu-vg +# disks: +# - /dev/sda5 +# - /dev/sdc +# - /dev/sdd +# # defines if VG should exist or be removed +# # true or false +# create: true +# lvnames: +# - lvname: swap_1 +# # Define size of lvol +# # 100%FREE, 10g, 1024 (megabytes by default) +# size: 5g +# # Defines additional lvcreate options (e.g. stripes, stripesize, etc) +# opts: '' +# # Defines if lvol should exist or be removed +# # true or false +# create: true +# # Defines filesystem to format lvol as +# filesystem: swap +# # Defines if filesystem should be mounted +# mount: false +# # Defines mountpoint for lvol +# mntp: [] +# # Defines additional mount options (e.g. noatime, noexec, etc) +# mopts: '' +# - lvname: root +# size: 40g +# create: true +# filesystem: ext4 +# mount: true +# mntp: / +# - vgname: test-vg +# disks: +# - /dev/sdb +# create: true +# lvnames: +# - lvname: test_1 +# size: 5g +# create: true +# filesystem: ext4 +# mount: true +# mntp: /mnt/test_1 +# - lvname: test_2 +# size: 10g +# create: true +# filesystem: ext4 +# mount: true +# mntp: /mnt/test_2 +# - vgname: cinder-volumes +# disks: +# - /dev/cciss/c0d1 +# create: true +# lvnames: +# # Set to None to only create LVM VG w/out creating LVM LVOLS +# - None + +# Defines if LVM will be managed by role +# default is false to ensure nothing is changed by accident. +manage_lvm: false + +### nvme to scsi device name map binary helper +ebsnvme_binary_helper_ver: '0.1.3' +ebsnvme_binary_helper_tmp: '/tmp' +ebsnvme_binary_helper_path: '/sbin/go-ebsnvme' + +### nvme to scsi device name map script helper +ebsnvme_scrip_helper_path: '/usr/local/bin/ebsnvme-id' + +### auto pvresize (waiting until ansible 2.10 or above as collections have new lvg with integrated pvresize) +### waiting for new module in collection set to true or run pvresize manually on remote systems +### https://docs.ansible.com/ansible/3/collections/community/general/lvg_module.html +### +pvresize_to_max: false diff --git a/roles/mrlesmithjr.ansible-manage-lvm/handlers/main.yml b/roles/mrlesmithjr.ansible-manage-lvm/handlers/main.yml new file mode 100644 index 00000000..2027eb20 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for ansible-manage-lvm diff --git a/roles/mrlesmithjr.ansible-manage-lvm/meta/main.yml b/roles/mrlesmithjr.ansible-manage-lvm/meta/main.yml new file mode 100644 index 00000000..55c95ed9 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/meta/main.yml @@ -0,0 +1,30 @@ +--- +galaxy_info: + author: Larry Smith Jr. + description: Ansible role to manage(create, extend, resize) LVM Groups/Logical Volumes. + namespace: mrlesmithjr + role_name: manage-lvm + + license: MIT + min_ansible_version: 1.2 + platforms: + - name: fedora + versions: + - 31 + + - name: EL + versions: + - all + - name: Fedora + versions: + - all + - name: Ubuntu + versions: + - all + - name: Debian + versions: + - all + galaxy_tags: + - system + - lvm +dependencies: [] diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/converge.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/converge.yml new file mode 100644 index 00000000..119de5da --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/converge.yml @@ -0,0 +1,29 @@ +--- +- name: Converge + hosts: all + vars: + lvm_groups: + - vgname: my_vg + disks: + - /dev/sdb1 + create: true + lvnames: + - lvname: my_lv + size: 40%VG + opts: "--wipesignatures y" + create: true + filesystem: ext4 + mount: true + mntp: "/var/lib/mountpoint" + - lvname: my_lw + size: 20%VG + opts: "--wipesignatures y" + mount: true + create: true + filesystem: xfs + mntp: "/var/lib/mountpoint2" + manage_lvm: true + tasks: + - name: "Include lvm" + include_role: + name: "ansible-manage-lvm" diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/molecule.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/molecule.yml new file mode 100644 index 00000000..fcb031f1 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/molecule.yml @@ -0,0 +1,42 @@ +--- +driver: + name: vagrant + provider: + name: virtualbox +lint: | + yamllint . + ansible-lint + flake8 +platforms: + - name: CentOS-Molecule-LVM + box: mrlesmithjr/centos7 + provider_override_args: + - "persistent_storage.enabled = true" + - "persistent_storage.location = 'centos-molecule-lvm.vdi'" + - "persistent_storage.size = 100" + - "persistent_storage.mount = false" + - "persistent_storage.diskdevice = '/dev/sdb'" + - name: Fedora-Molecule-LVM + box: mrlesmithjr/fedora31 + provider_override_args: + - "persistent_storage.enabled = true" + - "persistent_storage.location = 'fedora-molecule-lvm.vdi'" + - "persistent_storage.size = 100" + - "persistent_storage.mount = false" + - "persistent_storage.diskdevice = '/dev/sdb'" + - name: Ubuntu-Molecule-LVM + box: mrlesmithjr/bionic64 + provider_override_args: + - "persistent_storage.enabled = true" + - "persistent_storage.location = 'ubuntu-molecule-lvm.vdi'" + - "persistent_storage.size = 100" + - "persistent_storage.mount = false" + - "persistent_storage.diskdevice = '/dev/sdb'" +provisioner: + name: ansible +verifier: + name: testinfra + env: + PYTHONWARNINGS: "ignore:.*U.*mode is deprecated:DeprecationWarning" + options: + v: 1 diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/tests/conftest.py b/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/tests/conftest.py new file mode 100644 index 00000000..7bd27430 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/tests/conftest.py @@ -0,0 +1,21 @@ +"""PyTest Fixtures.""" +from __future__ import absolute_import +import os +import pytest + + +def pytest_runtest_setup(item): + """Run tests only when under molecule with testinfra installed.""" + try: + import testinfra + except ImportError: + pytest.skip("Test requires testinfra", allow_module_level=True) + if "MOLECULE_INVENTORY_FILE" in os.environ: + pytest.testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( + os.environ["MOLECULE_INVENTORY_FILE"] + ).get_hosts("all") + else: + pytest.skip( + "Test should run only from inside molecule.", + allow_module_level=True + ) diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/tests/test_default.py b/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/tests/test_default.py new file mode 100644 index 00000000..9df90df9 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/tests/test_default.py @@ -0,0 +1,33 @@ +"""Role testing files using testinfra.""" + + +def test_lvm_package_shall_be_installed(host): + assert host.package("lvm2").is_installed + + +def test_non_persistent_volume_group_is_created(host): + command = """sudo vgdisplay | grep -c 'my_vg'""" + cmd = host.run(command) + assert '1' in cmd.stdout + + +def test_mylv_logical_volume_is_created(host): + command = """sudo lvs -o lv_name my_vg --separator='|' --noheadings \ + | grep -c 'my_lv'""" + cmd = host.run(command) + assert int(cmd.stdout.rstrip()) >= 1 + + +def test_mylv_logical_volume2_is_created(host): + command = """sudo lvs -o lv_name my_vg --separator='|' --noheadings \ + | grep -c 'my_lw'""" + cmd = host.run(command) + assert int(cmd.stdout.rstrip()) >= 1 + + +def test_volume_is_mounted(host): + host.file("/var/lib/mountpoint").mode == 0o731 + + +def test_volume2_is_mounted(host): + host.file("/var/lib/mountpoint2").mode == 0o731 diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/converge.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/converge.yml new file mode 100644 index 00000000..ab055c73 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/converge.yml @@ -0,0 +1,29 @@ +--- +- name: Converge + hosts: all + vars: + lvm_groups: + - vgname: my_vg + disks: + - /dev/vdb + create: true + lvnames: + - lvname: my_lv + size: 40%VG + opts: "--wipesignatures y" + create: true + filesystem: ext4 + mount: true + mntp: "/var/lib/mountpoint" + - lvname: my_lw + size: 20%VG + opts: "--wipesignatures y" + mount: true + create: true + filesystem: xfs + mntp: "/var/lib/mountpoint2" + manage_lvm: true + tasks: + - name: "Include lvm" + include_role: + name: "ansible-manage-lvm" diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/molecule.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/molecule.yml new file mode 100644 index 00000000..225c751c --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/molecule.yml @@ -0,0 +1,29 @@ +--- +driver: + name: vagrant + provider: + name: libvirt +lint: yamllint . && flake8 && ansible-lint +platforms: + - name: Fedora-Molecule-Volumes-KVM + box: fedora/31-cloud-base + cpu: 2 + memory: 2048 + provider_raw_config_args: + - "storage :file, :size => '1G', :device => 'vdb'" +provisioner: + name: ansible + config_options: + defaults: + forks: 20 + ssh_connection: + pipelining: true + ssh_args: -o ControlMaster=auto -o ControlPersist=600s +verifier: + name: testinfra + env: + PYTHONWARNINGS: "ignore:.*U.*mode is deprecated:DeprecationWarning" + options: + v: 1 +scenario: + name: kvm diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/tests b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/tests new file mode 100644 index 00000000..5456f39e --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/tests @@ -0,0 +1 @@ +../default/tests \ No newline at end of file diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/converge.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/converge.yml new file mode 100644 index 00000000..be123c46 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/converge.yml @@ -0,0 +1,14 @@ +--- +- name: Converge + hosts: all + vars: + lvm_groups: + - vgname: my_vg + disks: + - /dev/vdb + create: true + manage_lvm: true + tasks: + - name: "Include lvm" + include_role: + name: "ansible-manage-lvm" diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/molecule.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/molecule.yml new file mode 100644 index 00000000..c70fec05 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/molecule.yml @@ -0,0 +1,29 @@ +--- +driver: + name: vagrant + provider: + name: libvirt +lint: yamllint . && flake8 && ansible-lint +platforms: + - name: Fedora-Molecule-Volumes-KVM + box: fedora/31-cloud-base + cpu: 2 + memory: 2048 + provider_raw_config_args: + - "storage :file, :size => '1G', :device => 'vdb'" +provisioner: + name: ansible + config_options: + defaults: + forks: 20 + ssh_connection: + pipelining: true + ssh_args: -o ControlMaster=auto -o ControlPersist=600s +verifier: + name: testinfra + env: + PYTHONWARNINGS: "ignore:.*U.*mode is deprecated:DeprecationWarning" + options: + v: 1 +scenario: + name: kvmonlyvg diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/tests/conftest.py b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/tests/conftest.py new file mode 100644 index 00000000..add822b0 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/tests/conftest.py @@ -0,0 +1 @@ +../../default/tests/conftest.py \ No newline at end of file diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/tests/test_default.py b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/tests/test_default.py new file mode 100644 index 00000000..b03947a9 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/tests/test_default.py @@ -0,0 +1,11 @@ +"""Role testing files using testinfra.""" + + +def test_lvm_package_shall_be_installed(host): + assert host.package("lvm2").is_installed + + +def test_non_persistent_volume_group_is_created(host): + command = """sudo vgdisplay | grep -c 'my_vg'""" + cmd = host.run(command) + assert '1' in cmd.stdout diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/converge.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/converge.yml new file mode 100644 index 00000000..09d88bd8 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/converge.yml @@ -0,0 +1,22 @@ +--- +- name: Converge + hosts: all + vars: + lvm_groups: + - vgname: my_vg + disks: + - /dev/vdb + create: true + lvnames: + - lvname: my_lv + size: 40%VG + opts: "--wipesignatures y" + create: true + filesystem: ext4 + mount: true + mntp: "/var/lib/mountpoint" + manage_lvm: true + tasks: + - name: "Include lvm" + include_role: + name: "ansible-manage-lvm" diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/molecule.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/molecule.yml new file mode 100644 index 00000000..0e94bc02 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/molecule.yml @@ -0,0 +1,29 @@ +--- +driver: + name: vagrant + provider: + name: libvirt +lint: yamllint . && flake8 && ansible-lint +platforms: + - name: Fedora-Molecule-Volumes-KVM + box: fedora/31-cloud-base + cpu: 2 + memory: 2048 + provider_raw_config_args: + - "storage :file, :size => '1G', :device => 'vdb'" +provisioner: + name: ansible + config_options: + defaults: + forks: 20 + ssh_connection: + pipelining: true + ssh_args: -o ControlMaster=auto -o ControlPersist=600s +verifier: + name: testinfra + env: + PYTHONWARNINGS: "ignore:.*U.*mode is deprecated:DeprecationWarning" + options: + v: 1 +scenario: + name: kvmsinglelv diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/tests/conftest.py b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/tests/conftest.py new file mode 100644 index 00000000..add822b0 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/tests/conftest.py @@ -0,0 +1 @@ +../../default/tests/conftest.py \ No newline at end of file diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/tests/test_default.py b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/tests/test_default.py new file mode 100644 index 00000000..ad9e53af --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/tests/test_default.py @@ -0,0 +1,22 @@ +"""Role testing files using testinfra.""" + + +def test_lvm_package_shall_be_installed(host): + assert host.package("lvm2").is_installed + + +def test_non_persistent_volume_group_is_created(host): + command = """sudo vgdisplay | grep -c 'my_vg'""" + cmd = host.run(command) + assert '1' in cmd.stdout + + +def test_mylv_logical_volume_is_created(host): + command = """sudo lvs -o lv_name my_vg --separator='|' --noheadings \ + | grep -c 'my_lv'""" + cmd = host.run(command) + assert int(cmd.stdout.rstrip()) >= 1 + + +def test_volume_is_mounted(host): + host.file("/var/lib/mountpoint").mode == 0o731 diff --git a/roles/mrlesmithjr.ansible-manage-lvm/playbook.yml b/roles/mrlesmithjr.ansible-manage-lvm/playbook.yml new file mode 100644 index 00000000..6b69e5ae --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/playbook.yml @@ -0,0 +1,27 @@ +--- +- hosts: test-nodes + vars: + lvm_groups: + - vgname: test-vg + disks: + - /dev/sdb + - /dev/sdc + create: true + lvnames: + - lvname: test_1 + size: 5g + create: true + filesystem: ext4 + mount: true + mntp: /mnt/test_1 + - lvname: test_2 + size: 10g + create: true + filesystem: ext4 + mount: true + mntp: /mnt/test_2 + manage_lvm: true + tasks: + - name: Include lvm + include_role: + name: ansible-manage-lvm diff --git a/roles/mrlesmithjr.ansible-manage-lvm/poetry.lock b/roles/mrlesmithjr.ansible-manage-lvm/poetry.lock new file mode 100644 index 00000000..c72ae50e --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/poetry.lock @@ -0,0 +1,2174 @@ +[[package]] +name = "ansible" +version = "4.2.0" +description = "Radically simple IT automation" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" + +[package.dependencies] +ansible-core = ">=2.11.2,<2.12" + +[[package]] +name = "ansible-core" +version = "2.11.6" +description = "Radically simple IT automation" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" + +[package.dependencies] +cryptography = "*" +jinja2 = "*" +packaging = "*" +PyYAML = "*" +resolvelib = ">=0.5.3,<0.6.0" + +[[package]] +name = "ansible-lint" +version = "4.2.0" +description = "Checks playbooks for practices and behaviour that could potentially be improved" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +ansible = ">=2.7" +pyyaml = "*" +"ruamel.yaml" = {version = ">=0.15.37,<1", markers = "python_version >= \"3.7\""} +six = "*" + +[[package]] +name = "arrow" +version = "1.2.1" +description = "Better dates & times for Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +python-dateutil = ">=2.7.0" + +[[package]] +name = "astroid" +version = "2.8.6" +description = "An abstract syntax tree for Python with inference support." +category = "dev" +optional = false +python-versions = "~=3.6" + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +wrapt = ">=1.11,<1.14" + +[[package]] +name = "autopep8" +version = "1.6.0" +description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pycodestyle = ">=2.8.0" +toml = "*" + +[[package]] +name = "backports.entry-points-selectable" +version = "1.1.1" +description = "Compatibility shim providing selectable entry points for older implementations" +category = "dev" +optional = false +python-versions = ">=2.7" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest", "pytest-flake8", "pytest-cov", "pytest-black (>=0.3.7)", "pytest-mypy", "pytest-checkdocs (>=2.4)", "pytest-enabler (>=1.0.1)"] + +[[package]] +name = "bandit" +version = "1.7.1" +description = "Security oriented static analyser for python code." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} +GitPython = ">=1.0.1" +PyYAML = ">=5.3.1" +stevedore = ">=1.20.0" + +[[package]] +name = "bcrypt" +version = "3.2.0" +description = "Modern password hashing for your software and your servers" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.1" +six = ">=1.4.1" + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + +[[package]] +name = "binaryornot" +version = "0.4.4" +description = "Ultra-lightweight pure Python package to check if a file is binary or text." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +chardet = ">=3.0.2" + +[[package]] +name = "black" +version = "21.11b1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0,<1" +platformdirs = ">=2" +regex = ">=2021.4.4" +tomli = ">=0.2.6,<2.0.0" +typing-extensions = [ + {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, + {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, +] + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +python2 = ["typed-ast (>=1.4.3)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "cachecontrol" +version = "0.12.10" +description = "httplib2 caching for requests" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2" +requests = "*" + +[package.extras] +filecache = ["lockfile (>=0.9)"] +redis = ["redis (>=2.10.5)"] + +[[package]] +name = "cachy" +version = "0.3.0" +description = "Cachy provides a simple yet effective caching library." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +redis = ["redis (>=3.3.6,<4.0.0)"] +memcached = ["python-memcached (>=1.59,<2.0)"] +msgpack = ["msgpack-python (>=0.5,<0.6)"] + +[[package]] +name = "cerberus" +version = "1.3.2" +description = "Lightweight, extensible schema and data validation tool for Python dictionaries." +category = "dev" +optional = false +python-versions = ">=2.7" + +[[package]] +name = "certifi" +version = "2021.10.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "cffi" +version = "1.15.0" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.3.1" +description = "Validate configuration and produce human readable error messages." +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[[package]] +name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "charset-normalizer" +version = "2.0.7" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "cleo" +version = "0.8.1" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +clikit = ">=0.6.0,<0.7.0" + +[[package]] +name = "click" +version = "8.0.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "click-completion" +version = "0.5.2" +description = "Fish, Bash, Zsh and PowerShell completion for Click" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +click = "*" +jinja2 = "*" +shellingham = "*" +six = "*" + +[[package]] +name = "click-help-colors" +version = "0.9.1" +description = "Colorization of help messages in Click" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +click = ">=7.0,<9" + +[package.extras] +dev = ["pytest"] + +[[package]] +name = "clikit" +version = "0.6.2" +description = "CliKit is a group of utilities to build beautiful and testable command line interfaces." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +pastel = ">=0.2.0,<0.3.0" +pylev = ">=1.3,<2.0" + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "cookiecutter" +version = "1.7.3" +description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +binaryornot = ">=0.4.4" +click = ">=7.0" +Jinja2 = ">=2.7,<4.0.0" +jinja2-time = ">=0.2.0" +poyo = ">=0.5.0" +python-slugify = ">=4.0.0" +requests = ">=2.23.0" +six = ">=1.10" + +[[package]] +name = "crashtest" +version = "0.3.1" +description = "Manage Python errors with ease" +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "cryptography" +version = "36.0.0" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools_rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "distlib" +version = "0.3.3" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "distro" +version = "1.6.0" +description = "Distro - an OS platform information API" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "fasteners" +version = "0.16.3" +description = "A python package that provides useful locks." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[[package]] +name = "filelock" +version = "3.4.0" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] +testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] + +[[package]] +name = "flake8" +version = "4.0.1" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + +[[package]] +name = "ghp-import" +version = "2.0.2" +description = "Copy your docs directly to the gh-pages branch." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["twine", "markdown", "flake8", "wheel"] + +[[package]] +name = "gitdb" +version = "4.0.9" +description = "Git Object Database" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.24" +description = "GitPython is a python library used to interact with Git repositories" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["genshi", "chardet (>=2.2)", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "identify" +version = "2.4.0" +description = "File identification library for Python" +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "importlib-metadata" +version = "4.8.2" +description = "Read metadata from Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "jeepney" +version = "0.7.1" +description = "Low-level, pure Python DBus protocol wrapper." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] +trio = ["trio", "async-generator"] + +[[package]] +name = "jinja2" +version = "3.0.3" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jinja2-time" +version = "0.2.0" +description = "Jinja2 Extension for Dates and Times" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +arrow = "*" +jinja2 = "*" + +[[package]] +name = "keyring" +version = "21.8.0" +description = "Store and access your passwords safely." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[[package]] +name = "lazy-object-proxy" +version = "1.6.0" +description = "A fast and thorough lazy object proxy." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[[package]] +name = "lockfile" +version = "0.12.2" +description = "Platform-independent file locking module" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "markdown" +version = "3.3.6" +description = "Python implementation of Markdown." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for ๐Ÿ." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mkdocs" +version = "1.2.3" +description = "Project documentation with Markdown." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +click = ">=3.3" +ghp-import = ">=1.0" +importlib-metadata = ">=3.10" +Jinja2 = ">=2.10.1" +Markdown = ">=3.2.1" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +PyYAML = ">=3.10" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] + +[[package]] +name = "molecule" +version = "3.0.3" +description = "Molecule aids in the development and testing of Ansible roles" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +ansible = ">=2.8" +cerberus = ">=1.3.1" +click = ">=7.0" +click-completion = ">=0.5.1" +click-help-colors = ">=0.6" +colorama = ">=0.3.9" +cookiecutter = ">=1.6.0" +Jinja2 = ">=2.10.1" +paramiko = ">=2.5.0,<3" +pexpect = ">=4.6.0,<5" +pluggy = ">=0.7.1,<1.0" +python-gilt = ">=1.2.1,<2" +PyYAML = ">=5.1,<6" +selinux = {version = "*", markers = "sys_platform == \"linux\" or sys_platform == \"linux2\""} +sh = ">=1.12.14" +tabulate = ">=0.8.4" +tree-format = ">=0.1.2" +yamllint = ">=1.15.0,<2" + +[package.extras] +docker = ["docker (>=2.0.0)"] +docs = ["simplejson", "sphinx", "sphinx-rtd-theme"] +lint = ["ansible-lint (>=4.1.1a2,<5)", "flake8 (>=3.6.0)", "pre-commit (>=1.21.0)", "yamllint (>=1.15.0)"] +test = ["ansi2html", "coverage (<5)", "mock (>=3.0.5,<4)", "pytest-cov (>=2.7.1,<3)", "pytest-helpers-namespace (>=2019.1.8,<2020)", "pytest-html (>=1.21.0)", "pytest-mock (>=1.10.4,<2)", "pytest-verbose-parametrize (>=1.7.0,<2)", "pytest-plus", "pytest-xdist (>=1.29.0,<2)", "pytest (>=5.4.0,<5.5)", "testinfra (>=3.4.0)"] +windows = ["pywinrm"] + +[[package]] +name = "molecule-vagrant" +version = "0.2" +description = "Vagrant Molecule Plugin :: run molecule tests using Vagrant" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" + +[package.dependencies] +ansible = ">=2.9.5" +molecule = ">=3.0.2" +python-vagrant = "*" +pyyaml = ">=5.1,<6" +selinux = "*" + +[package.extras] +test = ["ansi2html", "coverage (>=4.4,<5)", "flake8 (>=3.6.0,<4)", "mock (>=3.0.5,<4)", "pytest (>=4.6.3,<5)", "pytest-cov (>=2.7.1,<3)", "pytest-helpers-namespace (>=2019.1.8,<2020)", "pytest-html", "pytest-mock (>=1.10.4,<2)", "pytest-verbose-parametrize (>=1.7.0,<2)", "pytest-xdist (>=1.29.0,<2)", "pytest-dependency"] + +[[package]] +name = "msgpack" +version = "1.0.2" +description = "MessagePack (de)serializer." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "mypy" +version = "0.910" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +mypy-extensions = ">=0.4.3,<0.5.0" +toml = "*" +typing-extensions = ">=3.7.4" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<1.5.0)"] + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "nodeenv" +version = "1.6.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "packaging" +version = "20.9" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "paramiko" +version = "2.8.0" +description = "SSH2 protocol library" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +bcrypt = ">=3.1.3" +cryptography = ">=2.5" +pynacl = ">=1.0.1" + +[package.extras] +all = ["pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "bcrypt (>=3.1.3)", "invoke (>=1.3)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] +ed25519 = ["pynacl (>=1.0.1)", "bcrypt (>=3.1.3)"] +gssapi = ["pyasn1 (>=0.1.7)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] +invoke = ["invoke (>=1.3)"] + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "pbr" +version = "5.8.0" +description = "Python Build Reasonableness" +category = "dev" +optional = false +python-versions = ">=2.6" + +[[package]] +name = "pep517" +version = "0.12.0" +description = "Wrappers to build Python packages using PEP 517 hooks" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +tomli = {version = ">=1.1.0", markers = "python_version >= \"3.6\""} + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pip-tools" +version = "6.4.0" +description = "pip-tools keeps your pinned dependencies fresh." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +click = ">=7" +pep517 = "*" + +[package.extras] +coverage = ["pytest-cov"] +testing = ["pytest", "pytest-rerunfailures", "pytest-xdist"] + +[[package]] +name = "pkginfo" +version = "1.8.1" +description = "Query metadatdata from sdists / bdists / installed packages." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +testing = ["nose", "coverage"] + +[[package]] +name = "platformdirs" +version = "2.4.0" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + +[[package]] +name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +name = "poetry" +version = "1.1.11" +description = "Python dependency management and packaging made easy." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +cachecontrol = {version = ">=0.12.4,<0.13.0", extras = ["filecache"]} +cachy = ">=0.3.0,<0.4.0" +cleo = ">=0.8.1,<0.9.0" +clikit = ">=0.6.2,<0.7.0" +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +html5lib = ">=1.0,<2.0" +keyring = {version = ">=21.2.0,<22.0.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +packaging = ">=20.4,<21.0" +pexpect = ">=4.7.0,<5.0.0" +pkginfo = ">=1.4,<2.0" +poetry-core = ">=1.0.7,<1.1.0" +requests = ">=2.18,<3.0" +requests-toolbelt = ">=0.9.1,<0.10.0" +shellingham = ">=1.1,<2.0" +tomlkit = ">=0.7.0,<1.0.0" +virtualenv = ">=20.0.26,<21.0.0" + +[[package]] +name = "poetry-core" +version = "1.0.7" +description = "Poetry PEP 517 Build Backend" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "poyo" +version = "0.5.0" +description = "A lightweight YAML Parser for Python. ๐Ÿ“" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pre-commit" +version = "2.15.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +toml = "*" +virtualenv = ">=20.0.8" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pycodestyle" +version = "2.8.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyflakes" +version = "2.4.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pylev" +version = "1.4.0" +description = "A pure Python Levenshtein implementation that's not freaking GPL'd." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pylint" +version = "2.11.1" +description = "python code static checker" +category = "dev" +optional = false +python-versions = "~=3.6" + +[package.dependencies] +astroid = ">=2.8.0,<2.9" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.7" +platformdirs = ">=2.2.0" +toml = ">=0.7.1" + +[[package]] +name = "pynacl" +version = "1.4.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +cffi = ">=1.4.1" +six = "*" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["pytest (>=3.2.1,!=3.3.0)", "hypothesis (>=3.27.0)"] + +[[package]] +name = "pyparsing" +version = "3.0.6" +description = "Python parsing module" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-gilt" +version = "1.2.3" +description = "gilt - A GIT layering tool." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +click = "*" +colorama = "*" +fasteners = "*" +PyYAML = "*" +sh = "*" + +[package.extras] +test = ["black (==19.10b0)", "flake8", "hacking", "pep517", "pytest", "pytest-cov", "pytest-helpers-namespace", "pytest-mock", "twine"] + +[[package]] +name = "python-slugify" +version = "5.0.2" +description = "A Python Slugify application that handles Unicode" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + +[[package]] +name = "python-vagrant" +version = "0.5.15" +description = "Python bindings for interacting with Vagrant virtual machines." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pyyaml" +version = "5.4.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyyaml = "*" + +[[package]] +name = "regex" +version = "2021.11.10" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "requests" +version = "2.26.0" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "resolvelib" +version = "0.5.5" +description = "Resolve abstract dependencies into concrete ones" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +examples = ["html5lib", "packaging", "pygraphviz", "requests"] +lint = ["black", "flake8"] +release = ["setl", "towncrier"] +test = ["commentjson", "packaging", "pytest"] + +[[package]] +name = "ruamel.yaml" +version = "0.17.17" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +category = "dev" +optional = false +python-versions = ">=3" + +[package.extras] +docs = ["ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "secretstorage" +version = "3.3.1" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "selinux" +version = "0.2.1" +description = "shim selinux module" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.dependencies] +distro = ">=1.3.0" + +[[package]] +name = "sh" +version = "1.14.2" +description = "Python subprocess replacement" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "shellingham" +version = "1.4.0" +description = "Tool to Detect Surrounding Shell" +category = "dev" +optional = false +python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "smmap" +version = "5.0.0" +description = "A pure Python implementation of a sliding window memory map manager" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "stevedore" +version = "3.5.0" +description = "Manage dynamic plugins for Python applications" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pbr = ">=2.0.0,<2.1.0 || >2.1.0" + +[[package]] +name = "tabulate" +version = "0.8.9" +description = "Pretty-print tabular data" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "1.2.2" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "tomlkit" +version = "0.7.2" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "tree-format" +version = "0.1.2" +description = "" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +dev = ["pytest (>=2.7.1)", "testtools (>=1.8.0)"] + +[[package]] +name = "typing-extensions" +version = "4.0.0" +description = "Backported and Experimental Type Hints for Python 3.6+" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "urllib3" +version = "1.26.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "virtualenv" +version = "20.10.0" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +"backports.entry-points-selectable" = ">=1.0.4" +distlib = ">=0.3.1,<1" +filelock = ">=3.2,<4" +platformdirs = ">=2,<3" +six = ">=1.9.0,<2" + +[package.extras] +docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] +testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] + +[[package]] +name = "watchdog" +version = "2.1.6" +description = "Filesystem events monitoring" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "wrapt" +version = "1.13.3" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "yamllint" +version = "1.23.0" +description = "A linter for YAML files." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pathspec = ">=0.5.3" +pyyaml = "*" + +[[package]] +name = "zipp" +version = "3.6.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.10" +content-hash = "164ad99422f91270bcdf1c7f936dc56047169134e756cf2271aa6a10460f9e0f" + +[metadata.files] +ansible = [ + {file = "ansible-4.2.0.tar.gz", hash = "sha256:737d819ffbd7a80c28795b4edd93e59ad21e6e6d53af0d19f57412814f9260d0"}, +] +ansible-core = [ + {file = "ansible-core-2.11.6.tar.gz", hash = "sha256:93d50283c7c5b476debf83dc089b3f679b939a8b9a7b5d628d28daafbb3d303a"}, +] +ansible-lint = [ + {file = "ansible-lint-4.2.0.tar.gz", hash = "sha256:eb925d8682d70563ccb80e2aca7b3edf84fb0b768cea3edc6846aac7abdc414a"}, + {file = "ansible_lint-4.2.0-py2.py3-none-any.whl", hash = "sha256:b9fc9a6564f5d60a4284497f966f38ef78f0e2505edbe2bd1225f1ade31c2d8a"}, +] +arrow = [ + {file = "arrow-1.2.1-py3-none-any.whl", hash = "sha256:6b2914ef3997d1fd7b37a71ce9dd61a6e329d09e1c7b44f4d3099ca4a5c0933e"}, + {file = "arrow-1.2.1.tar.gz", hash = "sha256:c2dde3c382d9f7e6922ce636bf0b318a7a853df40ecb383b29192e6c5cc82840"}, +] +astroid = [ + {file = "astroid-2.8.6-py3-none-any.whl", hash = "sha256:cd8326b424c971e7d87678609cf6275d22028afd37d6ac59c16d47f1245882f6"}, + {file = "astroid-2.8.6.tar.gz", hash = "sha256:5f6f75e45f15290e73b56f9dfde95b4bf96382284cde406ef4203e928335a495"}, +] +autopep8 = [ + {file = "autopep8-1.6.0-py2.py3-none-any.whl", hash = "sha256:ed77137193bbac52d029a52c59bec1b0629b5a186c495f1eb21b126ac466083f"}, + {file = "autopep8-1.6.0.tar.gz", hash = "sha256:44f0932855039d2c15c4510d6df665e4730f2b8582704fa48f9c55bd3e17d979"}, +] +"backports.entry-points-selectable" = [ + {file = "backports.entry_points_selectable-1.1.1-py2.py3-none-any.whl", hash = "sha256:7fceed9532a7aa2bd888654a7314f864a3c16a4e710b34a58cfc0f08114c663b"}, + {file = "backports.entry_points_selectable-1.1.1.tar.gz", hash = "sha256:914b21a479fde881635f7af5adc7f6e38d6b274be32269070c53b698c60d5386"}, +] +bandit = [ + {file = "bandit-1.7.1-py3-none-any.whl", hash = "sha256:f5acd838e59c038a159b5c621cf0f8270b279e884eadd7b782d7491c02add0d4"}, + {file = "bandit-1.7.1.tar.gz", hash = "sha256:a81b00b5436e6880fa8ad6799bc830e02032047713cbb143a12939ac67eb756c"}, +] +bcrypt = [ + {file = "bcrypt-3.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6"}, + {file = "bcrypt-3.2.0-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:63d4e3ff96188e5898779b6057878fecf3f11cfe6ec3b313ea09955d587ec7a7"}, + {file = "bcrypt-3.2.0-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:cd1ea2ff3038509ea95f687256c46b79f5fc382ad0aa3664d200047546d511d1"}, + {file = "bcrypt-3.2.0-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:cdcdcb3972027f83fe24a48b1e90ea4b584d35f1cc279d76de6fc4b13376239d"}, + {file = "bcrypt-3.2.0-cp36-abi3-win32.whl", hash = "sha256:a67fb841b35c28a59cebed05fbd3e80eea26e6d75851f0574a9273c80f3e9b55"}, + {file = "bcrypt-3.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:81fec756feff5b6818ea7ab031205e1d323d8943d237303baca2c5f9c7846f34"}, + {file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"}, +] +binaryornot = [ + {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, + {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, +] +black = [ + {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"}, + {file = "black-21.11b1.tar.gz", hash = "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2"}, +] +cachecontrol = [ + {file = "CacheControl-0.12.10-py2.py3-none-any.whl", hash = "sha256:b0d43d8f71948ef5ebdee5fe236b86c6ffc7799370453dccb0e894c20dfa487c"}, + {file = "CacheControl-0.12.10.tar.gz", hash = "sha256:d8aca75b82eec92d84b5d6eb8c8f66ea16f09d2adb09dbca27fe2d5fc8d3732d"}, +] +cachy = [ + {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, + {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, +] +cerberus = [ + {file = "Cerberus-1.3.2.tar.gz", hash = "sha256:302e6694f206dd85cb63f13fd5025b31ab6d38c99c50c6d769f8fa0b0f299589"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +cffi = [ + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, +] +cfgv = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] +chardet = [ + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, + {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, +] +cleo = [ + {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, + {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, +] +click = [ + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, +] +click-completion = [ + {file = "click-completion-0.5.2.tar.gz", hash = "sha256:5bf816b81367e638a190b6e91b50779007d14301b3f9f3145d68e3cade7bce86"}, +] +click-help-colors = [ + {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, + {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, +] +clikit = [ + {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, + {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +cookiecutter = [ + {file = "cookiecutter-1.7.3-py2.py3-none-any.whl", hash = "sha256:f8671531fa96ab14339d0c59b4f662a4f12a2ecacd94a0f70a3500843da588e2"}, + {file = "cookiecutter-1.7.3.tar.gz", hash = "sha256:6b9a4d72882e243be077a7397d0f1f76fe66cf3df91f3115dbb5330e214fa457"}, +] +crashtest = [ + {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, + {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, +] +cryptography = [ + {file = "cryptography-36.0.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:9511416e85e449fe1de73f7f99b21b3aa04fba4c4d335d30c486ba3756e3a2a6"}, + {file = "cryptography-36.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:97199a13b772e74cdcdb03760c32109c808aff7cd49c29e9cf4b7754bb725d1d"}, + {file = "cryptography-36.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:494106e9cd945c2cadfce5374fa44c94cfadf01d4566a3b13bb487d2e6c7959e"}, + {file = "cryptography-36.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6fbbbb8aab4053fa018984bb0e95a16faeb051dd8cca15add2a27e267ba02b58"}, + {file = "cryptography-36.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:684993ff6f67000a56454b41bdc7e015429732d65a52d06385b6e9de6181c71e"}, + {file = "cryptography-36.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c702855cd3174666ef0d2d13dcc879090aa9c6c38f5578896407a7028f75b9f"}, + {file = "cryptography-36.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d91bc9f535599bed58f6d2e21a2724cb0c3895bf41c6403fe881391d29096f1d"}, + {file = "cryptography-36.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:b17d83b3d1610e571fedac21b2eb36b816654d6f7496004d6a0d32f99d1d8120"}, + {file = "cryptography-36.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8982c19bb90a4fa2aad3d635c6d71814e38b643649b4000a8419f8691f20ac44"}, + {file = "cryptography-36.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:24469d9d33217ffd0ce4582dfcf2a76671af115663a95328f63c99ec7ece61a4"}, + {file = "cryptography-36.0.0-cp36-abi3-win32.whl", hash = "sha256:f6a5a85beb33e57998dc605b9dbe7deaa806385fdf5c4810fb849fcd04640c81"}, + {file = "cryptography-36.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:2deab5ec05d83ddcf9b0916319674d3dae88b0e7ee18f8962642d3cde0496568"}, + {file = "cryptography-36.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2049f8b87f449fc6190350de443ee0c1dd631f2ce4fa99efad2984de81031681"}, + {file = "cryptography-36.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a776bae1629c8d7198396fd93ec0265f8dd2341c553dc32b976168aaf0e6a636"}, + {file = "cryptography-36.0.0-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:aa94d617a4cd4cdf4af9b5af65100c036bce22280ebb15d8b5262e8273ebc6ba"}, + {file = "cryptography-36.0.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:5c49c9e8fb26a567a2b3fa0343c89f5d325447956cc2fc7231c943b29a973712"}, + {file = "cryptography-36.0.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef216d13ac8d24d9cd851776662f75f8d29c9f2d05cdcc2d34a18d32463a9b0b"}, + {file = "cryptography-36.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:231c4a69b11f6af79c1495a0e5a85909686ea8db946935224b7825cfb53827ed"}, + {file = "cryptography-36.0.0-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:f92556f94e476c1b616e6daec5f7ddded2c082efa7cee7f31c7aeda615906ed8"}, + {file = "cryptography-36.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d73e3a96c38173e0aa5646c31bf8473bc3564837977dd480f5cbeacf1d7ef3a3"}, + {file = "cryptography-36.0.0.tar.gz", hash = "sha256:52f769ecb4ef39865719aedc67b4b7eae167bafa48dbc2a26dd36fa56460507f"}, +] +distlib = [ + {file = "distlib-0.3.3-py2.py3-none-any.whl", hash = "sha256:c8b54e8454e5bf6237cc84c20e8264c3e991e824ef27e8f1e81049867d861e31"}, + {file = "distlib-0.3.3.zip", hash = "sha256:d982d0751ff6eaaab5e2ec8e691d949ee80eddf01a62eaa96ddb11531fe16b05"}, +] +distro = [ + {file = "distro-1.6.0-py2.py3-none-any.whl", hash = "sha256:c8713330ab31a034623a9515663ed87696700b55f04556b97c39cd261aa70dc7"}, + {file = "distro-1.6.0.tar.gz", hash = "sha256:83f5e5a09f9c5f68f60173de572930effbcc0287bb84fdc4426cb4168c088424"}, +] +fasteners = [ + {file = "fasteners-0.16.3-py2.py3-none-any.whl", hash = "sha256:8408e52656455977053871990bd25824d85803b9417aa348f10ba29ef0c751f7"}, + {file = "fasteners-0.16.3.tar.gz", hash = "sha256:b1ab4e5adfbc28681ce44b3024421c4f567e705cc3963c732bf1cba3348307de"}, +] +filelock = [ + {file = "filelock-3.4.0-py3-none-any.whl", hash = "sha256:2e139a228bcf56dd8b2274a65174d005c4a6b68540ee0bdbb92c76f43f29f7e8"}, + {file = "filelock-3.4.0.tar.gz", hash = "sha256:93d512b32a23baf4cac44ffd72ccf70732aeff7b8050fcaf6d3ec406d954baf4"}, +] +flake8 = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] +ghp-import = [ + {file = "ghp-import-2.0.2.tar.gz", hash = "sha256:947b3771f11be850c852c64b561c600fdddf794bab363060854c1ee7ad05e071"}, + {file = "ghp_import-2.0.2-py3-none-any.whl", hash = "sha256:5f8962b30b20652cdffa9c5a9812f7de6bcb56ec475acac579807719bf242c46"}, +] +gitdb = [ + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, +] +gitpython = [ + {file = "GitPython-3.1.24-py3-none-any.whl", hash = "sha256:dc0a7f2f697657acc8d7f89033e8b1ea94dd90356b2983bca89dc8d2ab3cc647"}, + {file = "GitPython-3.1.24.tar.gz", hash = "sha256:df83fdf5e684fef7c6ee2c02fc68a5ceb7e7e759d08b694088d0cacb4eba59e5"}, +] +html5lib = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] +identify = [ + {file = "identify-2.4.0-py2.py3-none-any.whl", hash = "sha256:eba31ca80258de6bb51453084bff4a923187cd2193b9c13710f2516ab30732cc"}, + {file = "identify-2.4.0.tar.gz", hash = "sha256:a33ae873287e81651c7800ca309dc1f84679b763c9c8b30680e16fbfa82f0107"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.8.2-py3-none-any.whl", hash = "sha256:53ccfd5c134223e497627b9815d5030edf77d2ed573922f7a0b8f8bb81a1c100"}, + {file = "importlib_metadata-4.8.2.tar.gz", hash = "sha256:75bdec14c397f528724c1bfd9709d660b33a4d2e77387a3358f20b848bb5e5fb"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +jeepney = [ + {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, + {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, +] +jinja2 = [ + {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, + {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, +] +jinja2-time = [ + {file = "jinja2-time-0.2.0.tar.gz", hash = "sha256:d14eaa4d315e7688daa4969f616f226614350c48730bfa1692d2caebd8c90d40"}, + {file = "jinja2_time-0.2.0-py2.py3-none-any.whl", hash = "sha256:d3eab6605e3ec8b7a0863df09cc1d23714908fa61aa6986a845c20ba488b4efa"}, +] +keyring = [ + {file = "keyring-21.8.0-py3-none-any.whl", hash = "sha256:4be9cbaaaf83e61d6399f733d113ede7d1c73bc75cb6aeb64eee0f6ac39b30ea"}, + {file = "keyring-21.8.0.tar.gz", hash = "sha256:1746d3ac913d449a090caf11e9e4af00e26c3f7f7e81027872192b2398b98675"}, +] +lazy-object-proxy = [ + {file = "lazy-object-proxy-1.6.0.tar.gz", hash = "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726"}, + {file = "lazy_object_proxy-1.6.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b"}, + {file = "lazy_object_proxy-1.6.0-cp27-cp27m-win32.whl", hash = "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e"}, + {file = "lazy_object_proxy-1.6.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93"}, + {file = "lazy_object_proxy-1.6.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741"}, + {file = "lazy_object_proxy-1.6.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587"}, + {file = "lazy_object_proxy-1.6.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4"}, + {file = "lazy_object_proxy-1.6.0-cp36-cp36m-win32.whl", hash = "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f"}, + {file = "lazy_object_proxy-1.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3"}, + {file = "lazy_object_proxy-1.6.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981"}, + {file = "lazy_object_proxy-1.6.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2"}, + {file = "lazy_object_proxy-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd"}, + {file = "lazy_object_proxy-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837"}, + {file = "lazy_object_proxy-1.6.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653"}, + {file = "lazy_object_proxy-1.6.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3"}, + {file = "lazy_object_proxy-1.6.0-cp38-cp38-win32.whl", hash = "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8"}, + {file = "lazy_object_proxy-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf"}, + {file = "lazy_object_proxy-1.6.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad"}, + {file = "lazy_object_proxy-1.6.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43"}, + {file = "lazy_object_proxy-1.6.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a"}, + {file = "lazy_object_proxy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61"}, + {file = "lazy_object_proxy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b"}, +] +lockfile = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] +markdown = [ + {file = "Markdown-3.3.6-py3-none-any.whl", hash = "sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3"}, + {file = "Markdown-3.3.6.tar.gz", hash = "sha256:76df8ae32294ec39dcf89340382882dfa12975f87f45c3ed1ecdb1e8cefc7006"}, +] +markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +mergedeep = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] +mkdocs = [ + {file = "mkdocs-1.2.3-py3-none-any.whl", hash = "sha256:a1fa8c2d0c1305d7fc2b9d9f607c71778572a8b110fb26642aa00296c9e6d072"}, + {file = "mkdocs-1.2.3.tar.gz", hash = "sha256:89f5a094764381cda656af4298727c9f53dc3e602983087e1fe96ea1df24f4c1"}, +] +molecule = [ + {file = "molecule-3.0.3-py2.py3-none-any.whl", hash = "sha256:6ed924033dde822c00f87b02ea9fda3c6d9d44feb17a2940b7529317ae4d3f67"}, + {file = "molecule-3.0.3.tar.gz", hash = "sha256:c83f90cb8dc87f6663475711ac8c4f4c2112a1ff89ccb6665f0e3376032e77a7"}, +] +molecule-vagrant = [ + {file = "molecule-vagrant-0.2.tar.gz", hash = "sha256:f963890c00d337535f51815971484dad1d6f4dcb7a485baa233f85ab70cbf036"}, + {file = "molecule_vagrant-0.2-py2.py3-none-any.whl", hash = "sha256:34f38d3662c9785e8846ae32dedd07df019776ae435d1340c42e1d10adf336f7"}, +] +msgpack = [ + {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9"}, + {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a99b144475230982aee16b3d249170f1cccebf27fb0a08e9f603b69637a62192"}, + {file = "msgpack-1.0.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1026dcc10537d27dd2d26c327e552f05ce148977e9d7b9f1718748281b38c841"}, + {file = "msgpack-1.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:fe07bc6735d08e492a327f496b7850e98cb4d112c56df69b0c844dbebcbb47f6"}, + {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9ea52fff0473f9f3000987f313310208c879493491ef3ccf66268eff8d5a0326"}, + {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:26a1759f1a88df5f1d0b393eb582ec022326994e311ba9c5818adc5374736439"}, + {file = "msgpack-1.0.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:497d2c12426adcd27ab83144057a705efb6acc7e85957a51d43cdcf7f258900f"}, + {file = "msgpack-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:e89ec55871ed5473a041c0495b7b4e6099f6263438e0bd04ccd8418f92d5d7f2"}, + {file = "msgpack-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a4355d2193106c7aa77c98fc955252a737d8550320ecdb2e9ac701e15e2943bc"}, + {file = "msgpack-1.0.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:d6c64601af8f3893d17ec233237030e3110f11b8a962cb66720bf70c0141aa54"}, + {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f484cd2dca68502de3704f056fa9b318c94b1539ed17a4c784266df5d6978c87"}, + {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f3e6aaf217ac1c7ce1563cf52a2f4f5d5b1f64e8729d794165db71da57257f0c"}, + {file = "msgpack-1.0.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:8521e5be9e3b93d4d5e07cb80b7e32353264d143c1f072309e1863174c6aadb1"}, + {file = "msgpack-1.0.2-cp37-cp37m-win32.whl", hash = "sha256:31c17bbf2ae5e29e48d794c693b7ca7a0c73bd4280976d408c53df421e838d2a"}, + {file = "msgpack-1.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8ffb24a3b7518e843cd83538cf859e026d24ec41ac5721c18ed0c55101f9775b"}, + {file = "msgpack-1.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:b28c0876cce1466d7c2195d7658cf50e4730667196e2f1355c4209444717ee06"}, + {file = "msgpack-1.0.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:87869ba567fe371c4555d2e11e4948778ab6b59d6cc9d8460d543e4cfbbddd1c"}, + {file = "msgpack-1.0.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b55f7db883530b74c857e50e149126b91bb75d35c08b28db12dcb0346f15e46e"}, + {file = "msgpack-1.0.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ac25f3e0513f6673e8b405c3a80500eb7be1cf8f57584be524c4fa78fe8e0c83"}, + {file = "msgpack-1.0.2-cp38-cp38-win32.whl", hash = "sha256:0cb94ee48675a45d3b86e61d13c1e6f1696f0183f0715544976356ff86f741d9"}, + {file = "msgpack-1.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e36a812ef4705a291cdb4a2fd352f013134f26c6ff63477f20235138d1d21009"}, + {file = "msgpack-1.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2a5866bdc88d77f6e1370f82f2371c9bc6fc92fe898fa2dec0c5d4f5435a2694"}, + {file = "msgpack-1.0.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:92be4b12de4806d3c36810b0fe2aeedd8d493db39e2eb90742b9c09299eb5759"}, + {file = "msgpack-1.0.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:de6bd7990a2c2dabe926b7e62a92886ccbf809425c347ae7de277067f97c2887"}, + {file = "msgpack-1.0.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5a9ee2540c78659a1dd0b110f73773533ee3108d4e1219b5a15a8d635b7aca0e"}, + {file = "msgpack-1.0.2-cp39-cp39-win32.whl", hash = "sha256:c747c0cc08bd6d72a586310bda6ea72eeb28e7505990f342552315b229a19b33"}, + {file = "msgpack-1.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:d8167b84af26654c1124857d71650404336f4eb5cc06900667a493fc619ddd9f"}, + {file = "msgpack-1.0.2.tar.gz", hash = "sha256:fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984"}, +] +mypy = [ + {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, + {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"}, + {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"}, + {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"}, + {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"}, + {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"}, + {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"}, + {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"}, + {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"}, + {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"}, + {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"}, + {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"}, + {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"}, + {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"}, + {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"}, + {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"}, + {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"}, + {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"}, + {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"}, + {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"}, + {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"}, + {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"}, + {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nodeenv = [ + {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, + {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, +] +packaging = [ + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, +] +paramiko = [ + {file = "paramiko-2.8.0-py2.py3-none-any.whl", hash = "sha256:def3ec612399bab4e9f5eb66b0ae5983980db9dd9120d9e9c6ea3ff673865d1c"}, + {file = "paramiko-2.8.0.tar.gz", hash = "sha256:e673b10ee0f1c80d46182d3af7751d033d9b573dd7054d2d0aa46be186c3c1d2"}, +] +pastel = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +pbr = [ + {file = "pbr-5.8.0-py2.py3-none-any.whl", hash = "sha256:176e8560eaf61e127817ef93d8a844803abb27a4d4637f0ff3bb783129be2e0a"}, + {file = "pbr-5.8.0.tar.gz", hash = "sha256:672d8ebee84921862110f23fcec2acea191ef58543d34dfe9ef3d9f13c31cddf"}, +] +pep517 = [ + {file = "pep517-0.12.0-py2.py3-none-any.whl", hash = "sha256:dd884c326898e2c6e11f9e0b64940606a93eb10ea022a2e067959f3a110cf161"}, + {file = "pep517-0.12.0.tar.gz", hash = "sha256:931378d93d11b298cf511dd634cf5ea4cb249a28ef84160b3247ee9afb4e8ab0"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pip-tools = [ + {file = "pip-tools-6.4.0.tar.gz", hash = "sha256:65553a15b1ba34be5e43889345062e38fb9b219ffa23b084ca0d4c4039b6f53b"}, + {file = "pip_tools-6.4.0-py3-none-any.whl", hash = "sha256:bb2c3272bc229b4a6d25230ebe255823aba1aa466a0d698c48ab7eb5ab7efdc9"}, +] +pkginfo = [ + {file = "pkginfo-1.8.1-py2.py3-none-any.whl", hash = "sha256:bb55a6c017d50f2faea5153abc7b05a750e7ea7ae2cbb7fb3ad6f1dcf8d40988"}, + {file = "pkginfo-1.8.1.tar.gz", hash = "sha256:65175ffa2c807220673a41c371573ac9a1ea1b19ffd5eef916278f428319934f"}, +] +platformdirs = [ + {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, + {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, +] +pluggy = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] +poetry = [ + {file = "poetry-1.1.11-py2.py3-none-any.whl", hash = "sha256:628e2a933c9f7c28fa0edbee09f9e2e6b25301e610929b5414f3d55ed40fc712"}, + {file = "poetry-1.1.11.tar.gz", hash = "sha256:7d7d22f55fbebb830cc85b1c69cd7a91fd85f49e5396e7a14b953645a470f69e"}, +] +poetry-core = [ + {file = "poetry-core-1.0.7.tar.gz", hash = "sha256:98c11c755a16ef6c5673c22ca94a3802a7df4746a0853a70b6fae8b9f5cac206"}, + {file = "poetry_core-1.0.7-py2.py3-none-any.whl", hash = "sha256:4f8a7f5390d772f42c4c4c3f188e6424b802cb4b57466c6633a1b9ac36f18a43"}, +] +poyo = [ + {file = "poyo-0.5.0-py2.py3-none-any.whl", hash = "sha256:3e2ca8e33fdc3c411cd101ca395668395dd5dc7ac775b8e809e3def9f9fe041a"}, + {file = "poyo-0.5.0.tar.gz", hash = "sha256:e26956aa780c45f011ca9886f044590e2d8fd8b61db7b1c1cf4e0869f48ed4dd"}, +] +pre-commit = [ + {file = "pre_commit-2.15.0-py2.py3-none-any.whl", hash = "sha256:a4ed01000afcb484d9eb8d504272e642c4c4099bbad3a6b27e519bd6a3e928a6"}, + {file = "pre_commit-2.15.0.tar.gz", hash = "sha256:3c25add78dbdfb6a28a651780d5c311ac40dd17f160eb3954a0c59da40a505a7"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +pycodestyle = [ + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +pyflakes = [ + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, +] +pylev = [ + {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, + {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, +] +pylint = [ + {file = "pylint-2.11.1-py3-none-any.whl", hash = "sha256:0f358e221c45cbd4dad2a1e4b883e75d28acdcccd29d40c76eb72b307269b126"}, + {file = "pylint-2.11.1.tar.gz", hash = "sha256:2c9843fff1a88ca0ad98a256806c82c5a8f86086e7ccbdb93297d86c3f90c436"}, +] +pynacl = [ + {file = "PyNaCl-1.4.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff"}, + {file = "PyNaCl-1.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:d452a6746f0a7e11121e64625109bc4468fc3100452817001dbe018bb8b08514"}, + {file = "PyNaCl-1.4.0-cp27-cp27m-win32.whl", hash = "sha256:2fe0fc5a2480361dcaf4e6e7cea00e078fcda07ba45f811b167e3f99e8cff574"}, + {file = "PyNaCl-1.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:f8851ab9041756003119368c1e6cd0b9c631f46d686b3904b18c0139f4419f80"}, + {file = "PyNaCl-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7"}, + {file = "PyNaCl-1.4.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122"}, + {file = "PyNaCl-1.4.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d"}, + {file = "PyNaCl-1.4.0-cp35-abi3-win32.whl", hash = "sha256:4e10569f8cbed81cb7526ae137049759d2a8d57726d52c1a000a3ce366779634"}, + {file = "PyNaCl-1.4.0-cp35-abi3-win_amd64.whl", hash = "sha256:c914f78da4953b33d4685e3cdc7ce63401247a21425c16a39760e282075ac4a6"}, + {file = "PyNaCl-1.4.0-cp35-cp35m-win32.whl", hash = "sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4"}, + {file = "PyNaCl-1.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25"}, + {file = "PyNaCl-1.4.0-cp36-cp36m-win32.whl", hash = "sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4"}, + {file = "PyNaCl-1.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:cd401ccbc2a249a47a3a1724c2918fcd04be1f7b54eb2a5a71ff915db0ac51c6"}, + {file = "PyNaCl-1.4.0-cp37-cp37m-win32.whl", hash = "sha256:8122ba5f2a2169ca5da936b2e5a511740ffb73979381b4229d9188f6dcb22f1f"}, + {file = "PyNaCl-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:537a7ccbea22905a0ab36ea58577b39d1fa9b1884869d173b5cf111f006f689f"}, + {file = "PyNaCl-1.4.0-cp38-cp38-win32.whl", hash = "sha256:9c4a7ea4fb81536c1b1f5cc44d54a296f96ae78c1ebd2311bd0b60be45a48d96"}, + {file = "PyNaCl-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7c6092102219f59ff29788860ccb021e80fffd953920c4a8653889c029b2d420"}, + {file = "PyNaCl-1.4.0.tar.gz", hash = "sha256:54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505"}, +] +pyparsing = [ + {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, + {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +python-gilt = [ + {file = "python_gilt-1.2.3-py2.py3-none-any.whl", hash = "sha256:e220ea2e7e190ee06dbfa5fafe87967858b4ac0cf53f3072fa6ece4664a42082"}, +] +python-slugify = [ + {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"}, + {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"}, +] +python-vagrant = [ + {file = "python-vagrant-0.5.15.tar.gz", hash = "sha256:af9a8a9802d382d45dbea96aa3cfbe77c6e6ad65b3fe7b7c799d41ab988179c6"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +pyyaml = [ + {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, + {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, + {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, + {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, + {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, + {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, + {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, + {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, + {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, +] +pyyaml-env-tag = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] +regex = [ + {file = "regex-2021.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf"}, + {file = "regex-2021.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4"}, + {file = "regex-2021.11.10-cp310-cp310-win32.whl", hash = "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a"}, + {file = "regex-2021.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12"}, + {file = "regex-2021.11.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e"}, + {file = "regex-2021.11.10-cp36-cp36m-win32.whl", hash = "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4"}, + {file = "regex-2021.11.10-cp36-cp36m-win_amd64.whl", hash = "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e"}, + {file = "regex-2021.11.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f"}, + {file = "regex-2021.11.10-cp37-cp37m-win32.whl", hash = "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec"}, + {file = "regex-2021.11.10-cp37-cp37m-win_amd64.whl", hash = "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4"}, + {file = "regex-2021.11.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83"}, + {file = "regex-2021.11.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94"}, + {file = "regex-2021.11.10-cp38-cp38-win32.whl", hash = "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc"}, + {file = "regex-2021.11.10-cp38-cp38-win_amd64.whl", hash = "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d"}, + {file = "regex-2021.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b"}, + {file = "regex-2021.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef"}, + {file = "regex-2021.11.10-cp39-cp39-win32.whl", hash = "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a"}, + {file = "regex-2021.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29"}, + {file = "regex-2021.11.10.tar.gz", hash = "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6"}, +] +requests = [ + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +resolvelib = [ + {file = "resolvelib-0.5.5-py2.py3-none-any.whl", hash = "sha256:b0143b9d074550a6c5163a0f587e49c49017434e3cdfe853941725f5455dd29c"}, + {file = "resolvelib-0.5.5.tar.gz", hash = "sha256:123de56548c90df85137425a3f51eb93df89e2ba719aeb6a8023c032758be950"}, +] +"ruamel.yaml" = [ + {file = "ruamel.yaml-0.17.17-py3-none-any.whl", hash = "sha256:9af3ec5d7f8065582f3aa841305465025d0afd26c5fb54e15b964e11838fc74f"}, + {file = "ruamel.yaml-0.17.17.tar.gz", hash = "sha256:9751de4cbb57d4bfbf8fc394e125ed4a2f170fbff3dc3d78abf50be85924f8be"}, +] +secretstorage = [ + {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, + {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, +] +selinux = [ + {file = "selinux-0.2.1-py2.py3-none-any.whl", hash = "sha256:820adcf1b4451c9cc7759848797703263ba0eb6a4cad76d73548a9e0d57b7926"}, + {file = "selinux-0.2.1.tar.gz", hash = "sha256:d435f514e834e3fdc0941f6a29d086b80b2ea51b28112aee6254bd104ee42a74"}, +] +sh = [ + {file = "sh-1.14.2-py2.py3-none-any.whl", hash = "sha256:4921ac9c1a77ec8084bdfaf152fe14138e2b3557cc740002c1a97076321fce8a"}, + {file = "sh-1.14.2.tar.gz", hash = "sha256:9d7bd0334d494b2a4609fe521b2107438cdb21c0e469ffeeb191489883d6fe0d"}, +] +shellingham = [ + {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, + {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +smmap = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] +stevedore = [ + {file = "stevedore-3.5.0-py3-none-any.whl", hash = "sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c"}, + {file = "stevedore-3.5.0.tar.gz", hash = "sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335"}, +] +tabulate = [ + {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, + {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, +] +text-unidecode = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"}, + {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"}, +] +tomlkit = [ + {file = "tomlkit-0.7.2-py2.py3-none-any.whl", hash = "sha256:173ad840fa5d2aac140528ca1933c29791b79a374a0861a80347f42ec9328117"}, + {file = "tomlkit-0.7.2.tar.gz", hash = "sha256:d7a454f319a7e9bd2e249f239168729327e4dd2d27b17dc68be264ad1ce36754"}, +] +tree-format = [ + {file = "tree-format-0.1.2.tar.gz", hash = "sha256:a538523aa78ae7a4b10003b04f3e1b37708e0e089d99c9d3b9e1c71384c9a7f9"}, + {file = "tree_format-0.1.2-py2-none-any.whl", hash = "sha256:b5056228dbedde1fb81b79f71fb0c23c98e9d365230df9b29af76e8d8003de11"}, +] +typing-extensions = [ + {file = "typing_extensions-4.0.0-py3-none-any.whl", hash = "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9"}, + {file = "typing_extensions-4.0.0.tar.gz", hash = "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed"}, +] +urllib3 = [ + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, +] +virtualenv = [ + {file = "virtualenv-20.10.0-py2.py3-none-any.whl", hash = "sha256:4b02e52a624336eece99c96e3ab7111f469c24ba226a53ec474e8e787b365814"}, + {file = "virtualenv-20.10.0.tar.gz", hash = "sha256:576d05b46eace16a9c348085f7d0dc8ef28713a2cabaa1cf0aea41e8f12c9218"}, +] +watchdog = [ + {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, + {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aba5c812f8ee8a3ff3be51887ca2d55fb8e268439ed44110d3846e4229eb0e8b"}, + {file = "watchdog-2.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ae38bf8ba6f39d5b83f78661273216e7db5b00f08be7592062cb1fc8b8ba542"}, + {file = "watchdog-2.1.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ad6f1796e37db2223d2a3f302f586f74c72c630b48a9872c1e7ae8e92e0ab669"}, + {file = "watchdog-2.1.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:922a69fa533cb0c793b483becaaa0845f655151e7256ec73630a1b2e9ebcb660"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b2fcf9402fde2672545b139694284dc3b665fd1be660d73eca6805197ef776a3"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3386b367e950a11b0568062b70cc026c6f645428a698d33d39e013aaeda4cc04"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f1c00aa35f504197561060ca4c21d3cc079ba29cf6dd2fe61024c70160c990b"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b52b88021b9541a60531142b0a451baca08d28b74a723d0c99b13c8c8d48d604"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8047da932432aa32c515ec1447ea79ce578d0559362ca3605f8e9568f844e3c6"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e92c2d33858c8f560671b448205a268096e17870dcf60a9bb3ac7bfbafb7f5f9"}, + {file = "watchdog-2.1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7d336912853d7b77f9b2c24eeed6a5065d0a0cc0d3b6a5a45ad6d1d05fb8cd8"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cca7741c0fcc765568350cb139e92b7f9f3c9a08c4f32591d18ab0a6ac9e71b6"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_armv7l.whl", hash = "sha256:25fb5240b195d17de949588628fdf93032ebf163524ef08933db0ea1f99bd685"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_i686.whl", hash = "sha256:be9be735f827820a06340dff2ddea1fb7234561fa5e6300a62fe7f54d40546a0"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0d19fb2441947b58fbf91336638c2b9f4cc98e05e1045404d7a4cb7cddc7a65"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:3becdb380d8916c873ad512f1701f8a92ce79ec6978ffde92919fd18d41da7fb"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_s390x.whl", hash = "sha256:ae67501c95606072aafa865b6ed47343ac6484472a2f95490ba151f6347acfc2"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e0f30db709c939cabf64a6dc5babb276e6d823fd84464ab916f9b9ba5623ca15"}, + {file = "watchdog-2.1.6-py3-none-win32.whl", hash = "sha256:e02794ac791662a5eafc6ffeaf9bcc149035a0e48eb0a9d40a8feb4622605a3d"}, + {file = "watchdog-2.1.6-py3-none-win_amd64.whl", hash = "sha256:bd9ba4f332cf57b2c1f698be0728c020399ef3040577cde2939f2e045b39c1e5"}, + {file = "watchdog-2.1.6-py3-none-win_ia64.whl", hash = "sha256:a0f1c7edf116a12f7245be06120b1852275f9506a7d90227648b250755a03923"}, + {file = "watchdog-2.1.6.tar.gz", hash = "sha256:a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +wrapt = [ + {file = "wrapt-1.13.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca"}, + {file = "wrapt-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44"}, + {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056"}, + {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785"}, + {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096"}, + {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33"}, + {file = "wrapt-1.13.3-cp310-cp310-win32.whl", hash = "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f"}, + {file = "wrapt-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755"}, + {file = "wrapt-1.13.3-cp35-cp35m-win32.whl", hash = "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851"}, + {file = "wrapt-1.13.3-cp35-cp35m-win_amd64.whl", hash = "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13"}, + {file = "wrapt-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918"}, + {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade"}, + {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc"}, + {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf"}, + {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125"}, + {file = "wrapt-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36"}, + {file = "wrapt-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10"}, + {file = "wrapt-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068"}, + {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709"}, + {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df"}, + {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2"}, + {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b"}, + {file = "wrapt-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829"}, + {file = "wrapt-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"}, + {file = "wrapt-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9"}, + {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554"}, + {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c"}, + {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b"}, + {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce"}, + {file = "wrapt-1.13.3-cp38-cp38-win32.whl", hash = "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79"}, + {file = "wrapt-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb"}, + {file = "wrapt-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb"}, + {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32"}, + {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7"}, + {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e"}, + {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640"}, + {file = "wrapt-1.13.3-cp39-cp39-win32.whl", hash = "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374"}, + {file = "wrapt-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb"}, + {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"}, +] +yamllint = [ + {file = "yamllint-1.23.0-py2.py3-none-any.whl", hash = "sha256:0fa69bf8a86182b7fe14918bdd3a30354c869966bbc7cbfff176af71bda9c806"}, + {file = "yamllint-1.23.0.tar.gz", hash = "sha256:59f3ff77f44e7f46be6aecdb985830f73a1c51e290b7082a7d38c2ae1940f4a9"}, +] +zipp = [ + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, +] diff --git a/roles/mrlesmithjr.ansible-manage-lvm/pyproject.toml b/roles/mrlesmithjr.ansible-manage-lvm/pyproject.toml new file mode 100644 index 00000000..d5390e21 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/pyproject.toml @@ -0,0 +1,30 @@ +[tool.poetry] +name = "ansible-manage-lvm" +version = "0.1.0" +description = "" +authors = ["Larry Smith Jr. "] + +[tool.poetry.dependencies] +python = "^3.10" +ansible = "4.2.0" + +[tool.poetry.dev-dependencies] +bandit = "^1.7.1" +black = "^21.11b1" +flake8 = "^4.0.1" +mypy = "^0.910" +poetry = "^1.1.11" +pylint = "^2.11.1" +ansible-lint = "4.2.0" +yamllint = "1.23.0" +mkdocs = "^1.2.3" +autopep8 = "^1.6.0" +pycodestyle = "^2.8.0" +pip-tools = "^6.4.0" +molecule = "3.0.3" +molecule-vagrant = "0.2" +pre-commit = "^2.15.0" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/roles/mrlesmithjr.ansible-manage-lvm/requirements-dev.txt b/roles/mrlesmithjr.ansible-manage-lvm/requirements-dev.txt new file mode 100644 index 00000000..9804d3b6 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/requirements-dev.txt @@ -0,0 +1,114 @@ +ansible-core==2.11.6; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +ansible-lint==4.2.0; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") +ansible==4.2.0; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") +arrow==1.2.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +astroid==2.8.6; python_version >= "3.6" and python_version < "4.0" +autopep8==1.6.0 +backports.entry-points-selectable==1.1.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "2.7" +bandit==1.7.1; python_version >= "3.5" +bcrypt==3.2.0; python_version >= "3.6" +binaryornot==0.4.4; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +black==21.11b1; python_full_version >= "3.6.2" +cachecontrol==0.12.10; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +cachy==0.3.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +cerberus==1.3.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +certifi==2021.10.8; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" +cffi==1.15.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +cfgv==3.3.1; python_full_version >= "3.6.1" +chardet==4.0.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +charset-normalizer==2.0.7; python_full_version >= "3.6.0" and python_version >= "3" +cleo==0.8.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +click-completion==0.5.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +click-help-colors==0.9.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +click==8.0.3; python_version >= "3.6" and python_full_version >= "3.6.2" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") +clikit==0.6.2; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +colorama==0.4.4; platform_system == "Windows" and python_version >= "3.6" and python_full_version >= "3.6.2" and python_version < "4.0" and sys_platform == "win32" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") +cookiecutter==1.7.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +crashtest==0.3.1; python_version >= "3.6" and python_version < "4.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0") +cryptography==36.0.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0") and sys_platform == "linux" or python_full_version >= "3.5.0" and python_version >= "3.6" and python_version < "4.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0") and sys_platform == "linux" +distlib==0.3.3; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +distro==1.6.0; python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "linux" or python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "linux2" or sys_platform == "linux" and python_version >= "3.6" and python_full_version >= "3.4.0" or sys_platform == "linux2" and python_version >= "3.6" and python_full_version >= "3.4.0" +fasteners==0.16.3; python_version >= "3.6" +filelock==3.4.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +flake8==4.0.1; python_version >= "3.6" +ghp-import==2.0.2; python_version >= "3.6" +gitdb==4.0.9; python_version >= "3.7" +gitpython==3.1.24; python_version >= "3.7" +html5lib==1.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +identify==2.4.0; python_full_version >= "3.6.1" +idna==3.3; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.5" +importlib-metadata==4.8.2; python_version >= "3.6" +isort==5.10.1; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.6" +jeepney==0.7.1; python_version >= "3.6" and python_version < "4.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0") and sys_platform == "linux" +jinja2-time==0.2.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +jinja2==3.0.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +keyring==21.8.0; python_version >= "3.6" and python_version < "4.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0") +lazy-object-proxy==1.6.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.0" +lockfile==0.12.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +markdown==3.3.6; python_version >= "3.6" +markupsafe==2.0.1; python_version >= "3.6" +mccabe==0.6.1; python_version >= "3.6" and python_version < "4.0" +mergedeep==1.3.4; python_version >= "3.6" +mkdocs==1.2.3; python_version >= "3.6" +molecule-vagrant==0.2; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") +molecule==3.0.3; python_version >= "3.6" +msgpack==1.0.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +mypy-extensions==0.4.3; python_full_version >= "3.6.2" and python_version >= "3.5" +mypy==0.910; python_version >= "3.5" +nodeenv==1.6.0; python_full_version >= "3.6.1" +packaging==20.9; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +paramiko==2.8.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +pastel==0.2.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +pathspec==0.9.0; python_full_version >= "3.6.2" and python_version >= "3.6" +pbr==5.8.0; python_version >= "3.6" +pep517==0.12.0; python_version >= "3.6" +pexpect==4.8.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +pip-tools==6.4.0; python_version >= "3.6" +pkginfo==1.8.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +platformdirs==2.4.0; python_version >= "3.6" and python_full_version >= "3.6.2" and python_version < "4.0" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") +pluggy==0.13.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +poetry-core==1.0.7; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +poetry==1.1.11; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") +poyo==0.5.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +pre-commit==2.15.0; python_full_version >= "3.6.1" +ptyprocess==0.7.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +pycodestyle==2.8.0; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") +pycparser==2.21; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +pyflakes==2.4.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" +pylev==1.4.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +pylint==2.11.1; python_version >= "3.6" and python_version < "4.0" +pynacl==1.4.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" +pyparsing==3.0.6; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +python-dateutil==2.8.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +python-gilt==1.2.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +python-slugify==5.0.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +python-vagrant==0.5.15; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +pywin32-ctypes==0.2.0; python_version >= "3.6" and python_version < "4.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0") and sys_platform == "win32" +pyyaml-env-tag==0.1; python_version >= "3.6" +pyyaml==5.4.1; python_full_version >= "3.6.1" and python_version >= "3.6" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6") +regex==2021.11.10; python_full_version >= "3.6.2" +requests-toolbelt==0.9.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +requests==2.26.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" +resolvelib==0.5.5; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +ruamel.yaml==0.17.17; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" +secretstorage==3.3.1; python_version >= "3.6" and python_version < "4.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0") and sys_platform == "linux" +selinux==0.2.1; python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "linux" or python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "linux2" or sys_platform == "linux" and python_version >= "3.6" and python_full_version >= "3.5.0" or sys_platform == "linux2" and python_version >= "3.6" and python_full_version >= "3.5.0" +sh==1.14.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +shellingham==1.4.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.5.0" +six==1.16.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +smmap==5.0.0; python_version >= "3.7" +stevedore==3.5.0; python_version >= "3.6" +tabulate==0.8.9; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +text-unidecode==1.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +toml==0.10.2; python_full_version >= "3.6.1" and python_version >= "3.6" and python_version < "4.0" +tomli==1.2.2; python_version >= "3.6" and python_full_version >= "3.6.2" +tomlkit==0.7.2; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +tree-format==0.1.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +typing-extensions==4.0.0 +urllib3==1.26.7; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" +virtualenv==20.10.0; python_full_version >= "3.6.1" +watchdog==2.1.6; python_version >= "3.6" +webencodings==0.5.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +wrapt==1.13.3; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0" +yamllint==1.23.0; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") +zipp==3.6.0; python_version >= "3.6" diff --git a/roles/mrlesmithjr.ansible-manage-lvm/requirements.txt b/roles/mrlesmithjr.ansible-manage-lvm/requirements.txt new file mode 100644 index 00000000..ee6bace8 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/requirements.txt @@ -0,0 +1,11 @@ +ansible-core==2.11.6; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +ansible==4.2.0; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") +cffi==1.15.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +cryptography==36.0.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +jinja2==3.0.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +markupsafe==2.0.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +packaging==20.9; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" +pycparser==2.21; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +pyparsing==3.0.6; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +pyyaml==5.4.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" +resolvelib==0.5.5; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tasks/amazon.yml b/roles/mrlesmithjr.ansible-manage-lvm/tasks/amazon.yml new file mode 100644 index 00000000..a53ac693 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tasks/amazon.yml @@ -0,0 +1,70 @@ +--- + +- name: amazon | check for nvme devices + shell: | + set -o pipefail + cat /proc/partitions | awk '{print $4}' | grep -q nvme. ; echo $? + args: + executable: /bin/bash + register: blkdev_nvme + changed_when: false + +- name: amazon | check for amazon ebs devices + shell: | + set -o pipefail + lsblk -O -J | grep -qi "amazon elastic block store" ; echo $? + register: blkdev_awsebs + changed_when: false + args: + executable: /bin/bash + +- name: amazon | set flag for nvme subsystem + set_fact: + device_is_nvme: "{{ true if (blkdev_nvme.stdout == '0') else false }}" + +- name: amazon | set flag for aws ebs devices + set_fact: + device_is_awsebs: "{{ true if (blkdev_awsebs.stdout == '0') else false }}" + +- name: Block to map renamed ec2 ebs nvmeXnY devices to their original sdX/xvdX names + when: device_is_nvme and device_is_awsebs|bool + become: true + block: + - name: amazon | download nvme mapping binary helper + get_url: + url: "{{ ebsnvme_binary_helper_url }}" + dest: "{{ ebsnvme_binary_helper_tmp }}/" + changed_when: false + + - name: amazon | extract binary helper + unarchive: + src: "{{ ebsnvme_binary_helper_tmp }}/{{ ebsnvme_binary_helper_file }}" + dest: "{{ ebsnvme_binary_helper_tmp }}/" + remote_src: yes + mode: 0755 + changed_when: false + + - name: amazon | copy binary helper + copy: + src: "{{ ebsnvme_binary_helper_tmp }}/go-ebsnvme" + dest: "{{ ebsnvme_binary_helper_path }}" + mode: a+x + remote_src: yes + + - name: amazon | template script helper + template: + src: 'ebsnvme-id.j2' + dest: "{{ ebsnvme_scrip_helper_path }}" + mode: a+x + + - name: amazon | template udev rule + template: + src: '70-ec2-nvme-devices.rules.j2' + dest: '/etc/udev/rules.d/70-ec2-nvme-devices.rules' + mode: 0755 + register: udev_rule + + - name: amazon | reload and trigger udev rules + shell: + cmd: udevadm control --reload-rules && udevadm trigger + when: udev_rule.changed diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tasks/centos.yml b/roles/mrlesmithjr.ansible-manage-lvm/tasks/centos.yml new file mode 100644 index 00000000..b2a29e89 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tasks/centos.yml @@ -0,0 +1,69 @@ +--- +- name: centos | installing lvm2 and sg3_utils + package: + name: + - lvm2 + - sg3_utils + state: present + become: true + +- include_tasks: amazon.yml + when: ansible_facts.system_vendor == 'Amazon EC2' + +- name: centos | debug lvg + debug: + var: lv + verbosity: 3 + loop: "{{ lookup('subelements', lvm_groups, 'lvnames', {'skip_missing': True}, wantlist=True) }}" + loop_control: + loop_var: lv + +- name: centos | install xfs tools + package: + name: "xfsprogs" + state: "present" + become: true + loop: "{{ lookup('subelements', lvm_groups, 'lvnames', {'skip_missing': True}, wantlist=True) }}" + loop_control: + loop_var: lv + when: + - lv.1 is defined + - lv.1 != "None" + - lv.1.filesystem is defined + - lv.1.filesystem == "xfs" + - lv.1.create is defined + - lv.1.create|bool + +- name: centos | check for scsi adapters + find: + paths: "/sys/class/scsi_host" + file_type: any + become: true + register: scsi_adapters + +- block: + - name: centos | installing sg3_utils + package: + name: sg3_utils + state: present + become: true + + - name: centos | checking for scsi devices + command: sg_scan + become: true + register: scsi_devices + changed_when: false + + - name: centos | rescanning for new disks + command: "{{ rescan_scsi_command }}" + become: true + changed_when: false + when: scsi_devices.stdout|length > 0 + + - name: centos | rescanning for resized disks + command: "{{ rescan_scsi_command }} -s" + become: true + changed_when: false + when: scsi_devices.stdout|length > 0 + + when: scsi_adapters.matched > 0 diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tasks/create_fs.yml b/roles/mrlesmithjr.ansible-manage-lvm/tasks/create_fs.yml new file mode 100644 index 00000000..0e842f95 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tasks/create_fs.yml @@ -0,0 +1,96 @@ +--- + +# unable to resize xfs: looks like we've to reference the mountpoint instead of the device +- name: create_fs | check already converted + # at least xfs is executed twice if the partition has changed in the meantime + # then it tries to recreate the fs on the mounted fs which indeed fails... + shell: "xfs_info {{ lv.mntp }} | grep -c 'ftype=1'" + become: yes + register: mountedxfs + ignore_errors: true + changed_when: false + when: + - lv is defined and lv != 'None' + - lv.filesystem is defined + - lv.filesystem == "xfs" + - lv.create is defined + - lv.create|bool + +- name: create_fs | unmounting filesystem(s) + mount: + path: "{{ lv.mntp }}" + src: "/dev/{{ vg.vgname }}/{{ lv.lvname }}" + fstype: "{{ lv.filesystem | default(omit) }}" + state: absent + become: true + when: + - lv is defined + - lv != 'None' + - lv.create is defined + - not lv.create|bool + - lv.filesystem != "swap" + +- name: create_fs | creating new filesystem on new LVM logical volume(s) + filesystem: + fstype: "{{ lv.filesystem }}" + dev: "/dev/{{ vg.vgname }}/{{ lv.lvname }}" + resizefs: yes + become: true + when: + - vg.create is defined + - vg.create|bool + - lv is defined + - lv != 'None' + - lv.create is defined + - lv.create|bool + - lv.filesystem is defined + - lv.filesystem != 'None' + - lv.filesystem != 'xfs' + +- name: create_fs | creating new xfs filesystem on new LVM logical volume(s) + filesystem: + fstype: "{{ lv.filesystem }}" + dev: "/dev/{{ vg.vgname }}/{{ lv.lvname }}" + become: true + when: + - mountedxfs is failed + - vg.create is defined + - vg.create|bool + - lv is defined + - lv != 'None' + - lv.create is defined + - lv.create|bool + - lv.filesystem is defined + - lv.filesystem == 'xfs' + +- name: create_fs | mounting new filesystem(s) + mount: + path: "{{ lv.mntp }}" + src: "/dev/{{ vg.vgname }}/{{ lv.lvname }}" + fstype: "{{ lv.filesystem }}" + state: mounted + opts: "{{ lv.mopts | default('defaults') }}" + become: true + when: + - vg.create is defined + - vg.create|bool + - lv is defined + - lv != 'None' + - lv.create is defined + - lv.create|bool + - lv.mount is defined + - lv.mount|bool + +- name: create_fs | resizing xfs filesystem on new LVM logical volume(s) + command: "xfs_growfs {{ lv.mntp }}" + become: true + when: + - vg.create is defined + - vg.create|bool + - lv is defined + - lv != 'None' + - lv.create is defined + - lv.create|bool + - lv.filesystem is defined + - lv.filesystem == 'xfs' + - lvchanged.changed diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tasks/create_lv.yml b/roles/mrlesmithjr.ansible-manage-lvm/tasks/create_lv.yml new file mode 100644 index 00000000..ee2e7cae --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tasks/create_lv.yml @@ -0,0 +1,31 @@ +--- + +- name: create_lv | Display Volume Group + debug: + var: vg + verbosity: 2 + +- name: create_lv | creating new LVM logical volume(s) + lvol: + vg: "{{ vg.vgname }}" + lv: "{{ lv.lvname }}" + size: "{{ lv.size }}" + shrink: false + opts: "{{ lv.opts | default('') }}" + state: present + become: true + register: lvchanged + when: + - vg.create is defined + - vg.create|bool + - lv is defined + - lv != 'None' + - lv.create is defined + - lv.create|bool + +- name: create_lv | debug changed attribute + debug: + var: lvchanged + +- name: create_lv | configuring FS + include_tasks: create_fs.yml diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tasks/create_vg.yml b/roles/mrlesmithjr.ansible-manage-lvm/tasks/create_vg.yml new file mode 100644 index 00000000..f779d423 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tasks/create_vg.yml @@ -0,0 +1,29 @@ +--- +- name: create_vg | creating new LVM volume group(s) + lvg: + vg: "{{ vg.vgname }}" + pvs: "{{ vg.disks | join(',') }}" + state: present + become: true + when: + - vg.create is defined + - vg.create|bool + +### workaround: auto pvresize waiting for upgrade to new module supporting integrated pvresize +### ref: https://docs.ansible.com/ansible/3/collections/community/general/lvg_module.html +- name: create_vg | pvresize to max available free space + command: "pvresize {{ pv }}" + loop: "{{ vg.disks | default([]) }}" + loop_control: + loop_var: pv + changed_when: false + when: + - vg.create is defined + - vg.create|bool + - pvresize_to_max|bool + +- name: manage_lvm | loop over logical volume group(s) to create logical volumes + include_tasks: create_lv.yml + loop: "{{ vg.lvnames | default([]) }}" + loop_control: + loop_var: lv diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tasks/debian.yml b/roles/mrlesmithjr.ansible-manage-lvm/tasks/debian.yml new file mode 100644 index 00000000..1ca87ec8 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tasks/debian.yml @@ -0,0 +1,40 @@ +--- +- name: debian | Updating Apt Cache + apt: + update_cache: true + cache_valid_time: 3600 + become: true + +- name: debian | installing pre-reqs + apt: + name: + - lvm2 + - scsitools + state: present + become: true + +- name: debian | install xfs tools + apt: + name: xfsprogs + state: present + become: true + loop: "{{ lvm_groups|subelements('lvnames') }}" + when: + - item.1 is defined + - item.1 != 'None' + - item.1.filesystem is defined + - item.1.filesystem == "xfs" + - item.1.create is defined + - item.1.create|bool + +- name: debian | checking for scsi devices + command: sg_scan + become: true + register: scsi_devices + changed_when: false + +- name: debian | rescanning for new disks added + command: "{{ rescan_scsi_command }}" + become: true + changed_when: false + when: scsi_devices['stdout'] | length diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tasks/main.yml b/roles/mrlesmithjr.ansible-manage-lvm/tasks/main.yml new file mode 100644 index 00000000..c69013d5 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tasks/main.yml @@ -0,0 +1,19 @@ +--- +# tasks file for ansible-manage-lvm +- name: Set rescan_scsi_command for old debian version + set_fact: + rescan_scsi_command: "/sbin/rescan-scsi-bus" + when: + - ansible_distribution | replace(' ','') | lower == 'debian' + - ansible_distribution_major_version is version(10, '<=') + +- include_tasks: debian.yml + when: ansible_facts.os_family == "Debian" + +- include_tasks: centos.yml + when: ansible_facts.os_family == "RedHat" + +- include_tasks: manage_lvm.yml + when: + - lvm_groups is defined + - manage_lvm|bool diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tasks/manage_lvm.yml b/roles/mrlesmithjr.ansible-manage-lvm/tasks/manage_lvm.yml new file mode 100644 index 00000000..04b6d265 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tasks/manage_lvm.yml @@ -0,0 +1,31 @@ +--- +- name: manage_lvm | manage physical volume group creation + include_tasks: create_vg.yml + loop: "{{ lvm_groups }}" + loop_control: + loop_var: vg + +- name: manage_lvm | Removing LVM logical volume(s) + lvol: + vg: "{{ item.0.vgname }}" + lv: "{{ item.1.lvname }}" + state: absent + force: true + become: true + loop: "{{ lvm_groups|subelements('lvnames', {'skip_missing': true}) }}" + when: + - item.1 is defined + - item.1 != 'None' + - item.1.create is defined + - not item.1.create|bool + +- name: manage_lvm | Removing LVM volume group(s) + lvg: + vg: "{{ item.vgname }}" + pvs: "{{ item.disks | join(',') }}" + state: absent + become: true + loop: "{{ lvm_groups }}" + when: + - item.create is defined + - not item.create|bool diff --git a/roles/mrlesmithjr.ansible-manage-lvm/templates/70-ec2-nvme-devices.rules.j2 b/roles/mrlesmithjr.ansible-manage-lvm/templates/70-ec2-nvme-devices.rules.j2 new file mode 100644 index 00000000..1c3b28ec --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/templates/70-ec2-nvme-devices.rules.j2 @@ -0,0 +1,3 @@ +# ebs nvme to scsi device naming mapping +KERNEL=="nvme[0-9]*n[0-9]*", ENV{DEVTYPE}=="disk", ATTRS{model}=="Amazon Elastic Block Store", PROGRAM="{{ ebsnvme_scrip_helper_path }} /dev/%k", SYMLINK+="%c" + diff --git a/roles/mrlesmithjr.ansible-manage-lvm/templates/ebsnvme-id.j2 b/roles/mrlesmithjr.ansible-manage-lvm/templates/ebsnvme-id.j2 new file mode 100644 index 00000000..dc605fb5 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/templates/ebsnvme-id.j2 @@ -0,0 +1,15 @@ +#!/bin/bash +# This script uses go version of ebsnvme-id to provide +# SCSI Disk device name links for nvme devices +# +# links: +# +# https://www.logicworks.com/blog/2018/03/manage-aws-ebs-volumes-c5-m5-puppet-chef-ansible/ +# https://github.com/mvisonneau/go-ebsnvme +# https://gist.github.com/lbernail/d851e5b06eb32180a4b8ead2ce4f45db +# and working forks like: +# (keenan-v1/ebsnvme-id) https://gist.github.com/keenan-v1/aee92cd7383ee02de2a817a004917a03 +# + +{{ ebsnvme_binary_helper_path }} -n $1 | awk -F '/' '{print $3}' + diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tests/.ansible-lint b/roles/mrlesmithjr.ansible-manage-lvm/tests/.ansible-lint new file mode 100644 index 00000000..9c1ce1bf --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tests/.ansible-lint @@ -0,0 +1 @@ +skip_list: ['305','503','602'] diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.centos-7 b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.centos-7 new file mode 100644 index 00000000..1ad757e0 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.centos-7 @@ -0,0 +1,27 @@ +FROM centos:7 +ENV container=docker + +RUN yum -y install epel-release && \ + yum -y install gmp-devel libffi-devel openssl-devel python-crypto \ + python-devel python-pip python-setuptools python-virtualenv \ + redhat-rpm-config && \ + yum -y group install "Development Tools" + +# Install systemd -- See https://hub.docker.com/_/centos/ +RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \ + rm -f /lib/systemd/system/multi-user.target.wants/*;\ + rm -f /etc/systemd/system/*.wants/*;\ + rm -f /lib/systemd/system/local-fs.target.wants/*; \ + rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ + rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ + rm -f /lib/systemd/system/basic.target.wants/*;\ + rm -f /lib/systemd/system/anaconda.target.wants/*; + +RUN pip install enum34 ipaddress wheel && \ + pip install ansible ansible-lint + +COPY .ansible-lint / + +VOLUME ["/sys/fs/cgroup"] + +CMD ["/usr/sbin/init"] diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.debian-stretch b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.debian-stretch new file mode 100644 index 00000000..c1187b8c --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.debian-stretch @@ -0,0 +1,13 @@ +FROM debian:stretch +ENV container=docker + +RUN apt-get update && \ + apt-get install -y --no-install-recommends build-essential libffi-dev \ + libssl-dev python-dev python-minimal python-pip python-setuptools \ + python-virtualenv systemd && \ + rm -rf /var/lib/apt/lists/* + +RUN pip install enum34 ipaddress wheel && \ + pip install ansible ansible-lint + +COPY .ansible-lint / diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.fedora-25 b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.fedora-25 new file mode 100644 index 00000000..16fa8717 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.fedora-25 @@ -0,0 +1,26 @@ +FROM fedora:25 +ENV container=docker + +RUN dnf -y install gmp-devel libffi-devel openssl-devel python-crypto \ + python-devel python-dnf python-pip python-setuptools python-virtualenv \ + redhat-rpm-config systemd && \ + dnf -y group install "C Development Tools and Libraries" + +# Install systemd -- See https://hub.docker.com/_/centos/ +RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \ + rm -f /lib/systemd/system/multi-user.target.wants/*;\ + rm -f /etc/systemd/system/*.wants/*;\ + rm -f /lib/systemd/system/local-fs.target.wants/*; \ + rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ + rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ + rm -f /lib/systemd/system/basic.target.wants/*;\ + rm -f /lib/systemd/system/anaconda.target.wants/*; + +RUN pip install enum34 ipaddress wheel && \ + pip install ansible ansible-lint + +COPY .ansible-lint / + +VOLUME ["/sys/fs/cgroup"] + +CMD ["/usr/sbin/init"] diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.fedora-26 b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.fedora-26 new file mode 100644 index 00000000..dd8a9544 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.fedora-26 @@ -0,0 +1,26 @@ +FROM fedora:26 +ENV container=docker + +RUN dnf -y install gmp-devel libffi-devel openssl-devel python-crypto \ + python-devel python-dnf python-pip python-setuptools python-virtualenv \ + redhat-rpm-config systemd && \ + dnf -y group install "C Development Tools and Libraries" + +# Install systemd -- See https://hub.docker.com/_/centos/ +RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \ + rm -f /lib/systemd/system/multi-user.target.wants/*;\ + rm -f /etc/systemd/system/*.wants/*;\ + rm -f /lib/systemd/system/local-fs.target.wants/*; \ + rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ + rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ + rm -f /lib/systemd/system/basic.target.wants/*;\ + rm -f /lib/systemd/system/anaconda.target.wants/*; + +RUN pip install enum34 ipaddress wheel && \ + pip install ansible ansible-lint + +COPY .ansible-lint / + +VOLUME ["/sys/fs/cgroup"] + +CMD ["/usr/sbin/init"] diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.ubuntu-bionic b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.ubuntu-bionic new file mode 100644 index 00000000..07116b6b --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.ubuntu-bionic @@ -0,0 +1,13 @@ +FROM ubuntu:bionic +ENV container=docker + +RUN apt-get update && \ + apt-get install -y --no-install-recommends build-essential libffi-dev \ + libssl-dev python-dev python-minimal python-pip python-setuptools \ + python-virtualenv systemd && \ + rm -rf /var/lib/apt/lists/* + +RUN pip install enum34 ipaddress wheel && \ + pip install ansible ansible-lint + +COPY .ansible-lint / diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.ubuntu-xenial b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.ubuntu-xenial new file mode 100644 index 00000000..188f2551 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tests/Dockerfile.ubuntu-xenial @@ -0,0 +1,13 @@ +FROM ubuntu:xenial +ENV container=docker + +RUN apt-get update && \ + apt-get install -y --no-install-recommends build-essential libffi-dev \ + libssl-dev python-dev python-minimal python-pip python-setuptools \ + python-virtualenv && \ + rm -rf /var/lib/apt/lists/* + +RUN pip install enum34 ipaddress wheel && \ + pip install ansible ansible-lint + +COPY .ansible-lint / diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tests/inventory b/roles/mrlesmithjr.ansible-manage-lvm/tests/inventory new file mode 100644 index 00000000..2fbb50c4 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tests/inventory @@ -0,0 +1 @@ +localhost diff --git a/roles/mrlesmithjr.ansible-manage-lvm/tests/test.yml b/roles/mrlesmithjr.ansible-manage-lvm/tests/test.yml new file mode 100644 index 00000000..2ac7e231 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + connection: local + roles: + - ansible-manage-lvm diff --git a/roles/mrlesmithjr.ansible-manage-lvm/vars/main.yml b/roles/mrlesmithjr.ansible-manage-lvm/vars/main.yml new file mode 100644 index 00000000..953fcda2 --- /dev/null +++ b/roles/mrlesmithjr.ansible-manage-lvm/vars/main.yml @@ -0,0 +1,7 @@ +--- +# vars file for ansible-manage-lvm + +ebsnvme_binary_helper_file: go-ebsnvme_{{ ebsnvme_binary_helper_ver }}_linux_amd64.tar.gz +ebsnvme_binary_helper_url: https://github.com/mvisonneau/go-ebsnvme/releases/download/{{ ebsnvme_binary_helper_ver }}/{{ ebsnvme_binary_helper_file }} + +rescan_scsi_command: "/usr/bin/rescan-scsi-bus.sh"