diff --git a/.github/workflows/pypi-upload.yml b/.github/workflows/pypi-upload.yml index 62ed44a..cd51f73 100644 --- a/.github/workflows/pypi-upload.yml +++ b/.github/workflows/pypi-upload.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/setup-python@v6 with: - python-version: 3.10 + python-version: "3.10" architecture: x64 - name: Autobump version @@ -46,44 +46,3 @@ jobs: TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} run: | twine upload --verbose -u '__token__' dist/* - virt_stats: - name: Virt Stats PyPI Upload - runs-on: ubuntu-latest - defaults: - run: - working-directory: libvirt - - steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-python@v3 - with: - python-version: 3.8 - architecture: x64 - - - name: Autobump version - run: | - # from refs/tags/v1.2.3 get 1.2.3 - VERSION=${GITHUB_REF/refs\/tags\//} - PLACEHOLDER='version="develop"' - VERSION_FILE='setup.py' - - # grep ensures the placeholder is there. If grep doesn't find the placeholder - # it exits with exit code 1 and github actions aborts the build. - grep "$PLACEHOLDER" "$VERSION_FILE" - - sed -i "s/$PLACEHOLDER/version=\"${VERSION}\"/g" "$VERSION_FILE" - - - name: Install pypa/build and twine - run: | - python -m pip install build twine - - - name: Build a binary wheel and a source tarball - run: | - python -m build --sdist --wheel --outdir dist/ . - - - name: Upload to PyPI via Twine - env: - TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} - run: | - twine upload --verbose -u '__token__' dist/* diff --git a/libvirt/.gitignore b/libvirt/.gitignore deleted file mode 100644 index 87328a1..0000000 --- a/libvirt/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -build/ -dist/ -virt_stats.egg-info diff --git a/libvirt/CONTRIBUTING.md b/libvirt/CONTRIBUTING.md deleted file mode 100644 index a634666..0000000 --- a/libvirt/CONTRIBUTING.md +++ /dev/null @@ -1,101 +0,0 @@ -# Contributing to _Virt Stats_ - -Welcome! Happy to see you willing to make the project better. - -## We're standing on the shoulders of giants - -Under the hood Virt Stats relies on awesome [libvirt](https://libvirt.org/). - -## Technicalities - -Development on the latest version of Python is preferred. As of this writing it's 3.9. You can use any operating system. - -Install all development dependencies using: - -``` -pipenv install --dev -``` - -If you haven't used `pipenv` before but are comfortable with virtualenvs, just run `pip install pipenv` in the virtualenv you're already using and invoke the command above from the `libvirt` directory of the cloned _Machine Stats_ repo. It will do the correct thing. - -Non `pipenv` install works too: - -``` -pip install -r requirements.txt -pip install -r dev-requirements.txt -pip install -e . -``` - -### Tools - -We use the following tools: - -* `black` for code formatting (`pipenv run black .`) -* `isort` to sort imports (`pipenv run isort .`) -* `flake8` or `pylint` for code linting (`pipenv run flake8 - src/machine_stats/*` or `pipenv run pylint src`) -* `bump2version` for version bumps (`pipenv run bump2version`) - -## Testing environments - -- To create a test environment on Google Cloud Platform use the script in `scripts/nested-virtualization/main.sh` -- Connect to the created instance and check that your user is in a `libvirt` group. Add if necessary: - ``` - $ sudo usermod -a -G libvirt $USER - ``` -- Download a [Debian Cloud image](https://cloud.debian.org/images/cloud/) suitable for QEMU, for example: - ``` - $ curl -L -O https://cloud.debian.org/images/cloud/buster/latest/debian-10-nocloud-amd64.qcow2 - ``` -- Move the image file to `/var/lib/libvirt/images` to workaround permissions issue: - ``` - $ sudo mv debian-10-nocloud-amd64.qcow2 /var/lib/libvirt/images/ - ``` -- Create a new VM using the following command: - ``` - $ virt-install \ - --connect qemu:///system \ - --name debian10 \ - --memory 1024 \ - --vcpus 1 \ - --disk path=/var/lib/libvirt/images/debian-10-nocloud-amd64.qcow2,size=8,bus=virtio,format=qcow2 \ - --import \ - --graphics none \ - --os-variant debian10 \ - --network network=default,model=virtio - ``` - * It will boot Debian 10 - * To login, use `root` without a password - * Install and enable QEMU Guest Agent: - ``` - # apt-get update && apt-get install -y qemu-guest-agent - # systemctl enable qemu-quest-agent - # systemctl start qemu-guest-agent - # logout - ``` - * Press `^[` (Ctrl+[) on your keyboard - * `Domain creation completed` message should appear. - * Verify, that the VM is up and running: - ``` - virsh -c qemu:///system list - Id Name State - -------------------------- - 1 debian10 running - ``` - -### How to release a new virt-stats version - -To deploy a new version of Virt Stats, you will need to create a release. The steps are pretty simple, You can find Github's instruction [here](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release). - -* On the main repo page, click on [Releases](https://github.com/tidalmigrations/machine_stats/releases) (right side bar) -* Create a new release on the `master` branch. -* Choose a tag. The Tag that you create will be used as the new Tidal Tools version. Please follow this convention - * Minor/Patch release: `v2.5.6` → `v2.5.7` - * Major release: `v2.5.10` → `v2.6.0` - * Version release: `v2.6.7` → `v3.0.0` -* **Note:** [machine stats](https://pypi.org/project/machine-stats/) also have the same version number as Virt Stats. - -## Finally - -Thanks again for your interest in improving the project! You're taking action -when most people decide to sit and watch. diff --git a/libvirt/Pipfile b/libvirt/Pipfile deleted file mode 100644 index 1c7765f..0000000 --- a/libvirt/Pipfile +++ /dev/null @@ -1,19 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -libvirt-python = ">=3.0.0" -virt_stats = {editable = true, path = "."} - -[dev-packages] -black = "==20.8b1" -flake8 = "*" -isort = "*" -pylint = "*" -setuptools = "*" -twine = "*" -wheel = "*" -build = "*" -bump2version = "*" diff --git a/libvirt/Pipfile.lock b/libvirt/Pipfile.lock deleted file mode 100644 index 9c8a7ba..0000000 --- a/libvirt/Pipfile.lock +++ /dev/null @@ -1,635 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "25fe4a32cd5e7f4778a7dc387b9933a44bccc9bac24e27a944b6ce97551316f1" - }, - "pipfile-spec": 6, - "requires": {}, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "libvirt-python": { - "hashes": [ - "sha256:676c260ddb365120404e611a38c514045ef1af1a7fede15c1fc02d0f8241f696" - ], - "index": "pypi", - "version": "==7.3.0" - }, - "virt-stats": { - "editable": true, - "path": "." - } - }, - "develop": { - "appdirs": { - "hashes": [ - "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", - "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" - ], - "version": "==1.4.4" - }, - "astroid": { - "hashes": [ - "sha256:0755c998e7117078dcb7d0bda621391dd2a85da48052d948c7411ab187325346", - "sha256:1e83a69fd51b013ebf5912d26b9338d6643a55fec2f20c787792680610eed4a2" - ], - "markers": "python_version ~= '3.6'", - "version": "==2.8.4" - }, - "black": { - "hashes": [ - "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea" - ], - "index": "pypi", - "version": "==20.8b1" - }, - "bleach": { - "hashes": [ - "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da", - "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994" - ], - "markers": "python_version >= '3.6'", - "version": "==4.1.0" - }, - "build": { - "hashes": [ - "sha256:1aaadcd69338252ade4f7ec1265e1a19184bf916d84c9b7df095f423948cb89f", - "sha256:21b7ebbd1b22499c4dac536abc7606696ea4d909fd755e00f09f3c0f2c05e3c8" - ], - "index": "pypi", - "version": "==0.7.0" - }, - "bump2version": { - "hashes": [ - "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410", - "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6" - ], - "index": "pypi", - "version": "==1.0.1" - }, - "certifi": { - "hashes": [ - "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872", - "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569" - ], - "version": "==2021.10.8" - }, - "cffi": { - "hashes": [ - "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3", - "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2", - "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636", - "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20", - "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728", - "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27", - "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66", - "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443", - "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0", - "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7", - "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39", - "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605", - "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a", - "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37", - "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029", - "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139", - "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc", - "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df", - "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14", - "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880", - "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2", - "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a", - "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e", - "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474", - "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024", - "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8", - "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0", - "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e", - "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a", - "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e", - "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032", - "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6", - "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e", - "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b", - "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e", - "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954", - "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962", - "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c", - "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4", - "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55", - "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962", - "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023", - "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c", - "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6", - "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8", - "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382", - "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7", - "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc", - "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997", - "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796" - ], - "version": "==1.15.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0", - "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b" - ], - "markers": "python_version >= '3'", - "version": "==2.0.7" - }, - "click": { - "hashes": [ - "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3", - "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b" - ], - "markers": "python_version >= '3.6'", - "version": "==8.0.3" - }, - "colorama": { - "hashes": [ - "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", - "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.4.4" - }, - "cryptography": { - "hashes": [ - "sha256:07bb7fbfb5de0980590ddfc7f13081520def06dc9ed214000ad4372fb4e3c7f6", - "sha256:18d90f4711bf63e2fb21e8c8e51ed8189438e6b35a6d996201ebd98a26abbbe6", - "sha256:1ed82abf16df40a60942a8c211251ae72858b25b7421ce2497c2eb7a1cee817c", - "sha256:22a38e96118a4ce3b97509443feace1d1011d0571fae81fc3ad35f25ba3ea999", - "sha256:2d69645f535f4b2c722cfb07a8eab916265545b3475fdb34e0be2f4ee8b0b15e", - "sha256:4a2d0e0acc20ede0f06ef7aa58546eee96d2592c00f450c9acb89c5879b61992", - "sha256:54b2605e5475944e2213258e0ab8696f4f357a31371e538ef21e8d61c843c28d", - "sha256:7075b304cd567694dc692ffc9747f3e9cb393cc4aa4fb7b9f3abd6f5c4e43588", - "sha256:7b7ceeff114c31f285528ba8b390d3e9cfa2da17b56f11d366769a807f17cbaa", - "sha256:7eba2cebca600a7806b893cb1d541a6e910afa87e97acf2021a22b32da1df52d", - "sha256:928185a6d1ccdb816e883f56ebe92e975a262d31cc536429041921f8cb5a62fd", - "sha256:9933f28f70d0517686bd7de36166dda42094eac49415459d9bdf5e7df3e0086d", - "sha256:a688ebcd08250eab5bb5bca318cc05a8c66de5e4171a65ca51db6bd753ff8953", - "sha256:abb5a361d2585bb95012a19ed9b2c8f412c5d723a9836418fab7aaa0243e67d2", - "sha256:c10c797ac89c746e488d2ee92bd4abd593615694ee17b2500578b63cad6b93a8", - "sha256:ced40344e811d6abba00295ced98c01aecf0c2de39481792d87af4fa58b7b4d6", - "sha256:d57e0cdc1b44b6cdf8af1d01807db06886f10177469312fbde8f44ccbb284bc9", - "sha256:d99915d6ab265c22873f1b4d6ea5ef462ef797b4140be4c9d8b179915e0985c6", - "sha256:eb80e8a1f91e4b7ef8b33041591e6d89b2b8e122d787e87eeb2b08da71bb16ad", - "sha256:ebeddd119f526bcf323a89f853afb12e225902a24d29b55fe18dd6fcb2838a76" - ], - "markers": "python_version >= '3.6'", - "version": "==35.0.0" - }, - "docutils": { - "hashes": [ - "sha256:a31688b2ea858517fa54293e5d5df06fbb875fb1f7e4c64529271b77781ca8fc", - "sha256:c1d5dab2b11d16397406a282e53953fe495a46d69ae329f55aa98a5c4e3c5fbb" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.18" - }, - "flake8": { - "hashes": [ - "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d", - "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d" - ], - "index": "pypi", - "version": "==4.0.1" - }, - "idna": { - "hashes": [ - "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", - "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" - ], - "markers": "python_version >= '3'", - "version": "==3.3" - }, - "importlib-metadata": { - "hashes": [ - "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15", - "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1" - ], - "markers": "python_version >= '3.6'", - "version": "==4.8.1" - }, - "isort": { - "hashes": [ - "sha256:1a18ccace2ed8910bd9458b74a3ecbafd7b2f581301b0ab65cfdd4338272d76f", - "sha256:e52ff6d38012b131628cf0f26c51e7bd3a7c81592eefe3ac71411e692f1b9345" - ], - "index": "pypi", - "version": "==5.10.0" - }, - "jeepney": { - "hashes": [ - "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac", - "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f" - ], - "markers": "sys_platform == 'linux'", - "version": "==0.7.1" - }, - "keyring": { - "hashes": [ - "sha256:6334aee6073db2fb1f30892697b1730105b5e9a77ce7e61fca6b435225493efe", - "sha256:bd2145a237ed70c8ce72978b497619ddfcae640b6dcf494402d5143e37755c6e" - ], - "markers": "python_version >= '3.6'", - "version": "==23.2.1" - }, - "lazy-object-proxy": { - "hashes": [ - "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653", - "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61", - "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2", - "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837", - "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3", - "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43", - "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726", - "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3", - "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587", - "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8", - "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a", - "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd", - "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f", - "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad", - "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4", - "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b", - "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf", - "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981", - "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741", - "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e", - "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93", - "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.6.0" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "mypy-extensions": { - "hashes": [ - "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", - "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" - ], - "version": "==0.4.3" - }, - "packaging": { - "hashes": [ - "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966", - "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0" - ], - "markers": "python_version >= '3.6'", - "version": "==21.2" - }, - "pathspec": { - "hashes": [ - "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a", - "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1" - ], - "version": "==0.9.0" - }, - "pep517": { - "hashes": [ - "sha256:931378d93d11b298cf511dd634cf5ea4cb249a28ef84160b3247ee9afb4e8ab0", - "sha256:dd884c326898e2c6e11f9e0b64940606a93eb10ea022a2e067959f3a110cf161" - ], - "version": "==0.12.0" - }, - "pkginfo": { - "hashes": [ - "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779", - "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd" - ], - "version": "==1.7.1" - }, - "platformdirs": { - "hashes": [ - "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2", - "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d" - ], - "markers": "python_version >= '3.6'", - "version": "==2.4.0" - }, - "pycodestyle": { - "hashes": [ - "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20", - "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==2.8.0" - }, - "pycparser": { - "hashes": [ - "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", - "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.20" - }, - "pyflakes": { - "hashes": [ - "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c", - "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.0" - }, - "pygments": { - "hashes": [ - "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380", - "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6" - ], - "markers": "python_version >= '3.5'", - "version": "==2.10.0" - }, - "pylint": { - "hashes": [ - "sha256:0f358e221c45cbd4dad2a1e4b883e75d28acdcccd29d40c76eb72b307269b126", - "sha256:2c9843fff1a88ca0ad98a256806c82c5a8f86086e7ccbdb93297d86c3f90c436" - ], - "index": "pypi", - "version": "==2.11.1" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" - }, - "readme-renderer": { - "hashes": [ - "sha256:3286806450d9961d6e3b5f8a59f77e61503799aca5155c8d8d40359b4e1e1adc", - "sha256:8299700d7a910c304072a7601eafada6712a5b011a20139417e1b1e9f04645d8" - ], - "version": "==30.0" - }, - "regex": { - "hashes": [ - "sha256:0075fe4e2c2720a685fef0f863edd67740ff78c342cf20b2a79bc19388edf5db", - "sha256:0621c90f28d17260b41838b22c81a79ff436141b322960eb49c7b3f91d1cbab6", - "sha256:070336382ca92c16c45b4066c4ba9fa83fb0bd13d5553a82e07d344df8d58a84", - "sha256:075b0fdbaea81afcac5a39a0d1bb91de887dd0d93bf692a5dd69c430e7fc58cb", - "sha256:07e3755e0f070bc31567dfe447a02011bfa8444239b3e9e5cca6773a22133839", - "sha256:0ed3465acf8c7c10aa2e0f3d9671da410ead63b38a77283ef464cbb64275df58", - "sha256:17e095f7f96a4b9f24b93c2c915f31a5201a6316618d919b0593afb070a5270e", - "sha256:1d85ca137756d62c8138c971453cafe64741adad1f6a7e63a22a5a8abdbd19fa", - "sha256:20605bfad484e1341b2cbfea0708e4b211d233716604846baa54b94821f487cb", - "sha256:23f93e74409c210de4de270d4bf88fb8ab736a7400f74210df63a93728cf70d6", - "sha256:2bb7cae741de1aa03e3dd3a7d98c304871eb155921ca1f0d7cc11f5aade913fd", - "sha256:2e3ff69ab203b54ce5c480c3ccbe959394ea5beef6bd5ad1785457df7acea92e", - "sha256:30fe317332de0e50195665bc61a27d46e903d682f94042c36b3f88cb84bd7958", - "sha256:3576e173e7b4f88f683b4de7db0c2af1b209bb48b2bf1c827a6f3564fad59a97", - "sha256:35ed5714467fc606551db26f80ee5d6aa1f01185586a7bccd96f179c4b974a11", - "sha256:41c66bd6750237a8ed23028a6c9173dc0c92dc24c473e771d3bfb9ee817700c3", - "sha256:48b4f4810117a9072a5aa70f7fea5f86fa9efbe9a798312e0a05044bd707cc33", - "sha256:4abf35e16f4b639daaf05a2602c1b1d47370e01babf9821306aa138924e3fe92", - "sha256:4fba661a4966adbd2c3c08d3caad6822ecb6878f5456588e2475ae23a6e47929", - "sha256:5e85dcfc5d0f374955015ae12c08365b565c6f1eaf36dd182476a4d8e5a1cdb7", - "sha256:77f9d16f7970791f17ecce7e7f101548314ed1ee2583d4268601f30af3170856", - "sha256:7ee36d5113b6506b97f45f2e8447cb9af146e60e3f527d93013d19f6d0405f3b", - "sha256:7fab29411d75c2eb48070020a40f80255936d7c31357b086e5931c107d48306e", - "sha256:85289c25f658e3260b00178757c87f033f3d4b3e40aa4abdd4dc875ff11a94fb", - "sha256:886f459db10c0f9d17c87d6594e77be915f18d343ee138e68d259eb385f044a8", - "sha256:897c539f0f3b2c3a715be651322bef2167de1cdc276b3f370ae81a3bda62df71", - "sha256:8fbe1768feafd3d0156556677b8ff234c7bf94a8110e906b2d73506f577a3269", - "sha256:9267e4fba27e6dd1008c4f2983cc548c98b4be4444e3e342db11296c0f45512f", - "sha256:9486ebda015913909bc28763c6b92fcc3b5e5a67dee4674bceed112109f5dfb8", - "sha256:956187ff49db7014ceb31e88fcacf4cf63371e6e44d209cf8816cd4a2d61e11a", - "sha256:a56735c35a3704603d9d7b243ee06139f0837bcac2171d9ba1d638ce1df0742a", - "sha256:ab1fea8832976ad0bebb11f652b692c328043057d35e9ebc78ab0a7a30cf9a70", - "sha256:adf35d88d9cffc202e6046e4c32e1e11a1d0238b2fcf095c94f109e510ececea", - "sha256:af23b9ca9a874ef0ec20e44467b8edd556c37b0f46f93abfa93752ea7c0e8d1e", - "sha256:b3794cea825f101fe0df9af8a00f9fad8e119c91e39a28636b95ee2b45b6c2e5", - "sha256:bb11c982a849dc22782210b01d0c1b98eb3696ce655d58a54180774e4880ac66", - "sha256:be30cd315db0168063a1755fa20a31119da91afa51da2907553493516e165640", - "sha256:c6238d30dcff141de076344cf7f52468de61729c2f70d776fce12f55fe8df790", - "sha256:cb1e44d860345ab5d4f533b6c37565a22f403277f44c4d2d5e06c325da959883", - "sha256:d4bfe3bc3976ccaeb4ae32f51e631964e2f0e85b2b752721b7a02de5ce3b7f27", - "sha256:d8ee91e1c295beb5c132ebd78616814de26fedba6aa8687ea460c7f5eb289b72", - "sha256:e3c00cb5c71da655e1e5161481455479b613d500dd1bd252aa01df4f037c641f", - "sha256:e9cec3a62d146e8e122d159ab93ac32c988e2ec0dcb1e18e9e53ff2da4fbd30c", - "sha256:ef4e53e2fdc997d91f5b682f81f7dc9661db9a437acce28745d765d251902d85", - "sha256:f0148988af0182a0a4e5020e7c168014f2c55a16d11179610f7883dd48ac0ebe", - "sha256:f20f9f430c33597887ba9bd76635476928e76cad2981643ca8be277b8e97aa96", - "sha256:f5930d334c2f607711d54761956aedf8137f83f1b764b9640be21d25a976f3a4", - "sha256:f6a28e87ba69f3a4f30d775b179aac55be1ce59f55799328a0d9b6df8f16b39d", - "sha256:f9ee98d658a146cb6507be720a0ce1b44f2abef8fb43c2859791d91aace17cd5" - ], - "version": "==2021.11.2" - }, - "requests": { - "hashes": [ - "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", - "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==2.26.0" - }, - "requests-toolbelt": { - "hashes": [ - "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f", - "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0" - ], - "version": "==0.9.1" - }, - "rfc3986": { - "hashes": [ - "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835", - "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97" - ], - "version": "==1.5.0" - }, - "secretstorage": { - "hashes": [ - "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f", - "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195" - ], - "markers": "sys_platform == 'linux'", - "version": "==3.3.1" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" - }, - "tomli": { - "hashes": [ - "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee", - "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade" - ], - "markers": "python_version >= '3.6'", - "version": "==1.2.2" - }, - "tqdm": { - "hashes": [ - "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c", - "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.62.3" - }, - "twine": { - "hashes": [ - "sha256:218c42324121d4417cbcbbda59c623b8acc4becfce3daa545e6b6dd48bd21385", - "sha256:3725b79a6f1cfe84a134544ae1894706e60719ab28547cb6c6de781b9f72706d" - ], - "index": "pypi", - "version": "==3.5.0" - }, - "typed-ast": { - "hashes": [ - "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace", - "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff", - "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266", - "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528", - "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6", - "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808", - "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4", - "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363", - "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341", - "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04", - "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41", - "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e", - "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3", - "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899", - "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805", - "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c", - "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c", - "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39", - "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a", - "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3", - "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7", - "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f", - "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075", - "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0", - "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40", - "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428", - "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927", - "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3", - "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f", - "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65" - ], - "version": "==1.4.3" - }, - "typing-extensions": { - "hashes": [ - "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e", - "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7", - "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34" - ], - "markers": "python_version < '3.10'", - "version": "==3.10.0.2" - }, - "urllib3": { - "hashes": [ - "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece", - "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.26.7" - }, - "webencodings": { - "hashes": [ - "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", - "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" - ], - "version": "==0.5.1" - }, - "wheel": { - "hashes": [ - "sha256:21014b2bd93c6d0034b6ba5d35e4eb284340e09d63c59aef6fc14b0f346146fd", - "sha256:e2ef7239991699e3355d54f8e968a21bb940a1dbf34a4d226741e64462516fad" - ], - "index": "pypi", - "version": "==0.37.0" - }, - "wrapt": { - "hashes": [ - "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179", - "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096", - "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374", - "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df", - "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185", - "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785", - "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7", - "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909", - "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918", - "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33", - "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068", - "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829", - "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af", - "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79", - "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce", - "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc", - "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36", - "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade", - "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca", - "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32", - "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125", - "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e", - "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709", - "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f", - "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b", - "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb", - "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb", - "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489", - "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640", - "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb", - "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851", - "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d", - "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44", - "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13", - "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2", - "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb", - "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b", - "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9", - "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755", - "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c", - "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a", - "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf", - "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3", - "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229", - "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e", - "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de", - "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554", - "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10", - "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80", - "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056", - "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.13.3" - }, - "zipp": { - "hashes": [ - "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832", - "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc" - ], - "markers": "python_version >= '3.6'", - "version": "==3.6.0" - } - } -} diff --git a/libvirt/README.md b/libvirt/README.md deleted file mode 100644 index ac1eb1f..0000000 --- a/libvirt/README.md +++ /dev/null @@ -1,58 +0,0 @@ -> This script is deprecated. - -# Machine Stats for Hypervisors (Virt-Stats) - -A simple and effective way to gather guest VM statistics (hostname, IP addresses) from a [libvirt](https://libvirt.org/)-based environment as a first layer of a [Tidal's discovery process](https://guides.tidal.cloud/). A common use case is to use this to integrate your KVM-based virtual machine inventory into the [Tidal Accelerator](https://www.tidalcloud.com/accelerator/) Platform. - -## Prerequisutes - -* [Python 3+](https://python.org/) -* [libvirt](https://libvirt.org/) >=3.0.0 installed on both operator machine (i.e where you run Virt-Stats) and on remote machine (i.e where you run your virtual environmnent and guest VMs) - -## Installation - -Install locally in a Python 3 environment: - -``` -python3 -m pip install virt-stats -``` - -## Data captured - -As of now Virt-Stats captures the following metrics: - -* Hostname -* IP Addresses -* CPU count -* RAM allocated (GB) -* RAM used (GB) - -## Usage - -``` -virt-stats --connection URI -``` - -Please refer to the [Connection URIs](https://libvirt.org/uri.html) documentation for additional information. - -## Output - -Virt-Stats outputs a JSON document suitable to be piped to Tidal Tools: - -``` -virt-stats --connection qemu+ssh://me@10.0.0.1/system | tidal sync servers -``` - -## Troubleshooting - -### virt-stats: command not found - -If running Virt-Stats as a CLI failed, try running it as the following: - -``` -python3 -m virt-stats -``` - -## Contributing - -If you're interested in contributing to Virt-Stats, please check our [contributing](CONTRIBUTING.md) guide. diff --git a/libvirt/dev-requirements.txt b/libvirt/dev-requirements.txt deleted file mode 100644 index 239afc6..0000000 --- a/libvirt/dev-requirements.txt +++ /dev/null @@ -1,64 +0,0 @@ -# -# These requirements were autogenerated by pipenv -# To regenerate from the project's Pipfile, run: -# -# pipenv lock --requirements --dev -# - -# Note: in pipenv 2020.x, "--dev" changed to emit both default and development -# requirements. To emit only development requirements, pass "--dev-only". - --i https://pypi.org/simple --e . -appdirs==1.4.4 -astroid==2.8.4; python_version ~= '3.6' -black==20.8b1 -bleach==4.1.0; python_version >= '3.6' -build==0.7.0 -bump2version==1.0.1 -certifi==2021.10.8 -cffi==1.15.0 -charset-normalizer==2.0.7; python_version >= '3' -click==8.0.3; python_version >= '3.6' -colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -cryptography==35.0.0; python_version >= '3.6' -docutils==0.18; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -flake8==4.0.1 -idna==3.3; python_version >= '3' -importlib-metadata==4.8.1; python_version >= '3.6' -isort==5.10.0 -jeepney==0.7.1; sys_platform == 'linux' -keyring==23.2.1; python_version >= '3.6' -lazy-object-proxy==1.6.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' -libvirt-python==7.3.0 -mccabe==0.6.1 -mypy-extensions==0.4.3 -packaging==21.2; python_version >= '3.6' -pathspec==0.9.0 -pep517==0.12.0 -pkginfo==1.7.1 -platformdirs==2.4.0; python_version >= '3.6' -pycodestyle==2.8.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -pyflakes==2.4.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -pygments==2.10.0; python_version >= '3.5' -pylint==2.11.1 -pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -readme-renderer==30.0 -regex==2021.11.2 -requests-toolbelt==0.9.1 -requests==2.26.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' -rfc3986==1.5.0 -secretstorage==3.3.1; sys_platform == 'linux' -six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -toml==0.10.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -tomli==1.2.2; python_version >= '3.6' -tqdm==4.62.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -twine==3.5.0 -typed-ast==1.4.3 -typing-extensions==3.10.0.2; python_version < '3.10' -urllib3==1.26.7; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4' -webencodings==0.5.1 -wheel==0.37.0 -wrapt==1.13.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -zipp==3.6.0; python_version >= '3.6' diff --git a/libvirt/pyproject.toml b/libvirt/pyproject.toml deleted file mode 100644 index b0471b7..0000000 --- a/libvirt/pyproject.toml +++ /dev/null @@ -1,3 +0,0 @@ -[build-system] -requires = ["setuptools", "wheel"] -build-backend = "setuptools.build_meta:__legacy__" \ No newline at end of file diff --git a/libvirt/requirements.txt b/libvirt/requirements.txt deleted file mode 100644 index 67880e9..0000000 --- a/libvirt/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -# -# These requirements were autogenerated by pipenv -# To regenerate from the project's Pipfile, run: -# -# pipenv lock --requirements -# - --i https://pypi.org/simple --e . -libvirt-python==7.3.0 diff --git a/libvirt/scripts/README.md b/libvirt/scripts/README.md deleted file mode 100644 index 1008447..0000000 --- a/libvirt/scripts/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Scripts - -This directory contains different helper scripts for `virt-stats` development. diff --git a/libvirt/scripts/nested-virtualization/.env.example b/libvirt/scripts/nested-virtualization/.env.example deleted file mode 100644 index 2aeee9c..0000000 --- a/libvirt/scripts/nested-virtualization/.env.example +++ /dev/null @@ -1,11 +0,0 @@ -# gcloud settings -CLOUDSDK_CORE_ACCOUNT="john.doe@gmail.com" -CLOUDSDK_CORE_PROJECT="my-gcp-project" - -# other settings -VM_BOOT_DISK_SIZE="200GB" -VM_IMAGE="debian-9-stretch-v20210721" -VM_IMAGE_PROJECT="debian-cloud" -VM_MACHINE_TYPE="n1-standard-2" -VM_NAME="nested-host" -VM_ZONE="us-central1-a" diff --git a/libvirt/scripts/nested-virtualization/.gitignore b/libvirt/scripts/nested-virtualization/.gitignore deleted file mode 100644 index 4c49bd7..0000000 --- a/libvirt/scripts/nested-virtualization/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.env diff --git a/libvirt/scripts/nested-virtualization/README.md b/libvirt/scripts/nested-virtualization/README.md deleted file mode 100644 index d0ba52f..0000000 --- a/libvirt/scripts/nested-virtualization/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Nested Virtualization - -This script crates a new VM on Google Cloud Platform having nested -virtualization enabled. - -## Prerequisites - -- Google Cloud Platform [SDK](https://cloud.google.com/sdk/docs/install) - -## Configuration - -Copy `.env.example` to `.env` and edit the variables. Please check the [Restrictions](https://cloud.google.com/compute/docs/instances/nested-virtualization/overview#restrictions) before making any VM configuration changes. - -## Usage - -``` -./main.sh -``` diff --git a/libvirt/scripts/nested-virtualization/main.sh b/libvirt/scripts/nested-virtualization/main.sh deleted file mode 100755 index 23e0a2b..0000000 --- a/libvirt/scripts/nested-virtualization/main.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -o pipefail -set -o nounset - -__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -# Load up .env -set -o allexport -[[ -f "${__dir}/.env" ]] && source "${__dir}/.env" -set +o allexport - -vm_status() { - gcloud compute instances list \ - --filter="name='${VM_NAME}'" \ - --zones="${VM_ZONE}" \ - --format="value(status)" -} - -create_vm() { - echo "Creating VM Instance '${VM_NAME}'..." >&2 - - gcloud compute instances create "${VM_NAME}" \ - --zone="${VM_ZONE}" \ - --machine-type="${VM_MACHINE_TYPE}" \ - --min-cpu-platform="Intel Haswell" \ - --image="${VM_IMAGE}" \ - --image-project="${VM_IMAGE_PROJECT}" \ - --boot-disk-size="${VM_BOOT_DISK_SIZE}" \ - --metadata-from-file=startup-script="${__dir}/startup-script.sh" - - echo "VM Instance '${VM_NAME}' started." >&2 - echo "Give it a few minutes to finish provisioning." >&2 - echo "Check the VM console logs for statup script execution complete." >&2 - - print_connection_cmd -} - -start_vm() { - echo "Starting VM Instance '${VM_NAME}'..." >&2 - gcloud compute instances start "${VM_NAME}" \ - --zone="${VM_ZONE}" - - print_connection_cmd -} - -print_connection_cmd() { - echo "To connect:" >&2 - echo " gcloud compute ssh --project=${CLOUDSDK_CORE_PROJECT} --zone ${VM_ZONE} ${VM_NAME}" >&2 -} - -main() { - local status - status=$(vm_status) - case $status in - "RUNNING" ) - echo "VM Instance '${VM_NAME}' is already running." >&2 - print_connection_cmd - ;; - "TERMINATED" ) - echo "VM Instance '${VM_NAME}' is stopped." >&2 - start_vm - ;; - "" ) - create_vm - ;; - * ) - echo "Unknown VM Instance status (${status}) for instance '${VM_NAME}'" - esac -} - -main \ No newline at end of file diff --git a/libvirt/scripts/nested-virtualization/startup-script.sh b/libvirt/scripts/nested-virtualization/startup-script.sh deleted file mode 100644 index 2de5fd2..0000000 --- a/libvirt/scripts/nested-virtualization/startup-script.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash - -# shellcheck source=/dev/null -source "/etc/os-release" - -if [[ "$ID" == "rhel" || "$ID" == "centos" ]] -then - # Use yum - yum install -y \ - qemu-kvm \ - libvirt \ - libvirt-python \ - libguestfs-tools \ - virt-install -fi - -if [[ "$ID" == "debian" || "$ID" == "ubuntu" ]] -then - # Use apt - apt update - apt install -y \ - uml-utilities \ - qemu-kvm \ - bridge-utils \ - virtinst \ - libvirt-daemon-system \ - libvirt-clients -fi - -# Needs to explicitly start on RHEL 7 -systemctl start libvirtd -# Start the default network if not already started -virsh net-list --name | grep --fixed-strings --line-regexp --quiet default || virsh net-start default - -# There is no tunctl on RHEL 7 -if type -P tunctl &>/dev/null -then - tunctl -t tap0 -else - ip tuntap add tap0 mode tap -fi -ifconfig tap0 up - -brctl addif virbr0 tap0 - -grep libvirt /etc/default/instance_configs.cfg \ - || sed -i '/^groups =/s/$/,libvirt/' /etc/default/instance_configs.cfg - -systemctl restart google-guest-agent.service diff --git a/libvirt/setup.cfg b/libvirt/setup.cfg deleted file mode 100644 index 3d087cb..0000000 --- a/libvirt/setup.cfg +++ /dev/null @@ -1,12 +0,0 @@ -[flake8] -ignore = E203, E266, E501, W503 -max-line-length = 88 -max-complexity = 18 -select = B,C,E,F,W,T4 - -[isort] -multi_line_output = 3 -include_trailing_comma = True -force_grid_wrap = 0 -use_parentheses = True -line_length = 88 diff --git a/libvirt/setup.py b/libvirt/setup.py deleted file mode 100644 index 947cbd0..0000000 --- a/libvirt/setup.py +++ /dev/null @@ -1,26 +0,0 @@ -from distutils.core import setup - -with open("README.md", "r") as fh: - long_description = fh.read() - -setup( - name="virt_stats", - version="develop", - author="Tidal", - author_email="support@tidalcloud.com", - description="This program is now deprecated.\n\nA simple and effective way to gather machine statistics (RAM, Storage, CPU, etc.) from virtual environment", - long_description=long_description, - long_description_content_type="text/markdown", - packages=["virt_stats"], - package_dir={"": "src"}, - url="https://github.com/tidalmigrations/machine_stats", - install_requires=[ - "libvirt-python==7.3.0", - ], - entry_points={ - "console_scripts": [ - "virt_stats=virt_stats:main", - "virt-stats=virt_stats:main", - ] - }, -) diff --git a/libvirt/src/virt_stats/__init__.py b/libvirt/src/virt_stats/__init__.py deleted file mode 100644 index b5beb86..0000000 --- a/libvirt/src/virt_stats/__init__.py +++ /dev/null @@ -1,149 +0,0 @@ -import argparse -import json -import os -import sys -import io - -import libvirt - -from contextlib import contextmanager - - -def libvirt_version(): - version = libvirt.getVersion() - major = version // 1000000 - version %= 1000000 - minor = version // 1000 - release = version % 1000 - - return "%d.%d.%d" % (major, minor, release) - - -@contextmanager -def suppress_stderr(): - try: - stderr = os.dup(sys.stderr.fileno()) - devnull = open(os.devnull, "w") - os.dup2(devnull.fileno(), sys.stderr.fileno()) - yield - finally: - os.dup2(stderr, sys.stderr.fileno()) - devnull.close() - - -def hostname(domain: libvirt.virDomain): - try: - with suppress_stderr(): - hostname = domain.hostname() - return hostname - except libvirt.libvirtError: - macs = [] - ifaces = domain.interfaceAddresses( - libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE - ) - for (_, val) in ifaces.items(): - if val["hwaddr"]: - macs.append(val["hwaddr"]) - conn = domain.connect() - for network in conn.listAllNetworks(libvirt.VIR_CONNECT_LIST_NETWORKS_ACTIVE): - for lease in network.DHCPLeases(): - for mac in macs: - if lease["mac"] == mac: - return lease["hostname"] - - -def ip_addresses(domain: libvirt.virDomain): - ips = [] - ifaces = domain.interfaceAddresses(libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE) - for (_, val) in ifaces.items(): - if val["addrs"]: - for ipaddr in val["addrs"]: - if ( - ipaddr["type"] == libvirt.VIR_IP_ADDR_TYPE_IPV4 - or ipaddr["type"] == libvirt.VIR_IP_ADDR_TYPE_IPV6 - ): - ips.append(ipaddr["addr"]) - return ips - - -def ram_allocated_gb(memory_stats: dict): - v = memory_stats.get("available") - if not v: - return None - return round( - v / 1024 ** 2, 2 - ) # convert kb to gb and round to 2 digits precision after the decimal point. - - -def ram_used_gb(memory_stats: dict): - mem_total = memory_stats.get("available") - mem_free = memory_stats.get("unused") - if not mem_total or not mem_free: - return None - mem_used = mem_total - mem_free - return round( - mem_used / 1024 ** 2, 2 - ) # convert kb to gb and round to 2 digits precision after the decimal point. - - -def storage_devices(domain: libvirt.virDomain) -> set: - storage_devices = set() - list_of_lists = [item[-1] for item in domain.fsInfo()] - for sublist in list_of_lists: - storage_devices.update(sublist) - return storage_devices - - -def storage_allocated_gb(domain: libvirt.virDomain): - capacity = 0 - for device in storage_devices(domain): - capacity += domain.blockInfo(device)[0] - return round( - capacity / 1024 ** 3, 2 - ) # convert bytes to gb and round to 2 digits precision after the decimal point. - - -def storage_used_gb(domain: libvirt.virDomain): - allocation = 0 - for device in storage_devices(domain): - allocation += domain.blockInfo(device)[1] - return round( - allocation / 1024 ** 3, 2 - ) # convert bytes to gb and round to 2 digits precision after the decimal point. - - -def main(): - parser = argparse.ArgumentParser(prog="virt-stats") - parser.add_argument( - "-c", - "--connect", - metavar="URI", - help="hypervisor connection URI (check https://libvirt.org/uri.html for details)", - ) - args = parser.parse_args() - try: - conn = libvirt.open(args.connect) - except libvirt.libvirtError: - print("Failed to open connection to the hypervisor") - sys.exit(1) - - results = [] - for domain in conn.listAllDomains(libvirt.VIR_CONNECT_LIST_DOMAINS_ACTIVE): - memory_stats = domain.memoryStats() - results.append( - { - "cpu_count": domain.vcpusFlags(), - "host_name": hostname(domain), - "ip_addresses": ip_addresses(domain), - "ram_allocated_gb": ram_allocated_gb(memory_stats), - "ram_used_gb": ram_used_gb(memory_stats), - "storage_allocated_gb": storage_allocated_gb(domain), - "storage_used_gb": storage_used_gb(domain), - } - ) - - print(json.dumps(results, sort_keys=True, indent=4)) - - -if __name__ == "__main__": - main() diff --git a/libvirt/src/virt_stats/__main__.py b/libvirt/src/virt_stats/__main__.py deleted file mode 100644 index 8c64a47..0000000 --- a/libvirt/src/virt_stats/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from virt_stats import main - -main()