- fence_kubevirt: new fence agent

Resolves: rhbz#2000954
This commit is contained in:
Oyvind Albrigtsen 2021-11-08 11:01:02 +01:00
parent 69ddab129d
commit 984972b246
4 changed files with 347 additions and 2 deletions

View File

@ -0,0 +1,24 @@
From 52de83b30a8eea638b01f649f4884f50417121c0 Mon Sep 17 00:00:00 2001
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
Date: Mon, 8 Nov 2021 09:55:11 +0100
Subject: [PATCH] configure: fix --with-agents to not match *virt in regex
---
configure.ac | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 7aa51e75d..76aec7186 100644
--- a/configure.ac
+++ b/configure.ac
@@ -173,8 +173,8 @@ if echo "$AGENTS_LIST" | grep -q -E "all|zvm( |$)"; then
fi
FENCE_VIRT=0
-if echo "$AGENTS_LIST" | grep -q -E "all|virt( |$)"; then
- AGENTS_LIST=$(echo "$AGENTS_LIST" | sed -E "s/virt( |$)//")
+if echo "$AGENTS_LIST" | grep -q -E "all|(^| )virt( |$)"; then
+ AGENTS_LIST=$(echo "$AGENTS_LIST" | sed -E "s/(^| )virt( |$)//")
case "$host_os" in
*bsd*)
;;

View File

@ -0,0 +1,160 @@
--- fence-agents-4.10.0/agents/kubevirt/fence_kubevirt.py 2021-07-08 13:09:05.000000000 +0200
+++ /home/oalbrigt/rhpkg/fence-agents-8.6/fence-agents-4.2.1/agents/kubevirt/fence_kubevirt.py 2021-11-02 15:35:46.217440426 +0100
@@ -2,24 +2,25 @@
import sys
import logging
+import atexit
sys.path.append("@FENCEAGENTSLIBDIR@")
from fencing import *
-from fencing import fail, fail_usage, run_delay, EC_STATUS
+from fencing import fail, fail_usage, run_delay, EC_STATUS, EC_FETCH_VM_UUID
try:
+ sys.path.insert(0, '/usr/lib/fence-agents/bundled/kubevirt')
from kubernetes.client.exceptions import ApiException
except ImportError:
logging.error("Couldn\'t import kubernetes.client.exceptions.ApiException - not found or not accessible")
-API_VERSION='kubevirt.io/v1'
-
def get_nodes_list(conn, options):
logging.debug("Starting list/monitor operation")
result = {}
try:
+ apiversion = options.get("--apiversion")
namespace = options.get("--namespace")
include_uninitialized = True
- vm_api = conn.resources.get(api_version=API_VERSION, kind='VirtualMachine')
+ vm_api = conn.resources.get(api_version=apiversion, kind='VirtualMachine')
vm_list = vm_api.get(namespace=namespace)
for vm in vm_list.items:
result[vm.metadata.name] = ("", None)
@@ -30,18 +31,21 @@
def get_power_status(conn, options):
logging.debug("Starting get status operation")
try:
+ apiversion = options.get("--apiversion")
namespace = options.get("--namespace")
name = options.get("--plug")
- vmi_api = conn.resources.get(api_version=API_VERSION,
+ vmi_api = conn.resources.get(api_version=apiversion,
kind='VirtualMachineInstance')
vmi = vmi_api.get(name=name, namespace=namespace)
- if vmi is not None:
- phase = vmi.status.phase
- if phase == "Running":
- return "on"
- return "off"
+ return translate_status(vmi.status.phase)
except ApiException as e:
if e.status == 404:
+ try:
+ vm_api = conn.resources.get(api_version=apiversion, kind='VirtualMachine')
+ vm = vm_api.get(name=name, namespace=namespace)
+ except ApiException as e:
+ logging.error("VM %s doesn't exist", name)
+ fail(EC_FETCH_VM_UUID)
return "off"
logging.error("Failed to get power status, with API Exception: %s", e)
fail(EC_STATUS)
@@ -49,38 +53,53 @@
logging.error("Failed to get power status, with Exception: %s", e)
fail(EC_STATUS)
+def translate_status(instance_status):
+ if instance_status == "Running":
+ return "on"
+ return "unknown"
+
def set_power_status(conn, options):
logging.debug("Starting set status operation")
try:
+ apiversion= options.get("--apiversion")
namespace = options.get("--namespace")
name = options.get("--plug")
action = 'start' if options["--action"] == "on" else 'stop'
- virtctl_vm_action(conn, action, namespace, name)
+ virtctl_vm_action(conn, action, namespace, name, apiversion)
except Exception as e:
logging.error("Failed to set power status, with Exception: %s", e)
fail(EC_STATUS)
def define_new_opts():
- all_opt["namespace"] = {
- "getopt" : ":",
- "longopt" : "namespace",
- "help" : "--namespace=[namespace] Namespace of the KubeVirt machine",
- "shortdesc" : "Namespace of the KubeVirt machine.",
- "required" : "1",
- "order" : 2
- }
- all_opt["kubeconfig"] = {
- "getopt" : ":",
- "longopt" : "kubeconfig",
- "help" : "--kubeconfig=[kubeconfig] Kubeconfig file path",
- "shortdesc": "Kubeconfig file path",
- "required": "0",
- "order": 4
- }
+ all_opt["namespace"] = {
+ "getopt" : ":",
+ "longopt" : "namespace",
+ "help" : "--namespace=[namespace] Namespace of the KubeVirt machine",
+ "shortdesc" : "Namespace of the KubeVirt machine.",
+ "required" : "1",
+ "order" : 2
+ }
+ all_opt["kubeconfig"] = {
+ "getopt" : ":",
+ "longopt" : "kubeconfig",
+ "help" : "--kubeconfig=[kubeconfig] Kubeconfig file path",
+ "shortdesc": "Kubeconfig file path",
+ "required": "0",
+ "order": 4
+ }
+ all_opt["apiversion"] = {
+ "getopt" : ":",
+ "longopt" : "apiversion",
+ "help" : "--apiversion=[apiversion] Version of the KubeVirt API",
+ "shortdesc" : "Version of the KubeVirt API.",
+ "required" : "0",
+ "default" : "kubevirt.io/v1",
+ "order" : 5
+ }
-def virtctl_vm_action(conn, action, namespace, name):
+def virtctl_vm_action(conn, action, namespace, name, apiversion):
path = '/apis/subresources.{api_version}/namespaces/{namespace}/virtualmachines/{name}/{action}'
- path = path.format(api_version=API_VERSION, namespace=namespace, name=name, action=action)
+ path = path.format(api_version=apiversion, namespace=namespace, name=name, action=action)
return conn.request('put', path, header_params={'accept': '*/*'})
def validate_options(required_options_list, options):
@@ -92,8 +111,13 @@
def main():
conn = None
- device_opt = ["port", "namespace", "kubeconfig", "separator", "no_password"]
+ device_opt = ["port", "namespace", "kubeconfig", "ssl_insecure", "no_password", "apiversion"]
+
+ atexit.register(atexit_handler)
define_new_opts()
+
+ all_opt["power_timeout"]["default"] = "40"
+
options = check_input(device_opt, process_input(device_opt))
docs = {}
@@ -106,6 +130,11 @@
validate_options(['--namespace'], options)
+ # Disable insecure-certificate-warning message
+ if "--ssl-insecure" in options:
+ import urllib3
+ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+
try:
from kubernetes import config
from openshift.dynamic import DynamicClient

View File

@ -6,10 +6,60 @@
# keep around ready for later user
## global alphatag git0a6184070
# bundles
%global bundled_lib_dir bundled
# kubevirt
%global openshift openshift
%global openshift_version 0.12.1
%global ruamelyamlclib ruamel.yaml.clib
%global ruamelyamlclib_version 0.2.6
%global kubernetes kubernetes
%global kubernetes_version 12.0.1
%global certifi certifi
%global certifi_version 2021.10.8
%global googleauth google-auth
%global googleauth_version 2.3.0
%global cachetools cachetools
%global cachetools_version 4.2.4
%global pyasn1modules pyasn1-modules
%global pyasn1modules_version 0.2.8
%global pyasn1 pyasn1
%global pyasn1_version 0.4.8
%global dateutil dateutil
%global dateutil_version 2.8.2
%global pyyaml PyYAML
%global pyyaml_version 6.0
%global six six
%global six_version 1.16.0
%global urllib3 urllib3
%global urllib3_version 1.26.7
%global websocketclient websocket-client
%global websocketclient_version 1.2.1
%global jinja2 Jinja2
%global jinja2_version 3.0.2
%global markupsafe MarkupSafe
%global markupsafe_version 2.0.1
%global stringutils string-utils
%global stringutils_version 1.0.0
%global requests requests
%global requests_version 2.26.0
%global chrstnormalizer charset-normalizer
%global chrstnormalizer_version 2.0.7
%global idna idna
%global idna_version 3.3
%global reqstsoauthlib requests-oauthlib
%global reqstsoauthlib_version 1.3.0
%global oauthlib oauthlib
%global oauthlib_version 3.1.1
%global ruamelyaml ruamel.yaml
%global ruamelyaml_version 0.17.16
%global setuptools setuptools
%global setuptools_version 58.3.0
Name: fence-agents
Summary: Set of unified programs capable of host isolation ("fencing")
Version: 4.10.0
Release: 10%{?alphatag:.%{alphatag}}%{?dist}
Release: 11%{?alphatag:.%{alphatag}}%{?dist}
License: GPLv2+ and LGPLv2+
URL: https://github.com/ClusterLabs/fence-agents
Source0: https://fedorahosted.org/releases/f/e/fence-agents/%{name}-%{version}.tar.gz
@ -126,6 +176,42 @@ Source1088: pexpect-4.8.0-py2.py3-none-any.whl
Source1089: ptyprocess-0.7.0-py2.py3-none-any.whl
Source1090: suds_community-0.8.5-py3-none-any.whl
### END ###
# kubevirt
## pip download --no-binary :all: openshift "ruamel.yaml.clib>=0.1.2"
### BEGIN
Source1091: %{openshift}-%{openshift_version}.tar.gz
Source1092: %{ruamelyamlclib}-%{ruamelyamlclib_version}.tar.gz
Source1093: %{kubernetes}-%{kubernetes_version}.tar.gz
Source1094: %{certifi}-%{certifi_version}.tar.gz
Source1095: %{googleauth}-%{googleauth_version}.tar.gz
Source1096: %{cachetools}-%{cachetools_version}.tar.gz
Source1097: %{pyasn1modules}-%{pyasn1modules_version}.tar.gz
Source1098: %{pyasn1}-%{pyasn1_version}.tar.gz
Source1099: python-%{dateutil}-%{dateutil_version}.tar.gz
Source1100: %{pyyaml}-%{pyyaml_version}.tar.gz
## rsa is dependency for "pip install",
## but gets removed to use cryptography lib instead
Source1101: rsa-4.7.2.tar.gz
Source1102: %{six}-%{six_version}.tar.gz
Source1103: %{urllib3}-%{urllib3_version}.tar.gz
Source1104: %{websocketclient}-%{websocketclient_version}.tar.gz
Source1105: %{jinja2}-%{jinja2_version}.tar.gz
Source1106: %{markupsafe}-%{markupsafe_version}.tar.gz
Source1107: python-%{stringutils}-%{stringutils_version}.tar.gz
Source1108: %{requests}-%{requests_version}.tar.gz
Source1109: %{chrstnormalizer}-%{chrstnormalizer_version}.tar.gz
Source1110: %{idna}-%{idna_version}.tar.gz
Source1111: %{reqstsoauthlib}-%{reqstsoauthlib_version}.tar.gz
Source1112: %{oauthlib}-%{oauthlib_version}.tar.gz
Source1113: %{ruamelyaml}-%{ruamelyaml_version}.tar.gz
Source1114: %{setuptools}-%{setuptools_version}.tar.gz
## required for installation
Source1115: setuptools_scm-6.3.2.tar.gz
Source1116: packaging-21.2-py3-none-any.whl
Source1117: poetry-core-1.0.7.tar.gz
Source1118: pyparsing-3.0.1.tar.gz
Source1119: tomli-1.0.1.tar.gz
### END
Patch0: ha-cloud-support-aliyun.patch
Patch1: ha-cloud-support-aws.patch
@ -136,8 +222,10 @@ Patch5: bundled-pexpect.patch
Patch6: bundled-suds.patch
Patch7: bz2010652-fence_azure_arm-fix-sovereign-cloud-msi-support.patch
Patch8: bz2010709-fence_amt_ws-fix-or-causing-dead-code.patch
Patch9: bz2000954-1-configure-fix-virt.patch
Patch10: bz2000954-2-fence_kubevirt.patch
%global supportedagents amt_ws apc apc_snmp bladecenter brocade cisco_mds cisco_ucs compute drac5 eaton_snmp emerson eps evacuate hpblade ibmblade ifmib ilo ilo_moonshot ilo_mp ilo_ssh intelmodular ipdu ipmilan kdump lpar mpath redfish rhevm rsa rsb sbd scsi vmware_rest vmware_soap wti
%global supportedagents amt_ws apc apc_snmp bladecenter brocade cisco_mds cisco_ucs compute drac5 eaton_snmp emerson eps evacuate hpblade ibmblade ifmib ilo ilo_moonshot ilo_mp ilo_ssh intelmodular ipdu ipmilan kdump kubevirt lpar mpath redfish rhevm rsa rsb sbd scsi vmware_rest vmware_soap wti
%ifarch x86_64
%global testagents virsh heuristics_ping aliyun aws azure_arm gce openstack virt
%endif
@ -302,6 +390,11 @@ install -m 0644 agents/virt/fence_virtd.service %{buildroot}/%{_unitdir}/
%endif
# XXX unsure if /usr/sbin/fence_* should be compiled as well
# kubevirt
%{__python3} -m pip install --user --no-index --find-links %{_sourcedir} setuptools-scm
%{__python3} -m pip install --target %{buildroot}/usr/lib/fence-agents/%{bundled_lib_dir}/kubevirt --no-index --find-links %{_sourcedir} openshift
rm -rf %{buildroot}/usr/lib/fence-agents/%{bundled_lib_dir}/kubevirt/rsa*
## tree fix up
# fix libfence permissions
chmod 0755 %{buildroot}%{_datadir}/fence/*.py
@ -977,6 +1070,41 @@ Fence agent for use with kdump crash recovery service.
%{_mandir}/man8/fence_kdump.8*
%{_mandir}/man8/fence_kdump_send.8*
%package kubevirt
License: GPLv2+ and LGPLv2+ and ASL 2.0 and BSD and BSD-2-Clause and BSD-3-Clause and ISC and MIT and MPL-2.0
Summary: Fence agent for KubeVirt platform
Requires: fence-agents-common = %{version}-%{release}
Provides: bundled(python3-%{openshift}) = %{openshift_version}
Provides: bundled(python3-%{ruamelyamlclib}) = %{ruamelyamlclib_version}
Provides: bundled(python3-%{kubernetes}) = %{kubernetes_version}
Provides: bundled(python3-%{certifi}) = %{certifi_version}
Provides: bundled(python3-%{googleauth}) = %{googleauth_version}
Provides: bundled(python3-%{cachetools}) = %{cachetools_version}
Provides: bundled(python3-%{pyasn1modules}) = %{pyasn1modules_version}
Provides: bundled(python3-%{pyasn1}) = %{pyasn1_version}
Provides: bundled(python3-%{dateutil}) = %{dateutil_version}
Provides: bundled(python3-%{pyyaml}) = %{pyyaml_version}
Provides: bundled(python3-%{six}) = %{six_version}
Provides: bundled(python3-%{urllib3}) = %{urllib3_version}
Provides: bundled(python3-%{websocketclient}) = %{websocketclient_version}
Provides: bundled(python3-%{jinja2}) = %{jinja2_version}
Provides: bundled(python3-%{markupsafe}) = %{markupsafe_version}
Provides: bundled(python3-%{stringutils}) = %{stringutils_version}
Provides: bundled(python3-%{requests}) = %{requests_version}
Provides: bundled(python3-%{chrstnormalizer}) = %{chrstnormalizer_version}
Provides: bundled(python3-%{idna}) = %{idna_version}
Provides: bundled(python3-%{reqstsoauthlib}) = %{reqstsoauthlib_version}
Provides: bundled(python3-%{oauthlib}) = %{oauthlib_version}
Provides: bundled(python3-%{ruamelyaml}) = %{ruamelyaml_version}
Provides: bundled(python3-%{setuptools}) = %{setuptools_version}
%description kubevirt
Fence agent for KubeVirt platform.
%files kubevirt
%{_sbindir}/fence_kubevirt
%{_mandir}/man8/fence_kubevirt.8*
# bundled libraries
/usr/lib/fence-agents/%{bundled_lib_dir}/kubevirt
%package lpar
License: GPLv2+ and LGPLv2+
Summary: Fence agent for IBM LPAR
@ -1274,6 +1402,10 @@ are located on corosync cluster nodes.
%endif
%changelog
* Mon Nov 8 2021 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.10.0-11
- fence_kubevirt: new fence agent
Resolves: rhbz#2000954
* Tue Oct 5 2021 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.10.0-10
- fence_azure_arm: fix sovereign cloud and MSI support
Resolves: rhbz#2010652

29
sources
View File

@ -99,3 +99,32 @@ SHA512 (wrapt-1.12.1.tar.gz) = efc38c0adc4fcaa34499a996ea4a337a000a812254ec7ddac
SHA512 (pexpect-4.8.0-py2.py3-none-any.whl) = 79b3a33866f8fec11a5ccf079387b7de393cdee65167671db0ac42cf3d6c2e544c40ee344c1b5f7deb13d97057300c86f605df30fbfff9c6773944886c5158c0
SHA512 (ptyprocess-0.7.0-py2.py3-none-any.whl) = aa6c925add18a9603f130887e2a0ec645eb5bbf6b8020c78450a7cee934454dc46d1a435068368347f851d45550ea0fda8fb2ba0864c24c41e17a58bc7a9e84f
SHA512 (suds_community-0.8.5-py3-none-any.whl) = 0719c3c2988ff96bd8698df326fb332f85f830ef8d4bfca13c285cc0e917a6cf575f71a2b037df9270cd64edf2ea543779630f08d9d2eb77b82233ea0c5ac215
SHA512 (openshift-0.12.1.tar.gz) = 35a0ecfbc12d657f5f79d4c752a7c023a2a5e3fc5e7b377d9f11ce4a7d5f666ca5c6296f31adb44b7680d051af42d3638ced1092fb7e9146d2cc998f2c3a7b80
SHA512 (ruamel.yaml.clib-0.2.6.tar.gz) = 12307a3c3bae09cf65d9672894c9a869a7ed5483ca3afb9ee39d8bcbf1948b012a0dbf570e315cc8b9a8b55184de9e10324953ec4819d214379e01522ee13b20
SHA512 (kubernetes-12.0.1.tar.gz) = ff4739dc185dbf46050e53382b9260a0a69c55b43820ccb1df498718c78d1bf42842f4ab1b6d0c3520c5edab45d9c9c9527aea9ccb0b6347f34e18202f9155a2
SHA512 (certifi-2021.10.8.tar.gz) = 06dc41a471f16f6c52751854e82fb42011c9388651cff55761298b86ba437d431e6325ab039ef330f2b2c5f69f5ba43dc468e7ca3df205a8bb31468f43711fbe
SHA512 (google-auth-2.3.0.tar.gz) = cf0040d238880ea4bbad64f0a47311f2ed3922a7301a0d5287319b39ea8e76dca66dc78fd860cc12386b078bd2147a1cba01de97381420ef94cc44fca0c90ad1
SHA512 (cachetools-4.2.4.tar.gz) = 29a6bb3a064e5603cd3e3882d8e5a6a6ef95ba3029716692c9a82d7186a0befcfb8ed4a0ee3ecb591fdff93a46836d5b25acca7ba5eab1ba837e86404aea8fcf
SHA512 (pyasn1-modules-0.2.8.tar.gz) = fdfcaa065deffdd732deaa1fa30dec2fc4a90ffe15bd12de40636ce0212f447611096d2f4e652ed786b5c47544439e6a93721fabe121f3320f13965692a1ca5b
SHA512 (pyasn1-0.4.8.tar.gz) = e64e70b325c8067f87ace7c0673149e82fe564aa4b0fa146d29b43cb588ecd6e81b1b82803b8cfa7a17d3d0489b6d88b4af5afb3aa0052bf92e8a1769fe8f7b0
SHA512 (python-dateutil-2.8.2.tar.gz) = 6538858e4a3e2d1de1bf25b6d8b25e3a8d20bf60fb85e32d07ac491c90ce193e268bb5641371b8a79fb0f033a184bac9896b3bc643c1aca9ee9c6478286ac20c
SHA512 (PyYAML-6.0.tar.gz) = b402993073282e7f4202823b051d364b91929362edd5b3aebe93b56833956ec9279c1ba82b97f8bc8a2b82d20e1060e4ec9fc90400a6ed902adce3e4f83a6e0e
SHA512 (rsa-4.7.2.tar.gz) = 63f561774dbaa10511167cba31e0f852e32b3250f2803edaa2729dc2b28baa2c42cb79dfbd49e38eb42ce82f665ed4c3d9dcc810c37380401e2c62202b1c7948
SHA512 (six-1.16.0.tar.gz) = 076fe31c8f03b0b52ff44346759c7dc8317da0972403b84dfe5898179f55acdba6c78827e0f8a53ff20afe8b76432c6fe0d655a75c24259d9acbaa4d9e8015c0
SHA512 (urllib3-1.26.7.tar.gz) = 6f5a5e6dd5ff99950fcc051495e0a698153b57e20b6c83d869b54c7fece9616909bcf2fe99efc40815f8722996ad93e430bf765ce5c629b912690c286014b86f
SHA512 (websocket-client-1.2.1.tar.gz) = fdbeb7ac2add27478a17b388ac62e9378094a368f29749d8b63c274ee41836506369dddd083956f42f1f2d74948392b3ddd59b801c98f9e028c126bdb54c636b
SHA512 (Jinja2-3.0.2.tar.gz) = cea7d24656bbc9117785886caee4eb28bc417bd7529152493ac2dd5041d798a1e30c0c5c619327817a708b1af8d08f13ae9125bbc7cb7d440045cb54d7bfbd9e
SHA512 (MarkupSafe-2.0.1.tar.gz) = 77249bda784111ece15d59eb3de1cbb37a58fb9f22902fe6b73fea9eb0f23857ccbe53dc55463278e3b91f78dc35e2b027fd823ca50d88d8985d5a98ce2327f1
SHA512 (python-string-utils-1.0.0.tar.gz) = 23ee48053848edd74915a985ee9edec48bbba468e228745f7d27b6a855c67f6b7ddf1cf71049458bf0b1c6c4d4f905ebacfac960597cbadbbe2daa1fe9472280
SHA512 (requests-2.26.0.tar.gz) = c3397d77f0d2f1afb05661c4b98adad6c1ddaf360906254150b33ab0d9479fd306905bd6d61b8cf8becd9a40bdcf9b03542e8267c644ef19f03f44bfca0bc461
SHA512 (charset-normalizer-2.0.7.tar.gz) = 7096fa23fade52c8eee2577b87aa574deffe6f66e8986f71172f3b9212bd6c6fb17901cceab90144c9d07de8bc6f5e320497daa3d3f749f436788232d4cba088
SHA512 (idna-3.3.tar.gz) = 70b7cc8718e7d7899c75cfe476f044eae5a2fa03801fc9c12e3a092627ca943ffc4a578f9b8a55e181a11564835e125cfaaa577c02a6461dbb97366e620e53ad
SHA512 (requests-oauthlib-1.3.0.tar.gz) = 7ef206aaf50cd3289f04175ff3a08022d00aeaaba57a6580912f37c30880322ec71ae9f6af7edc99efe6043fc6c19ba2c9f6fc0f29c126be28cde22bb885510d
SHA512 (oauthlib-3.1.1.tar.gz) = 1c18f265a6017a6f2bf77507f5de095b439be36f309316993b547ded0f306461b058dcb85dc245bf26f65a9c77be44ca38f9053f3300a9b5cb92332b61a7f307
SHA512 (ruamel.yaml-0.17.16.tar.gz) = 61780127c23a2fa20c6ce29b27790b72538b5ea0370906d38f4cfe760c30a3756022a385d3f241dd88199358ff152d624dc372fbe7e1fd6d2959f873daf1263d
SHA512 (setuptools-58.3.0.tar.gz) = 5a38231c2ce361ad45befbd0de34dd7dde9d15f25e7fe2b8cf595d43eeee86fb3c2400e5b2676b547a025217aad85e63b1db6d9778baa412eefb25b22170c587
SHA512 (setuptools_scm-6.3.2.tar.gz) = 9a16552803ef92367ad71007cf322737b5baa58b924083f04c860875bf6cb2e2bb4f43a7f89778b040c2eb55c5d32de479a918056519339820c6d0f1a6a386f0
SHA512 (packaging-21.2-py3-none-any.whl) = 620a077783da21db677eda413c7cfcd9a9112afd573deda853615fad5b7f79b0ddfae4a7ee5d69834ba45e2299ebf343c6398b8eb60bb04569883520ada4a381
SHA512 (poetry-core-1.0.7.tar.gz) = 0d93daefd7cb785059d1faa04b347cbaa908e0698d59543a18eeb6d86c8aae6f922b9105cb794b23895d676a05eea339f8f19bf41252e9940381be6b1c5d2d1a
SHA512 (pyparsing-3.0.1.tar.gz) = 4a91daaf962a4d689ac26a712a83e8c4fbebc33270b6e46f0ae34fe247f6858d6334fbb59bdbbafa448703d24763fe1c86ce164e095de5003c7f1390960ba520
SHA512 (tomli-1.0.1.tar.gz) = 2731ff827bda17471bf75a44b445062bd4c43adfc9f0fdab4f8953e559f60708bc3e3500b424bf914c5e472fc9afbab72316c5a3b47c3a7654b2eb5343e62d21